diff --git a/.gitignore b/.gitignore index 35d50b35af..2ffb438219 100644 --- a/.gitignore +++ b/.gitignore @@ -90,7 +90,7 @@ /nix/config.h.in /nix/nix-daemon/nix-daemon.cc /nix/nix-setuid-helper/nix-setuid-helper.cc -/nix/scripts/guix-authenticate +/nix/scripts/authenticate /nix/scripts/list-runtime-roots /nix/scripts/offload /nix/scripts/substitute diff --git a/Makefile.am b/Makefile.am index a2144d4b8e..eda87f3124 100644 --- a/Makefile.am +++ b/Makefile.am @@ -101,6 +101,7 @@ MODULES = \ guix/build-system/android-ndk.scm \ guix/build-system/ant.scm \ guix/build-system/cargo.scm \ + guix/build-system/clojure.scm \ guix/build-system/cmake.scm \ guix/build-system/dub.scm \ guix/build-system/emacs.scm \ @@ -173,6 +174,7 @@ MODULES = \ guix/build/syscalls.scm \ guix/build/gremlin.scm \ guix/build/debug-link.scm \ + guix/build/clojure-build-system.scm \ guix/build/clojure-utils.scm \ guix/build/emacs-utils.scm \ guix/build/java-utils.scm \ diff --git a/doc/guix.texi b/doc/guix.texi index c2c778a28c..082e81bf7c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -3275,6 +3275,10 @@ produce a list of channel specifications that can be passed to @command{guix pull -C} or installed as @file{~/.config/guix/channels.scm} (@pxref{Invoking guix pull}). @end table + +@item --profile=@var{profile} +@itemx -p @var{profile} +Display information about @var{profile}. @end table @node Invoking guix pack diff --git a/gnu/local.mk b/gnu/local.mk index 4b194d7b13..e56f8a28dc 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1048,6 +1048,7 @@ dist_patch_DATA = \ %D%/packages/patches/pinball-missing-separators.patch \ %D%/packages/patches/pinball-src-deps.patch \ %D%/packages/patches/pinball-system-ltdl.patch \ + %D%/packages/patches/pinentry-efl.patch \ %D%/packages/patches/pingus-sdl-libs-config.patch \ %D%/packages/patches/pius.patch \ %D%/packages/patches/pixman-CVE-2016-5296.patch \ diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm index cd18aaa06f..d30c13d845 100644 --- a/gnu/packages/admin.scm +++ b/gnu/packages/admin.scm @@ -9,7 +9,7 @@ ;;; Copyright © 2016, 2017 Leo Famulari ;;; Copyright © 2016 Pjotr Prins ;;; Copyright © 2016, 2017 Ricardo Wurmus -;;; Copyright © 2016, 2017 Efraim Flashner +;;; Copyright © 2016, 2017, 2018 Efraim Flashner ;;; Copyright © 2016 Peter Feigl ;;; Copyright © 2016 John J. Foerch ;;; Copyright © 2016, 2017 Nils Gillmann @@ -2455,26 +2455,20 @@ (define-public thermald (version "1.7.2") (source (origin - (method url-fetch) - (uri (string-append "https://github.com/01org/thermal_daemon/archive/v" - version ".tar.gz")) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 (base32 - "15a6vb67y5wsmf0irrq7sxam18yqpz64130k83ryf24mp40h661b")))) + (method git-fetch) + (uri (git-reference + (url "https://github.com/01org/thermal_daemon") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1cs2pq8xvfnsvrhg2bxawk4kn3z1qmfrnpnhs178pvfbglzh15hc")))) (build-system gnu-build-system) (arguments - `(#:phases - (modify-phases %standard-phases - (add-after 'unpack 'bootstrap - (lambda _ - (invoke "sh" "autogen.sh") - #t))) - #:configure-flags + `(#:configure-flags (let ((out (assoc-ref %outputs "out"))) (list (string-append "--sysconfdir=" out "/etc") - (string-append "--with-udev-dir=" - out "/lib/udev") (string-append "--with-dbus-sys-dir=" out "/etc/dbus-1/system.d") "--localstatedir=/var")))) diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm index 7883834d18..e3938494ba 100644 --- a/gnu/packages/audio.scm +++ b/gnu/packages/audio.scm @@ -466,7 +466,7 @@ (define-public autotalent formant warp.") ;; All code except the FFT routine is licensed under GPLv2+. ;; The FFT routine is under BSD-3. - (license (list license:gpl2+)))) + (license license:gpl2+))) (define-public azr3 (package diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm index d6e38bb0b8..da2e82c33d 100644 --- a/gnu/packages/bootloaders.scm +++ b/gnu/packages/bootloaders.scm @@ -555,8 +555,8 @@ (define-public u-boot-malta (define-public u-boot-beagle-bone-black (make-u-boot-package "am335x_boneblack" "arm-linux-gnueabihf")) -(define-public u-boot-pine64-plus - (let ((base (make-u-boot-package "pine64_plus" "aarch64-linux-gnu"))) +(define-public (make-u-boot-sunxi64-package board triplet) + (let ((base (make-u-boot-package board triplet))) (package (inherit base) (arguments @@ -574,9 +574,12 @@ (define-public u-boot-pine64-plus ) #t)))))) (native-inputs - `(("firmware" ,arm-trusted-firmware-pine64-plus) + `(("firmware" ,arm-trusted-firmware-sun50i-a64) ,@(package-native-inputs base)))))) +(define-public u-boot-pine64-plus + (make-u-boot-sunxi64-package "pine64_plus" "aarch64-linux-gnu")) + (define-public u-boot-bananapi-m2-ultra (make-u-boot-package "Bananapi_M2_Ultra" "arm-linux-gnueabihf")) diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm index fb07867c6d..32b92a976c 100644 --- a/gnu/packages/compression.scm +++ b/gnu/packages/compression.scm @@ -696,13 +696,13 @@ (define-public libmspack (package (name "libmspack") (home-page "https://cabextract.org.uk/libmspack/") - (version "0.8") + (version "0.9.1") (source (origin (method url-fetch) (uri (string-append home-page name "-" version "alpha.tar.gz")) (sha256 - (base32 "1byx98jajv927f0a7np0hvs8lxzccny6pj8vrrgmldv1jlp7jcq5")))) + (base32 "0h1f5w8rjnq7dcqpqm1mpx5m8q80691kid6f7npqlqwqqzckd8v2")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--disable-static"))) @@ -1085,13 +1085,13 @@ (define-public cabextract (package (name "cabextract") (home-page "https://cabextract.org.uk/") - (version "1.7") + (version "1.9") (source (origin (method url-fetch) (uri (string-append home-page name "-" version ".tar.gz")) (sha256 (base32 - "1g86wmb8lkjiv2jarfz979ngbgg7d3si8x5il4g801604v406wi9")) + "1hf4zhjxfdgq9x172r5zfdnafma9q0zf7372syn8hcn7hcypkg0v")) (modules '((guix build utils))) (snippet '(begin @@ -1099,11 +1099,27 @@ (define-public cabextract (delete-file-recursively "mspack") #t)))) (build-system gnu-build-system) - (arguments '(#:configure-flags '("--with-external-libmspack"))) + (arguments + '(#:configure-flags '("--with-external-libmspack") + #:phases + (modify-phases %standard-phases + ;; cabextract needs some of libmspack's header files. + ;; These are located in the "mspack" directory of libmspack. + (add-before 'build 'unpack-libmspack + (lambda* (#:key inputs #:allow-other-keys) + (let ((dir-name "libmspack-src")) + (mkdir dir-name) + (invoke "tar" "-xvf" (assoc-ref inputs "libmspack-source") + "-C" dir-name "--strip-components" "1") + (rename-file (string-append dir-name "/mspack") + "mspack") + (delete-file-recursively dir-name) + #t)))))) (native-inputs `(("pkg-config" ,pkg-config))) (inputs - `(("libmspack" ,libmspack))) + `(("libmspack" ,libmspack) + ("libmspack-source" ,(package-source libmspack)))) (synopsis "Tool to unpack Cabinet archives") (description "Extracts files out of Microsoft Cabinet (.cab) archives") ;; Some source files specify gpl2+, lgpl2+, however COPYING is gpl3. diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index dea925e568..59bef9a8d1 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -265,6 +265,41 @@ (define-public python-django-allauth (define-public python2-django-allauth (package-with-python2 python-django-allauth)) +(define-public python-django-debug-toolbar + (package + (name "python-django-debug-toolbar") + (version "1.10.1") + (source + (origin + (method url-fetch) + (uri (string-append + "https://github.com/jazzband/django-debug-toolbar/archive/" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "1rww056hyzks8spbgf4h7kf6ybxlc5p08a2b6gn1nqrrzs4yx9sy")))) + (build-system python-build-system) + (propagated-inputs + `(("python-sqlparse" ,python-sqlparse) + ("python-django" ,python-django))) + (native-inputs + `(("python-django-jinja" ,python-django-jinja) + ("python-html5lib" ,python-html5lib))) + (arguments + '(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (invoke "make" "test")))))) + (home-page + "https://github.com/jazzband/django-debug-toolbar") + (synopsis "Toolbar to help with developing Django applications") + (description + "A configurable set of panels that display information about the current +request and response as a toolbar on the rendered page.") + (license license:bsd-3))) + (define-public python-django-gravatar2 (package (name "python-django-gravatar2") @@ -338,6 +373,47 @@ (define-public python-django-assets (define-public python2-django-assets (package-with-python2 python-django-assets)) +(define-public python-django-jinja + (package + (name "python-django-jinja") + (version "2.4.1") + (source + (origin + (method url-fetch) + (uri (string-append + "https://github.com/niwinz/django-jinja/archive/" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "0bzrb4m6wx9ph5cpvz7wpvg5k6ksvj0dnxlg0nhhqskhvp46brs1")))) + (build-system python-build-system) + (propagated-inputs + `(("python-django" ,python-django) + ("python-jinja2" ,python-jinja2) + ("python-pytz" ,python-pytz) + ("python-django-pipeline" ,python-django-pipeline))) + (arguments + '(;; TODO Tests currently fail due to issues with the configuration for + ;; django-pipeline + #:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (or + (not tests?) + (with-directory-excursion "testing" + (invoke "python" "runtests.py")))))))) + (home-page + "https://niwinz.github.io/django-jinja/latest/") + (synopsis "Simple jinja2 templating backend for Django") + (description + "This package provides a templating backend for Django, using Jinja2. It +provides certain advantages over the builtin Jinja2 backend in Django, for +example, explicit calls to callables from templates and better performance.") + (license license:bsd-3))) + (define-public python-django-jsonfield (package (name "python-django-jsonfield") @@ -518,6 +594,46 @@ (define-public python-django-overextends (define-public python2-django-overextends (package-with-python2 python-django-overextends)) +(define-public python-django-pipeline + (package + (name "python-django-pipeline") + (version "1.6.14") + (source + (origin + (method url-fetch) + (uri (pypi-uri "django-pipeline" version)) + (sha256 + (base32 + "1a207y71r7za033ira0qmh2yrgp5rq0l04gw2fg9b8jri7sslrzg")))) + (build-system python-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-source + (lambda _ + (substitute* "tests/tests/test_compiler.py" + (("\\/usr\\/bin\\/env") + (which "env"))))) + (replace 'check + (lambda*(#:key tests? #:allow-other-keys) + (or + (not tests?) + (begin + (setenv "DJANGO_SETTINGS_MODULE" "tests.settings") + (invoke "django-admin" "test" "tests")))))))) + (propagated-inputs + `(("python-django" ,python-django) + ("python-slimit" ,python-slimit) + ("python-jsmin" ,python-jsmin))) + (home-page + "https://github.com/jazzband/django-pipeline") + (synopsis "Asset packaging library for Django") + (description + "Pipeline is an asset packaging library for Django, providing both CSS +and JavaScript concatenation and compression, built-in JavaScript template +support, and optional data-URI image and font embedding.") + (license license:expat))) + (define-public python-django-redis (package (name "python-django-redis") diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm index dfcee56afe..67667eeee5 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -4698,7 +4698,7 @@ (define-public emacs-highlight-indentation (define-public emacs-elpy (package (name "emacs-elpy") - (version "1.24.0") + (version "1.26.0") (source (origin (method git-fetch) (uri (git-reference @@ -4707,7 +4707,7 @@ (define-public emacs-elpy (file-name (string-append name "-" version "-checkout")) (sha256 (base32 - "0rsg8a9nwqfkv0xcs11jzfp10ij7jm0v2ikx19zv2v7awqy0q5wf")))) + "0wynzp5xmrgiggmam82n6lfaiqmfl4n3ccpsgnh86r6pbsmssxjk")))) (build-system emacs-build-system) (arguments `(#:include (cons* "^elpy/[^/]+\\.py$" "^snippets\\/" %default-include) diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm index 0b5a82e9e5..c396cd644f 100644 --- a/gnu/packages/firmware.scm +++ b/gnu/packages/firmware.scm @@ -446,25 +446,26 @@ (define* (make-arm-trusted-firmware platform #:optional (arch "aarch64")) (license (list license:bsd-3 license:bsd-2)))) ; libfdt -(define-public arm-trusted-firmware-pine64-plus - (let ((base (make-arm-trusted-firmware "sun50iw1p1")) - ;; Vendor's arm trusted firmware branch hasn't been upstreamed yet. - (commit "ae78724247a01560164d607ed66db111c74d8df0") +(define-public arm-trusted-firmware-sun50i-a64 + (let ((base (make-arm-trusted-firmware "sun50i_a64")) + ;; Use unreleased version which enables additional features needed for + ;; LCD support + (commit "cabe0a31801e99e7abb84d2114ded6bb56f3c71e") (revision "1")) (package (inherit base) - (name "arm-trusted-firmware-pine64-plus") - (version (string-append "1.2-" revision "." (string-take commit 7))) + (name "arm-trusted-firmware-sun50i-a64") + (version (git-version "2.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference - (url "https://github.com/apritzel/arm-trusted-firmware.git") + (url "https://github.com/ARM-software/arm-trusted-firmware.git") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 - "0r4xnlq7v9khjfcg6gqp7nmrmnw4z1r8bipwdr07png1dcbb8214"))))))) + "0srw2zj3vn5d2fwzjpwa5h70d5bwvb79jnpdvmd395npv0gxshdz"))))))) (define-public arm-trusted-firmware-puma-rk3399 (let ((base (make-arm-trusted-firmware "rk3399")) diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm index 1195695d7a..f9f8428202 100644 --- a/gnu/packages/fonts.scm +++ b/gnu/packages/fonts.scm @@ -99,13 +99,14 @@ (define-public font-ubuntu (name "font-ubuntu") (version "0.83") (source (origin - (method url-fetch) - (uri (string-append - "http://font.ubuntu.com/download/ubuntu-font-family-" - version ".zip")) + (method git-fetch) + (uri (git-reference + (url "https://salsa.debian.org/fonts-team/fonts-ubuntu") + (commit (string-append "upstream/" version)))) + (file-name (git-file-name name version)) (sha256 (base32 - "0hjvq2x758dx0sfwqhzflns0ns035qm7h6ygskbx1svzg517sva5")))) + "1d2xrjpxy70f3nsgqiggwv6pj06qglf5vj2847pqx60w3ygi903g")))) (build-system font-build-system) (home-page "http://font.ubuntu.com/") (synopsis "The Ubuntu Font Family") diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm index cec013074f..53fdc8200c 100644 --- a/gnu/packages/gnupg.scm +++ b/gnu/packages/gnupg.scm @@ -40,6 +40,8 @@ (define-module (gnu packages gnupg) #:use-module (gnu packages curl) #:use-module (gnu packages crypto) #:use-module (gnu packages emacs) + #:use-module (gnu packages enlightenment) + #:use-module (gnu packages gettext) #:use-module (gnu packages guile) #:use-module (gnu packages openldap) #:use-module (gnu packages perl) @@ -836,6 +838,34 @@ (define-public pinentry-qt "Pinentry provides a console and a Qt GUI that allows users to enter a passphrase when @code{gpg} is run and needs it."))) +(define-public pinentry-efl + (package + (inherit pinentry-tty) + (name "pinentry-efl") + (source + (origin + (inherit (package-source pinentry-tty)) + (patches (search-patches "pinentry-efl.patch")))) + (arguments + '(#:configure-flags '("--enable-pinentry-efl") + #:phases + (modify-phases %standard-phases + (replace 'bootstrap + (lambda _ + (invoke "sh" "autogen.sh")))))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("gettext" ,gettext-minimal) + ,@(package-native-inputs pinentry-tty))) + (inputs + `(("efl" ,efl) + ,@(package-inputs pinentry-tty))) + (description + "Pinentry provides a console and a graphical interface for the +@dfn{Enlightenment Foundation Libraries} (EFL) that allows users to enter a +passphrase when @code{gpg} is run and needs it."))) + (define-public pinentry (package (inherit pinentry-gtk2) (name "pinentry"))) diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm index 97d36c72d3..9af22146ed 100644 --- a/gnu/packages/java.scm +++ b/gnu/packages/java.scm @@ -9388,7 +9388,8 @@ (define-public java-jansi-native ,(match (%current-system) ((or "i686-linux" "armhf-linux") "linux32") - ((or "x86_64-linux" "aarch64-linux") + ((or "x86_64-linux" "aarch64-linux" + "mips64el-linux") "linux64"))))) (install-file "src/main/native-package/src/libjansi.so" dir)) #t)) diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm index 6849cdd2bf..d401e5c456 100644 --- a/gnu/packages/lisp.scm +++ b/gnu/packages/lisp.scm @@ -533,12 +533,8 @@ (define-public ccl (install-file kernel libdir) (install-file heap libdir) - (let ((dirs '("lib" "library" "examples" "tools" "objc-bridge" - ,(match (%current-system) - ("x86_64-linux" - "x86-headers64") - ("i686-linux" - "x86-headers"))))) + (let ((dirs '("lib" "library" "examples" "contrib" + "tools" "objc-bridge"))) (for-each copy-recursively dirs (map (cut string-append libdir <>) dirs))) diff --git a/gnu/packages/patches/pinentry-efl.patch b/gnu/packages/patches/pinentry-efl.patch new file mode 100644 index 0000000000..5ba79e28df --- /dev/null +++ b/gnu/packages/patches/pinentry-efl.patch @@ -0,0 +1,798 @@ +https://git.gnupg.org/cgi-bin/gitweb.cgi?p=pinentry.git;a=commit;h=948105b7a34ec9a9e5479d376b7c86bafee50a01 +This patch can be removed with the next release of pinentry. + +From 948105b7a34ec9a9e5479d376b7c86bafee50a01 Mon Sep 17 00:00:00 2001 +From: "William L. Thomson Jr" +Date: Tue, 29 May 2018 22:50:47 +0100 +Subject: [PATCH] efl: Add an EFL-based pinentry. + +* NEWS: Update. +* Makefile.am: Add new efl subdirectory. +* configure.ac: Add --enable-pinentry-efl option. +* efl/Makefile.am: New file. +* efl/pinentry-efl.c: New file. + +Signed-off-by: Damien Goutte-Gattat +--- + Makefile.am | 8 +- + configure.ac | 44 +++- + efl/Makefile.am | 38 ++++ + efl/pinentry-efl.c | 623 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 716 insertions(+), 2 deletions(-) + create mode 100644 efl/Makefile.am + create mode 100644 efl/pinentry-efl.c + +diff --git a/Makefile.am b/Makefile.am +index 8c8b8e5..b8fd0e1 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -82,10 +82,16 @@ else + pinentry_fltk = + endif + ++if BUILD_PINENTRY_EFL ++pinentry_efl = efl ++else ++pinentry_efl = ++endif ++ + SUBDIRS = m4 secmem pinentry ${pinentry_curses} ${pinentry_tty} \ + ${pinentry_emacs} ${pinentry_gtk_2} ${pinentry_gnome_3} \ + ${pinentry_qt} ${pinentry_tqt} ${pinentry_w32} \ +- ${pinentry_fltk} doc ++ ${pinentry_fltk} ${pinentry_efl} doc + + + install-exec-local: +diff --git a/configure.ac b/configure.ac +index ff6c2e0..e305e44 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -419,6 +419,42 @@ fi + + + dnl ++dnl Check for EFL pinentry programs. ++dnl ++AC_ARG_ENABLE(pinentry-efl, ++ AC_HELP_STRING([--enable-pinentry-efl], [build EFL pinentry]), ++ pinentry_efl=$enableval, pinentry_efl=maybe) ++ ++dnl check for pkg-config ++if test "$pinentry_efl" != "no"; then ++ AC_PATH_PROG(PKG_CONFIG, pkg-config, no) ++ if test x"${PKG_CONFIG}" = xno ; then ++ pinentry_efl=no ++ fi ++fi ++ ++if test "$pinentry_efl" != "no"; then ++ AC_MSG_CHECKING([for efl]) ++ "${PKG_CONFIG}" --exists 'elementary >= 1.18' ++ if test $? -ne 0 ; then ++ AC_MSG_RESULT([no]) ++ AC_MSG_WARN([efl >= 1.18 is required for efl pinentry]) ++ pinentry_efl=no ++ else ++ AC_MSG_RESULT([yes]) ++ EFL_CFLAGS=`"${PKG_CONFIG}" --cflags ecore-x elementary` ++ EFL_LIBS=`"${PKG_CONFIG}" --libs ecore-x elementary` ++ AC_SUBST(EFL_CFLAGS) ++ AC_SUBST(EFL_LIBS) ++ if test "$pinentry_efl" != "no" ++ then ++ pinentry_efl=yes ++ fi ++ fi ++fi ++AM_CONDITIONAL(BUILD_PINENTRY_EFL, test "$pinentry_efl" = "yes") ++ ++dnl + dnl Check for GTK+-2 / GNOME3 pinentry programs. + dnl + AC_ARG_ENABLE(pinentry-gtk2, +@@ -645,7 +681,11 @@ else + if test "$pinentry_tqt" = "yes"; then + PINENTRY_DEFAULT=pinentry-tqt + else +- AC_MSG_ERROR([[No pinentry enabled.]]) ++ if test "$pinentry_efl" = "yes"; then ++ PINENTRY_DEFAULT=pinentry-efl ++ else ++ AC_MSG_ERROR([[No pinentry enabled.]]) ++ fi + fi + fi + fi +@@ -721,6 +761,7 @@ secmem/Makefile + pinentry/Makefile + curses/Makefile + tty/Makefile ++efl/Makefile + emacs/Makefile + gtk+-2/Makefile + gnome3/Makefile +@@ -744,6 +785,7 @@ AC_MSG_NOTICE([ + Curses Pinentry ..: $pinentry_curses + TTY Pinentry .....: $pinentry_tty + Emacs Pinentry ...: $pinentry_emacs ++ EFL Pinentry .....: $pinentry_efl + GTK+-2 Pinentry ..: $pinentry_gtk_2 + GNOME 3 Pinentry .: $pinentry_gnome_3 + Qt Pinentry ......: $pinentry_qt $pinentry_qt_lib_version +diff --git a/efl/Makefile.am b/efl/Makefile.am +new file mode 100644 +index 0000000..b986a04 +--- /dev/null ++++ b/efl/Makefile.am +@@ -0,0 +1,38 @@ ++# Makefile.am - PIN entry EFL frontend. ++# Copyright (C) 2017 Obsidian-Studios, Inc. ++# Author William L. Thomson Jr. ++# ++# This file is part of PINENTRY. ++# ++# PINENTRY is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# PINENTRY is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA ++ ++## Process this file with automake to produce Makefile.in ++ ++bin_PROGRAMS = pinentry-efl ++ ++if FALLBACK_CURSES ++ncurses_include = $(NCURSES_INCLUDE) ++libcurses = ../pinentry/libpinentry-curses.a $(LIBCURSES) $(LIBICONV) ++else ++ncurses_include = ++libcurses = ++endif ++ ++AM_CPPFLAGS = $(COMMON_CFLAGS) $(EFL_CFLAGS) $(ncurses_include) \ ++ -I$(top_srcdir)/secmem -I$(top_srcdir)/pinentry ++LDADD = ../pinentry/libpinentry.a ../secmem/libsecmem.a \ ++ $(COMMON_LIBS) $(LIBCAP) $(EFL_LIBS) $(libcurses) ++ ++pinentry_efl_SOURCES = pinentry-efl.c +diff --git a/efl/pinentry-efl.c b/efl/pinentry-efl.c +new file mode 100644 +index 0000000..ca99693 +--- /dev/null ++++ b/efl/pinentry-efl.c +@@ -0,0 +1,623 @@ ++/* pinentry-efl.c ++ Copyright (C) 2017 Obsidian-Studios, Inc. ++ Author William L. Thomson Jr. ++ ++ Based on pinentry-gtk2.c ++ Copyright (C) 1999 Robert Bihlmeyer ++ Copyright (C) 2001, 2002, 2007, 2015 g10 Code GmbH ++ Copyright (C) 2004 by Albrecht Dreß ++ ++ pinentry-efl is a pinentry application for the EFL widget set. ++ It tries to follow the Gnome Human Interface Guide as close as ++ possible. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++#include ++#include ++#include ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wstrict-prototypes" ++#endif ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) ++#pragma GCC diagnostic pop ++#endif ++ ++#ifdef HAVE_GETOPT_H ++#include ++#else ++#include "getopt.h" ++#endif /* HAVE_GETOPT_H */ ++ ++#include "pinentry.h" ++ ++#ifdef FALLBACK_CURSES ++#include "pinentry-curses.h" ++#endif ++ ++#define PGMNAME "pinentry-efl" ++ ++#ifndef VERSION ++#define VERSION ++#endif ++ ++#define ENTRY_HIDE "Hide entry" ++#define ENTRY_SHOW "Show entry" ++ ++typedef enum { CONFIRM_CANCEL, CONFIRM_OK, CONFIRM_NOTOK } confirm_value_t; ++ ++static const int WIDTH = 480; ++static const int BUTTON_HEIGHT = 27; ++static const int BUTTON_WIDTH = 70; ++static const int BUTTON_ICON_SIZE = 13; ++static const int PADDING = 5; ++ ++static Eina_Bool got_input; ++static Ecore_Timer *timer; ++static Evas_Object *check_label; ++static Evas_Object *error_label; ++static Evas_Object *entry; ++static Evas_Object *repeat_entry; ++static Evas_Object *qualitybar; ++static Evas_Object *win; ++static char **pargv; ++static int grab_failed; ++static int passphrase_ok; ++static int confirm_mode; ++static int pargc; ++static confirm_value_t confirm_value; ++static pinentry_t pinentry; ++ ++pinentry_cmd_handler_t pinentry_cmd_handler; ++ ++static void ++quit (void) ++{ ++ evas_object_del(win); ++ elm_exit(); ++ ecore_main_loop_quit (); ++} ++ ++static void ++delete_event (void *data EINA_UNUSED, ++ Evas_Object *obj EINA_UNUSED, ++ void *event EINA_UNUSED) ++{ ++ pinentry->close_button = 1; ++ quit (); ++} ++ ++static void ++changed_text_handler (void *data EINA_UNUSED, ++ Evas_Object *obj, ++ void *event EINA_UNUSED) ++{ ++ const char *s; ++ int length; ++ int percent; ++ ++ got_input = EINA_TRUE; ++ ++ if (pinentry->repeat_passphrase && repeat_entry) ++ { ++ elm_object_text_set (repeat_entry, ""); ++ elm_object_text_set (error_label, ""); ++ } ++ ++ if (!qualitybar || !pinentry->quality_bar) ++ return; ++ ++ s = elm_object_text_get (obj); ++ if (!s) ++ s = ""; ++ length = strlen (s); ++ percent = length? pinentry_inq_quality (pinentry, s, length) : 0; ++ evas_object_color_set(qualitybar, ++ 255 - ( 2.55 * percent ), ++ 2.55 * percent, 0, 255); ++ elm_progressbar_value_set (qualitybar, (double) percent / 100.0); ++} ++ ++static void ++on_check (void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) ++{ ++ if(elm_check_state_get(obj)) ++ { ++ elm_entry_password_set(entry, EINA_FALSE); ++ elm_object_text_set(check_label,ENTRY_HIDE); ++ } ++ else ++ { ++ elm_entry_password_set(entry, EINA_TRUE); ++ elm_object_text_set(check_label,ENTRY_SHOW); ++ } ++ evas_object_size_hint_min_set(check_label, ++ ELM_SCALE_SIZE(BUTTON_WIDTH), ++ ELM_SCALE_SIZE(BUTTON_HEIGHT)); ++ evas_object_size_hint_align_set(check_label, 0, 1); ++} ++ ++static void ++on_click (void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) ++{ ++ if (confirm_mode) ++ { ++ confirm_value = (confirm_value_t) data; ++ quit (); ++ return; ++ } ++ ++ if (data) ++ { ++ const char *s; ++ const char *s2; ++ ++ s = elm_entry_entry_get (entry); ++ if (!s) ++ s = ""; ++ ++ if (pinentry->repeat_passphrase && repeat_entry) ++ { ++ s2 = elm_entry_entry_get (repeat_entry); ++ if (!s2) ++ s2 = ""; ++ if (strcmp (s, s2)) ++ { ++ elm_object_text_set(error_label, ++ pinentry->repeat_error_string? ++ pinentry->repeat_error_string: ++ "not correctly repeated"); ++ elm_object_focus_set(entry,EINA_TRUE); ++ return; ++ } ++ pinentry->repeat_okay = 1; ++ } ++ ++ passphrase_ok = 1; ++ pinentry_setbufferlen (pinentry, strlen (s) + 1); ++ if (pinentry->pin) ++ strncpy (pinentry->pin, s, strlen(s) + 1); ++ } ++ quit (); ++} ++ ++static void ++enter_callback (void *data, Evas_Object * obj, void *event_info EINA_UNUSED) ++{ ++ if (data) ++ elm_object_focus_set (data, 1); ++ else ++ on_click ((void *) CONFIRM_OK, obj, NULL); ++} ++ ++static Eina_Bool ++timeout_cb (const void * data) ++{ ++ pinentry_t pe = (pinentry_t)data; ++ if (!got_input) ++ { ++ ecore_main_loop_quit(); ++ if (pe) ++ pe->specific_err = gpg_error (GPG_ERR_TIMEOUT); ++ } ++ ++ timer = NULL; ++ return ECORE_CALLBACK_DONE; ++} ++ ++static void ++create_window (void) ++{ ++ char *txt; ++ Evas_Object *icon; ++ Evas_Object *obj; ++ Evas_Object *table; ++ int btn_txt_len = 0; ++ int row = 0; ++ int ok_len = 0; ++ ++ win = elm_win_util_dialog_add(NULL,"pinentry","enter pin"); ++ elm_win_autodel_set(win, EINA_TRUE); ++ elm_win_center(win,EINA_TRUE,EINA_TRUE); ++ evas_object_smart_callback_add(win, "delete,request", delete_event, NULL); ++ ++ table = elm_table_add(win); ++ elm_table_padding_set(table,ELM_SCALE_SIZE(PADDING),0); ++ evas_object_size_hint_padding_set (table, ++ ELM_SCALE_SIZE(PADDING), ++ ELM_SCALE_SIZE(PADDING), ++ ELM_SCALE_SIZE(PADDING), ++ ELM_SCALE_SIZE(PADDING)); ++ evas_object_show(table); ++ ++ if (pinentry->title) ++ { ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, ++ pinentry->title); ++ elm_win_title_set ( win, txt ); ++ free (txt); ++ } ++ ++ /* Description Label */ ++ if (pinentry->description) ++ { ++ char* aligned; ++ int len; ++ ++ obj = elm_label_add(table); ++ elm_label_line_wrap_set (obj, ELM_WRAP_WORD); ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->description); ++ len = strlen(txt)+20; // 20 chars for align tag ++ aligned = calloc(len+1,sizeof(char)); ++ if(aligned) ++ { ++ snprintf(aligned,len, "%s",txt); ++ elm_object_text_set(obj,aligned); ++ free (aligned); ++ } else ++ elm_object_text_set(obj,txt); ++ free (txt); ++ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0); ++ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0); ++ elm_table_pack(table, obj, 1, row, 5, 1); ++ evas_object_show(obj); ++ row++; ++ } ++ if (!confirm_mode && (pinentry->error || pinentry->repeat_passphrase)) ++ { ++ /* Error Label */ ++ if (pinentry->error) ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->error); ++ else ++ txt = ""; ++ obj = elm_label_add(table); ++ evas_object_color_set(obj, 255, 0, 0, 255); ++ elm_object_text_set(obj,txt); ++ elm_object_style_set(obj,"slide_bounce"); ++ elm_label_slide_duration_set(obj, 10); ++ elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_ALWAYS); ++ elm_label_slide_go(obj); ++ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0); ++ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0); ++ elm_table_pack(table, obj, 1, row, 5, 1); ++ evas_object_show(obj); ++ if (pinentry->error) ++ free (txt); ++ row++; ++ } ++ ++ qualitybar = NULL; ++ ++ if (!confirm_mode) ++ { ++ ++ if (pinentry->prompt) ++ { ++ /* Entry/Prompt Label */ ++ obj = elm_label_add(table); ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->prompt); ++ elm_object_text_set(obj,txt); ++ free (txt); ++ evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND); ++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); ++ elm_table_pack(table, obj, 1, row, 1, 1); ++ evas_object_show(obj); ++ } ++ ++ entry = elm_entry_add(table); ++ elm_entry_scrollable_set(entry, EINA_TRUE); ++ elm_scroller_policy_set(entry, ++ ELM_SCROLLER_POLICY_OFF, ++ ELM_SCROLLER_POLICY_OFF); ++ elm_entry_password_set(entry, EINA_TRUE); ++ elm_entry_single_line_set(entry, EINA_TRUE); ++ evas_object_size_hint_weight_set(entry, 0, 0); ++ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0); ++ elm_table_pack(table, entry, 2, row, 4, 1); ++ evas_object_smart_callback_add(entry, ++ "changed", ++ changed_text_handler, ++ NULL); ++ evas_object_show(entry); ++ row++; ++ ++ /* Check box */ ++ obj = elm_check_add(table); ++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); ++ elm_table_pack(table, obj, 1, row, 1, 1); ++ evas_object_smart_callback_add(obj, "changed", on_check, NULL); ++ evas_object_show(obj); ++ ++ /* Check Label */ ++ check_label = elm_label_add(table); ++ on_check((void *)NULL, obj, (void *)NULL); ++ elm_table_pack(table, check_label, 2, row, 4, 1); ++ evas_object_show(check_label); ++ row++; ++ ++ if (pinentry->quality_bar) ++ { ++ /* Quality Bar Label */ ++ obj = elm_label_add(table); ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, ++ pinentry->quality_bar); ++ elm_object_text_set(obj,txt); ++ free (txt); ++ evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND); ++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); ++ elm_table_pack(table, obj, 1, row, 1, 1); ++ evas_object_show(obj); ++ ++ qualitybar = elm_progressbar_add(table); ++ evas_object_color_set(qualitybar, 255, 0, 0, 255); ++ evas_object_show(qualitybar); ++ if (pinentry->quality_bar_tt) ++ elm_object_tooltip_text_set (qualitybar, ++ pinentry->quality_bar_tt); ++ evas_object_size_hint_weight_set(qualitybar, EVAS_HINT_EXPAND, 0); ++ evas_object_size_hint_align_set(qualitybar, EVAS_HINT_FILL, 0); ++ elm_table_pack(table, qualitybar, 2, row, 4, 1); ++ row++; ++ } ++ ++ if (pinentry->repeat_passphrase) ++ { ++ /* Repeat Label */ ++ obj = elm_label_add(table); ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, ++ pinentry->repeat_passphrase); ++ elm_object_text_set(obj,txt); ++ free (txt); ++ evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND); ++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL); ++ elm_table_pack(table, obj, 1, row, 1, 1); ++ evas_object_show(obj); ++ ++ repeat_entry = elm_entry_add(table); ++ elm_entry_scrollable_set(repeat_entry, EINA_TRUE); ++ elm_scroller_policy_set(repeat_entry, ++ ELM_SCROLLER_POLICY_OFF, ++ ELM_SCROLLER_POLICY_OFF); ++ elm_entry_password_set(repeat_entry, EINA_TRUE); ++ elm_entry_single_line_set(repeat_entry, EINA_TRUE); ++ evas_object_size_hint_weight_set(repeat_entry, 0, 0); ++ evas_object_size_hint_align_set(repeat_entry, EVAS_HINT_FILL, 0); ++ elm_table_pack(table, repeat_entry, 2, row, 4, 1); ++ evas_object_smart_callback_add (repeat_entry, "activated", ++ enter_callback, NULL); ++ evas_object_show(repeat_entry); ++ evas_object_smart_callback_add (entry, ++ "activated", ++ enter_callback, ++ repeat_entry); ++ evas_object_smart_callback_add(repeat_entry, ++ "activated", ++ on_click, ++ (void *) CONFIRM_OK); ++ row++; ++ } ++ else ++ evas_object_smart_callback_add(entry, ++ "activated", ++ on_click, ++ (void *) CONFIRM_OK); ++ } ++ ++ /* Cancel Button */ ++ if (!pinentry->one_button) ++ { ++ obj = elm_button_add(table); ++ icon = elm_icon_add (table); ++ evas_object_size_hint_aspect_set (icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1); ++ if (elm_icon_standard_set (icon, "dialog-cancel") || ++ elm_icon_standard_set (icon, "window-close")) ++ { ++ evas_object_size_hint_min_set(icon, ++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE), ++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE)); ++ elm_object_part_content_set(obj, "icon", icon); ++ evas_object_show (icon); ++ } ++ else ++ evas_object_del(icon); ++ if (pinentry->cancel || pinentry->default_cancel) ++ { ++ if(pinentry->cancel) ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->cancel); ++ else ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, ++ pinentry->default_cancel); ++ if(txt[0]=='_') ++ elm_object_text_set(obj,txt+1); ++ else ++ elm_object_text_set(obj,txt); ++ btn_txt_len = ELM_SCALE_SIZE(strlen(txt) * (PADDING * 1.5)); ++ free (txt); ++ } ++ else ++ elm_object_text_set(obj, "Cancel"); //STOCK_CANCEL ++ evas_object_size_hint_align_set(obj, 0, 0); ++ if(btn_txt_len>ELM_SCALE_SIZE(BUTTON_WIDTH)) ++ evas_object_size_hint_min_set(obj, ++ btn_txt_len, ++ ELM_SCALE_SIZE(BUTTON_HEIGHT)); ++ else ++ evas_object_size_hint_min_set(obj, ++ ELM_SCALE_SIZE(BUTTON_WIDTH), ++ ELM_SCALE_SIZE(BUTTON_HEIGHT)); ++ elm_table_pack(table, obj, 4, row, 1, 1); ++ evas_object_smart_callback_add(obj, ++ "clicked", ++ on_click, ++ (void *) CONFIRM_CANCEL); ++ evas_object_show(obj); ++ } ++ ++ /* OK Button */ ++ obj = elm_button_add(table); ++ icon = elm_icon_add (table); ++ evas_object_size_hint_aspect_set (icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1); ++ if (elm_icon_standard_set (icon, "dialog-ok") || ++ elm_icon_standard_set (icon, "list-add")) ++ { ++ evas_object_size_hint_min_set(icon, ++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE), ++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE)); ++ elm_object_part_content_set(obj, "icon", icon); ++ evas_object_show (icon); ++ } ++ else ++ evas_object_del(icon); ++ if (pinentry->ok || pinentry->default_ok) ++ { ++ if(pinentry->ok) ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->ok); ++ else ++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->default_ok); ++ if(txt[0]=='_') ++ elm_object_text_set(obj,txt+1); ++ else ++ elm_object_text_set(obj,txt); ++ ok_len = ELM_SCALE_SIZE(strlen(txt) * (PADDING * 1.5)); ++ if(ok_len>btn_txt_len) ++ btn_txt_len = ok_len; ++ free (txt); ++ } ++ else ++ elm_object_text_set(obj,"OK"); //STOCK_OK ++ evas_object_size_hint_align_set(obj, 0, 0); ++ if(btn_txt_len>ELM_SCALE_SIZE(BUTTON_WIDTH)) ++ evas_object_size_hint_min_set(obj, ++ btn_txt_len, ++ ELM_SCALE_SIZE(BUTTON_HEIGHT)); ++ else ++ evas_object_size_hint_min_set(obj, ++ ELM_SCALE_SIZE(BUTTON_WIDTH), ++ ELM_SCALE_SIZE(BUTTON_HEIGHT)); ++ elm_table_pack(table, obj, 5, row, 1, 1); ++ evas_object_smart_callback_add(obj, "clicked", on_click, (void *) CONFIRM_OK); ++ evas_object_show(obj); ++ ++ /* Key/Lock Icon */ ++ obj = elm_icon_add (win); ++ evas_object_size_hint_aspect_set (obj, EVAS_ASPECT_CONTROL_BOTH, 1, 1); ++ if (elm_icon_standard_set (obj, "dialog-password")) ++ { ++ double ic_size = WIDTH/5; ++ if(row==0) ++ ic_size = ic_size/3.5; ++ else if(row<4) ++ ic_size = ic_size - ic_size/row; ++ evas_object_size_hint_min_set(obj, ++ ELM_SCALE_SIZE(ic_size), ++ ELM_SCALE_SIZE(ic_size)); ++ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); ++ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0.5); ++ elm_table_pack(table, obj, 0, 0, 1, row? row:1); ++ evas_object_show (obj); ++ } ++ else ++ evas_object_del(obj); ++ ++ /* Box for padding */ ++ obj = elm_box_add (win); ++ elm_box_pack_end (obj, table); ++ evas_object_show (obj); ++ ++ elm_win_resize_object_add(win,obj); ++ evas_object_show(win); ++ ++ if(entry) ++ elm_object_focus_set (entry, EINA_TRUE); ++ ++ if (pinentry->timeout > 0) ++ timer = ecore_timer_add (pinentry->timeout, ++ (Ecore_Task_Cb)timeout_cb, ++ pinentry); ++} ++ ++static int ++efl_cmd_handler (pinentry_t pe) ++{ ++ int want_pass = !!pe->pin; ++ ++ got_input = EINA_FALSE; ++ pinentry = pe; ++ confirm_value = CONFIRM_CANCEL; ++ passphrase_ok = 0; ++ confirm_mode = want_pass ? 0 : 1; ++ /* init ecore-x explicitly using DISPLAY since this can launch ++ * from console ++ */ ++ if (pe->display) ++ ecore_x_init (pe->display); ++ elm_init (pargc, pargv); ++ create_window (); ++ ecore_main_loop_begin (); ++ ++ if (timer) ++ { ++ ecore_timer_del (timer); ++ timer = NULL; ++ } ++ ++ if (confirm_value == CONFIRM_CANCEL || grab_failed) ++ pe->canceled = 1; ++ ++ pinentry = NULL; ++ if (want_pass) ++ { ++ if (passphrase_ok && pe->pin) ++ return strlen (pe->pin); ++ else ++ return -1; ++ } ++ else ++ return (confirm_value == CONFIRM_OK) ? 1 : 0; ++} ++ ++int ++main (int argc, char *argv[]) ++{ ++ pinentry_init (PGMNAME); ++ ++#ifdef FALLBACK_CURSES ++ if (pinentry_have_display (argc, argv)) ++ { ++#endif ++ ++ pinentry_cmd_handler = efl_cmd_handler; ++ pargc = argc; ++ pargv = argv; ++ ++#ifdef FALLBACK_CURSES ++ } ++ else ++ { ++ pinentry_cmd_handler = curses_cmd_handler; ++ } ++#endif ++ ++ pinentry_parse_opts (argc, argv); ++ if (pinentry_loop ()) ++ return 1; ++ ++ return 0; ++} +-- +2.8.0.rc3 + diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index e158df2000..03db842531 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -1983,6 +1983,31 @@ (define-public python2-s3transfer `(("python2-futures" ,python2-futures) ,@(package-native-inputs base)))))) +(define-public python-slimit + (package + (name "python-slimit") + (version "0.8.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "slimit" version ".zip")) + (sha256 + (base32 + "02vj2x728rs1127q2nc27frrqra4fczivnb7gch6n5lzi7pxqczl")))) + (build-system python-build-system) + (native-inputs + `(("unzip" ,unzip))) + (propagated-inputs + `(("python-ply" ,python-ply))) + (home-page "https://slimit.readthedocs.io/") + (synopsis "JavaScript minifier, parser and lexer written in Python") + (description + "SlimIt is a JavaScript minifier written in Python. It compiles +JavaScript into more compact code so that it downloads and runs faster. +SlimIt also provides a library that includes a JavaScript parser, lexer, +pretty printer and a tree visitor.") + (license license:expat))) + (define-public python-flask-restful (package (name "python-flask-restful") @@ -2168,6 +2193,25 @@ (define-public python-flask-htmlmin (define-public python2-flask-htmlmin (package-with-python2 python-flask-htmlmin)) +(define-public python-jsmin + (package + (name "python-jsmin") + (version "2.2.2") + (source + (origin + (method url-fetch) + (uri (pypi-uri "jsmin" version)) + (sha256 + (base32 + "0fsmqbjvpxvff0984x7c0y8xmf49ax9mncz48b9xjx8wrnr9kpxn")))) + (build-system python-build-system) + (home-page "https://github.com/tikitu/jsmin/") + (synopsis "Python JavaScript minifier") + (description + "@code{jsmin} is a JavaScript minifier, usable from both Python code and +on the command line.") + (license license:expat))) + (define-public python-flask-login (package (name "python-flask-login") diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index 07ab0e5293..52c130e1f3 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -14667,3 +14667,25 @@ (define-public python-precis-i18n "This module implements the PRECIS Framework as described in RFC 8264, RFC 8265 and RFC 8266.") (license license:expat))) + +(define-public python-wikidata + (package + (name "python-wikidata") + (version "0.6.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "Wikidata" version)) + (sha256 + (base32 + "08nlnydddfp1jj0cdmshvld1irzngbp3dij928wqsg9ziklm6mw9")))) + (build-system python-build-system) + (propagated-inputs + `(("python-babel" ,python-babel))) + (home-page "https://github.com/dahlia/wikidata") + (synopsis "Wikidata client library") + (description + "This package provides a Python interface to +@url{https://www.wikidata.org/, Wikidata}.") + (properties '((upstream-name . "Wikidata"))) + (license license:gpl3+))) diff --git a/gnu/services/games.scm b/gnu/services/games.scm index b9d78e078d..b743f6a4b6 100644 --- a/gnu/services/games.scm +++ b/gnu/services/games.scm @@ -65,7 +65,8 @@ (define wesnothd-shepherd-service (modules '((gnu build shepherd))) (start #~(make-forkexec-constructor/container (list #$(file-append package "/bin/wesnothd") - "-p" #$(number->string port)))) + "-p" #$(number->string port)) + #:user "wesnothd" #:group "wesnothd")) (stop #~(make-kill-destructor))))))) (define wesnothd-service-type diff --git a/guix/scripts/describe.scm b/guix/scripts/describe.scm index e59502076c..d817d7f7ca 100644 --- a/guix/scripts/describe.scm +++ b/guix/scripts/describe.scm @@ -40,7 +40,11 @@ (define %options (lambda (opt name arg result) (unless (member arg '("human" "channels")) (leave (G_ "~a: unsupported output format~%") arg)) - (alist-cons 'format 'channels result))) + (alist-cons 'format (string->symbol arg) result))) + (option '(#\p "profile") #t #f + (lambda (opt name arg result) + (alist-cons 'profile (canonicalize-profile arg) + result))) (option '(#\h "help") #f #f (lambda args (show-help) @@ -58,6 +62,8 @@ (define (show-help) Display information about the channels currently in use.\n")) (display (G_ " -f, --format=FORMAT display information in the given FORMAT")) + (display (G_ " + -p, --profile=PROFILE display information about PROFILE")) (newline) (display (G_ " -h, --help display this help and exit")) @@ -78,11 +84,11 @@ (define (display-package-search-path fmt) (format #t (G_ "~%;; warning: GUIX_PACKAGE_PATH=\"~a\"~%") string)))))) -(define (display-checkout-info fmt) +(define* (display-checkout-info fmt #:optional directory) "Display information about the current checkout according to FMT, a symbol denoting the requested format. Exit if the current directory does not lie within a Git checkout." - (let* ((program (car (command-line))) + (let* ((program (or directory (car (command-line)))) (directory (catch 'git-error (lambda () (repository-discover (dirname program))) @@ -146,15 +152,16 @@ (define number ;;; (define (guix-describe . args) - (let* ((opts (args-fold* args %options - (lambda (opt name arg result) - (leave (G_ "~A: unrecognized option~%") - name)) - cons - %default-options)) - (format (assq-ref opts 'format))) + (let* ((opts (args-fold* args %options + (lambda (opt name arg result) + (leave (G_ "~A: unrecognized option~%") + name)) + cons + %default-options)) + (format (assq-ref opts 'format)) + (profile (or (assq-ref opts 'profile) (current-profile)))) (with-error-handling - (match (current-profile) + (match profile (#f (display-checkout-info format)) (profile diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm index e477bf0ddc..2314f3b28c 100644 --- a/guix/scripts/lint.scm +++ b/guix/scripts/lint.scm @@ -33,6 +33,7 @@ (define-module (guix scripts lint) #:use-module (guix packages) #:use-module (guix licenses) #:use-module (guix records) + #:use-module (guix grafts) #:use-module (guix ui) #:use-module (guix upstream) #:use-module (guix utils) @@ -774,30 +775,37 @@ (define (check-mirror-uri uri) ;XXX: could be optimized (define (check-derivation package) "Emit a warning if we fail to compile PACKAGE to a derivation." - (catch #t - (lambda () - (guard (c ((nix-protocol-error? c) - (emit-warning package - (format #f (G_ "failed to create derivation: ~a") - (nix-protocol-error-message c)))) - ((message-condition? c) - (emit-warning package - (format #f (G_ "failed to create derivation: ~a") - (condition-message c))))) - (with-store store - ;; Disable grafts since it can entail rebuilds. - (package-derivation store package #:graft? #f) + (define (try system) + (catch #t + (lambda () + (guard (c ((nix-protocol-error? c) + (emit-warning package + (format #f (G_ "failed to create ~a derivation: ~a") + system + (nix-protocol-error-message c)))) + ((message-condition? c) + (emit-warning package + (format #f (G_ "failed to create ~a derivation: ~a") + system + (condition-message c))))) + (with-store store + ;; Disable grafts since it can entail rebuilds. + (parameterize ((%graft? #f)) + (package-derivation store package system #:graft? #f) - ;; If there's a replacement, make sure we can compute its - ;; derivation. - (match (package-replacement package) - (#f #t) - (replacement - (package-derivation store replacement #:graft? #f)))))) - (lambda args - (emit-warning package - (format #f (G_ "failed to create derivation: ~s~%") - args))))) + ;; If there's a replacement, make sure we can compute its + ;; derivation. + (match (package-replacement package) + (#f #t) + (replacement + (package-derivation store replacement system + #:graft? #f))))))) + (lambda args + (emit-warning package + (format #f (G_ "failed to create ~a derivation: ~s") + system args))))) + + (for-each try (package-supported-systems package))) (define (check-license package) "Warn about type errors of the 'license' field of PACKAGE." diff --git a/tests/lint.scm b/tests/lint.scm index ab0e8b9a8c..300153e24e 100644 --- a/tests/lint.scm +++ b/tests/lint.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013 Cyril Roelandt ;;; Copyright © 2014, 2015, 2016 Eric Bavier -;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès +;;; Copyright © 2014, 2015, 2016, 2017, 2018 Ludovic Courtès ;;; Copyright © 2015, 2016 Mathieu Lirzin ;;; Copyright © 2016 Hartmut Goebel ;;; Copyright © 2017 Alex Kost @@ -365,7 +365,7 @@ (define-syntax-rule (with-warnings body ...) (arguments '(#:imported-modules (invalid-module)))))) (check-derivation pkg))) - "failed to create derivation"))) + "failed to create"))) (test-assert "license: invalid license" (string-contains