From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:21:48 2018 Received: (at submit) by debbugs.gnu.org; 28 Oct 2018 09:21:48 +0000 Received: from localhost ([127.0.0.1]:46679 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhGW-0000QT-K9 for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:21:48 -0400 Received: from eggs.gnu.org ([208.118.235.92]:38827) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhGV-0000QH-Df for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:21:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gGhGP-0001EN-BU for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:21:41 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_20 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:37583) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gGhGO-0001Dq-2H for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:21:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48432) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gGhGN-0002xo-Bj for guix-patches@gnu.org; Sun, 28 Oct 2018 05:21:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gGhGJ-0001Br-HR for guix-patches@gnu.org; Sun, 28 Oct 2018 05:21:39 -0400 Received: from mira.cbaines.net ([2a01:7e00::f03c:91ff:fe69:8da9]:60346) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gGhGF-00019Y-Ug for guix-patches@gnu.org; Sun, 28 Oct 2018 05:21:33 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id 3A40A1672F; Sun, 28 Oct 2018 09:21:30 +0000 (GMT) Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id 0DF13165AF for ; Sun, 28 Oct 2018 09:21:30 +0000 (GMT) Received: from phact (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 034ebde7 for ; Sun, 28 Oct 2018 09:21:29 +0000 (UTC) User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: guix-patches@gnu.org Subject: [PATCH 0/7] Add patchwork package and service. Date: Sun, 28 Oct 2018 09:21:26 +0000 Message-ID: <87y3aie8a1.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.0 (----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) --=-=-= Content-Type: text/plain These patches add a package for patchwork, a web-based patch tracking system, along with some missing dependencies and the beginnings of a system service and test. Everything up to the patchwork package should be ready to merge, but the patchwork package, service and system test is currently very rough and unready. Christopher Baines (7): gnu: Add python-jsmin. gnu: Add python-slimit. gnu: Add python-django-pipeline. gnu: Add python-django-jinja. gnu: Add python-django-debug-toolbar. gnu: Add patchwork. services: Add patchwork. gnu/packages/django.scm | 130 ++++++++++++++++ gnu/packages/patchutils.scm | 95 ++++++++++++ gnu/packages/python-web.scm | 50 +++++++ gnu/services/web.scm | 291 +++++++++++++++++++++++++++++++++++- gnu/tests/web.scm | 104 ++++++++++++- 5 files changed, 668 insertions(+), 2 deletions(-) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlvVf5dfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9Xe97Q//dPZXf+LyaQLJco+D0HcJDqQ3Zzd96GrxJEH1Zj8iMBppyrTfIZZ1eqwF kidJxEn/6AHBIRRoRi5YgqVYi6V4xLNQQAd31xUs0NSUtoUP/l7TzXHFUqnMLbq1 5Ck2HwyESV8McMlSBnYtV4tXf8qFg9toG78DVWvNL4R0hHdC8ydnHV4tsC8II0b3 xDCnPLFYYKv71wv1xtUr80+O3n1/fXZEhiyOWuCNnJcS5IZfJF3sxb4bBICqH6Cd 8Lm0cWpkyOsUgRaPRsVvWaJJDXHIZMXvcG4e1wC1eAKLY8sMiPihJ9mvDY0/OFrU 2MaqcpEYI6sAfm1OQujEUViqrPb3ARyU8UomO/2p0XH5HVWwy9dLqbacLUncCdkk 9HOPMROh7lNulGz4dWGDOPJXKLZHL7o8chZUZ9JJXrISpAQc6y+ZdA8guXLt8rtg 78hWWyJdDS7oNg4TLGxxb5XZd5gUOjx5VN6tBGyHFIzUcjGXjZMabb47d8EBjQ8z JCBuYuzBpReqlXA9q7NWbQn4UjOWVA6D5oV6gXjADw8ggNjNOD8EJmddSNeBWgn/ r5y8Go0kut2cRvxYv41qg1d9XqJ3iZqnfnUOTdmHobdNMo7K3H0wRIG8BIVhHHa5 MTYcPYd4RJ+kHMU7wxB8SlFOyzv0n792/ZrW9yIF0UbfKxNj9pU= =jUoC -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:05 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:05 +0000 Received: from localhost ([127.0.0.1]:46690 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLd-0000Yq-9F for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:05 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44440 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLb-0000YG-Jn for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:04 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id E673A1672F; Sun, 28 Oct 2018 09:27:02 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id 9AA2E1672F for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id fe756f41 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 1/7] gnu: Add python-jsmin. Date: Sun, 28 Oct 2018 09:26:56 +0000 Message-Id: <20181028092702.22549-1-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/python-web.scm (python-jsmin, python2-jsmin): New variables. --- gnu/packages/python-web.scm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index f8052458a..c00992c71 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -2130,6 +2130,28 @@ It comes with safe defaults and easily configurable options.") (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 python2-jsmin + (package-with-python2 python-jsmin)) + (define-public python-flask-login (package (name "python-flask-login") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:05 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:06 +0000 Received: from localhost ([127.0.0.1]:46692 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLd-0000Yx-IP for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:05 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44444 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLb-0000YH-K2 for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:04 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id 02C2116759; Sun, 28 Oct 2018 09:27:03 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id AF9DA16750 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id bf8d0fc4 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 2/7] gnu: Add python-slimit. Date: Sun, 28 Oct 2018 09:26:57 +0000 Message-Id: <20181028092702.22549-2-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> References: <20181028092702.22549-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/python-web.scm (python-slimit, python2-slimit): New variables. --- gnu/packages/python-web.scm | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index c00992c71..a7af71bd5 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -1945,6 +1945,34 @@ transfers.") `(("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 + "@code{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 python2-slimit + (package-with-python2 python-slimit)) + (define-public python-flask-restful (package (name "python-flask-restful") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:06 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:06 +0000 Received: from localhost ([127.0.0.1]:46694 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLd-0000ZA-V8 for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:06 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44450 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLb-0000YK-Qh for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:04 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id 63BE21675E; Sun, 28 Oct 2018 09:27:03 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id 1569F16750 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:03 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id b01b9af8 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 5/7] gnu: Add python-django-debug-toolbar. Date: Sun, 28 Oct 2018 09:27:00 +0000 Message-Id: <20181028092702.22549-5-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> References: <20181028092702.22549-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/django.scm (python-django-debug-toolbar, python2-django-debug-toolbar): New variables. --- gnu/packages/django.scm | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index 48f36835d..3a761bf60 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -265,6 +265,44 @@ account authentication.") (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 various debug information +about the current request/response.") + (license license:bsd-3))) + +(define-public python2-django-debug-toolbar + (package-with-python2 python-django-debug-toolbar)) + (define-public python-django-gravatar2 (package (name "python-django-gravatar2") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:11 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:11 +0000 Received: from localhost ([127.0.0.1]:46696 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLj-0000ZR-8a for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:11 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44454 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLc-0000YL-3Z for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:04 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id A0F051675D; Sun, 28 Oct 2018 09:27:03 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id D7CD616754 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 39bb4704 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 4/7] gnu: Add python-django-jinja. Date: Sun, 28 Oct 2018 09:26:59 +0000 Message-Id: <20181028092702.22549-4-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> References: <20181028092702.22549-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/django.scm (python-django-jinja, python2-django-jinja): New variables. --- gnu/packages/django.scm | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index 589ba282e..48f36835d 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -338,6 +338,55 @@ merging, minifying and compiling CSS and Javascript files.") (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 and nonobstructive jinja2 backend for Django") + (description + "Jinja2 provides certain advantages over the native system of Django, for +example, explicit calls to callable from templates and better performance. +@code{django-jinja} is a alternative to the jinja2 backend built in to Django.") + (license license:bsd-3))) + +(define-public python2-django-jinja + (let ((base (package-with-python2 (strip-python2-variant python-django-jinja)))) + (package + (inherit base) + (native-inputs + `(("python2-mock" ,python2-mock) + ,@(package-native-inputs base)))))) + (define-public python-django-jsonfield (package (name "python-django-jsonfield") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:11 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:11 +0000 Received: from localhost ([127.0.0.1]:46698 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLj-0000ZT-IE for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:11 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44456 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLc-0000Yd-PG for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:05 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id 4957616750; Sun, 28 Oct 2018 09:27:04 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id C49CF16753 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id cc9cd7b9 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 3/7] gnu: Add python-django-pipeline. Date: Sun, 28 Oct 2018 09:26:58 +0000 Message-Id: <20181028092702.22549-3-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> References: <20181028092702.22549-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/django.scm (python-django-pipeline, python2-django-pipeline): New variables. --- gnu/packages/django.scm | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index dea925e56..589ba282e 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -518,6 +518,49 @@ project.") (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 python2-django-pipeline + (package-with-python2 python-django-pipeline)) + (define-public python-django-redis (package (name "python-django-redis") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:12 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:12 +0000 Received: from localhost ([127.0.0.1]:46700 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLj-0000Za-SU for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:12 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44458 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLc-0000Ye-Pi for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:05 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id 6319016753; Sun, 28 Oct 2018 09:27:04 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id 355A416758 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:03 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 07d34f8f for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 6/7] gnu: Add patchwork. Date: Sun, 28 Oct 2018 09:27:01 +0000 Message-Id: <20181028092702.22549-6-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> References: <20181028092702.22549-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --- gnu/packages/patchutils.scm | 95 +++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm index 688e62cdc..7dabda9ee 100644 --- a/gnu/packages/patchutils.scm +++ b/gnu/packages/patchutils.scm @@ -29,6 +29,8 @@ #:use-module (gnu packages ed) #:use-module (gnu packages base) #:use-module (gnu packages bash) + #:use-module (gnu packages databases) + #:use-module (gnu packages django) #:use-module (gnu packages file) #:use-module (gnu packages gawk) #:use-module (gnu packages gettext) @@ -240,3 +242,96 @@ hexadecimal and ASCII (or EBCDIC). It can also display two files at once, and highlight the differences between them. It works well with large files (up to 4 GiB).") (license gpl2+))) + +(define-public patchwork + (package + (name "patchwork") + (version "2.1.1") + (source (origin + (method url-fetch) + (uri (string-append + "https://github.com/getpatchwork/patchwork/archive/v" + version ".tar.gz")) + (sha256 + (base32 + "1q4i46gwwxvr8gjj983r8aacfsssp062dzi29ha7zba380fsxayy")) + (file-name (string-append name "-" version)))) + (build-system python-build-system) + (arguments + `(;; TODO: Tests require a running database + #:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (add-after 'unpack 'patch-wsgi.py + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "patchwork/wsgi.py" + (("import os") + (string-append + "import os, sys + +sys.path.extend('" (string-append (getenv "PYTHONPATH") ":" (site-packages inputs outputs)) "'.split(':'))")) + (("'patchwork\\.settings\\.production'") + "os.getenv('DJANGO_SETTINGS_MODULE', 'guix.patchwork.settings')")))) + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (or (not tests?) + (begin + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") + (invoke + "python" "-Wonce" "./manage.py" "test" "--noinput") + #t)))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (for-each (lambda (directory) + (copy-recursively + directory + (string-append (site-packages inputs outputs) + "/" directory))) + '("patchwork" + "templates")) + (delete-file-recursively (string-append + (site-packages inputs outputs) + "patchwork/tests")) + (copy-recursively "htdocs" + (string-append + out "/share/patchwork/htdocs")) + (copy-recursively "lib" + (string-append + out "/share/doc/" ,name "-" ,version))) + #t)) + (add-after 'install 'install-patchwork-admin + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/bin")) + (call-with-output-file (string-append out "/bin/patchwork-admin") + (lambda (port) + (display "#!/usr/bin/env python3 +import os, sys + +if __name__ == \"__main__\": + os.environ.setdefault( + \"DJANGO_SETTINGS_MODULE\", + \"guix.patchwork.settings\" + ) + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv)" port))) + (chmod (string-append out "/bin/patchwork-admin") #o555)) + #t))))) + (inputs + `(("python-wrapper" ,python-wrapper))) + (propagated-inputs + `(("python-django" ,python-django) + ;; TODO: Make this configurable + ("python-psycopg2" ,python-psycopg2) + ("python-django-filter" ,python-django-filter) + ("python-djangorestframework" ,python-djangorestframework) + ("python-django-debug-toolbar" ,python-django-debug-toolbar))) + (synopsis "") + (description "") + (home-page "") + (license ""))) -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 28 05:27:12 2018 Received: (at 33185) by debbugs.gnu.org; 28 Oct 2018 09:27:12 +0000 Received: from localhost ([127.0.0.1]:46702 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLk-0000Zh-7A for submit@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:12 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:44460 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGhLc-0000Yf-T8 for 33185@debbugs.gnu.org; Sun, 28 Oct 2018 05:27:05 -0400 Received: by mira.cbaines.net (Postfix, from userid 113) id 7B22716754; Sun, 28 Oct 2018 09:27:04 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (127.103.9.51.dyn.plus.net [51.9.103.127]) by mira.cbaines.net (Postfix) with ESMTPSA id 564061675C for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:03 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 686f03d0 for <33185@debbugs.gnu.org>; Sun, 28 Oct 2018 09:27:02 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 7/7] services: Add patchwork. Date: Sun, 28 Oct 2018 09:27:02 +0000 Message-Id: <20181028092702.22549-7-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> References: <20181028092702.22549-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --- gnu/services/web.scm | 291 ++++++++++++++++++++++++++++++++++++++++++- gnu/tests/web.scm | 104 +++++++++++++++- 2 files changed, 393 insertions(+), 2 deletions(-) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 1edb1f4d3..6d0bfee94 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -32,12 +32,16 @@ #:use-module (gnu system pam) #:use-module (gnu system shadow) #:use-module (gnu packages admin) + #:use-module (gnu packages databases) #:use-module (gnu packages web) + #:use-module (gnu packages patchutils) #:use-module (gnu packages php) + #:use-module (gnu packages python) #:use-module (gnu packages guile) #:use-module (gnu packages logging) #:use-module (guix records) #:use-module (guix modules) + #:use-module (guix utils) #:use-module (guix gexp) #:use-module ((guix store) #:select (text-file)) #:use-module ((guix utils) #:select (version-major)) @@ -205,7 +209,41 @@ varnish-configuration-parameters varnish-configuration-extra-options - varnish-service-type)) + varnish-service-type + + + patchwork-database-configuration + patchwork-database-configuration? + patchwork-database-configuration-engine + patchwork-database-configuration-name + patchwork-database-configuration-user + patchwork-database-configuration-password + patchwork-database-configuration-host + patchwork-database-configuration-port + + + patchwork-settings-module + patchwork-settings-module? + patchwork-settings-module-database-configuration + patchwork-settings-module-secret-key + patchwork-settings-module-allowed-hosts + patchwork-settings-module-default-from-email + patchwork-settings-module-static-url + patchwork-settings-module-admins + patchwork-settings-module-debug? + patchwork-settings-module-enable-rest-api? + patchwork-settings-module-enable-xmlrpc? + patchwork-settings-module-force-https-links? + patchwork-settings-module-extra-settings + + + patchwork-configuration + patchwork-configuration? + patchwork-configuration-patchwork + patchwork-configuration-settings-module + patchwork-configuration-domain + + patchwork-service-type)) ;;; Commentary: ;;; @@ -1256,3 +1294,254 @@ files.") varnish-shepherd-service))) (default-value (varnish-configuration)))) + + +;;; +;;; Patchwork +;;; + +(define-record-type* + patchwork-database-configuration make-patchwork-database-configuration + patchwork-database-configuration? + (engine patchwork-database-configuration-engine + (default "django.db.backends.postgresql_psycopg2")) + (name patchwork-database-configuration-name + (default "patchwork")) + (user patchwork-database-configuration-user + (default "")) + (password patchwork-database-configuration-password + (default "")) + (host patchwork-database-configuration-host + (default "")) + (port patchwork-database-configuration-port + (default ""))) + +(define-record-type* + patchwork-settings-module make-patchwork-settings-module + patchwork-settings-module? + (database-configuration patchwork-settings-module-database-configuration + (default (patchwork-database-configuration))) + (secret-key patchwork-settings-module-secret-key) + (allowed-hosts patchwork-settings-module-allowed-hosts) + (default-from-email patchwork-settings-module-default-from-email) + (static-url patchwork-settings-module-static-url + (default "/static/")) + (admins patchwork-settings-module-admins + (default '())) + (debug? patchwork-settings-module-debug? + (default #f)) + (enable-rest-api? patchwork-settings-module-enable-rest-api? + (default #t)) + (enable-xmlrpc? patchwork-settings-module-enable-xmlrpc? + (default #t)) + (force-https-links? patchwork-settings-module-force-https-links? + (default #t)) + (extra-settings patchwork-settings-module-extra-settings + (default ""))) + +(define-record-type* + patchwork-configuration make-patchwork-configuration + patckwork-configuration? + (patchwork patchwork-configuration-patchwork + (default patchwork)) + (settings-module patchwork-configuration-settings-module) + (domain patchwork-configuration-domain)) + +(define-gexp-compiler (patchwork-settings-module-compiler + (file ) system target) + (match file + (($ database-configuration secret-key + allowed-hosts default-from-email + static-url admins debug? enable-rest-api? + enable-xmlrpc? force-https-links? + extra-configuration) + (gexp->derivation + "patchwork-settings" + (with-imported-modules '((guix build utils)) + #~(let ((output #$output)) + (define (create-__init__.py filename) + (call-with-output-file filename + (lambda (port) (display "" port)))) + + (use-modules (guix build utils) + (srfi srfi-1)) + + (mkdir-p (string-append output "/guix/patchwork")) + (create-__init__.py + (string-append output "/guix/__init__.py")) + (create-__init__.py + (string-append output "/guix/patchwork/__init__.py")) + + (call-with-output-file + (string-append output "/guix/patchwork/settings.py") + (lambda (port) + (display + (string-append "from patchwork.settings.base import * + +# Configuration from Guix +SECRET_KEY = '" #$secret-key "' + +ALLOWED_HOSTS = [ +" #$(string-concatenate + (map (lambda (allowed-host) + (string-append " '" allowed-host "'\n")) + allowed-hosts)) +"] + +DEBUG = " #$(if debug? "True" "False") " + +DATABASES = { + 'default': { +" #$(match database-configuration + (($ + engine name user password host port) + (string-append + " 'ENGINE': '" engine "',\n" + " 'NAME': '" name "',\n" + " 'USER': '" user "',\n" + " 'PASSWORD': '" password "',\n" + " 'HOST': '" host "',\n" + " 'PORT': '" port "',\n"))) " + }, +} + +" #$(if debug? + #~(string-append "STATIC_ROOT = '" #$(file-append patchwork "/share/patchwork/htdocs") "'") + #~(string-append "STATIC_URL = '" #$static-url "'")) " + +STATICFILES_STORAGE = ( + 'django.contrib.staticfiles.storage.StaticFilesStorage' +) + +# Guix Extra Configuration +" #$extra-configuration " +") port))) + #t)) + #:local-build? #t)))) + +(define (patchwork-wsgi-wrapper patchwork) + (define patchwork-wsgi.py + (file-append patchwork + (string-append + "/lib/python" + (version-major+minor + (package-version python)) + "/site-packages/patchwork/wsgi.py"))) + + (mixed-text-file + "patchwork-wsgi.py" + "import os\n" + "\n" + "exec(open(\"" patchwork-wsgi.py "\").read())\n")) + +(define patchwork-httpd-configuration + (match-lambda + (($ patchwork settings-module + domain) + + (define wsgi.py (patchwork-wsgi-wrapper patchwork)) + + (list "WSGISocketPrefix /var/run/mod_wsgi" + (list "LoadModule wsgi_module " + (file-append mod-wsgi "/modules/mod_wsgi.so")) + (httpd-virtualhost + "*:8080" + `("ServerAdmin admin@example.com +ServerName " ,domain " + +LogFormat \"%v %h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" customformat +LogLevel info +CustomLog \"/var/log/httpd/" ,domain "-access_log\" customformat + +ErrorLog /var/log/httpd/error.log + +WSGIScriptAlias / " ,wsgi.py " +WSGIDaemonProcess patchwork user=httpd group=httpd processes=1 threads=2 display-name=%{GROUP} lang='en_US.UTF-8' locale='en_US.UTF-8' python-path=" ,settings-module " +WSGIProcessGroup patchwork + + + Require all granted + + +Alias /static " ,patchwork "/share/patchwork/htdocs + + AllowOverride None + Options MultiViews Indexes SymlinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS +")))))) + +(define (patchwork-setup-gexp settings-module) + (with-imported-modules (source-module-closure + '((guix build utils))) + #~(lambda () + (catch #t + (lambda () + (let ((pid (primitive-fork)) + (user (getpwnam "postgres"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + (primitive-exit + (if (and + (zero? + (system* #$(file-append postgresql "/bin/createuser") + "httpd")) + (zero? + (system* #$(file-append postgresql "/bin/createdb") + "-O" "httpd" "patchwork"))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))) + (let ((pid (primitive-fork)) + (user (getpwnam "httpd"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + ;; TODO Extract + (setenv "DJANGO_SECRET_KEY" "testsecretkey") + (setenv "DATABASE_NAME" "patchwork") + (setenv "PYTHONPATH" #$settings-module) + (primitive-exit + (if (and + (zero? + (system* #$(file-append patchwork + "/bin/patchwork-admin") + "migrate"))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid)))))) + (lambda (key . parameters) + (format (current-error-port) + "Uncaught throw to '~a: ~a\n" key parameters) + #f))))) + +(define patchwork-service-type + (service-type + (name 'patchwork-setup) + (extensions + (list (service-extension httpd-service-type + patchwork-httpd-configuration) + (service-extension + shepherd-root-service-type + (match-lambda + (($ patchwork settings-module + domain) + (list (shepherd-service + (requirement '(postgres)) + (provision '(patchwork-setup)) + (start (patchwork-setup-gexp settings-module)) + (stop #~(const #f)) + (respawn? #f) + (documentation "Setup patchwork.")))))))) + (description + "patchwork"))) diff --git a/gnu/tests/web.scm b/gnu/tests/web.scm index 319655396..fbdf78a03 100644 --- a/gnu/tests/web.scm +++ b/gnu/tests/web.scm @@ -28,15 +28,27 @@ #:use-module (gnu system vm) #:use-module (gnu services) #:use-module (gnu services web) + #:use-module (gnu services databases) #:use-module (gnu services networking) + #:use-module (gnu services shepherd) + #:use-module (gnu packages databases) + #:use-module (gnu packages patchutils) + #:use-module (gnu packages python) + #:use-module (gnu packages web) + #:use-module (guix packages) + #:use-module (guix modules) + #:use-module (guix records) #:use-module (guix gexp) #:use-module (guix store) + #:use-module (guix utils) + #:use-module (ice-9 match) #:export (%test-httpd %test-nginx %test-varnish %test-php-fpm %test-hpcguix-web - %test-tailon)) + %test-tailon + %test-patchwork)) (define %index.html-contents ;; Contents of the /index.html file. @@ -498,3 +510,93 @@ HTTP-PORT." (name "tailon") (description "Connect to a running Tailon server.") (value (run-tailon-test)))) + + +;;; +;;; Patchwork +;;; + +(define %patchwork-os + (simple-operating-system + (service dhcp-client-service-type) + (service httpd-service-type + (httpd-configuration + (config + (httpd-config-file + (listen '("8080")))))) + (service postgresql-service-type) + (service patchwork-service-type + (patchwork-configuration + (settings-module + (patchwork-settings-module + (secret-key "00000") + (allowed-hosts '("*")) + (default-from-email "") + (debug? #t))) + (domain "localhost"))))) + +(define* (run-patchwork-test) + "Run tests in %NGINX-OS, which has nginx running and listening on +HTTP-PORT." + (define os + (marionette-operating-system + %patchwork-os + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define forwarded-port 8080) + + (define vm + (virtual-machine + (operating-system os) + (port-forwardings `((8080 . ,forwarded-port))))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (srfi srfi-11) (srfi srfi-64) + (gnu build marionette) + (web uri) + (web client) + (web response)) + + (define marionette + (make-marionette (list #$vm))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "patchwork") + + (test-assert "httpd service running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (match (start-service 'httpd) + (#f #f) + (('service response-parts ...) + (match (assq-ref response-parts 'running) + ((#t) #t) + ((pid) (number? pid)))))) + marionette)) + + ;; Retrieve the index.html file we put in /srv. + (test-equal "http-get" + 200 + (let-values + (((response text) + (http-get #$(simple-format + #f "http://localhost:~A/" forwarded-port) + #:decode-body? #t))) + (response-code response))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "patchwork-test" test)) + +(define %test-patchwork + (system-test + (name "patchwork") + (description "") + (value (run-patchwork-test)))) -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:44:58 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:44:58 +0000 Received: from localhost ([127.0.0.1]:33355 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtq-0004Md-H9 for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:58 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51524 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFto-0004Ly-PW for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:57 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 2A1E716561; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id E8E8416561 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id aa066143 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 1/7] gnu: Add python-jsmin. Date: Sun, 4 Nov 2018 10:44:49 +0000 Message-Id: <20181104104455.3527-1-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/python-web.scm (python-jsmin, python2-jsmin): New variables. --- gnu/packages/python-web.scm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index eda796e01..3671454c2 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -2168,6 +2168,28 @@ It comes with safe defaults and easily configurable options.") (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 python2-jsmin + (package-with-python2 python-jsmin)) + (define-public python-flask-login (package (name "python-flask-login") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:44:59 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:44:59 +0000 Received: from localhost ([127.0.0.1]:33357 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtq-0004Mf-RE for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:59 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51528 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFto-0004Lz-Pu for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:57 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 43E22167A7; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id 05E9A16753 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id a50460cc for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 2/7] gnu: Add python-slimit. Date: Sun, 4 Nov 2018 10:44:50 +0000 Message-Id: <20181104104455.3527-2-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181104104455.3527-1-mail@cbaines.net> References: <20181104104455.3527-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/python-web.scm (python-slimit, python2-slimit): New variables. --- gnu/packages/python-web.scm | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index 3671454c2..26134e808 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -1983,6 +1983,34 @@ transfers.") `(("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 + "@code{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 python2-slimit + (package-with-python2 python-slimit)) + (define-public python-flask-restful (package (name "python-flask-restful") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:44:59 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:44:59 +0000 Received: from localhost ([127.0.0.1]:33359 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtr-0004Mr-5G for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:59 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51534 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFto-0004M0-UT for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:57 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 7377D167AA; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id 15A3A16754 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id b78d51e2 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 3/7] gnu: Add python-django-pipeline. Date: Sun, 4 Nov 2018 10:44:51 +0000 Message-Id: <20181104104455.3527-3-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181104104455.3527-1-mail@cbaines.net> References: <20181104104455.3527-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/django.scm (python-django-pipeline, python2-django-pipeline): New variables. --- gnu/packages/django.scm | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index dea925e56..589ba282e 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -518,6 +518,49 @@ project.") (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 python2-django-pipeline + (package-with-python2 python-django-pipeline)) + (define-public python-django-redis (package (name "python-django-redis") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:44:59 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:44:59 +0000 Received: from localhost ([127.0.0.1]:33361 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtr-0004Mz-Ej for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:59 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51538 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtp-0004M1-1L for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:57 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 89942167A9; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id 4D29A16753 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 8bb7a928 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 5/7] gnu: Add python-django-debug-toolbar. Date: Sun, 4 Nov 2018 10:44:53 +0000 Message-Id: <20181104104455.3527-5-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181104104455.3527-1-mail@cbaines.net> References: <20181104104455.3527-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/django.scm (python-django-debug-toolbar, python2-django-debug-toolbar): New variables. --- gnu/packages/django.scm | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index 48f36835d..3a761bf60 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -265,6 +265,44 @@ account authentication.") (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 various debug information +about the current request/response.") + (license license:bsd-3))) + +(define-public python2-django-debug-toolbar + (package-with-python2 python-django-debug-toolbar)) + (define-public python-django-gravatar2 (package (name "python-django-gravatar2") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:45:00 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:45:00 +0000 Received: from localhost ([127.0.0.1]:33363 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtr-0004N6-Nm for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:45:00 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51540 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtp-0004M2-6P for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:58 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id B0B7116754; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id 3175C167A1 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id df16d4e5 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 4/7] gnu: Add python-django-jinja. Date: Sun, 4 Nov 2018 10:44:52 +0000 Message-Id: <20181104104455.3527-4-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181104104455.3527-1-mail@cbaines.net> References: <20181104104455.3527-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/django.scm (python-django-jinja, python2-django-jinja): New variables. --- gnu/packages/django.scm | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index 589ba282e..48f36835d 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -338,6 +338,55 @@ merging, minifying and compiling CSS and Javascript files.") (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 and nonobstructive jinja2 backend for Django") + (description + "Jinja2 provides certain advantages over the native system of Django, for +example, explicit calls to callable from templates and better performance. +@code{django-jinja} is a alternative to the jinja2 backend built in to Django.") + (license license:bsd-3))) + +(define-public python2-django-jinja + (let ((base (package-with-python2 (strip-python2-variant python-django-jinja)))) + (package + (inherit base) + (native-inputs + `(("python2-mock" ,python2-mock) + ,@(package-native-inputs base)))))) + (define-public python-django-jsonfield (package (name "python-django-jsonfield") -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:45:00 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:45:00 +0000 Received: from localhost ([127.0.0.1]:33365 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFts-0004ND-45 for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:45:00 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51542 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtp-0004MG-SK for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:58 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 6C69116753; Sun, 4 Nov 2018 10:44:57 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id 5D20F167A6 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id c52e51ea for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 6/7] gnu: Add patchwork. Date: Sun, 4 Nov 2018 10:44:54 +0000 Message-Id: <20181104104455.3527-6-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181104104455.3527-1-mail@cbaines.net> References: <20181104104455.3527-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --- gnu/packages/patchutils.scm | 103 ++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm index 688e62cdc..0981cbc08 100644 --- a/gnu/packages/patchutils.scm +++ b/gnu/packages/patchutils.scm @@ -29,6 +29,8 @@ #:use-module (gnu packages ed) #:use-module (gnu packages base) #:use-module (gnu packages bash) + #:use-module (gnu packages databases) + #:use-module (gnu packages django) #:use-module (gnu packages file) #:use-module (gnu packages gawk) #:use-module (gnu packages gettext) @@ -240,3 +242,104 @@ hexadecimal and ASCII (or EBCDIC). It can also display two files at once, and highlight the differences between them. It works well with large files (up to 4 GiB).") (license gpl2+))) + +(define-public patchwork + (package + (name "patchwork") + (version "2.1.1") + (source (origin + (method url-fetch) + (uri (string-append + "https://github.com/getpatchwork/patchwork/archive/v" + version ".tar.gz")) + (sha256 + (base32 + "1q4i46gwwxvr8gjj983r8aacfsssp062dzi29ha7zba380fsxayy")) + (file-name (string-append name "-" version)))) + (build-system python-build-system) + (arguments + `(;; TODO: Tests require a running database + #:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (add-after 'unpack 'patch-wsgi.py + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "patchwork/wsgi.py" + (("import os") + (string-append + "import os, sys + +sys.path.extend('" (string-append (getenv "PYTHONPATH") ":" (site-packages inputs outputs)) "'.split(':'))")) + (("'patchwork\\.settings\\.production'") + "os.getenv('DJANGO_SETTINGS_MODULE', 'guix.patchwork.settings')")))) + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (or (not tests?) + (begin + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") + (invoke + "python" "-Wonce" "./manage.py" "test" "--noinput") + #t)))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (for-each (lambda (directory) + (copy-recursively + directory + (string-append (site-packages inputs outputs) + "/" directory))) + '("patchwork" + "templates")) + (delete-file-recursively (string-append + (site-packages inputs outputs) + "patchwork/tests")) + (let ((static-root + (string-append out "/share/patchwork/htdocs"))) + (mkdir-p static-root) + (copy-file "patchwork/settings/production.example.py" + "patchwork/settings/assets.py") + (setenv "DJANGO_SECRET_KEY" "dummyvalue") + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.assets") + (setenv "STATIC_ROOT" static-root) + (invoke "./manage.py" "collectstatic" "--no-input")) + + (copy-recursively "lib" + (string-append + out "/share/doc/" ,name "-" ,version))) + #t)) + (add-after 'install 'install-patchwork-admin + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/bin")) + (call-with-output-file (string-append out "/bin/patchwork-admin") + (lambda (port) + (display "#!/usr/bin/env python3 +import os, sys + +if __name__ == \"__main__\": + os.environ.setdefault( + \"DJANGO_SETTINGS_MODULE\", + \"guix.patchwork.settings\" + ) + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv)" port))) + (chmod (string-append out "/bin/patchwork-admin") #o555)) + #t))))) + (inputs + `(("python-wrapper" ,python-wrapper))) + (propagated-inputs + `(("python-django" ,python-django) + ;; TODO: Make this configurable + ("python-psycopg2" ,python-psycopg2) + ("python-mysqlclient" ,python-mysqlclient) + ("python-django-filter" ,python-django-filter) + ("python-djangorestframework" ,python-djangorestframework) + ("python-django-debug-toolbar" ,python-django-debug-toolbar))) + (synopsis "") + (description "") + (home-page "") + (license ""))) -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 05:45:03 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 10:45:03 +0000 Received: from localhost ([127.0.0.1]:33367 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtu-0004Nr-I3 for submit@debbugs.gnu.org; Sun, 04 Nov 2018 05:45:03 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:51544 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJFtq-0004MI-2e for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 05:44:58 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 9C13C167A1; Sun, 4 Nov 2018 10:44:57 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (unknown [185.80.85.115]) by mira.cbaines.net (Postfix) with ESMTPSA id 718AC167A8 for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:56 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 57eb208c for <33185@debbugs.gnu.org>; Sun, 4 Nov 2018 10:44:55 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 7/7] services: Add patchwork. Date: Sun, 4 Nov 2018 10:44:55 +0000 Message-Id: <20181104104455.3527-7-mail@cbaines.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181104104455.3527-1-mail@cbaines.net> References: <20181104104455.3527-1-mail@cbaines.net> X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --- gnu/services/web.scm | 297 ++++++++++++++++++++++++++++++++++++++++++- gnu/tests/web.scm | 104 ++++++++++++++- 2 files changed, 399 insertions(+), 2 deletions(-) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index fcf453c24..41db75153 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -32,12 +32,16 @@ #:use-module (gnu system pam) #:use-module (gnu system shadow) #:use-module (gnu packages admin) + #:use-module (gnu packages databases) #:use-module (gnu packages web) + #:use-module (gnu packages patchutils) #:use-module (gnu packages php) + #:use-module (gnu packages python) #:use-module (gnu packages guile) #:use-module (gnu packages logging) #:use-module (guix records) #:use-module (guix modules) + #:use-module (guix utils) #:use-module (guix gexp) #:use-module ((guix store) #:select (text-file)) #:use-module ((guix utils) #:select (version-major)) @@ -210,7 +214,41 @@ varnish-configuration-parameters varnish-configuration-extra-options - varnish-service-type)) + varnish-service-type + + + patchwork-database-configuration + patchwork-database-configuration? + patchwork-database-configuration-engine + patchwork-database-configuration-name + patchwork-database-configuration-user + patchwork-database-configuration-password + patchwork-database-configuration-host + patchwork-database-configuration-port + + + patchwork-settings-module + patchwork-settings-module? + patchwork-settings-module-database-configuration + patchwork-settings-module-secret-key + patchwork-settings-module-allowed-hosts + patchwork-settings-module-default-from-email + patchwork-settings-module-static-url + patchwork-settings-module-admins + patchwork-settings-module-debug? + patchwork-settings-module-enable-rest-api? + patchwork-settings-module-enable-xmlrpc? + patchwork-settings-module-force-https-links? + patchwork-settings-module-extra-settings + + + patchwork-configuration + patchwork-configuration? + patchwork-configuration-patchwork + patchwork-configuration-settings-module + patchwork-configuration-domain + + patchwork-service-type)) ;;; Commentary: ;;; @@ -1261,3 +1299,260 @@ files.") varnish-shepherd-service))) (default-value (varnish-configuration)))) + + +;;; +;;; Patchwork +;;; + +(define-record-type* + patchwork-database-configuration make-patchwork-database-configuration + patchwork-database-configuration? + (engine patchwork-database-configuration-engine + (default "django.db.backends.postgresql_psycopg2")) + (name patchwork-database-configuration-name + (default "patchwork")) + (user patchwork-database-configuration-user + (default "")) + (password patchwork-database-configuration-password + (default "")) + (host patchwork-database-configuration-host + (default "")) + (port patchwork-database-configuration-port + (default ""))) + +(define-record-type* + patchwork-settings-module make-patchwork-settings-module + patchwork-settings-module? + (database-configuration patchwork-settings-module-database-configuration + (default (patchwork-database-configuration))) + (secret-key patchwork-settings-module-secret-key) + (allowed-hosts patchwork-settings-module-allowed-hosts) + (default-from-email patchwork-settings-module-default-from-email) + (static-url patchwork-settings-module-static-url + (default "/static/")) + (admins patchwork-settings-module-admins + (default '())) + (debug? patchwork-settings-module-debug? + (default #f)) + (enable-rest-api? patchwork-settings-module-enable-rest-api? + (default #t)) + (enable-xmlrpc? patchwork-settings-module-enable-xmlrpc? + (default #t)) + (force-https-links? patchwork-settings-module-force-https-links? + (default #t)) + (extra-settings patchwork-settings-module-extra-settings + (default ""))) + +(define-record-type* + patchwork-configuration make-patchwork-configuration + patckwork-configuration? + (patchwork patchwork-configuration-patchwork + (default patchwork)) + (settings-module patchwork-configuration-settings-module) + (domain patchwork-configuration-domain)) + +(define-gexp-compiler (patchwork-settings-module-compiler + (file ) system target) + (match file + (($ database-configuration secret-key + allowed-hosts default-from-email + static-url admins debug? enable-rest-api? + enable-xmlrpc? force-https-links? + extra-configuration) + (gexp->derivation + "patchwork-settings" + (with-imported-modules '((guix build utils)) + #~(let ((output #$output)) + (define (create-__init__.py filename) + (call-with-output-file filename + (lambda (port) (display "" port)))) + + (use-modules (guix build utils) + (srfi srfi-1)) + + (mkdir-p (string-append output "/guix/patchwork")) + (create-__init__.py + (string-append output "/guix/__init__.py")) + (create-__init__.py + (string-append output "/guix/patchwork/__init__.py")) + + (call-with-output-file + (string-append output "/guix/patchwork/settings.py") + (lambda (port) + (display + (string-append "from patchwork.settings.base import * + +# Configuration from Guix +SECRET_KEY = '" #$secret-key "' + +ALLOWED_HOSTS = [ +" #$(string-concatenate + (map (lambda (allowed-host) + (string-append " '" allowed-host "'\n")) + allowed-hosts)) +"] + +DEBUG = " #$(if debug? "True" "False") " + +ENABLE_REST_API = " #$(if enable-xmlrpc? "True" "False") " +ENABLE_XMLRPC = " #$(if enable-xmlrpc? "True" "False") " + +FORCE_HTTPS_LINKS = " #$(if force-https-links? "True" "False") " + +DATABASES = { + 'default': { +" #$(match database-configuration + (($ + engine name user password host port) + (string-append + " 'ENGINE': '" engine "',\n" + " 'NAME': '" name "',\n" + " 'USER': '" user "',\n" + " 'PASSWORD': '" password "',\n" + " 'HOST': '" host "',\n" + " 'PORT': '" port "',\n"))) " + }, +} + +" #$(if debug? + #~(string-append "STATIC_ROOT = '" #$(file-append patchwork "/share/patchwork/htdocs") "'") + #~(string-append "STATIC_URL = '" #$static-url "'")) " + +STATICFILES_STORAGE = ( + 'django.contrib.staticfiles.storage.StaticFilesStorage' +) + +# Guix Extra Configuration +" #$extra-configuration " +") port))) + #t)) + #:local-build? #t)))) + +(define (patchwork-wsgi-wrapper patchwork) + (define patchwork-wsgi.py + (file-append patchwork + (string-append + "/lib/python" + (version-major+minor + (package-version python)) + "/site-packages/patchwork/wsgi.py"))) + + (mixed-text-file + "patchwork-wsgi.py" + "import os\n" + "\n" + "exec(open(\"" patchwork-wsgi.py "\").read())\n")) + +(define patchwork-httpd-configuration + (match-lambda + (($ patchwork settings-module + domain) + + (define wsgi.py (patchwork-wsgi-wrapper patchwork)) + + (list "WSGISocketPrefix /var/run/mod_wsgi" + (list "LoadModule wsgi_module " + (file-append mod-wsgi "/modules/mod_wsgi.so")) + (httpd-virtualhost + "*:8080" + `("ServerAdmin admin@example.com +ServerName " ,domain " + +LogFormat \"%v %h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" customformat +LogLevel info +CustomLog \"/var/log/httpd/" ,domain "-access_log\" customformat + +ErrorLog /var/log/httpd/error.log + +WSGIScriptAlias / " ,wsgi.py " +WSGIDaemonProcess patchwork user=httpd group=httpd processes=1 threads=2 display-name=%{GROUP} lang='en_US.UTF-8' locale='en_US.UTF-8' python-path=" ,settings-module " +WSGIProcessGroup patchwork +WSGIPassAuthorization On + + + Require all granted + + +Alias /static " ,patchwork "/share/patchwork/htdocs + + AllowOverride None + Options MultiViews Indexes SymlinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS +")))))) + +(define (patchwork-setup-gexp settings-module) + (with-imported-modules (source-module-closure + '((guix build utils))) + #~(lambda () + (catch #t + (lambda () + (let ((pid (primitive-fork)) + (user (getpwnam "postgres"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + (primitive-exit + (if (and + (zero? + (system* #$(file-append postgresql "/bin/createuser") + "httpd")) + (zero? + (system* #$(file-append postgresql "/bin/createdb") + "-O" "httpd" "patchwork"))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))) + (let ((pid (primitive-fork)) + (user (getpwnam "httpd"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + ;; TODO Extract + (setenv "DJANGO_SECRET_KEY" "testsecretkey") + (setenv "DATABASE_NAME" "patchwork") + (setenv "PYTHONPATH" #$settings-module) + (primitive-exit + (if (and + (zero? + (system* #$(file-append patchwork + "/bin/patchwork-admin") + "migrate"))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid)))))) + (lambda (key . parameters) + (format (current-error-port) + "Uncaught throw to '~a: ~a\n" key parameters) + #f))))) + +(define patchwork-service-type + (service-type + (name 'patchwork-setup) + (extensions + (list (service-extension httpd-service-type + patchwork-httpd-configuration) + (service-extension + shepherd-root-service-type + (match-lambda + (($ patchwork settings-module + domain) + (list (shepherd-service + (requirement '(postgres)) + (provision '(patchwork-setup)) + (start (patchwork-setup-gexp settings-module)) + (stop #~(const #f)) + (respawn? #f) + (documentation "Setup patchwork.")))))))) + (description + "patchwork"))) diff --git a/gnu/tests/web.scm b/gnu/tests/web.scm index 319655396..fbdf78a03 100644 --- a/gnu/tests/web.scm +++ b/gnu/tests/web.scm @@ -28,15 +28,27 @@ #:use-module (gnu system vm) #:use-module (gnu services) #:use-module (gnu services web) + #:use-module (gnu services databases) #:use-module (gnu services networking) + #:use-module (gnu services shepherd) + #:use-module (gnu packages databases) + #:use-module (gnu packages patchutils) + #:use-module (gnu packages python) + #:use-module (gnu packages web) + #:use-module (guix packages) + #:use-module (guix modules) + #:use-module (guix records) #:use-module (guix gexp) #:use-module (guix store) + #:use-module (guix utils) + #:use-module (ice-9 match) #:export (%test-httpd %test-nginx %test-varnish %test-php-fpm %test-hpcguix-web - %test-tailon)) + %test-tailon + %test-patchwork)) (define %index.html-contents ;; Contents of the /index.html file. @@ -498,3 +510,93 @@ HTTP-PORT." (name "tailon") (description "Connect to a running Tailon server.") (value (run-tailon-test)))) + + +;;; +;;; Patchwork +;;; + +(define %patchwork-os + (simple-operating-system + (service dhcp-client-service-type) + (service httpd-service-type + (httpd-configuration + (config + (httpd-config-file + (listen '("8080")))))) + (service postgresql-service-type) + (service patchwork-service-type + (patchwork-configuration + (settings-module + (patchwork-settings-module + (secret-key "00000") + (allowed-hosts '("*")) + (default-from-email "") + (debug? #t))) + (domain "localhost"))))) + +(define* (run-patchwork-test) + "Run tests in %NGINX-OS, which has nginx running and listening on +HTTP-PORT." + (define os + (marionette-operating-system + %patchwork-os + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define forwarded-port 8080) + + (define vm + (virtual-machine + (operating-system os) + (port-forwardings `((8080 . ,forwarded-port))))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (srfi srfi-11) (srfi srfi-64) + (gnu build marionette) + (web uri) + (web client) + (web response)) + + (define marionette + (make-marionette (list #$vm))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "patchwork") + + (test-assert "httpd service running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (match (start-service 'httpd) + (#f #f) + (('service response-parts ...) + (match (assq-ref response-parts 'running) + ((#t) #t) + ((pid) (number? pid)))))) + marionette)) + + ;; Retrieve the index.html file we put in /srv. + (test-equal "http-get" + 200 + (let-values + (((response text) + (http-get #$(simple-format + #f "http://localhost:~A/" forwarded-port) + #:decode-body? #t))) + (response-code response))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "patchwork-test" test)) + +(define %test-patchwork + (system-test + (name "patchwork") + (description "") + (value (run-patchwork-test)))) -- 2.18.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 14:09:38 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 19:09:38 +0000 Received: from localhost ([127.0.0.1]:34261 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJNmD-0005mr-Uy for submit@debbugs.gnu.org; Sun, 04 Nov 2018 14:09:38 -0500 Received: from mx1.riseup.net ([198.252.153.129]:55837) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJNmC-0005mj-7v for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 14:09:36 -0500 Received: from cotinga.riseup.net (cotinga-pn.riseup.net [10.0.1.164]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "COMODO RSA Domain Validation Secure Server CA" (verified OK)) by mx1.riseup.net (Postfix) with ESMTPS id 682E01A049D; Sun, 4 Nov 2018 11:09:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1541358575; bh=8zW+BO7X6Iuqsz0G6eHiisfG/NtO/6waf/UFnGMw1sE=; h=Subject:To:References:From:Date:In-Reply-To:From; b=iip4inLft3KEO4Q6PUKgjPJdB4PzM3LHELN0tzioZCpxEjg9zCtQZFsWg5xKpYRmI 3YIxNmpLeeRVd8F+9PFhAdjd2AIIkw41hlqfjW6K24UkhPCU9cu41npqCESqAPro2f AgD1Rfv8fcB7Bc8VVTsXni9vZhgX08WsSWYnnmG8= X-Riseup-User-ID: 81AAAD16A17A3015DD0B6EF577421739170229F035AEA830155EEF3333BEA642 Received: from [127.0.0.1] (localhost [127.0.0.1]) by cotinga.riseup.net with ESMTPSA id 536B2E6D58; Sun, 4 Nov 2018 11:09:33 -0800 (PST) Subject: Re: [bug#33185] [PATCH 6/7] gnu: Add patchwork. To: Christopher Baines , 33185@debbugs.gnu.org References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-6-mail@cbaines.net> From: swedebugia Message-ID: <8334382e-d993-2375-6a27-79e6fd42c571@riseup.net> Date: Sun, 4 Nov 2018 20:09:32 +0100 MIME-Version: 1.0 In-Reply-To: <20181104104455.3527-6-mail@cbaines.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi I did not run the code. See question below. On 2018-11-04 11:44, Christopher Baines wrote: > --- > gnu/packages/patchutils.scm | 103 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 103 insertions(+) > > diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm snip > + > +(define-public patchwork > + snip > + (synopsis "") > + (description "") > + (home-page "") > + (license ""))) Perhaps you forgot to populate these 4 fields? -- Cheers Swedebugia From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 04 14:10:48 2018 Received: (at 33185) by debbugs.gnu.org; 4 Nov 2018 19:10:48 +0000 Received: from localhost ([127.0.0.1]:34265 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJNnM-0005oq-9w for submit@debbugs.gnu.org; Sun, 04 Nov 2018 14:10:48 -0500 Received: from mx1.riseup.net ([198.252.153.129]:56014) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gJNnK-0005oh-GS for 33185@debbugs.gnu.org; Sun, 04 Nov 2018 14:10:46 -0500 Received: from cotinga.riseup.net (cotinga-pn.riseup.net [10.0.1.164]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "COMODO RSA Domain Validation Secure Server CA" (verified OK)) by mx1.riseup.net (Postfix) with ESMTPS id 111E21A0197; Sun, 4 Nov 2018 11:10:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1541358646; bh=/Deyc4k7XEYt8OOnUF8rd5y6fReT/ywMEIj8JAMfK0M=; h=Subject:To:References:From:Date:In-Reply-To:From; b=D5KLz+DAwNEWqYoSlELBmeujZv8rCVE9tIo71lOFYjgds738oR5K/l1P9zYWh6DL2 GgH8n6pvIctr1LEtrEa+MYAS4RrQQZQ5huIuZFwcNpjbUCcWEDreAwOrUQY22tgVB8 57LVUIBaQREjW/d6YWPYEjJnYcOhWzHASW8ckTcI= X-Riseup-User-ID: 9EDD883B13B46E5F392B37EE89805C5929FD58BE1A95C1BCBBD37A20B2913A43 Received: from [127.0.0.1] (localhost [127.0.0.1]) by cotinga.riseup.net with ESMTPSA id 1A937E6DD0; Sun, 4 Nov 2018 11:10:44 -0800 (PST) Subject: Re: [bug#33185] [PATCH 7/7] services: Add patchwork. To: Christopher Baines , 33185@debbugs.gnu.org References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-7-mail@cbaines.net> From: swedebugia Message-ID: Date: Sun, 4 Nov 2018 20:10:42 +0100 MIME-Version: 1.0 In-Reply-To: <20181104104455.3527-7-mail@cbaines.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi On 2018-11-04 11:44, Christopher Baines wrote: > --- > gnu/services/web.scm | 297 ++++++++++++++++++++++++++++++++++++++++++- > gnu/tests/web.scm | 104 ++++++++++++++- > 2 files changed, 399 insertions(+), 2 deletions(-) Nice work with the service-declaration. :) (untested) Would you be willing to update the patch with documentation also? -- Cheers Swedebugia From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:30:05 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:30:05 +0000 Received: from localhost ([127.0.0.1]:32897 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmR3-0007ui-Ax for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:05 -0500 Received: from eggs.gnu.org ([208.118.235.92]:46211) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmR1-0007th-Rv for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmQw-0001h9-6D for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:29:58 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54144) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmQw-0001gz-3U; Mon, 19 Nov 2018 11:29:58 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32842 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmQv-0005AC-Qo; Mon, 19 Nov 2018 11:29:58 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Christopher Baines Subject: Re: [bug#33185] [PATCH 1/7] gnu: Add python-jsmin. References: <87y3aie8a1.fsf@cbaines.net> <20181028092702.22549-1-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:29:56 +0100 In-Reply-To: <20181028092702.22549-1-mail@cbaines.net> (Christopher Baines's message of "Sun, 28 Oct 2018 09:26:56 +0000") Message-ID: <877eh9yqrf.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Hello, Christopher Baines skribis: > * gnu/packages/python-web.scm (python-jsmin, python2-jsmin): New variable= s. LGTM! For the record, if the =E2=80=98python2-=E2=80=99 version is not strictly n= eeded, you should omit it. Thanks, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:30:33 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:30:33 +0000 Received: from localhost ([127.0.0.1]:32900 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmRV-0007wE-JN for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:33 -0500 Received: from eggs.gnu.org ([208.118.235.92]:46332) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmRT-0007w2-N3 for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmRO-0002B5-4K for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:26 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54156) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmRO-0002Ax-10; Mon, 19 Nov 2018 11:30:26 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32844 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmRN-0006f8-NR; Mon, 19 Nov 2018 11:30:25 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Christopher Baines Subject: Re: [bug#33185] [PATCH 2/7] gnu: Add python-slimit. References: <20181028092702.22549-1-mail@cbaines.net> <20181028092702.22549-2-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:30:24 +0100 In-Reply-To: <20181028092702.22549-2-mail@cbaines.net> (Christopher Baines's message of "Sun, 28 Oct 2018 09:26:57 +0000") Message-ID: <8736rxyqqn.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Christopher Baines skribis: > * gnu/packages/python-web.scm (python-slimit, python2-slimit): New variables. [...] > + (synopsis "JavaScript minifier, parser and lexer written in Python") > + (description > + "@code{SlimIt} is a JavaScript minifier written in Python. It compiles I think you can avoid @code here. Otherwise LGTM! From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:30:54 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:30:54 +0000 Received: from localhost ([127.0.0.1]:32905 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmRp-0007wt-S2 for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:54 -0500 Received: from eggs.gnu.org ([208.118.235.92]:46383) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmRn-0007wb-Hv for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmRh-0002wi-Op for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:30:46 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54159) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmRh-0002wW-Lj; Mon, 19 Nov 2018 11:30:45 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32846 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmRh-0007dZ-Cd; Mon, 19 Nov 2018 11:30:45 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Christopher Baines Subject: Re: [bug#33185] [PATCH 3/7] gnu: Add python-django-pipeline. References: <20181028092702.22549-1-mail@cbaines.net> <20181028092702.22549-3-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:30:44 +0100 In-Reply-To: <20181028092702.22549-3-mail@cbaines.net> (Christopher Baines's message of "Sun, 28 Oct 2018 09:26:58 +0000") Message-ID: <87y39pxc5n.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Christopher Baines skribis: > * gnu/packages/django.scm (python-django-pipeline, python2-django-pipeline): > New variables. LGTM! From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:33:21 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:33:21 +0000 Received: from localhost ([127.0.0.1]:32916 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmUC-00080w-QN for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:33:21 -0500 Received: from eggs.gnu.org ([208.118.235.92]:47070) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmUB-00080j-2N for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:33:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmU5-0006qA-6T for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:33:13 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_20 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54208) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmU5-0006pv-3H; Mon, 19 Nov 2018 11:33:13 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32848 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmU4-0005yH-Qe; Mon, 19 Nov 2018 11:33:13 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Christopher Baines Subject: Re: [bug#33185] [PATCH 4/7] gnu: Add python-django-jinja. References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-4-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:33:11 +0100 In-Reply-To: <20181104104455.3527-4-mail@cbaines.net> (Christopher Baines's message of "Sun, 4 Nov 2018 10:44:52 +0000") Message-ID: <87tvkdxc1k.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Christopher Baines skribis: > * gnu/packages/django.scm (python-django-jinja, python2-django-jinja): New > variables. [...] > + (home-page > + "https://niwinz.github.io/django-jinja/latest/") > + (synopsis "Simple and nonobstructive jinja2 backend for Django") > + (description > + "Jinja2 provides certain advantages over the native system of Django, for > +example, explicit calls to callable from templates and better performance. > +@code{django-jinja} is a alternative to the jinja2 backend built in to Django.") This is not crystal-clear to someone unfamiliar with Django and Jinja, so bonus points if you can come up with a clearer synopsis and description. Otherwise LGTM! From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:34:00 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:34:00 +0000 Received: from localhost ([127.0.0.1]:32919 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmUp-00081q-4Q for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:34:00 -0500 Received: from eggs.gnu.org ([208.118.235.92]:47361) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmUn-00081a-0d for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:33:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmUh-0007QH-CG for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:33:51 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54219) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmUh-0007Q9-9M; Mon, 19 Nov 2018 11:33:51 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32850 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmUh-00061R-0d; Mon, 19 Nov 2018 11:33:51 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Christopher Baines Subject: Re: [bug#33185] [PATCH 5/7] gnu: Add python-django-debug-toolbar. References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-5-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:33:49 +0100 In-Reply-To: <20181104104455.3527-5-mail@cbaines.net> (Christopher Baines's message of "Sun, 4 Nov 2018 10:44:53 +0000") Message-ID: <87pnv1xc0i.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Christopher Baines skribis: > * gnu/packages/django.scm (python-django-debug-toolbar, > python2-django-debug-toolbar): New variables. [...] > + (synopsis "Toolbar to help with developing Django applications") > + (description > + "A configurable set of panels that display various debug information > +about the current request/response.") Please make a full sentence. Otherwise LGTM. From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:38:00 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:38:00 +0000 Received: from localhost ([127.0.0.1]:32925 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmYb-00087Y-Of for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:38:00 -0500 Received: from eggs.gnu.org ([208.118.235.92]:48097) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmYa-00087M-Gi for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:37:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmYU-0001u5-Az for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:37:47 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54315) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmYT-0001tT-5G; Mon, 19 Nov 2018 11:37:45 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32858 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmYS-0006K6-Se; Mon, 19 Nov 2018 11:37:45 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Christopher Baines Subject: Re: [bug#33185] [PATCH 6/7] gnu: Add patchwork. References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-6-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:37:43 +0100 In-Reply-To: <20181104104455.3527-6-mail@cbaines.net> (Christopher Baines's message of "Sun, 4 Nov 2018 10:44:54 +0000") Message-ID: <87h8gdxbu0.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Christopher Baines skribis: > --- > gnu/packages/patchutils.scm | 103 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 103 insertions(+) [...] > + (add-after 'unpack 'patch-wsgi.py > + (lambda* (#:key inputs outputs #:allow-other-keys) > + (substitute* "patchwork/wsgi.py" > + (("import os") > + (string-append > + "import os, sys > + > +sys.path.extend('" (string-append (getenv "PYTHONPATH") ":" (site-packag= es inputs outputs)) "'.split(':'))")) > + (("'patchwork\\.settings\\.production'") > + "os.getenv('DJANGO_SETTINGS_MODULE', 'guix.patchwork.set= tings')")))) > + (replace 'check > + (lambda* (#:key tests? #:allow-other-keys) > + (or (not tests?) > + (begin > + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.= dev") > + (invoke > + "python" "-Wonce" "./manage.py" "test" "--noinput") > + #t)))) > + (replace 'install > + (lambda* (#:key inputs outputs #:allow-other-keys) > + (let ((out (assoc-ref outputs "out"))) > + (for-each (lambda (directory) > + (copy-recursively > + directory > + (string-append (site-packages inputs outputs) > + "/" directory))) > + '("patchwork" > + "templates")) > + (delete-file-recursively (string-append > + (site-packages inputs outputs) > + "patchwork/tests")) > + (let ((static-root > + (string-append out "/share/patchwork/htdocs"))) > + (mkdir-p static-root) > + (copy-file "patchwork/settings/production.example.py" > + "patchwork/settings/assets.py") > + (setenv "DJANGO_SECRET_KEY" "dummyvalue") > + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.as= sets") > + (setenv "STATIC_ROOT" static-root) > + (invoke "./manage.py" "collectstatic" "--no-input")) > + > + (copy-recursively "lib" > + (string-append > + out "/share/doc/" ,name "-" ,version))) > + #t)) > + (add-after 'install 'install-patchwork-admin > + (lambda* (#:key inputs outputs #:allow-other-keys) > + (let* ((out (assoc-ref outputs "out"))) > + (mkdir-p (string-append out "/bin")) > + (call-with-output-file (string-append out "/bin/patchwork= -admin") > + (lambda (port) > + (display "#!/usr/bin/env python3 > +import os, sys > + > +if __name__ =3D=3D \"__main__\": > + os.environ.setdefault( > + \"DJANGO_SETTINGS_MODULE\", > + \"guix.patchwork.settings\" > + ) > + > + from django.core.management import execute_from_command_line > + > + execute_from_command_line(sys.argv)" port))) > + (chmod (string-append out "/bin/patchwork-admin") #o555)) > + #t))))) IMO these phases would be less intimidating with a few comments explaining what=E2=80=99s going on. :-) > + (synopsis "") > + (description "") > + (home-page "") > + (license ""))) As swedebugia noted, you=E2=80=99re missing a few things here and in the co= mmit log. :-) With these things fixed it should be good! Thanks, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 19 11:43:05 2018 Received: (at 33185) by debbugs.gnu.org; 19 Nov 2018 16:43:05 +0000 Received: from localhost ([127.0.0.1]:32933 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmdc-0008FP-Pu for submit@debbugs.gnu.org; Mon, 19 Nov 2018 11:43:04 -0500 Received: from eggs.gnu.org ([208.118.235.92]:48688) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gOmdb-0008Ev-Br for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:43:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOmdV-0005WX-D7 for 33185@debbugs.gnu.org; Mon, 19 Nov 2018 11:42:58 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54353) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOmdV-0005WK-A4; Mon, 19 Nov 2018 11:42:57 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=32860 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1gOmdU-0006ch-Pq; Mon, 19 Nov 2018 11:42:57 -0500 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: swedebugia Subject: Re: [bug#33185] [PATCH 7/7] services: Add patchwork. References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-7-mail@cbaines.net> Date: Mon, 19 Nov 2018 17:42:55 +0100 In-Reply-To: (swedebugia's message of "Sun, 4 Nov 2018 20:10:42 +0100") Message-ID: <87d0r1xblc.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 33185 Cc: Christopher Baines , 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -6.0 (------) Hello, swedebugia skribis: > On 2018-11-04 11:44, Christopher Baines wrote: >> --- >> gnu/services/web.scm | 297 ++++++++++++++++++++++++++++++++++++++++++- >> gnu/tests/web.scm | 104 ++++++++++++++- >> 2 files changed, 399 insertions(+), 2 deletions(-) > > Nice work with the service-declaration. :) (untested) +1! > Would you be willing to update the patch with documentation also? Yes, also with =E2=80=98documentation=E2=80=99 fields. :-) I spotted a typo here: +(define-record-type* + patchwork-configuration make-patchwork-configuration + patckwork-configuration? ^^ Regarding =E2=80=98patchwork-setup-gexp=E2=80=99, I wonder if you could use =E2=80=98make-forkexec-constructor=E2=80=99 with the appropriate environmen= t variables and move the =E2=80=9Ccreateuser=E2=80=9D bit to an activation snippet. Hmm maybe the activation snippet would run too early, right? In that case, perhaps you could create another Shepherd service, =E2=80=98patchwork-initialization=E2=80=99, that would do the createuser st= uff, and have =E2=80=98patchwork=E2=80=99 depend on it. Thoughts? Thanks, Chris! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 20 13:06:41 2018 Received: (at 33185) by debbugs.gnu.org; 20 Nov 2018 18:06:42 +0000 Received: from localhost ([127.0.0.1]:36378 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPAQ4-0005oM-Tf for submit@debbugs.gnu.org; Tue, 20 Nov 2018 13:06:41 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:42438 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPAQ2-0005ng-46 for 33185@debbugs.gnu.org; Tue, 20 Nov 2018 13:06:39 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 73EF21682A; Tue, 20 Nov 2018 18:06:37 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 0C766167FF; Tue, 20 Nov 2018 18:06:37 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 5b0769fc; Tue, 20 Nov 2018 18:06:36 +0000 (UTC) References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-7-mail@cbaines.net> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: swedebugia Subject: Re: [bug#33185] [PATCH 7/7] services: Add patchwork. In-reply-to: Date: Tue, 20 Nov 2018 18:06:34 +0000 Message-ID: <87efbfsjx1.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain swedebugia writes: > Hi > > On 2018-11-04 11:44, Christopher Baines wrote: >> --- >> gnu/services/web.scm | 297 ++++++++++++++++++++++++++++++++++++++++++- >> gnu/tests/web.scm | 104 ++++++++++++++- >> 2 files changed, 399 insertions(+), 2 deletions(-) > > Nice work with the service-declaration. :) (untested) Thanks :) > Would you be willing to update the patch with documentation also? Yep, I hope to get to this eventually :) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlv0TSpfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9Xelhw//fu+4KEh2lpIzNq7/4Bw0bNEpg59rsHSkgrwmQpSecNpIfcwMVIrxYswH 9Jxq9RZtHNO0MxgFBXjpw+ZOJUwGg0aM7e+MCoE3oJ+MDNPqebVQcCYO3Ao9JQ+q 73JbgjWWSzSmD5Lha9S97p6iDFGALDQhVOJdWZK538CuPuEM+ZjeCaa3vKRMua9z ftBUud7AlYvTo2R4fobX4stdKkWlT6QHCIYQGcZJjqTUF2c327Sro0hjb5NHAuZL vyWdPbUdis3G9e1Ke+FsC4gWiU2T+/gV0SaOZlH5HGhResgRIW1KpdBidiV34sr7 Olzot1ZVzG4tfWmnnwQGyJ1Me0gURVdsUkcm3fmhXLwtTUlGhJMbDzQ0wAZoAhMn qnv/FmBzvHeWu6DSZXHdyUxOXn5YuBXmBomtECG7YC9VGIlDGFp3qfGuDO4H3wkV hUm+iyaIb3XN23iCLiK7Wkw4IGSejo4VGeau+eTQgDdAX9SWI8ea87eoobJI4AUk m4iqoi0r3h0jVX8dVGA2XuaoZxzj0b7w/Fu/ajdyTO0bSwa9tNYulPg7lY25eK+j DdfP/ZhWvA/GDA3s9VfZHOZ5G7ZFT6zptq1f/FRrklMJnBbuBxW9CHkVQ4QtqYjS 4bSXR2zcOogPtAOKtxZqZFkJjoeRVRnSvUxTzlGjMwrLJLeubKE= =l0ni -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 20 13:22:12 2018 Received: (at 33185) by debbugs.gnu.org; 20 Nov 2018 18:22:13 +0000 Received: from localhost ([127.0.0.1]:36638 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPAf5-0000AY-KF for submit@debbugs.gnu.org; Tue, 20 Nov 2018 13:22:12 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:42462 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPAf2-00009u-D6 for 33185@debbugs.gnu.org; Tue, 20 Nov 2018 13:22:09 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id B29EE1682B; Tue, 20 Nov 2018 18:22:07 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 3C227167FF; Tue, 20 Nov 2018 18:22:06 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id f67a6031; Tue, 20 Nov 2018 18:22:06 +0000 (UTC) References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-7-mail@cbaines.net> <87d0r1xblc.fsf@gnu.org> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: [bug#33185] [PATCH 7/7] services: Add patchwork. In-reply-to: <87d0r1xblc.fsf@gnu.org> Date: Tue, 20 Nov 2018 18:22:03 +0000 Message-ID: <87d0qzsj78.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: > Hello, > > swedebugia skribis: > >> On 2018-11-04 11:44, Christopher Baines wrote: >>> --- >>> gnu/services/web.scm | 297 ++++++++++++++++++++++++++++++++++++++++++- >>> gnu/tests/web.scm | 104 ++++++++++++++- >>> 2 files changed, 399 insertions(+), 2 deletions(-) >> >> Nice work with the service-declaration. :) (untested) > > +1! > >> Would you be willing to update the patch with documentation also? > > Yes, also with =E2=80=98documentation=E2=80=99 fields. :-) > > I spotted a typo here: > > +(define-record-type* > + patchwork-configuration make-patchwork-configuration > + patckwork-configuration? > ^^ Good spot! > Regarding =E2=80=98patchwork-setup-gexp=E2=80=99, I wonder if you could u= se > =E2=80=98make-forkexec-constructor=E2=80=99 with the appropriate environm= ent variables > and move the =E2=80=9Ccreateuser=E2=80=9D bit to an activation snippet. > > Hmm maybe the activation snippet would run too early, right? In that > case, perhaps you could create another Shepherd service, > =E2=80=98patchwork-initialization=E2=80=99, that would do the createuser = stuff, and have > =E2=80=98patchwork=E2=80=99 depend on it. So, I've made some changes since I last sent this patch, the biggest being splitting the database creation out from running of the database migrations. Assuming that the shepherd service defined as part of the patchwork-service-type just runs the migrations, yes, it needs PostgreSQL (or whatever database you're using) to be available. At the moment, the service is hardcoded to use mod_wsgi, so it runs through the httpd-service, no shepherd service for running patchwork is needed in the service-type at least. It would be good to try and make it more flexible in the future, at least so that you can pick and choose a bit more (and instead use uwsgi, gunicorn, ...). Thanks for taking a look :) Chris --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKSBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlv0UMtfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9Xcvsg/3Sand6E/rpQZ+mSeb36Mnj++b7mk02DW5Ly8s+NdEv2aSy2g83Xfjrbyk hyE3frkYLLZSjCm96CbZkLSvhEQXQPCmi7A+WlNoCtg3vDBq6PYKN9vwn/PtU5mu kdgtXXTQ2woaI5BYxUC3HATCAMGk/vXkDlRhcQPp8SDNXzgCGWEOPo8zfGrVxK8p LnXG6wHU1XSMe32AVP36pJESQhd4PdvNv+/d8HHXyeK8XRbL5pus8TZLhbl0Xaep A4ffkmGlh6HzHT6eg6HgIpC/mQbZjQG4Qd3oOCKtzcV4YGEbuiSijOVOHIe4oPdy kbGVmlLqJPamCkDgAxsmshtt9TLXjNnkMYel69b/NEoPMpUiM2aHMRN1zS4a9Z2V 6kadfJwORGFM8bThg1pqmOkPM0UPpXY+jvVgFk8FWFiTp0RvvJOqoHveliwAwvrN H/cV+strqk/foDZKOQzyhnVKl4BkbWanwNI0Qz8qLVM2QEPxggASXYTZerdRfocL mdmsEHOhpkk1f/OCsSatPsOJvdh0QBPamE6j42ehpOhZqzfnKNfUm4bJhkRbJWNI CydNiyJDvX5jlVt8aD+zmoPH43TsDnaqFC+MNyaifAmr/iufVJAEW7fVh3ON03qA cbLe/chE8TEhvK78XNGq2TdnF9r0/TPNaUh31mVzYFEqo63a7A== =9ElR -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 20 14:58:35 2018 Received: (at 33185) by debbugs.gnu.org; 20 Nov 2018 19:58:35 +0000 Received: from localhost ([127.0.0.1]:37424 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPCAN-00071W-Ci for submit@debbugs.gnu.org; Tue, 20 Nov 2018 14:58:35 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:42588 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPCAK-00071M-Mm for 33185@debbugs.gnu.org; Tue, 20 Nov 2018 14:58:33 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id 8E00916832; Tue, 20 Nov 2018 19:58:31 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 4C03F1682E; Tue, 20 Nov 2018 19:58:31 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 72a2f5d6; Tue, 20 Nov 2018 19:58:31 +0000 (UTC) References: <20181028092702.22549-1-mail@cbaines.net> <20181028092702.22549-2-mail@cbaines.net> <8736rxyqqn.fsf@gnu.org> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: [bug#33185] [PATCH 2/7] gnu: Add python-slimit. In-reply-to: <8736rxyqqn.fsf@gnu.org> Date: Tue, 20 Nov 2018 19:58:28 +0000 Message-ID: <87bm6jseqj.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: > Christopher Baines skribis: > >> * gnu/packages/python-web.scm (python-slimit, python2-slimit): New varia= bles. > > [...] > >> + (synopsis "JavaScript minifier, parser and lexer written in Python") >> + (description >> + "@code{SlimIt} is a JavaScript minifier written in Python. It com= piles > > I think you can avoid @code here. Otherwise LGTM! Great, I've pushed now with this change :) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlv0Z2RfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XfaEQ//S+pgbRjy8BEL8NhZP+YN7aWuuGTfMkYWDt3JUpHm5spEOB7iaMPNkf2T rUSlJGqj6IjMEs0spe/nzKnFtaeE1p13f185O70KkCPX/+uRJ7ZAKST8nJ3hi9Up yh3Ls5bf0OphvkUNoqx7a4IuUX1tKIioXxWs8MQne5SuHDxTa0671hnohZBfEgNX TH3QcEExMJ92kPljhR/MwGJo57CCJ5R/dNt6zS37oR2Kd6KVKDLt3dloGgkXZrVO Q29UGhVCSTR8TZj4YYV0whmWmq/pgKRBSPIIgjjKQT73VHh2DyzD3Z8Lm/TgfMkq cEdTuFaWreTMj4uozynNaVFXkYsw1MmtFuEuHyRQ5ltQZptl1oj3CgQlNmvkDPP9 vdqgfk3KkPNNRF2nmn50dHZQXBh67ZdUjqy2U/V4muvkkn+30uB7jdn+ucagaQOS nbk6tl5A8Y3xdmAA8O1U/rEx4eTHGW2k4iEaT0CtaG+mJegBiaVaJwE50zKSHByV a4hcht+5sTKROs4IPAsnHaHYphavfl4jez4SgW3SeCBW7hpoUNg1zKaYDBWU2AE3 g7l/sqeZ2fuJzGcmev+EtaFUsgyHrd7qprysbnioHTRYouR6F6P1PzCsHVQnh3Ss q16SxeEhnuODlcsF/KeVxAgRnejvg0KTXSZ8wvq7a3mfVxTyaQY= =L09Z -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 20 15:02:57 2018 Received: (at 33185) by debbugs.gnu.org; 20 Nov 2018 20:02:57 +0000 Received: from localhost ([127.0.0.1]:37429 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPCEa-0007Af-Vy for submit@debbugs.gnu.org; Tue, 20 Nov 2018 15:02:57 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:42606 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPCEX-0007AV-DO for 33185@debbugs.gnu.org; Tue, 20 Nov 2018 15:02:53 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id F317B16832; Tue, 20 Nov 2018 20:02:52 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id AE1B41682E; Tue, 20 Nov 2018 20:02:52 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id f865a589; Tue, 20 Nov 2018 20:02:52 +0000 (UTC) References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-4-mail@cbaines.net> <87tvkdxc1k.fsf@gnu.org> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: [bug#33185] [PATCH 4/7] gnu: Add python-django-jinja. In-reply-to: <87tvkdxc1k.fsf@gnu.org> Date: Tue, 20 Nov 2018 20:02:52 +0000 Message-ID: <87a7m3sej7.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: > Christopher Baines skribis: > >> * gnu/packages/django.scm (python-django-jinja, python2-django-jinja): N= ew >> variables. > > [...] > >> + (home-page >> + "https://niwinz.github.io/django-jinja/latest/") >> + (synopsis "Simple and nonobstructive jinja2 backend for Django") >> + (description >> + "Jinja2 provides certain advantages over the native system of Djan= go, for >> +example, explicit calls to callable from templates and better performan= ce. >> +@code{django-jinja} is a alternative to the jinja2 backend built in to = Django.") > > This is not crystal-clear to someone unfamiliar with Django and Jinja, > so bonus points if you can come up with a clearer synopsis and > description. Otherwise LGTM! Yep, I've made another pass at the synopsis and description, which is hopefully much clearer now, and pushed this. Somehow I'd neglected to mention that this related to templates! --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlv0aGxfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XdzOQ//Uk00N2Z5yiM39Sb0S6a2iQVdrKnk402JlsiYo8iSYxs8hZ34Xt80uEvg ZCEOGQd+eOk3NrUbhuifAqYpbxFxhUacHnubQKva50uGDGiOiPuS92yXiuYgxafg ymjgp+Zc5el2M8gW+ew1FCbk3FJrJJWOxHwEMfHOQmzQy2t8fhjdgxn4StvDF6rc QNBmrTaFZZPoCtPZCMyGVyDVkCZ+RjhfErZ2v8BL3zjvEC71NIKrwj3eBZfZdDAh f8R/6di1rBCRENZ/3lyr3iB0AbUYob3N3ovUCqgJtRZXwdaBV+5xXubvuBvXDR9H f/gWxW2n5lm8q8tKtj7h8CXX6VIFI0cBd0XCPupEfO6Dsx8Dt0Ap1KC6i3cBwUVl d9KDfMGLCyd0e9qbM5FMFaUBselqvJnUYG+wwCsLs3USe0DwwaQAaQIzmhNR1B6+ a8PPv4gg0WiGPMwBvIGjRpw8IbAW5r8UY/NBXPsLqWPo9jLD+TQATWZFCrZ0Yqv4 BCOkL1vB0VfMez/AdeH62mKRZOGnBLTH7oU3D/6TaU1y3usF82fAx67mCgvEWjj/ lY7gHG7XFDLtGsfzYjRYw76J5mtnEy8/XyWvpCO5XYQSeHhpohh01wg1Gp+O3rbU zfamoQUTbhOAWLTfZ7fReky+NQW3F4zwA6QREXgOcjLXtqN8blc= =dr8F -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 20 15:03:22 2018 Received: (at 33185) by debbugs.gnu.org; 20 Nov 2018 20:03:22 +0000 Received: from localhost ([127.0.0.1]:37433 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPCF0-0007Bo-AC for submit@debbugs.gnu.org; Tue, 20 Nov 2018 15:03:22 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:42618 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gPCEz-0007Bg-8p for 33185@debbugs.gnu.org; Tue, 20 Nov 2018 15:03:21 -0500 Received: by mira.cbaines.net (Postfix, from userid 113) id D902516832; Tue, 20 Nov 2018 20:03:20 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id A60D21682E; Tue, 20 Nov 2018 20:03:20 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id e96abd6f; Tue, 20 Nov 2018 20:03:20 +0000 (UTC) References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-5-mail@cbaines.net> <87pnv1xc0i.fsf@gnu.org> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: [bug#33185] [PATCH 5/7] gnu: Add python-django-debug-toolbar. In-reply-to: <87pnv1xc0i.fsf@gnu.org> Date: Tue, 20 Nov 2018 20:03:20 +0000 Message-ID: <878t1nseif.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: > Christopher Baines skribis: > >> * gnu/packages/django.scm (python-django-debug-toolbar, >> python2-django-debug-toolbar): New variables. > > [...] > >> + (synopsis "Toolbar to help with developing Django applications") >> + (description >> + "A configurable set of panels that display various debug informati= on >> +about the current request/response.") > > Please make a full sentence. Otherwise LGTM. Sure, I've expanded this a bit now and pushed. Thanks for taking a look :) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlv0aIhfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XfknhAArDxPZICIBgbbNEU1R+1KK6T0e/YK14wyQw1/aONlj17bz/li01Q/xXb5 xJqr6EC6sdQFT5Gd4cfG90+76TaxWtw7QWpkodmQa8xiv6g7IiwJg7KV4b7ndKvo F3HaxwS6OvXEbLXYj21Yj4+lIIAQa7JSY4/2ftFusAAoZaoTixfZO20VcE4377Rb A9Q1y4HkEqvKMquJzwKeHdOmoguPr5vgTKmKG/xLt6Zv99ig6tDAfU8bTewXFGQs L9qyv8PKLdvPKo4l8P7Pu1tTPG4D1b589K3EmG1KkXHuIwxD+dmHyIeEbwNSrjku Csi8HLjxDu5fXLGV3Rs0rloJYGyojz2vBukEUp7jdR0O4gKR7fjedZCo3BLLzP0O NbJpQCKaUgCn9v/egU1aIhn12TL6yjDNnQOoEfLpy4fZHgHYAQX83xxQ0EHKFHf6 wfb8hMPqLat/lMKy2h9SvFXdtaXcx6CjvOj3e5YnVSm1+vmRE2DtWsRpIV+Z3anK iICBxMiRfy4jo3zPzr6MZAx8oelB4n8kerei/w0VK+8F4WwonFKa7nB6+LoDOmNS k92ZNasbR/nkqqA4brW435Q4pmD7qHAXspiAr4/pPlx4g3dKufI/wigorlwA79Kj 9BtqEYkjK0Ul+kFOqS8j+yUrQFSjlC7QShEJJN7wAcu3FBsE6dE= =ZyNY -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 22 17:09:43 2019 Received: (at 33185) by debbugs.gnu.org; 22 Jan 2019 22:09:43 +0000 Received: from localhost ([127.0.0.1]:41708 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4Ee-0002hM-OR for submit@debbugs.gnu.org; Tue, 22 Jan 2019 17:09:43 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:53924 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4Ec-0002h8-EG for 33185@debbugs.gnu.org; Tue, 22 Jan 2019 17:09:31 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 2E5FF16A89 for <33185@debbugs.gnu.org>; Tue, 22 Jan 2019 22:09:29 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 7bc8b304 for <33185@debbugs.gnu.org>; Tue, 22 Jan 2019 22:09:28 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH v2 1/2] gnu: Add patchwork. Date: Tue, 22 Jan 2019 22:09:27 +0000 Message-Id: <20190122220928.17927-1-mail@cbaines.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <87y3aie8a1.fsf@cbaines.net> References: <87y3aie8a1.fsf@cbaines.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/patchutils.scm (patchwork): New variable. --- gnu/packages/patchutils.scm | 154 ++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm index 09f5afbb28..cba2076175 100644 --- a/gnu/packages/patchutils.scm +++ b/gnu/packages/patchutils.scm @@ -31,6 +31,8 @@ #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages check) + #:use-module (gnu packages databases) + #:use-module (gnu packages django) #:use-module (gnu packages file) #:use-module (gnu packages gawk) #:use-module (gnu packages gettext) @@ -305,3 +307,155 @@ directories, and has support for many popular version control systems. Meld helps you review code changes and understand patches. It might even help you to figure out what is going on in that merge you keep avoiding.") (license gpl2))) + +(define-public patchwork + (package + (name "patchwork") + (version "2.1.1") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/getpatchwork/patchwork.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1wpcgkji9cb50lyv12ifgk08sjn7dkqkzis9qjwhx6y855dfdfn1")))) + (build-system python-build-system) + (arguments + `(;; TODO: Tests require a running database + #:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (add-after 'unpack 'replace-wsgi.py + (lambda* (#:key inputs outputs #:allow-other-keys) + (delete-file "patchwork/wsgi.py") + (call-with-output-file "patchwork/wsgi.py" + (lambda (port) + ;; Embed the PYTHONPATH containing the dependencies, as well + ;; as the python modules in this package in the wsgi.py file, + ;; as this will ensure they are available at runtime. + (define pythonpath + (string-append (getenv "PYTHONPATH") + ":" + (site-packages inputs outputs))) + (display + (string-append " +import os, sys + +sys.path.extend('" pythonpath "'.split(':')) + +from django.core.wsgi import get_wsgi_application + +# By default, assume that patchwork is running as a Guix service, which +# provides the settings as the 'guix.patchwork.settings' Python module. +# +# When using httpd, it's hard to set environment variables, so rely on the +# default set here. +os.environ['DJANGO_SETTINGS_MODULE'] = os.getenv( + 'DJANGO_SETTINGS_MODULE', + 'guix.patchwork.settings' # default +) + +application = get_wsgi_application()\n") port))))) + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (or (not tests?) + (begin + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") + (invoke + "python" "-Wonce" "./manage.py" "test" "--noinput") + #t)))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (for-each (lambda (directory) + (copy-recursively + directory + (string-append (site-packages inputs outputs) + "/" directory))) + '("patchwork" + "templates")) + (delete-file-recursively (string-append + (site-packages inputs outputs) + "patchwork/tests")) + ;; pwclient + (for-each (lambda (file) + (install-file file (string-append out "/bin"))) + (list + (string-append (site-packages inputs outputs) + "/patchwork/bin/pwclient") + (string-append (site-packages inputs outputs) + "/patchwork/bin/parsemail.sh") + (string-append (site-packages inputs outputs) + "patchwork/bin/parsemail-batch.sh"))) + + (simple-format #t "replacing template pwclient symlink") + (let ((template-pwclient (string-append + (site-packages inputs outputs) + "/patchwork/templates/patchwork/pwclient"))) + (delete-file template-pwclient) + (copy-file (string-append (site-packages inputs outputs) + "/patchwork/bin/pwclient") + template-pwclient)) + + (let ((static-root + (string-append out "/share/patchwork/htdocs"))) + (mkdir-p static-root) + (copy-file "patchwork/settings/production.example.py" + "patchwork/settings/assets.py") + (setenv "DJANGO_SECRET_KEY" "dummyvalue") + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.assets") + (setenv "STATIC_ROOT" static-root) + (invoke "./manage.py" "collectstatic" "--no-input")) + + (copy-recursively "lib" + (string-append + out "/share/doc/" ,name "-" ,version))) + #t)) + (add-after 'install 'install-hasher + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (chmod (string-append (site-packages inputs outputs) + "/patchwork/hasher.py") + #o555) + (symlink (string-append (site-packages inputs outputs) + "/patchwork/hasher.py") + (string-append out "/bin/hasher"))) + #t)) + ;; Create a patchwork specific version of Django's command line admin + ;; utility. + (add-after 'install 'install-patchwork-admin + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/bin")) + (call-with-output-file (string-append out "/bin/patchwork-admin") + (lambda (port) + (display "#!/usr/bin/env python3 +import os, sys + +if __name__ == \"__main__\": + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv)" port))) + (chmod (string-append out "/bin/patchwork-admin") #o555)) + #t))))) + (inputs + `(("python-wrapper" ,python-wrapper))) + (propagated-inputs + `(("python-django" ,python-django) + ;; TODO: Make this configurable + ("python-psycopg2" ,python-psycopg2) + ("python-mysqlclient" ,python-mysqlclient) + ("python-django-filter" ,python-django-filter) + ("python-djangorestframework" ,python-djangorestframework) + ("python-django-debug-toolbar" ,python-django-debug-toolbar))) + (synopsis "Web based patch tracking system") + (description + "Patchwork is a patch tracking system. It takes in emails containing +patches, and displays the patches along with comments and state information. +Users can login allowing them to change the state of patches.") + (home-page "http://jk.ozlabs.org/projects/patchwork/") + (license gpl2+))) -- 2.20.1 From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 22 17:09:44 2019 Received: (at 33185) by debbugs.gnu.org; 22 Jan 2019 22:09:44 +0000 Received: from localhost ([127.0.0.1]:41710 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4Ep-0002hZ-RZ for submit@debbugs.gnu.org; Tue, 22 Jan 2019 17:09:44 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:53922 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4Ec-0002h7-ER for 33185@debbugs.gnu.org; Tue, 22 Jan 2019 17:09:31 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 3D22216A8A for <33185@debbugs.gnu.org>; Tue, 22 Jan 2019 22:09:29 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id b16d782b for <33185@debbugs.gnu.org>; Tue, 22 Jan 2019 22:09:28 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH v2 2/2] services: Add patchwork. Date: Tue, 22 Jan 2019 22:09:28 +0000 Message-Id: <20190122220928.17927-2-mail@cbaines.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122220928.17927-1-mail@cbaines.net> References: <87y3aie8a1.fsf@cbaines.net> <20190122220928.17927-1-mail@cbaines.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/service/web.scm ( , ): New record types. (patchwork-virtualhost): New procedure. (patchwork-service-type): New variable. * gnu/tests/web.scm (%test-patchwork): New variable. --- gnu/services/web.scm | 284 ++++++++++++++++++++++++++++++++++++++++++- gnu/tests/web.scm | 160 +++++++++++++++++++++++- 2 files changed, 442 insertions(+), 2 deletions(-) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index d71fed20ed..1986c2095c 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -32,12 +32,17 @@ #:use-module (gnu system pam) #:use-module (gnu system shadow) #:use-module (gnu packages admin) + #:use-module (gnu packages databases) #:use-module (gnu packages web) + #:use-module (gnu packages patchutils) #:use-module (gnu packages php) + #:use-module (gnu packages python) #:use-module (gnu packages guile) #:use-module (gnu packages logging) + #:use-module (guix packages) #:use-module (guix records) #:use-module (guix modules) + #:use-module (guix utils) #:use-module (guix gexp) #:use-module ((guix store) #:select (text-file)) #:use-module ((guix utils) #:select (version-major)) @@ -211,7 +216,42 @@ varnish-configuration-parameters varnish-configuration-extra-options - varnish-service-type)) + varnish-service-type + + + patchwork-database-configuration + patchwork-database-configuration? + patchwork-database-configuration-engine + patchwork-database-configuration-name + patchwork-database-configuration-user + patchwork-database-configuration-password + patchwork-database-configuration-host + patchwork-database-configuration-port + + + patchwork-settings-module + patchwork-settings-module? + patchwork-settings-module-database-configuration + patchwork-settings-module-secret-key + patchwork-settings-module-allowed-hosts + patchwork-settings-module-default-from-email + patchwork-settings-module-static-url + patchwork-settings-module-admins + patchwork-settings-module-debug? + patchwork-settings-module-enable-rest-api? + patchwork-settings-module-enable-xmlrpc? + patchwork-settings-module-force-https-links? + patchwork-settings-module-extra-settings + + + patchwork-configuration + patchwork-configuration? + patchwork-configuration-patchwork + patchwork-configuration-settings-module + patchwork-configuration-domain + + patchwork-virtualhost + patchwork-service-type)) ;;; Commentary: ;;; @@ -1269,3 +1309,245 @@ files.") varnish-shepherd-service))) (default-value (varnish-configuration)))) + + +;;; +;;; Patchwork +;;; + +(define-record-type* + patchwork-database-configuration make-patchwork-database-configuration + patchwork-database-configuration? + (engine patchwork-database-configuration-engine + (default "django.db.backends.postgresql_psycopg2")) + (name patchwork-database-configuration-name + (default "patchwork")) + (user patchwork-database-configuration-user + (default "httpd")) + (password patchwork-database-configuration-password + (default "")) + (host patchwork-database-configuration-host + (default "")) + (port patchwork-database-configuration-port + (default ""))) + +(define-record-type* + patchwork-settings-module make-patchwork-settings-module + patchwork-settings-module? + (database-configuration patchwork-settings-module-database-configuration + (default (patchwork-database-configuration))) + (secret-key-file patchwork-settings-module-secret-key-file + (default "/etc/patchwork/django-secret-key")) + (allowed-hosts patchwork-settings-module-allowed-hosts) + (default-from-email patchwork-settings-module-default-from-email) + (static-url patchwork-settings-module-static-url + (default "/static/")) + (admins patchwork-settings-module-admins + (default '())) + (debug? patchwork-settings-module-debug? + (default #f)) + (enable-rest-api? patchwork-settings-module-enable-rest-api? + (default #t)) + (enable-xmlrpc? patchwork-settings-module-enable-xmlrpc? + (default #t)) + (force-https-links? patchwork-settings-module-force-https-links? + (default #t)) + (extra-settings patchwork-settings-module-extra-settings + (default ""))) + +(define-record-type* + patchwork-configuration make-patchwork-configuration + patchwork-configuration? + (patchwork patchwork-configuration-patchwork + (default patchwork)) + (settings-module patchwork-configuration-settings-module) + (domain patchwork-configuration-domain)) + +;; Django uses a Python module for configuration, so this compiler generates a +;; Python module from the configuration record. +(define-gexp-compiler (patchwork-settings-module-compiler + (file ) system target) + (match file + (($ database-configuration secret-key-file + allowed-hosts default-from-email + static-url admins debug? enable-rest-api? + enable-xmlrpc? force-https-links? + extra-configuration) + (gexp->derivation + "patchwork-settings" + (with-imported-modules '((guix build utils)) + #~(let ((output #$output)) + (define (create-__init__.py filename) + (call-with-output-file filename + (lambda (port) (display "" port)))) + + (use-modules (guix build utils) + (srfi srfi-1)) + + (mkdir-p (string-append output "/guix/patchwork")) + (create-__init__.py + (string-append output "/guix/__init__.py")) + (create-__init__.py + (string-append output "/guix/patchwork/__init__.py")) + + (call-with-output-file + (string-append output "/guix/patchwork/settings.py") + (lambda (port) + (display + (string-append "from patchwork.settings.base import * + +# Configuration from Guix +with open('" #$secret-key-file "') as f: + SECRET_KEY = f.read().strip() + +ALLOWED_HOSTS = [ +" #$(string-concatenate + (map (lambda (allowed-host) + (string-append " '" allowed-host "'\n")) + allowed-hosts)) +"] + +DEBUG = " #$(if debug? "True" "False") " + +ENABLE_REST_API = " #$(if enable-xmlrpc? "True" "False") " +ENABLE_XMLRPC = " #$(if enable-xmlrpc? "True" "False") " + +FORCE_HTTPS_LINKS = " #$(if force-https-links? "True" "False") " + +DATABASES = { + 'default': { +" #$(match database-configuration + (($ + engine name user password host port) + (string-append + " 'ENGINE': '" engine "',\n" + " 'NAME': '" name "',\n" + " 'USER': '" user "',\n" + " 'PASSWORD': '" password "',\n" + " 'HOST': '" host "',\n" + " 'PORT': '" port "',\n"))) " + }, +} + +" #$(if debug? + #~(string-append "STATIC_ROOT = '" #$(file-append patchwork "/share/patchwork/htdocs") "'") + #~(string-append "STATIC_URL = '" #$static-url "'")) " + +STATICFILES_STORAGE = ( + 'django.contrib.staticfiles.storage.StaticFilesStorage' +) + +# Guix Extra Configuration +" #$extra-configuration " +") port))) + #t)) + #:local-build? #t)))) + +(define patchwork-virtualhost + (match-lambda + (($ patchwork settings-module + domain) + + (define wsgi.py + (file-append patchwork + (string-append + "/lib/python" + (version-major+minor + (package-version python)) + "/site-packages/patchwork/wsgi.py"))) + + (httpd-virtualhost + "*:8080" + `("ServerAdmin admin@example.com +ServerName " ,domain " + +LogFormat \"%v %h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" customformat +LogLevel info +CustomLog \"/var/log/httpd/" ,domain "-access_log\" customformat + +ErrorLog /var/log/httpd/error.log + +WSGIScriptAlias / " ,wsgi.py " +WSGIDaemonProcess " ,(package-name patchwork) " user=httpd group=httpd processes=1 threads=2 display-name=%{GROUP} lang='en_US.UTF-8' locale='en_US.UTF-8' python-path=" ,settings-module " +WSGIProcessGroup " ,(package-name patchwork) " +WSGIPassAuthorization On + + + Require all granted + + +Alias /static " ,patchwork "/share/patchwork/htdocs + + AllowOverride None + Options MultiViews Indexes SymlinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS +"))))) + +(define (patchwork-httpd-configuration patchwork-configuration) + (list "WSGISocketPrefix /var/run/mod_wsgi" + (list "LoadModule wsgi_module " + (file-append mod-wsgi "/modules/mod_wsgi.so")) + (patchwork-virtualhost patchwork-configuration))) + +(define (patchwork-django-admin-gexp patchwork settings-module) + #~(lambda command + (let ((pid (primitive-fork)) + (user (getpwnam "httpd"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + + (setenv "DJANGO_SETTINGS_MODULE" "guix.patchwork.settings") + (setenv "PYTHONPATH" #$settings-module) + (primitive-exit + (if (zero? + (apply system* + #$(file-append patchwork "/bin/patchwork-admin") + command)) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))))) + +(define (patchwork-django-admin-action patchwork settings-module) + (shepherd-action + (name 'django-admin) + (documentation + "Run a django admin command for patchwork") + (procedure (patchwork-django-admin-gexp patchwork settings-module)))) + +(define patchwork-service-type + (service-type + (name 'patchwork-setup) + (extensions + (list (service-extension httpd-service-type + patchwork-httpd-configuration) + (service-extension + shepherd-root-service-type + (match-lambda + (($ patchwork settings-module + domain) + (list (shepherd-service + (requirement '(postgres)) + (provision (list (string->symbol + (string-append (package-name patchwork) + "-setup")))) + (start + #~(lambda () + (define run-django-admin-command + #$(patchwork-django-admin-gexp patchwork + settings-module)) + + (run-django-admin-command "migrate"))) + (stop #~(const #f)) + (actions + (list (patchwork-django-admin-action patchwork + settings-module))) + (respawn? #f) + (documentation "Setup patchwork.")))))))) + (description + "Patchwork patch tracking system."))) diff --git a/gnu/tests/web.scm b/gnu/tests/web.scm index 319655396a..0b109c0ed7 100644 --- a/gnu/tests/web.scm +++ b/gnu/tests/web.scm @@ -28,15 +28,27 @@ #:use-module (gnu system vm) #:use-module (gnu services) #:use-module (gnu services web) + #:use-module (gnu services databases) #:use-module (gnu services networking) + #:use-module (gnu services shepherd) + #:use-module (gnu packages databases) + #:use-module (gnu packages patchutils) + #:use-module (gnu packages python) + #:use-module (gnu packages web) + #:use-module (guix packages) + #:use-module (guix modules) + #:use-module (guix records) #:use-module (guix gexp) #:use-module (guix store) + #:use-module (guix utils) + #:use-module (ice-9 match) #:export (%test-httpd %test-nginx %test-varnish %test-php-fpm %test-hpcguix-web - %test-tailon)) + %test-tailon + %test-patchwork)) (define %index.html-contents ;; Contents of the /index.html file. @@ -498,3 +510,149 @@ HTTP-PORT." (name "tailon") (description "Connect to a running Tailon server.") (value (run-tailon-test)))) + + +;;; +;;; Patchwork +;;; + +(define patchwork-initial-database-setup-service + (match-lambda + (($ + engine name user password host port) + + (define start-gexp + #~(lambda () + (let ((pid (primitive-fork)) + (postgres (getpwnam "postgres"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid postgres)) + (setuid (passwd:uid postgres)) + (primitive-exit + (if (and + (zero? + (system* #$(file-append postgresql "/bin/createuser") + #$user)) + (zero? + (system* #$(file-append postgresql "/bin/createdb") + "-O" #$user #$name))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))))) + + (shepherd-service + (requirement '(postgres)) + (provision '(patchwork-postgresql-user-and-database)) + (start start-gexp) + (stop #~(const #f)) + (respawn? #f) + (documentation "Setup patchwork database."))))) + +(define (patchwork-os patchwork) + (simple-operating-system + (service dhcp-client-service-type) + (service httpd-service-type + (httpd-configuration + (config + (httpd-config-file + (listen '("8080")))))) + (service postgresql-service-type) + (simple-service 'patchwork-create-django-secret-key + activation-service-type + #~(begin + (mkdir "/etc/patchwork") + (call-with-output-file "/etc/patchwork/django-secret-key" + (lambda (p) + (display "000000\n" p))) + #t)) + (service patchwork-service-type + (patchwork-configuration + (patchwork patchwork) + (settings-module + (patchwork-settings-module + (allowed-hosts '("*")) + (default-from-email "") + (debug? #t))) + (domain "localhost"))) + (simple-service 'patchwork-database-setup + shepherd-root-service-type + (list + (patchwork-initial-database-setup-service + (patchwork-database-configuration)))))) + +(define (run-patchwork-test patchwork) + "Run tests in %NGINX-OS, which has nginx running and listening on +HTTP-PORT." + (define os + (marionette-operating-system + (patchwork-os patchwork) + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define forwarded-port 8080) + + (define vm + (virtual-machine + (operating-system os) + (port-forwardings `((8080 . ,forwarded-port))))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (srfi srfi-11) (srfi srfi-64) + (gnu build marionette) + (web uri) + (web client) + (web response)) + + (define marionette + (make-marionette (list #$vm))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "patchwork") + + (test-assert "patchwork-postgresql-user-and-service started" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (match (start-service 'patchwork-postgresql-user-and-database) + (#f #f) + (('service response-parts ...) + (match (assq-ref response-parts 'running) + ((#t) #t) + ((pid) (number? pid)))))) + marionette)) + + (test-assert "httpd running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'httpd)) + marionette)) + + (test-equal "http-get" + 200 + (let-values + (((response text) + (http-get #$(simple-format + #f "http://localhost:~A/" forwarded-port) + #:decode-body? #t))) + (response-code response))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "patchwork-test" test)) + +(define %test-patchwork + (system-test + (name "patchwork") + (description "Connect to a running Patchwork service.") + (value (run-patchwork-test patchwork)))) -- 2.20.1 From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 22 17:31:31 2019 Received: (at 33185) by debbugs.gnu.org; 22 Jan 2019 22:31:31 +0000 Received: from localhost ([127.0.0.1]:41746 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4Zu-0006Um-TX for submit@debbugs.gnu.org; Tue, 22 Jan 2019 17:31:31 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:54006 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4Zs-0006SO-EH for 33185@debbugs.gnu.org; Tue, 22 Jan 2019 17:31:29 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 81C4E16A71; Tue, 22 Jan 2019 22:31:27 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id e13f7f52; Tue, 22 Jan 2019 22:31:27 +0000 (UTC) References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-6-mail@cbaines.net> <87h8gdxbu0.fsf@gnu.org> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: [bug#33185] [PATCH 6/7] gnu: Add patchwork. In-reply-to: <87h8gdxbu0.fsf@gnu.org> Date: Tue, 22 Jan 2019 22:31:24 +0000 Message-ID: <87ef94iatf.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: > Christopher Baines skribis: > >> --- >> gnu/packages/patchutils.scm | 103 ++++++++++++++++++++++++++++++++++++ >> 1 file changed, 103 insertions(+) > > [...] > >> + (add-after 'install 'install-patchwork-admin >> + (lambda* (#:key inputs outputs #:allow-other-keys) >> + (let* ((out (assoc-ref outputs "out"))) >> + (mkdir-p (string-append out "/bin")) >> + (call-with-output-file (string-append out "/bin/patchwor= k-admin") >> + (lambda (port) >> + (display "#!/usr/bin/env python3 >> +import os, sys >> + >> +if __name__ =3D=3D \"__main__\": >> + os.environ.setdefault( >> + \"DJANGO_SETTINGS_MODULE\", >> + \"guix.patchwork.settings\" >> + ) >> + >> + from django.core.management import execute_from_command_line >> + >> + execute_from_command_line(sys.argv)" port))) >> + (chmod (string-append out "/bin/patchwork-admin") #o555)) >> + #t))))) > > IMO these phases would be less intimidating with a few comments > explaining what=E2=80=99s going on. :-) > >> + (synopsis "") >> + (description "") >> + (home-page "") >> + (license ""))) > > As swedebugia noted, you=E2=80=99re missing a few things here and in the = commit > log. :-) > > With these things fixed it should be good! Thanks for taking a look. I've finally got around to taking another look at these patches, and sent updated patches for the package, service and system test. I think it's a lot further forward, but there are still a few bits to sort out. I'll send some comments in reply to the patches. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlxHmbxfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9Xew2BAAqagVbKEY7gKlXY6Sn/zR2XSi/wbkjWcNnNEXoY61IPauqWjEBDQF/sUS m/zgcpvBq3pYuTdchcuZwgymfgtYLmelxE9SolfSbaA76QNEdFvUz6UbjX3Hj1rS oNsLzKxyQQOSz15AOnR9GDlhJhBM1/ndULFH7K/meIuwcvJK+Gt4NZrd+S/aEyoA Ua8jH1XRW59hagQ9jprr/Xu6Nn0DWMyHw4OH3my8GvhpmMHLAF3PE3KrVe/is3Hs G2Eu4Lhh1+nhLnerTuOTwygT6FR0L90wILx6bEjvfOQCYruH0FAof3HU91vXwHVk Cq1NsYJbn10Yg3HEWZtS7oC0CWLcO1ixBjyVcq0XTXJEpiHcIZB1nen0A7oB29YW GaLELIdU6Y3GRSzkVXhTLw3YTX0rxawPjwQuj6lNX5+DiVzzLgNe7BtbsETXIDcp caNTtj6SNNqh9Fcy9pykKyYH+GQWY0jZwRYZAgQ07Y0woZpPrdVe9cSM+gPU6XKP 2JAGcnrCbY9Qe8HelegpLyWkSG0t3Urlf6fDfBt693WsrnvD0O7Hd2zuH1oQc94s +dZyqxsPy99axLF66jv7jakgD1K+xNYPN+quodlFnNMaP7t9k/apA0RIt75dapT0 8p9I3VVXiHUfYO3QB29chZV/5jr+J6KCS8bdhPxW4JU+SGGnOBE= =eF/9 -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 22 17:36:14 2019 Received: (at 33185) by debbugs.gnu.org; 22 Jan 2019 22:36:14 +0000 Received: from localhost ([127.0.0.1]:41751 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4eT-0007RH-MT for submit@debbugs.gnu.org; Tue, 22 Jan 2019 17:36:13 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:54016 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4eS-0007RA-E8 for 33185@debbugs.gnu.org; Tue, 22 Jan 2019 17:36:12 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 8BFD016A71; Tue, 22 Jan 2019 22:36:11 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 4150f654; Tue, 22 Jan 2019 22:36:11 +0000 (UTC) References: <20181104104455.3527-1-mail@cbaines.net> <20181104104455.3527-6-mail@cbaines.net> <8334382e-d993-2375-6a27-79e6fd42c571@riseup.net> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: swedebugia Subject: Re: [bug#33185] [PATCH 6/7] gnu: Add patchwork. In-reply-to: <8334382e-d993-2375-6a27-79e6fd42c571@riseup.net> Date: Tue, 22 Jan 2019 22:36:10 +0000 Message-ID: <87d0ooialh.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain swedebugia writes: > Hi > > I did not run the code. See question below. > > On 2018-11-04 11:44, Christopher Baines wrote: >> --- >> gnu/packages/patchutils.scm | 103 ++++++++++++++++++++++++++++++++++++ >> 1 file changed, 103 insertions(+) >> >> diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm > snip >> + >> +(define-public patchwork >> + > snip >> + (synopsis "") >> + (description "") >> + (home-page "") >> + (license ""))) > Perhaps you forgot to populate these 4 fields? These patches for patchwork were just functional, not ready for merging. However, I've now got around to sending some more polished patches, not quite ready for merging yet still, but at least with values for these fields. Thanks, Chris --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlxHmtpfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XeCqRAAtgNGJ2Ao61gh9LxAXR0QN5YdoJSDdSgvfeiaRJMRfF9lCZmDGnGrLXup 4kNaQHglsup6TaMg/vTO7BtdbL5bWjiqunRQuTgVGkbljYolUN4znvsjpIU/rnhT fl2VWP3dOJg6PlRC/gvrxRrkMw0wvhwcGHN+5s1Kp+7UWWXILNZetYRI+9D30Fho Ek1WZHpKBGdTs0L2HkS6BleksB+irsj0JAHy+dfexEw2jxWhoTLPDJ0p762WdAt5 IbJH6mZ5oOKt/W7J0MpE5w9vbvCFmAfAqAyOodVRwFBTEB2dVplSoc2oAxhRY0WT BCQnrWy/l/K5UpwHszVwADQIoqEwSfUQbkJY9cxS/TtxLauf0NxcleAohmSCKWjO FIO//L82lzwjOwuYUjr0qFBCbfn0RO+rSaCvuAjdVtpDy5XItqxtXN9M8rArpz01 10FUjjtkv+tQMl4wsPRykGiAP29idCC6QbzTvMzZNTNcJZaTB7xJFE9Lq8s/aoAb T4LPFzRD0ACabLCk3McRc5MzQQD6M5KKHl4rBlWY+A2kbbSwllwgYfZB4Uocf3K7 t2LOGU2vFHB05cwb50w+gLrD1PBRrRnKcwx2O2jGSh36VvtqsQq9EkwUldzgwiaA qfmtynNz8e5PaKsoMDZGGSaCW3EBYfH8bvE748tR1/diO2Gkrao= =uj/3 -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 22 17:40:55 2019 Received: (at 33185) by debbugs.gnu.org; 22 Jan 2019 22:40:55 +0000 Received: from localhost ([127.0.0.1]:41758 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4j0-0007Xh-NY for submit@debbugs.gnu.org; Tue, 22 Jan 2019 17:40:54 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:54024 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gm4iz-0007XZ-Cn for 33185@debbugs.gnu.org; Tue, 22 Jan 2019 17:40:53 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 8A7DE16A71 for <33185@debbugs.gnu.org>; Tue, 22 Jan 2019 22:40:52 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 7c322383 for <33185@debbugs.gnu.org>; Tue, 22 Jan 2019 22:40:52 +0000 (UTC) References: <87y3aie8a1.fsf@cbaines.net> <20190122220928.17927-1-mail@cbaines.net> <20190122220928.17927-2-mail@cbaines.net> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: 33185@debbugs.gnu.org Subject: Re: [bug#33185] [PATCH v2 2/2] services: Add patchwork. In-reply-to: <20190122220928.17927-2-mail@cbaines.net> Date: Tue, 22 Jan 2019 22:40:52 +0000 Message-ID: <87bm48iadn.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Christopher Baines writes: > +(define (patchwork-django-admin-gexp patchwork settings-module) > + #~(lambda command > + (let ((pid (primitive-fork)) > + (user (getpwnam "httpd"))) > + (if (eq? pid 0) > + (dynamic-wind > + (const #t) > + (lambda () > + (setgid (passwd:gid user)) > + (setuid (passwd:uid user)) > + > + (setenv "DJANGO_SETTINGS_MODULE" "guix.patchwork.settings") > + (setenv "PYTHONPATH" #$settings-module) > + (primitive-exit > + (if (zero? > + (apply system* > + #$(file-append patchwork "/bin/patchwork-admin") > + command)) > + 0 > + 1))) > + (lambda () > + (primitive-exit 1))) > + (zero? (cdr (waitpid pid))))))) > + > +(define (patchwork-django-admin-action patchwork settings-module) > + (shepherd-action > + (name 'django-admin) > + (documentation > + "Run a django admin command for patchwork") > + (procedure (patchwork-django-admin-gexp patchwork settings-module)))) It would be really useful to provide an easy way of accessing the Django admin utilities. I think Shepherd actions might be a good way of doing this, but I haven't got it working yet... I think something goes wrong when it forks, so I might need to try different approaches to change user. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlxHm/RfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9Xehiw//d1FgpRGathpWxEyczj84ILPSjr+hoWzKgyGQDKausqZP08T69951VZcs XACoa0C+gKQOAUXN+qUmILcCxHTgP2XE3rOuQQX7bm+EN2ew03qxTgqjXR0D40dA grTq8RbDuQcrVkmKu0fLHq0a5Ju/eIBM2cIsZg3kct2da5+Ey0vRivd+EK3TSTM4 PdGvfcLScpeLJWTH+r0Hmc1flIJITZyMOMJ77rEHTXBzEnmJaWuoSfOhqICE4gP0 JSXU8STO6/Fj7xOSAjAOhJsjjphTqxZANAVE3nandAopGD0RPfCus1eQ8AQIJ+ft 2CEgp2/lxUP6RfsZlV/b7uWqf1nG/k6tbKoBnK4ugkqRg18b1h+kIuYpyuvv/4LU jdRUr5OZTiNJJklzU5MouYME7MAPg3Ka51mwM+nZM/DyyoAN0bkqQ8F36lPfuwwP CJWtb4/Yc7FkUB4xLIlDKSdhtutnkvum9mYbnE00dVqeA18e3anuOxffdvgDFx+c VSAdLhr6iy5I50qaRVoQUJ79X8i41peGXfRDfylMPcv/COLZ6i1c9++P/N3U3WFK 47ooTMmyr8yeABPqt7NMJ3h2O0dRD0XZ3UcETT54VJGI/EdZQv8lj/RDuRkMd624 33DjLbukBn9m78mjkwoXLpLEdPVSwNbK+7SDYFdZgi+yB3y2AF0= =+Fm5 -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Jan 23 04:29:17 2019 Received: (at 33185) by debbugs.gnu.org; 23 Jan 2019 09:29:17 +0000 Received: from localhost ([127.0.0.1]:42020 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gmEqS-0006uE-Qq for submit@debbugs.gnu.org; Wed, 23 Jan 2019 04:29:17 -0500 Received: from sender-of-o53.zoho.com ([135.84.80.218]:21801) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gmEqP-0006u4-Gb for 33185@debbugs.gnu.org; Wed, 23 Jan 2019 04:29:15 -0500 ARC-Seal: i=1; a=rsa-sha256; t=1548235738; cv=none; d=zoho.com; s=zohoarc; b=SqvowsPa1FKPVyJCLml1wEkNY5zogx4XedkYkVOdvaQ0fllZC1pbheDAXRpFgHS3lGA3u8QN/Fqc++xcBFHudM40An20k+2HmZLaraMWs7pN//bN1ky4M6joexJJg7ftmRSWJcuoTZ/VfTUDf4dGhWyCb0hFlK53Mv9f5tr4FOA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1548235738; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To:ARC-Authentication-Results; bh=kA5sGNYcCGIhrU/cjrEiCgot2pf3ASPmh+h8qAkqFqI=; b=HdGyDuyBmtncjyNdwGEo8GuLqreeymb1nUEsXE55ZsEwiO4zaJ7r39A4uRFbGcKk4ps+afpsGmVYKzOfYmDFLiB3f9JTMDR7LqVRlPbL2SV0vjprompeg2yt58usEnfjSadBulB0+mqeBszYlLtYhJFKao3yKfKOUYiADCoBRbA= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass header.i=elephly.net; spf=pass smtp.mailfrom=rekado@elephly.net; dmarc=pass header.from= header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1548235738; s=zoho; d=elephly.net; i=rekado@elephly.net; h=References:From:To:Cc:Subject:In-reply-to:Date:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding; l=2116; bh=kA5sGNYcCGIhrU/cjrEiCgot2pf3ASPmh+h8qAkqFqI=; b=ZA/hBFAnMtYzz5Kq98PNJVl0+dBNr1a8xadJOa2y5mWLqJ6CyjCjUnWaNZnh4cHA /89Ug/idFQ8tKJW0uXDH5OkDeko3URB4GiXuH795xRgN+ojoLixHemD9lA7d+o/VCHA 5TvE/Pem+48TxGP02wNrH3x8yUwTRJlHnhvb7brg= Received: from localhost (p578E6B53.dip0.t-ipconnect.de [87.142.107.83]) by mx.zohomail.com with SMTPS id 1548235737356592.687064235227; Wed, 23 Jan 2019 01:28:57 -0800 (PST) References: <87y3aie8a1.fsf@cbaines.net> <20190122220928.17927-1-mail@cbaines.net> User-agent: mu4e 1.0; emacs 26.1 From: Ricardo Wurmus To: Christopher Baines Subject: Re: [bug#33185] [PATCH v2 1/2] gnu: Add patchwork. In-reply-to: <20190122220928.17927-1-mail@cbaines.net> X-URL: https://elephly.net X-PGP-Key: https://elephly.net/rekado.pubkey X-PGP-Fingerprint: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC Date: Wed, 23 Jan 2019 10:28:53 +0100 Message-ID: <87imyf7mei.fsf@elephly.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Chris, thanks for the patch! > * gnu/packages/patchutils.scm (patchwork): New variable. [=E2=80=A6] > + (replace 'check > + (lambda* (#:key tests? #:allow-other-keys) > + (or (not tests?) > + (begin > + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.= dev") > + (invoke > + "python" "-Wonce" "./manage.py" "test" "--noinput") > + #t)))) Maybe write this as (replace 'check (lambda* (#:key tests? #:allow-other-keys) (when tests? (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") (invoke "python" "-Wonce" "./manage.py" "test" "--noinput")) #t)) > + (replace 'install > + (lambda* (#:key inputs outputs #:allow-other-keys) > + (let ((out (assoc-ref outputs "out"))) [=E2=80=A6] This phase might be less verbose if you let-bound the result of (site-packages inputs outputs) at the beginning. It would also be good if there were more comments about what=E2=80=99s going on. It=E2=80=99s no= t all obvious (e.g. why =E2=80=9Clib=E2=80=9D is copied to =E2=80=9Cdocs=E2=80=9D). > + (simple-format #t "replacing template pwclient symlink") Use =E2=80=9Cdisplay=E2=80=9D instead of =E2=80=9Csimple-format #t=E2=80=9D? > + (add-after 'install 'install-hasher > + (lambda* (#:key inputs outputs #:allow-other-keys) > + (let* ((out (assoc-ref outputs "out"))) > + (chmod (string-append (site-packages inputs outputs) > + "/patchwork/hasher.py") > + #o555) > + (symlink (string-append (site-packages inputs outputs) > + "/patchwork/hasher.py") > + (string-append out "/bin/hasher"))) > + #t)) Here also consider simplifying with let. > + ;; Create a patchwork specific version of Django's command line= admin > + ;; utility. > + (add-after 'install 'install-patchwork-admin > + (lambda* (#:key inputs outputs #:allow-other-keys) > + (let* ((out (assoc-ref outputs "out"))) > + (mkdir-p (string-append out "/bin")) > + (call-with-output-file (string-append out "/bin/patchwork= -admin") > + (lambda (port) > + (display "#!/usr/bin/env python3 Should this really say =E2=80=9C#!/usr/bin/env python3=E2=80=9D? -- Ricardo From debbugs-submit-bounces@debbugs.gnu.org Fri Jan 25 16:00:19 2019 Received: (at 33185) by debbugs.gnu.org; 25 Jan 2019 21:00:19 +0000 Received: from localhost ([127.0.0.1]:45602 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gn8a8-0008Hg-CT for submit@debbugs.gnu.org; Fri, 25 Jan 2019 16:00:19 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:56782 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gn8a6-0008HP-21 for 33185@debbugs.gnu.org; Fri, 25 Jan 2019 16:00:07 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 0BD7F169BD for <33185@debbugs.gnu.org>; Fri, 25 Jan 2019 21:00:05 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 49688dec for <33185@debbugs.gnu.org>; Fri, 25 Jan 2019 21:00:04 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH v3 1/2] gnu: Add patchwork. Date: Fri, 25 Jan 2019 21:00:03 +0000 Message-Id: <20190125210004.28221-1-mail@cbaines.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <87y3aie8a1.fsf@cbaines.net> References: <87y3aie8a1.fsf@cbaines.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/patchutils.scm (patchwork): New variable. --- gnu/packages/patchutils.scm | 165 ++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm index 09f5afbb28..260bba3d41 100644 --- a/gnu/packages/patchutils.scm +++ b/gnu/packages/patchutils.scm @@ -31,6 +31,8 @@ #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages check) + #:use-module (gnu packages databases) + #:use-module (gnu packages django) #:use-module (gnu packages file) #:use-module (gnu packages gawk) #:use-module (gnu packages gettext) @@ -305,3 +307,166 @@ directories, and has support for many popular version control systems. Meld helps you review code changes and understand patches. It might even help you to figure out what is going on in that merge you keep avoiding.") (license gpl2))) + +(define-public patchwork + (package + (name "patchwork") + (version "2.1.1") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/getpatchwork/patchwork.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1wpcgkji9cb50lyv12ifgk08sjn7dkqkzis9qjwhx6y855dfdfn1")))) + (build-system python-build-system) + (arguments + `(;; TODO: Tests require a running database + #:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (add-after 'unpack 'replace-wsgi.py + (lambda* (#:key inputs outputs #:allow-other-keys) + (delete-file "patchwork/wsgi.py") + (call-with-output-file "patchwork/wsgi.py" + (lambda (port) + ;; Embed the PYTHONPATH containing the dependencies, as well + ;; as the python modules in this package in the wsgi.py file, + ;; as this will ensure they are available at runtime. + (define pythonpath + (string-append (getenv "PYTHONPATH") + ":" + (site-packages inputs outputs))) + (display + (string-append " +import os, sys + +sys.path.extend('" pythonpath "'.split(':')) + +from django.core.wsgi import get_wsgi_application + +# By default, assume that patchwork is running as a Guix service, which +# provides the settings as the 'guix.patchwork.settings' Python module. +# +# When using httpd, it's hard to set environment variables, so rely on the +# default set here. +os.environ['DJANGO_SETTINGS_MODULE'] = os.getenv( + 'DJANGO_SETTINGS_MODULE', + 'guix.patchwork.settings' # default +) + +application = get_wsgi_application()\n") port))))) + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (when tests? + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") + (invoke "python" "-Wonce" "./manage.py" "test" "--noinput")) + #t)) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (out-site-packages (site-packages inputs outputs))) + (for-each (lambda (directory) + (copy-recursively + directory + (string-append out-site-packages directory))) + '(;; Contains the python code + "patchwork" + ;; Contains the templates for the generated HTML + "templates")) + (delete-file-recursively + (string-append out-site-packages "patchwork/tests")) + + ;; Install patchwork related tools + (for-each (lambda (file) + (install-file file (string-append out "/bin"))) + (list + (string-append out-site-packages + "patchwork/bin/pwclient") + (string-append out-site-packages + "patchwork/bin/parsemail.sh") + (string-append out-site-packages + "patchwork/bin/parsemail-batch.sh"))) + + ;; TODO: Can't remembed why this was important... but I think + ;; it is. + (let ((template-pwclient (string-append + out-site-packages + "patchwork/templates/patchwork/pwclient"))) + (delete-file template-pwclient) + (copy-file (string-append out-site-packages + "patchwork/bin/pwclient") + template-pwclient)) + + ;; Collect the static assets, this includes JavaScript, CSS and + ;; fonts. This is a standard Django process when running a + ;; Django application for regular use, and includes assets for + ;; dependencies like the admin site from Django. + ;; + ;; The intent here is that you can serve files from this + ;; directory through a webserver, which is recommended when + ;; running Django applications. + (let ((static-root + (string-append out "/share/patchwork/htdocs"))) + (mkdir-p static-root) + (copy-file "patchwork/settings/production.example.py" + "patchwork/settings/assets.py") + (setenv "DJANGO_SECRET_KEY" "dummyvalue") + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.assets") + (setenv "STATIC_ROOT" static-root) + (invoke "./manage.py" "collectstatic" "--no-input")) + + ;; The lib directory includes example configuration files that + ;; may be useful when deploying patchwork. + (copy-recursively "lib" + (string-append + out "/share/doc/" ,name "-" ,version))) + #t)) + ;; The hasher script is used from the post-receive.hook + (add-after 'install 'install-hasher + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (out-site-packages (site-packages inputs outputs)) + (out-hasher.py (string-append out-site-packages + "/patchwork/hasher.py"))) + (chmod out-hasher.py #o555) + (symlink out-hasher.py (string-append out "/bin/hasher"))) + #t)) + ;; Create a patchwork specific version of Django's command line admin + ;; utility. + (add-after 'install 'install-patchwork-admin + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/bin")) + (call-with-output-file (string-append out "/bin/patchwork-admin") + (lambda (port) + (simple-format port "#!~A +import os, sys + +if __name__ == \"__main__\": + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv)" (which "python")))) + (chmod (string-append out "/bin/patchwork-admin") #o555)) + #t))))) + (inputs + `(("python-wrapper" ,python-wrapper))) + (propagated-inputs + `(("python-django" ,python-django) + ;; TODO: Make this configurable + ("python-psycopg2" ,python-psycopg2) + ("python-mysqlclient" ,python-mysqlclient) + ("python-django-filter" ,python-django-filter) + ("python-djangorestframework" ,python-djangorestframework) + ("python-django-debug-toolbar" ,python-django-debug-toolbar))) + (synopsis "Web based patch tracking system") + (description + "Patchwork is a patch tracking system. It takes in emails containing +patches, and displays the patches along with comments and state information. +Users can login allowing them to change the state of patches.") + (home-page "http://jk.ozlabs.org/projects/patchwork/") + (license gpl2+))) -- 2.20.1 From debbugs-submit-bounces@debbugs.gnu.org Fri Jan 25 16:00:19 2019 Received: (at 33185) by debbugs.gnu.org; 25 Jan 2019 21:00:20 +0000 Received: from localhost ([127.0.0.1]:45604 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gn8aJ-0008Ip-77 for submit@debbugs.gnu.org; Fri, 25 Jan 2019 16:00:19 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:56784 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gn8a5-0008HQ-WE for 33185@debbugs.gnu.org; Fri, 25 Jan 2019 16:00:07 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 1C30F169C0 for <33185@debbugs.gnu.org>; Fri, 25 Jan 2019 21:00:05 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id c91e1ac1 for <33185@debbugs.gnu.org>; Fri, 25 Jan 2019 21:00:04 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH v3 2/2] services: Add patchwork. Date: Fri, 25 Jan 2019 21:00:04 +0000 Message-Id: <20190125210004.28221-2-mail@cbaines.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190125210004.28221-1-mail@cbaines.net> References: <87y3aie8a1.fsf@cbaines.net> <20190125210004.28221-1-mail@cbaines.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/service/web.scm ( , ): New record types. (patchwork-virtualhost): New procedure. (patchwork-service-type): New variable. * gnu/tests/web.scm (%test-patchwork): New variable. --- gnu/services/web.scm | 284 ++++++++++++++++++++++++++++++++++++++++++- gnu/tests/web.scm | 160 +++++++++++++++++++++++- 2 files changed, 442 insertions(+), 2 deletions(-) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index d71fed20ed..1986c2095c 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -32,12 +32,17 @@ #:use-module (gnu system pam) #:use-module (gnu system shadow) #:use-module (gnu packages admin) + #:use-module (gnu packages databases) #:use-module (gnu packages web) + #:use-module (gnu packages patchutils) #:use-module (gnu packages php) + #:use-module (gnu packages python) #:use-module (gnu packages guile) #:use-module (gnu packages logging) + #:use-module (guix packages) #:use-module (guix records) #:use-module (guix modules) + #:use-module (guix utils) #:use-module (guix gexp) #:use-module ((guix store) #:select (text-file)) #:use-module ((guix utils) #:select (version-major)) @@ -211,7 +216,42 @@ varnish-configuration-parameters varnish-configuration-extra-options - varnish-service-type)) + varnish-service-type + + + patchwork-database-configuration + patchwork-database-configuration? + patchwork-database-configuration-engine + patchwork-database-configuration-name + patchwork-database-configuration-user + patchwork-database-configuration-password + patchwork-database-configuration-host + patchwork-database-configuration-port + + + patchwork-settings-module + patchwork-settings-module? + patchwork-settings-module-database-configuration + patchwork-settings-module-secret-key + patchwork-settings-module-allowed-hosts + patchwork-settings-module-default-from-email + patchwork-settings-module-static-url + patchwork-settings-module-admins + patchwork-settings-module-debug? + patchwork-settings-module-enable-rest-api? + patchwork-settings-module-enable-xmlrpc? + patchwork-settings-module-force-https-links? + patchwork-settings-module-extra-settings + + + patchwork-configuration + patchwork-configuration? + patchwork-configuration-patchwork + patchwork-configuration-settings-module + patchwork-configuration-domain + + patchwork-virtualhost + patchwork-service-type)) ;;; Commentary: ;;; @@ -1269,3 +1309,245 @@ files.") varnish-shepherd-service))) (default-value (varnish-configuration)))) + + +;;; +;;; Patchwork +;;; + +(define-record-type* + patchwork-database-configuration make-patchwork-database-configuration + patchwork-database-configuration? + (engine patchwork-database-configuration-engine + (default "django.db.backends.postgresql_psycopg2")) + (name patchwork-database-configuration-name + (default "patchwork")) + (user patchwork-database-configuration-user + (default "httpd")) + (password patchwork-database-configuration-password + (default "")) + (host patchwork-database-configuration-host + (default "")) + (port patchwork-database-configuration-port + (default ""))) + +(define-record-type* + patchwork-settings-module make-patchwork-settings-module + patchwork-settings-module? + (database-configuration patchwork-settings-module-database-configuration + (default (patchwork-database-configuration))) + (secret-key-file patchwork-settings-module-secret-key-file + (default "/etc/patchwork/django-secret-key")) + (allowed-hosts patchwork-settings-module-allowed-hosts) + (default-from-email patchwork-settings-module-default-from-email) + (static-url patchwork-settings-module-static-url + (default "/static/")) + (admins patchwork-settings-module-admins + (default '())) + (debug? patchwork-settings-module-debug? + (default #f)) + (enable-rest-api? patchwork-settings-module-enable-rest-api? + (default #t)) + (enable-xmlrpc? patchwork-settings-module-enable-xmlrpc? + (default #t)) + (force-https-links? patchwork-settings-module-force-https-links? + (default #t)) + (extra-settings patchwork-settings-module-extra-settings + (default ""))) + +(define-record-type* + patchwork-configuration make-patchwork-configuration + patchwork-configuration? + (patchwork patchwork-configuration-patchwork + (default patchwork)) + (settings-module patchwork-configuration-settings-module) + (domain patchwork-configuration-domain)) + +;; Django uses a Python module for configuration, so this compiler generates a +;; Python module from the configuration record. +(define-gexp-compiler (patchwork-settings-module-compiler + (file ) system target) + (match file + (($ database-configuration secret-key-file + allowed-hosts default-from-email + static-url admins debug? enable-rest-api? + enable-xmlrpc? force-https-links? + extra-configuration) + (gexp->derivation + "patchwork-settings" + (with-imported-modules '((guix build utils)) + #~(let ((output #$output)) + (define (create-__init__.py filename) + (call-with-output-file filename + (lambda (port) (display "" port)))) + + (use-modules (guix build utils) + (srfi srfi-1)) + + (mkdir-p (string-append output "/guix/patchwork")) + (create-__init__.py + (string-append output "/guix/__init__.py")) + (create-__init__.py + (string-append output "/guix/patchwork/__init__.py")) + + (call-with-output-file + (string-append output "/guix/patchwork/settings.py") + (lambda (port) + (display + (string-append "from patchwork.settings.base import * + +# Configuration from Guix +with open('" #$secret-key-file "') as f: + SECRET_KEY = f.read().strip() + +ALLOWED_HOSTS = [ +" #$(string-concatenate + (map (lambda (allowed-host) + (string-append " '" allowed-host "'\n")) + allowed-hosts)) +"] + +DEBUG = " #$(if debug? "True" "False") " + +ENABLE_REST_API = " #$(if enable-xmlrpc? "True" "False") " +ENABLE_XMLRPC = " #$(if enable-xmlrpc? "True" "False") " + +FORCE_HTTPS_LINKS = " #$(if force-https-links? "True" "False") " + +DATABASES = { + 'default': { +" #$(match database-configuration + (($ + engine name user password host port) + (string-append + " 'ENGINE': '" engine "',\n" + " 'NAME': '" name "',\n" + " 'USER': '" user "',\n" + " 'PASSWORD': '" password "',\n" + " 'HOST': '" host "',\n" + " 'PORT': '" port "',\n"))) " + }, +} + +" #$(if debug? + #~(string-append "STATIC_ROOT = '" #$(file-append patchwork "/share/patchwork/htdocs") "'") + #~(string-append "STATIC_URL = '" #$static-url "'")) " + +STATICFILES_STORAGE = ( + 'django.contrib.staticfiles.storage.StaticFilesStorage' +) + +# Guix Extra Configuration +" #$extra-configuration " +") port))) + #t)) + #:local-build? #t)))) + +(define patchwork-virtualhost + (match-lambda + (($ patchwork settings-module + domain) + + (define wsgi.py + (file-append patchwork + (string-append + "/lib/python" + (version-major+minor + (package-version python)) + "/site-packages/patchwork/wsgi.py"))) + + (httpd-virtualhost + "*:8080" + `("ServerAdmin admin@example.com +ServerName " ,domain " + +LogFormat \"%v %h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" customformat +LogLevel info +CustomLog \"/var/log/httpd/" ,domain "-access_log\" customformat + +ErrorLog /var/log/httpd/error.log + +WSGIScriptAlias / " ,wsgi.py " +WSGIDaemonProcess " ,(package-name patchwork) " user=httpd group=httpd processes=1 threads=2 display-name=%{GROUP} lang='en_US.UTF-8' locale='en_US.UTF-8' python-path=" ,settings-module " +WSGIProcessGroup " ,(package-name patchwork) " +WSGIPassAuthorization On + + + Require all granted + + +Alias /static " ,patchwork "/share/patchwork/htdocs + + AllowOverride None + Options MultiViews Indexes SymlinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS +"))))) + +(define (patchwork-httpd-configuration patchwork-configuration) + (list "WSGISocketPrefix /var/run/mod_wsgi" + (list "LoadModule wsgi_module " + (file-append mod-wsgi "/modules/mod_wsgi.so")) + (patchwork-virtualhost patchwork-configuration))) + +(define (patchwork-django-admin-gexp patchwork settings-module) + #~(lambda command + (let ((pid (primitive-fork)) + (user (getpwnam "httpd"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + + (setenv "DJANGO_SETTINGS_MODULE" "guix.patchwork.settings") + (setenv "PYTHONPATH" #$settings-module) + (primitive-exit + (if (zero? + (apply system* + #$(file-append patchwork "/bin/patchwork-admin") + command)) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))))) + +(define (patchwork-django-admin-action patchwork settings-module) + (shepherd-action + (name 'django-admin) + (documentation + "Run a django admin command for patchwork") + (procedure (patchwork-django-admin-gexp patchwork settings-module)))) + +(define patchwork-service-type + (service-type + (name 'patchwork-setup) + (extensions + (list (service-extension httpd-service-type + patchwork-httpd-configuration) + (service-extension + shepherd-root-service-type + (match-lambda + (($ patchwork settings-module + domain) + (list (shepherd-service + (requirement '(postgres)) + (provision (list (string->symbol + (string-append (package-name patchwork) + "-setup")))) + (start + #~(lambda () + (define run-django-admin-command + #$(patchwork-django-admin-gexp patchwork + settings-module)) + + (run-django-admin-command "migrate"))) + (stop #~(const #f)) + (actions + (list (patchwork-django-admin-action patchwork + settings-module))) + (respawn? #f) + (documentation "Setup patchwork.")))))))) + (description + "Patchwork patch tracking system."))) diff --git a/gnu/tests/web.scm b/gnu/tests/web.scm index 319655396a..0b109c0ed7 100644 --- a/gnu/tests/web.scm +++ b/gnu/tests/web.scm @@ -28,15 +28,27 @@ #:use-module (gnu system vm) #:use-module (gnu services) #:use-module (gnu services web) + #:use-module (gnu services databases) #:use-module (gnu services networking) + #:use-module (gnu services shepherd) + #:use-module (gnu packages databases) + #:use-module (gnu packages patchutils) + #:use-module (gnu packages python) + #:use-module (gnu packages web) + #:use-module (guix packages) + #:use-module (guix modules) + #:use-module (guix records) #:use-module (guix gexp) #:use-module (guix store) + #:use-module (guix utils) + #:use-module (ice-9 match) #:export (%test-httpd %test-nginx %test-varnish %test-php-fpm %test-hpcguix-web - %test-tailon)) + %test-tailon + %test-patchwork)) (define %index.html-contents ;; Contents of the /index.html file. @@ -498,3 +510,149 @@ HTTP-PORT." (name "tailon") (description "Connect to a running Tailon server.") (value (run-tailon-test)))) + + +;;; +;;; Patchwork +;;; + +(define patchwork-initial-database-setup-service + (match-lambda + (($ + engine name user password host port) + + (define start-gexp + #~(lambda () + (let ((pid (primitive-fork)) + (postgres (getpwnam "postgres"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid postgres)) + (setuid (passwd:uid postgres)) + (primitive-exit + (if (and + (zero? + (system* #$(file-append postgresql "/bin/createuser") + #$user)) + (zero? + (system* #$(file-append postgresql "/bin/createdb") + "-O" #$user #$name))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))))) + + (shepherd-service + (requirement '(postgres)) + (provision '(patchwork-postgresql-user-and-database)) + (start start-gexp) + (stop #~(const #f)) + (respawn? #f) + (documentation "Setup patchwork database."))))) + +(define (patchwork-os patchwork) + (simple-operating-system + (service dhcp-client-service-type) + (service httpd-service-type + (httpd-configuration + (config + (httpd-config-file + (listen '("8080")))))) + (service postgresql-service-type) + (simple-service 'patchwork-create-django-secret-key + activation-service-type + #~(begin + (mkdir "/etc/patchwork") + (call-with-output-file "/etc/patchwork/django-secret-key" + (lambda (p) + (display "000000\n" p))) + #t)) + (service patchwork-service-type + (patchwork-configuration + (patchwork patchwork) + (settings-module + (patchwork-settings-module + (allowed-hosts '("*")) + (default-from-email "") + (debug? #t))) + (domain "localhost"))) + (simple-service 'patchwork-database-setup + shepherd-root-service-type + (list + (patchwork-initial-database-setup-service + (patchwork-database-configuration)))))) + +(define (run-patchwork-test patchwork) + "Run tests in %NGINX-OS, which has nginx running and listening on +HTTP-PORT." + (define os + (marionette-operating-system + (patchwork-os patchwork) + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define forwarded-port 8080) + + (define vm + (virtual-machine + (operating-system os) + (port-forwardings `((8080 . ,forwarded-port))))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (srfi srfi-11) (srfi srfi-64) + (gnu build marionette) + (web uri) + (web client) + (web response)) + + (define marionette + (make-marionette (list #$vm))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "patchwork") + + (test-assert "patchwork-postgresql-user-and-service started" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (match (start-service 'patchwork-postgresql-user-and-database) + (#f #f) + (('service response-parts ...) + (match (assq-ref response-parts 'running) + ((#t) #t) + ((pid) (number? pid)))))) + marionette)) + + (test-assert "httpd running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'httpd)) + marionette)) + + (test-equal "http-get" + 200 + (let-values + (((response text) + (http-get #$(simple-format + #f "http://localhost:~A/" forwarded-port) + #:decode-body? #t))) + (response-code response))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "patchwork-test" test)) + +(define %test-patchwork + (system-test + (name "patchwork") + (description "Connect to a running Patchwork service.") + (value (run-patchwork-test patchwork)))) -- 2.20.1 From debbugs-submit-bounces@debbugs.gnu.org Fri Jan 25 16:04:53 2019 Received: (at 33185) by debbugs.gnu.org; 25 Jan 2019 21:04:53 +0000 Received: from localhost ([127.0.0.1]:45617 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gn8ei-0008QH-Ve for submit@debbugs.gnu.org; Fri, 25 Jan 2019 16:04:53 -0500 Received: from li622-129.members.linode.com ([212.71.249.129]:56798 helo=mira.cbaines.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gn8eg-0008Q8-5B for 33185@debbugs.gnu.org; Fri, 25 Jan 2019 16:04:50 -0500 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 33619169C0; Fri, 25 Jan 2019 21:04:48 +0000 (GMT) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id b2665ee5; Fri, 25 Jan 2019 21:04:48 +0000 (UTC) References: <87y3aie8a1.fsf@cbaines.net> <20190122220928.17927-1-mail@cbaines.net> <87imyf7mei.fsf@elephly.net> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: Ricardo Wurmus Subject: Re: [bug#33185] [PATCH v2 1/2] gnu: Add patchwork. In-reply-to: <87imyf7mei.fsf@elephly.net> Date: Fri, 25 Jan 2019 21:04:46 +0000 Message-ID: <875zucih3l.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 Cc: 33185@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ricardo Wurmus writes: > Hi Chris, > > thanks for the patch! And thanks for your feedback :) I've sent some updated patches. >> * gnu/packages/patchutils.scm (patchwork): New variable. > [=E2=80=A6] >> + (replace 'check >> + (lambda* (#:key tests? #:allow-other-keys) >> + (or (not tests?) >> + (begin >> + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings= .dev") >> + (invoke >> + "python" "-Wonce" "./manage.py" "test" "--noinput") >> + #t)))) > > Maybe write this as > > (replace 'check > (lambda* (#:key tests? #:allow-other-keys) > (when tests? > (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") > (invoke > "python" "-Wonce" "./manage.py" "test" "--noinput")) > #t)) Yep, I've updated it to use when now. >> + (replace 'install >> + (lambda* (#:key inputs outputs #:allow-other-keys) >> + (let ((out (assoc-ref outputs "out"))) [=E2=80=A6] > > This phase might be less verbose if you let-bound the result of > (site-packages inputs outputs) at the beginning. It would also be good > if there were more comments about what=E2=80=99s going on. It=E2=80=99s = not all obvious > (e.g. why =E2=80=9Clib=E2=80=9D is copied to =E2=80=9Cdocs=E2=80=9D). I've used let more now, and tried to be a bit more descriptive in the comments. I'll reconfigure the patchwork instances I host at some point and hopefully add more detail then. >> + (simple-format #t "replacing template pwclient symlink") > > Use =E2=80=9Cdisplay=E2=80=9D instead of =E2=80=9Csimple-format #t=E2=80= =9D? That was just a debugging thing, I've removed it. >> + (add-after 'install 'install-hasher >> + (lambda* (#:key inputs outputs #:allow-other-keys) >> + (let* ((out (assoc-ref outputs "out"))) >> + (chmod (string-append (site-packages inputs outputs) >> + "/patchwork/hasher.py") >> + #o555) >> + (symlink (string-append (site-packages inputs outputs) >> + "/patchwork/hasher.py") >> + (string-append out "/bin/hasher"))) >> + #t)) > > Here also consider simplifying with let. Yep, I've used let here more now. >> + ;; Create a patchwork specific version of Django's command lin= e admin >> + ;; utility. >> + (add-after 'install 'install-patchwork-admin >> + (lambda* (#:key inputs outputs #:allow-other-keys) >> + (let* ((out (assoc-ref outputs "out"))) >> + (mkdir-p (string-append out "/bin")) >> + (call-with-output-file (string-append out "/bin/patchwor= k-admin") >> + (lambda (port) >> + (display "#!/usr/bin/env python3 > > Should this really say =E2=80=9C#!/usr/bin/env python3=E2=80=9D? So this was fine, as it was replaced in a future stage. But yes, it's probably better to use a more appropriate value that isn't changed later on. I've updated this now. So yes, I've sent some updated patches, still a few niggles, but they're getting better. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlxLee5fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XejxA//WEE1AuWYyVTmFva7uny4cMHWlTQy43SvXsDSRSdJNqEup0QaNBn9SMb4 STPp++qcMngul5FhrvCOaUNxJ4OfSHUkPvlVC/mOqsek9h5dOTTzaBoIhLg9QA0I ZpFe+ZPq7Td6BPhlk0G6eZNIGL3UASSOAjMEFp3Y5dLHAtdjGx2DaI2p8R8cIBAf 9mwKrUjApdLcXtsoW5PXLlb0pQgqaCB3r/brXDQGJV57Okwvw3P0HllL+Z0YiUtd PZEax2ZlHnyfvO9Abyf+wxex/UU4enBbFdmUoCeU3hsjahovOowiUiaJ9MWTNN2d OHQ3KNfCVDsVqtryEd67zPnXClyDwX7iSuF3XytWz+PvmL5zd1r/K6nYe3TN2sto 8w14M4DqhI4tDmN5MOd5aBx44R3jfla9hFBcfGjPDnEr8StJmalkDz0WfW3IzYZO VhAC0hfJNDImPM6s5TtqWUcN+kdhgzGtSHE8H5wMYUFYGfm5P0P28Hh6Bda8eEEu T8Db7QxL7jtdkZn3SHdYaU4I8nAhjH05HDRGyTIlZlsn5Mv1Z2wufyDYWj6GsePH PJ3cwuulOpt+Z7+c5jY7xhjv5YXEaVcfdo0s+gkRQi33lHidUszYGwtpj8hl4T8B kr2oPVmI2MKfJqbpUJOnEYxBOEVGvIduqwuqIR7t3M73tZOSOUk= =V/28 -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri May 03 15:17:00 2019 Received: (at 33185) by debbugs.gnu.org; 3 May 2019 19:17:00 +0000 Received: from localhost ([127.0.0.1]:49682 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdg3-0002Xx-Ua for submit@debbugs.gnu.org; Fri, 03 May 2019 15:17:00 -0400 Received: from mira.cbaines.net ([212.71.252.8]:58894) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdg1-0002Xo-M2 for 33185@debbugs.gnu.org; Fri, 03 May 2019 15:16:58 -0400 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id EDE2A16F92 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 20:16:54 +0100 (BST) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 82316c50 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 19:16:54 +0000 (UTC) References: <87y3aie8a1.fsf@cbaines.net> User-agent: mu4e 1.0; emacs 26.1 From: Christopher Baines To: 33185@debbugs.gnu.org Subject: Re: [bug#33185] [PATCH 0/7] Add patchwork package and service. In-reply-to: <87y3aie8a1.fsf@cbaines.net> Date: Fri, 03 May 2019 20:16:52 +0100 Message-ID: <87o94jqrff.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Christopher Baines writes: > These patches add a package for patchwork, a web-based patch tracking > system, along with some missing dependencies and the beginnings of a > system service and test. > > Everything up to the patchwork package should be ready to merge, but the > patchwork package, service and system test is currently very rough and > unready. > > > Christopher Baines (7): > gnu: Add python-jsmin. > gnu: Add python-slimit. > gnu: Add python-django-pipeline. > gnu: Add python-django-jinja. > gnu: Add python-django-debug-toolbar. > gnu: Add patchwork. > services: Add patchwork. > > gnu/packages/django.scm | 130 ++++++++++++++++ > gnu/packages/patchutils.scm | 95 ++++++++++++ > gnu/packages/python-web.scm | 50 +++++++ > gnu/services/web.scm | 291 +++++++++++++++++++++++++++++++++++- > gnu/tests/web.scm | 104 ++++++++++++- > 5 files changed, 668 insertions(+), 2 deletions(-) Following on from this, I believe the first 5 patches adding the prerequisite packages for patchwork have now been added. The initial package and service for Patchwork wasn't ready to add to Guix, but I now believe it is at least ready to review. In addition to Patchwork, this patch series also includes a service for Getmail. I believe this is the simplest way of getting patches in to Patchwork. Christopher Baines (3): services: Add getmail. gnu: Add patchwork. services: Add patchwork. doc/guix.texi | 464 ++++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + gnu/packages/patchutils.scm | 166 +++++++++++++ gnu/services/getmail.scm | 380 +++++++++++++++++++++++++++++ gnu/services/web.scm | 366 +++++++++++++++++++++++++++- gnu/tests/mail.scm | 177 +++++++++++++- gnu/tests/web.scm | 162 ++++++++++++- 7 files changed, 1713 insertions(+), 3 deletions(-) create mode 100644 gnu/services/getmail.scm --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlzMk6RfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XfxEA//dnEwlN4sBw0p7iUq2iVfN7NEV4jt7zy+jvYSmOPphhlyi3RoP3umaWhQ qhul4C9Nsw8hSEoagbZuQu1N2R1xZw7nbq4G4KHcPAwhKtIbDIbNWegHOyVDGGio PyLKvD1N0m5hVEHqGT7IC4KeVgJSy00qr8BSVJiUyeJR6MT7z0AecLBX9bvbhl7C qEHsfITU7oI13NZCKwa2gDKaiA5naH0vseqeRxN8emQA5hWpBg5tcD4jVtHEa/kW cBVZN7rSRxH0q7Zrk/L9DSbj3wySLS7Qap1Dchto1sCF1UG3RSGscWEpmjhqKWOY YZBdLAnm6e1RSnvzDcVeu3IeUMfQXVtTqPgRApjFgnAPvCUBZIc7aufJxewp/ViR IBYcYMnFbYFvKrQgyFDbSN+c5oiaMtX/Hpm749jgOV6aHdi72FRIfdiBWhtuCtHN odHQ+FBpXaioFH8DFP+ILgxD5tM1hhRVK5zBgT16y6xiZNEcsDrt8hQ3F5bsC7O1 fyudY8XhJHf0JhZs7kbVjeV0WsQmokeHtaG2MI2UxbXWzk4gqGIzzbwfDSJuNNqt aWmpgayS/nqhKcGLYJPQSfxpTBhEBl9eMprW7DEsFBJBdwX4SLVWwmQEqrHANdrD vAuoQ707CfiVIyuRx+lDLXkuvwLQyR0J+Sh8aK/BW4qQ+8PHHv8= =+CRr -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri May 03 15:30:51 2019 Received: (at 33185) by debbugs.gnu.org; 3 May 2019 19:30:51 +0000 Received: from localhost ([127.0.0.1]:49704 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdtK-0002u6-Dv for submit@debbugs.gnu.org; Fri, 03 May 2019 15:30:51 -0400 Received: from mira.cbaines.net ([212.71.252.8]:58912) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdtG-0002tj-Q9 for 33185@debbugs.gnu.org; Fri, 03 May 2019 15:30:40 -0400 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 01A9E16F58 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 20:30:37 +0100 (BST) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 0fac7396 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 19:30:37 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 3/3] services: Add patchwork. Date: Fri, 3 May 2019 20:30:37 +0100 Message-Id: <20190503193037.27035-3-mail@cbaines.net> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190503193037.27035-1-mail@cbaines.net> References: <87o94jqrff.fsf@cbaines.net> <20190503193037.27035-1-mail@cbaines.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/service/web.scm ( , ): New record types. (patchwork-virtualhost): New procedure. (patchwork-service-type): New variable. * gnu/tests/web.scm (%test-patchwork): New variable. * doc/guix.text (Web Services): Document it. --- doc/guix.texi | 174 ++++++++++++++++++++ gnu/services/web.scm | 368 ++++++++++++++++++++++++++++++++++++++++++- gnu/tests/web.scm | 164 ++++++++++++++++++- 3 files changed, 702 insertions(+), 4 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index e23d178697..cd70de5cb5 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -19323,6 +19323,180 @@ Additional arguments to pass to the @command{varnishd} process. @end table @end deftp +@subsubheading Patchwork +@cindex Patchwork +Patchwork is a patch tracking system. It can collect patches sent to a +mailing list, and display them in a web interface. + +@defvr {Scheme Variable} patchwork-service-type +Service type for Patchwork. +@end defvr + +The following example is an example of a minimal service for Patchwork, for +the @code{patchwork.example.com} domain. + +@example +(service patchwork-service-type + (patchwork-configuration + (domain "patchwork.example.com") + (settings-module + (patchwork-settings-module + (allowed-hosts (list domain)) + (default-from-email "patchwork@@patchwork.example.com"))) + (getmail-retriever-config + (getmail-retriever-configuration + (type "SimpleIMAPSSLRetriever") + (server "imap.example.com") + (port 993) + (username "patchwork") + (password-command + (list (file-append coreutils "/bin/cat") + "/etc/getmail-patchwork-imap-password")) + (extra-parameters + '((mailboxes . ("Patches")))))))) + +@end example + +There are three records for configuring the Patchwork service. The +@code{} relates to the configuration for Patchwork +within the HTTPD service. + +The @code{settings-module} field within the @code{} +record can be populated with the @code{} record, +which describes a settings module that is generated within the Guix store. + +For the @code{database-configuration} field within the +@code{}, the +@code{} must be used. + +@deftp {Data Type} patchwork-configuration +Data type representing the Patchwork service configuration. This type has the +following parameters: + +@table @asis +@item @code{patchwork} (default: @code{patchwork}) +The Patchwork package to use. + +@item @code{domain} +The domain to use for Patchwork, this is used in the HTTPD service virtual +host. + +@item @code{settings-module} +The settings module to use for Patchwork. As a Django application, Patchwork +is configured with a Python module containing the settings. This can either be +an instance of the @code{} record, any other record +that represents the settings in the store, or a directory outside of the +store. + +@item @code{static-path} (default: @code{"/static/"}) +The path under which the HTTPD service should serve the static files. + +@item @code{getmail-retriever-config} +The getmail-retriever-configuration record value to use with +Patchwork. Getmail will be configured with this value, the messages will be +delivered to Patchwork. + +@end table +@end deftp + +@deftp {Data Type} patchwork-settings-module +Data type representing a settings module for Patchwork. Some of these +settings relate directly to Patchwork, but others relate to Django, the web +framework used by Patchwork, or the Django Rest Framework library. This type +has the following parameters: + +@table @asis +@item @code{database-configuration} (default: @code{(patchwork-database-configuration)}) +The database connection settings used for Patchwork. See the +@code{} record type for more information. + +@item @code{secret-key-file} (default: @code{"/etc/patchwork/django-secret-key"}) +Patchwork, as a Django web application uses a secret key for cryptographically +signing values. This file should contain a unique unpredictable value. + +If this file does not exist, it will be created and populated with a random +value by the patchwork-setup shepherd service. + +This setting relates to Django. + +@item @code{allowed-hosts} +A list of valid hosts for this Patchwork service. This should at least include +the domain specified in the @code{} record. + +This is a Django setting. + +@item @code{default-from-email} +The email address from which Patchwork should send email by default. + +This is a Patchwork setting. + +@item @code{static-url} (default: @code{#f}) +The URL to use when serving static assets. It can be part of a URL, or a full +URL, but must end in a @code{/}. + +If the default value is used, the @code{static-path} value from the +@code{} record will be used. + +This is a Django setting. + +@item @code{admins} (default: @code{'()}) +Email addresses to send the details of errors that occur. Each value should +be a list containing two elements, the name and then the email address. + +This is a Django setting. + +@item @code{debug?} (default: @code{#f}) +Whether to run Patchwork in debug mode. If set to @code{#t}, detailed error +messages will be shown. + +This is a Django setting. + +@item @code{enable-rest-api?} (default: @code{#t}) +Whether to enable the Patchwork REST API. + +This is a Patchwork setting. + +@item @code{enable-xmlrpc?} (default: @code{#t}) +Whether to enable the XML RPC API. + +This is a Patchwork setting. + +@item @code{force-https-links?} (default: @code{#t}) +Whether to use HTTPS links on Patchwork pages. + +This is a Patchwork setting. + +@item @code{extra-settings} (default: @code{""}) +Extra code to place at the end of the Patchwork settings module. + +@end table +@end deftp + +@deftp {Data Type} patchwork-database-configuration +Data type representing the database configuration for Patchwork. + +@table @asis +@item @code{engine} (default: @code{"django.db.backends.postgresql_psycopg2"}) +The database engine to use. + +@item @code{name} (default: @code{"patchwork"}) +The name of the database to use. + +@item @code{user} (default: @code{"httpd"}) +The user to connect to the database as. + +@item @code{password} (default: @code{""}) +The password to use when connecting to the database. + +@item @code{host} (default: @code{""}) +The host to make the database connection to. + +@item @code{port} (default: @code{""}) +The port on which to connect to the database. + +@end table +@end deftp + @subsubheading FastCGI @cindex fastcgi @cindex fcgiwrap diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 84294db53b..35efddb0ae 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -7,7 +7,7 @@ ;;; Copyright © 2017 nee ;;; Copyright © 2017, 2018 Clément Lassieur ;;; Copyright © 2018 Pierre-Antoine Rouby -;;; Copyright © 2017 Christopher Baines +;;; Copyright © 2017, 2018, 2019 Christopher Baines ;;; Copyright © 2018 Marius Bakke ;;; ;;; This file is part of GNU Guix. @@ -29,14 +29,23 @@ #:use-module (gnu services) #:use-module (gnu services shepherd) #:use-module (gnu services admin) + #:use-module (gnu services getmail) + #:use-module (gnu services mail) #:use-module (gnu system pam) #:use-module (gnu system shadow) #:use-module (gnu packages admin) + #:use-module (gnu packages databases) #:use-module (gnu packages web) + #:use-module (gnu packages patchutils) #:use-module (gnu packages php) + #:use-module (gnu packages python) + #:use-module (gnu packages gnupg) + #:use-module (gnu packages guile) #:use-module (gnu packages logging) + #:use-module (guix packages) #:use-module (guix records) #:use-module (guix modules) + #:use-module (guix utils) #:use-module (guix gexp) #:use-module ((guix store) #:select (text-file)) #:use-module ((guix utils) #:select (version-major)) @@ -210,7 +219,42 @@ varnish-configuration-parameters varnish-configuration-extra-options - varnish-service-type)) + varnish-service-type + + + patchwork-database-configuration + patchwork-database-configuration? + patchwork-database-configuration-engine + patchwork-database-configuration-name + patchwork-database-configuration-user + patchwork-database-configuration-password + patchwork-database-configuration-host + patchwork-database-configuration-port + + + patchwork-settings-module + patchwork-settings-module? + patchwork-settings-module-database-configuration + patchwork-settings-module-secret-key + patchwork-settings-module-allowed-hosts + patchwork-settings-module-default-from-email + patchwork-settings-module-static-url + patchwork-settings-module-admins + patchwork-settings-module-debug? + patchwork-settings-module-enable-rest-api? + patchwork-settings-module-enable-xmlrpc? + patchwork-settings-module-force-https-links? + patchwork-settings-module-extra-settings + + + patchwork-configuration + patchwork-configuration? + patchwork-configuration-patchwork + patchwork-configuration-settings-module + patchwork-configuration-domain + + patchwork-virtualhost + patchwork-service-type)) ;;; Commentary: ;;; @@ -1268,3 +1312,323 @@ files.") varnish-shepherd-service))) (default-value (varnish-configuration)))) + + +;;; +;;; Patchwork +;;; + +(define-record-type* + patchwork-database-configuration make-patchwork-database-configuration + patchwork-database-configuration? + (engine patchwork-database-configuration-engine + (default "django.db.backends.postgresql_psycopg2")) + (name patchwork-database-configuration-name + (default "patchwork")) + (user patchwork-database-configuration-user + (default "httpd")) + (password patchwork-database-configuration-password + (default "")) + (host patchwork-database-configuration-host + (default "")) + (port patchwork-database-configuration-port + (default ""))) + +(define-record-type* + patchwork-settings-module make-patchwork-settings-module + patchwork-settings-module? + (database-configuration patchwork-settings-module-database-configuration + (default (patchwork-database-configuration))) + (secret-key-file patchwork-settings-module-secret-key-file + (default "/etc/patchwork/django-secret-key")) + (allowed-hosts patchwork-settings-module-allowed-hosts) + (default-from-email patchwork-settings-module-default-from-email) + (static-url patchwork-settings-module-static-url + (default "/static/")) + (admins patchwork-settings-module-admins + (default '())) + (debug? patchwork-settings-module-debug? + (default #f)) + (enable-rest-api? patchwork-settings-module-enable-rest-api? + (default #t)) + (enable-xmlrpc? patchwork-settings-module-enable-xmlrpc? + (default #t)) + (force-https-links? patchwork-settings-module-force-https-links? + (default #t)) + (extra-settings patchwork-settings-module-extra-settings + (default ""))) + +(define-record-type* + patchwork-configuration make-patchwork-configuration + patchwork-configuration? + (patchwork patchwork-configuration-patchwork + (default patchwork)) + (domain patchwork-configuration-domain) + (settings-module patchwork-configuration-settings-module) + (static-path patchwork-configuration-static-url + (default "/static/")) + (getmail-retriever-config getmail-retriever-config)) + +;; Django uses a Python module for configuration, so this compiler generates a +;; Python module from the configuration record. +(define-gexp-compiler (patchwork-settings-module-compiler + (file ) system target) + (match file + (($ database-configuration secret-key-file + allowed-hosts default-from-email + static-url admins debug? enable-rest-api? + enable-xmlrpc? force-https-links? + extra-configuration) + (gexp->derivation + "patchwork-settings" + (with-imported-modules '((guix build utils)) + #~(let ((output #$output)) + (define (create-__init__.py filename) + (call-with-output-file filename + (lambda (port) (display "" port)))) + + (use-modules (guix build utils) + (srfi srfi-1)) + + (mkdir-p (string-append output "/guix/patchwork")) + (create-__init__.py + (string-append output "/guix/__init__.py")) + (create-__init__.py + (string-append output "/guix/patchwork/__init__.py")) + + (call-with-output-file + (string-append output "/guix/patchwork/settings.py") + (lambda (port) + (display + (string-append "from patchwork.settings.base import * + +# Configuration from Guix +with open('" #$secret-key-file "') as f: + SECRET_KEY = f.read().strip() + +ALLOWED_HOSTS = [ +" #$(string-concatenate + (map (lambda (allowed-host) + (string-append " '" allowed-host "'\n")) + allowed-hosts)) +"] + +ADMINS = [ +" #$(string-concatenate + (map (match-lambda + ((name email-address) + (string-append + "('" name "','" email-address "'),"))) + admins)) +"] + +DEBUG = " #$(if debug? "True" "False") " + +ENABLE_REST_API = " #$(if enable-xmlrpc? "True" "False") " +ENABLE_XMLRPC = " #$(if enable-xmlrpc? "True" "False") " + +FORCE_HTTPS_LINKS = " #$(if force-https-links? "True" "False") " + +DATABASES = { + 'default': { +" #$(match database-configuration + (($ + engine name user password host port) + (string-append + " 'ENGINE': '" engine "',\n" + " 'NAME': '" name "',\n" + " 'USER': '" user "',\n" + " 'PASSWORD': '" password "',\n" + " 'HOST': '" host "',\n" + " 'PORT': '" port "',\n"))) " + }, +} + +" #$(if debug? + #~(string-append "STATIC_ROOT = '" + #$(file-append patchwork "/share/patchwork/htdocs") + "'") + #~(string-append "STATIC_URL = '" #$static-url "'")) " + +STATICFILES_STORAGE = ( + 'django.contrib.staticfiles.storage.StaticFilesStorage' +) + +# Guix Extra Configuration +" #$extra-configuration " +") port))) + #t)) + #:local-build? #t)))) + +(define patchwork-virtualhost + (match-lambda + (($ patchwork domain + settings-module static-path + getmail-retriever-config) + (define wsgi.py + (file-append patchwork + (string-append + "/lib/python" + (version-major+minor + (package-version python)) + "/site-packages/patchwork/wsgi.py"))) + + (httpd-virtualhost + "*:8080" + `("ServerAdmin admin@example.com` +ServerName " ,domain " + +LogFormat \"%v %h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" customformat +LogLevel info +CustomLog \"/var/log/httpd/" ,domain "-access_log\" customformat + +ErrorLog /var/log/httpd/error.log + +WSGIScriptAlias / " ,wsgi.py " +WSGIDaemonProcess " ,(package-name patchwork) " user=httpd group=httpd processes=1 threads=2 display-name=%{GROUP} lang='en_US.UTF-8' locale='en_US.UTF-8' python-path=" ,settings-module " +WSGIProcessGroup " ,(package-name patchwork) " +WSGIPassAuthorization On + + + Require all granted + + +" ,@(if static-path + `("Alias " ,static-path " " ,patchwork "/share/patchwork/htdocs/") + '()) +" + + AllowOverride None + Options MultiViews Indexes SymlinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS +"))))) + +(define (patchwork-httpd-configuration patchwork-configuration) + (list "WSGISocketPrefix /var/run/mod_wsgi" + (list "LoadModule wsgi_module " + (file-append mod-wsgi "/modules/mod_wsgi.so")) + (patchwork-virtualhost patchwork-configuration))) + +(define (patchwork-django-admin-gexp patchwork settings-module) + #~(lambda command + (let ((pid (primitive-fork)) + (user (getpwnam "httpd"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + + (setenv "DJANGO_SETTINGS_MODULE" "guix.patchwork.settings") + (setenv "PYTHONPATH" #$settings-module) + (primitive-exit + (if (zero? + (apply system* + #$(file-append patchwork "/bin/patchwork-admin") + command)) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))))) + +(define (patchwork-django-admin-action patchwork settings-module) + (shepherd-action + (name 'django-admin) + (documentation + "Run a django admin command for patchwork") + (procedure (patchwork-django-admin-gexp patchwork settings-module)))) + +(define patchwork-shepherd-services + (match-lambda + (($ patchwork domain + settings-module static-path + getmail-retriever-config) + (define secret-key-file-creation-gexp + (if (patchwork-settings-module? settings-module) + (with-extensions (list guile-gcrypt) + #~(let ((secret-key-file + #$(patchwork-settings-module-secret-key-file + settings-module))) + (use-modules (guix build utils) + (gcrypt random)) + + (unless (file-exists? secret-key-file) + (mkdir-p (dirname secret-key-file)) + (call-with-output-file secret-key-file + (lambda (port) + (display (random-token 30 'very-strong) port))) + (let* ((pw (getpwnam "httpd")) + (uid (passwd:uid pw)) + (gid (passwd:gid pw))) + (chown secret-key-file uid gid) + (chmod secret-key-file #o400))))) + #~())) + + (list (shepherd-service + (requirement '(postgres)) + (provision (list (string->symbol + (string-append (package-name patchwork) + "-setup")))) + (start + #~(lambda () + (define run-django-admin-command + #$(patchwork-django-admin-gexp patchwork + settings-module)) + + #$secret-key-file-creation-gexp + + (run-django-admin-command "migrate"))) + (stop #~(const #f)) + (actions + (list (patchwork-django-admin-action patchwork + settings-module))) + (respawn? #f) + (documentation "Setup Patchwork.")))))) + +(define patchwork-getmail-configs + (match-lambda + (($ patchwork domain + settings-module static-path + getmail-retriever-config) + (list + (getmail-configuration + (name (string->symbol (package-name patchwork))) + (user "httpd") + (directory (string-append + "/var/lib/getmail/" (package-name patchwork))) + (rcfile + (getmail-configuration-file + (retriever getmail-retriever-config) + (destination + (getmail-destination-configuration + (type "MDA_external") + (path (file-append patchwork "/bin/patchwork-admin")) + (extra-parameters + '((arguments . ("parsemail")))))) + (options + (getmail-options-configuration + (read-all #f) + (delivered-to #f) + (received #f))))) + (idle (assq-ref + (getmail-retriever-configuration-extra-parameters + getmail-retriever-config) + 'mailboxes)) + (environment-variables + (list "DJANGO_SETTINGS_MODULE=guix.patchwork.settings" + #~(string-append "PYTHONPATH=" #$settings-module)))))))) + +(define patchwork-service-type + (service-type + (name 'patchwork-setup) + (extensions + (list (service-extension httpd-service-type + patchwork-httpd-configuration) + (service-extension shepherd-root-service-type + patchwork-shepherd-services) + (service-extension getmail-service-type + patchwork-getmail-configs))) + (description + "Patchwork patch tracking system."))) diff --git a/gnu/tests/web.scm b/gnu/tests/web.scm index 319655396a..7c1c0aa511 100644 --- a/gnu/tests/web.scm +++ b/gnu/tests/web.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Ludovic Courtès -;;; Copyright © 2017 Christopher Baines +;;; Copyright © 2017, 2019 Christopher Baines ;;; Copyright © 2017, 2018 Clément Lassieur ;;; Copyright © 2018 Pierre-Antoine Rouby ;;; Copyright © 2018 Marius Bakke @@ -28,15 +28,29 @@ #:use-module (gnu system vm) #:use-module (gnu services) #:use-module (gnu services web) + #:use-module (gnu services databases) + #:use-module (gnu services getmail) #:use-module (gnu services networking) + #:use-module (gnu services shepherd) + #:use-module (gnu services mail) + #:use-module (gnu packages databases) + #:use-module (gnu packages patchutils) + #:use-module (gnu packages python) + #:use-module (gnu packages web) + #:use-module (guix packages) + #:use-module (guix modules) + #:use-module (guix records) #:use-module (guix gexp) #:use-module (guix store) + #:use-module (guix utils) + #:use-module (ice-9 match) #:export (%test-httpd %test-nginx %test-varnish %test-php-fpm %test-hpcguix-web - %test-tailon)) + %test-tailon + %test-patchwork)) (define %index.html-contents ;; Contents of the /index.html file. @@ -498,3 +512,149 @@ HTTP-PORT." (name "tailon") (description "Connect to a running Tailon server.") (value (run-tailon-test)))) + + +;;; +;;; Patchwork +;;; + +(define patchwork-initial-database-setup-service + (match-lambda + (($ + engine name user password host port) + + (define start-gexp + #~(lambda () + (let ((pid (primitive-fork)) + (postgres (getpwnam "postgres"))) + (if (eq? pid 0) + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid postgres)) + (setuid (passwd:uid postgres)) + (primitive-exit + (if (and + (zero? + (system* #$(file-append postgresql "/bin/createuser") + #$user)) + (zero? + (system* #$(file-append postgresql "/bin/createdb") + "-O" #$user #$name))) + 0 + 1))) + (lambda () + (primitive-exit 1))) + (zero? (cdr (waitpid pid))))))) + + (shepherd-service + (requirement '(postgres)) + (provision '(patchwork-postgresql-user-and-database)) + (start start-gexp) + (stop #~(const #f)) + (respawn? #f) + (documentation "Setup patchwork database."))))) + +(define (patchwork-os patchwork) + (simple-operating-system + (service dhcp-client-service-type) + (service httpd-service-type + (httpd-configuration + (config + (httpd-config-file + (listen '("8080")))))) + (service postgresql-service-type) + (service patchwork-service-type + (patchwork-configuration + (patchwork patchwork) + (domain "localhost") + (settings-module + (patchwork-settings-module + (allowed-hosts (list domain)) + (default-from-email ""))) + (getmail-retriever-config + (getmail-retriever-configuration + (type "SimpleIMAPSSLRetriever") + (server "imap.example.com") + (port 993) + (username "username") + (password "password") + (extra-parameters + '((mailboxes . ("INBOX")))))))) + (simple-service 'patchwork-database-setup + shepherd-root-service-type + (list + (patchwork-initial-database-setup-service + (patchwork-database-configuration)))))) + +(define (run-patchwork-test patchwork) + "Run tests in %NGINX-OS, which has nginx running and listening on +HTTP-PORT." + (define os + (marionette-operating-system + (patchwork-os patchwork) + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define forwarded-port 8080) + + (define vm + (virtual-machine + (operating-system os) + (port-forwardings `((8080 . ,forwarded-port))))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (srfi srfi-11) (srfi srfi-64) + (gnu build marionette) + (web uri) + (web client) + (web response)) + + (define marionette + (make-marionette (list #$vm))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "patchwork") + + (test-assert "patchwork-postgresql-user-and-service started" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (match (start-service 'patchwork-postgresql-user-and-database) + (#f #f) + (('service response-parts ...) + (match (assq-ref response-parts 'running) + ((#t) #t) + ((pid) (number? pid)))))) + marionette)) + + (test-assert "httpd running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'httpd)) + marionette)) + + (test-equal "http-get" + 200 + (let-values + (((response text) + (http-get #$(simple-format + #f "http://localhost:~A/" forwarded-port) + #:decode-body? #t))) + (response-code response))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "patchwork-test" test)) + +(define %test-patchwork + (system-test + (name "patchwork") + (description "Connect to a running Patchwork service.") + (value (run-patchwork-test patchwork)))) -- 2.21.0 From debbugs-submit-bounces@debbugs.gnu.org Fri May 03 15:30:52 2019 Received: (at 33185) by debbugs.gnu.org; 3 May 2019 19:30:52 +0000 Received: from localhost ([127.0.0.1]:49706 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdtT-0002uH-JZ for submit@debbugs.gnu.org; Fri, 03 May 2019 15:30:52 -0400 Received: from mira.cbaines.net ([212.71.252.8]:58910) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdtG-0002ti-Q9 for 33185@debbugs.gnu.org; Fri, 03 May 2019 15:30:40 -0400 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 9CC4D16F4D for <33185@debbugs.gnu.org>; Fri, 3 May 2019 20:30:37 +0100 (BST) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id f336a9a0 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 19:30:37 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 1/3] services: Add getmail. Date: Fri, 3 May 2019 20:30:35 +0100 Message-Id: <20190503193037.27035-1-mail@cbaines.net> X-Mailer: git-send-email 2.21.0 In-Reply-To: <87o94jqrff.fsf@cbaines.net> References: <87o94jqrff.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Getmail is a mail retriever written in Python, this commit adds a service-type to run getmail. I'm looking at this, as it's a convinient way of getting mailing list messages in to Patchwork. I initially tried putting this in the (gnu services mail) module, but due to also trying to use the define-configuration pattern, it conflicted with the dovecot service. * gnu/services/getmail.scm: New file. * gnu/local.mk: Add it. * gnu/tests/mail.scm (%getmail-os, %test-getmail): New variables. (run-getmail-test): New procedure. --- doc/guix.texi | 290 ++++++++++++++++++++++++++++++ gnu/local.mk | 1 + gnu/services/getmail.scm | 380 +++++++++++++++++++++++++++++++++++++++ gnu/tests/mail.scm | 178 +++++++++++++++++- 4 files changed, 848 insertions(+), 1 deletion(-) create mode 100644 gnu/services/getmail.scm diff --git a/doc/guix.texi b/doc/guix.texi index 7cda06de5c..e23d178697 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -16651,6 +16651,296 @@ variables. @end table @end deftp +@subsubheading Getmail service + +@cindex IMAP +@cindex POP + +@deffn {Scheme Variable} getmail-service-type +This is the type of the @uref{http://pyropus.ca/software/getmail/, Getmail} +mail retriever, whose value should be an @code{getmail-configuration}. + +Available @code{getmail-configuration} fields are: + +@deftypevr {@code{getmail-configuration} parameter} symbol name +A symbol to identify the getmail service. + +Defaults to @samp{"unset"}. + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} package package +The getmail package to use. + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} string user +The user to run getmail as. + +Defaults to @samp{"getmail"}. + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} string group +The group to run getmail as. + +Defaults to @samp{"getmail"}. + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} string directory +The getmail directory to use. + +Defaults to @samp{"/var/lib/getmail/default"}. + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} getmail-configuration-file rcfile +The getmail configuration file to use. + +Available @code{getmail-configuration-file} fields are: + +@deftypevr {@code{getmail-configuration-file} parameter} getmail-retriever-configuration retriever +What mail account to retrieve mail from, and how to access that account. + +Available @code{getmail-retriever-configuration} fields are: + +@deftypevr {@code{getmail-retriever-configuration} parameter} string type +The type of mail retriever to use. Valid values include @samp{passwd} +and @samp{static}. + +Defaults to @samp{"SimpleIMAPSSLRetriever"}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} string server +Space separated list of arguments to the userdb driver. + +Defaults to @samp{unset}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} string username +Space separated list of arguments to the userdb driver. + +Defaults to @samp{unset}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} non-negative-integer port +Space separated list of arguments to the userdb driver. + +Defaults to @samp{#f}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} string password +Override fields from passwd. + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} list password-command +Override fields from passwd. + +Defaults to @samp{()}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} string keyfile +PEM-formatted key file to use for the TLS negotiation + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} string certfile +PEM-formatted certificate file to use for the TLS negotiation + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} string ca-certs +CA certificates to use + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{getmail-retriever-configuration} parameter} parameter-alist extra-parameters +Extra retriever parameters + +Defaults to @samp{()}. + +@end deftypevr + +@end deftypevr + +@deftypevr {@code{getmail-configuration-file} parameter} getmail-destination-configuration destination +What to do with retrieved messages. + +Available @code{getmail-destination-configuration} fields are: + +@deftypevr {@code{getmail-destination-configuration} parameter} string type +The type of mail destination. Valid values include @samp{Maildir}, +@samp{Mboxrd} and @samp{MDA_external}. + +Defaults to @samp{unset}. + +@end deftypevr + +@deftypevr {@code{getmail-destination-configuration} parameter} string-or-filelike path +The path option for the mail destination. The behaviour depends on the +chosen type. + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{getmail-destination-configuration} parameter} parameter-alist extra-parameters +Extra destination parameters + +Defaults to @samp{()}. + +@end deftypevr + +@end deftypevr + +@deftypevr {@code{getmail-configuration-file} parameter} getmail-options-configuration options +Configure getmail. + +Available @code{getmail-options-configuration} fields are: + +@deftypevr {@code{getmail-options-configuration} parameter} non-negative-integer verbose +If set to @samp{0}, getmail will only print warnings and errors. A +value of @samp{1} means that messages will be printed about retrieving +and deleting messages. If set to @samp{2}, getmail will print messages +about each of it's actions. + +Defaults to @samp{1}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} boolean read-all +If true, getmail will retrieve all available messages. Otherwise it +will only retrieve messages it hasn't seen previously. + +Defaults to @samp{#t}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} boolean delete +If set to true, messages will be deleted from the server after +retrieving and successfully delivering them. Otherwise, messages will +be left on the server. + +Defaults to @samp{#f}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} non-negative-integer delete-after +Getmail will delete messages this number of days after seeing them, if +they have not been delivered. This means messages will be left on the +server this number of days after delivering them. A value of @samp{0} +disabled this feature. + +Defaults to @samp{0}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} non-negative-integer delete-bigger-than +Delete messages larger than this of bytes after retrieving them, even if +the delete and delete-after options are disabled. A value of @samp{0} +disables this feature. + +Defaults to @samp{0}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} non-negative-integer max-bytes-per-session +Retrieve messages totalling up to this number of bytes before closing +the session with the server. A value of @samp{0} disables this feature. + +Defaults to @samp{0}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} non-negative-integer max-message-size +Don't retrieve messages larger than this number of bytes. A value of +@samp{0} disables this feature. + +Defaults to @samp{0}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} boolean delivered-to +If true, getmail will add a Delivered-To header to messages. + +Defaults to @samp{#t}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} boolean received +If set, getmail adds a Received header to the messages. + +Defaults to @samp{#t}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} string message-log +Getmail will record a log of its actions to the named file. A value of +@samp{""} disables this feature. + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} boolean message-log-syslog +If true, getmail will record a log of its actions using the system +logger. + +Defaults to @samp{#t}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} boolean message-log-verbose +If true, getmail will log information about messages not retrieved and +the reason for not retrieving them, as well as starting and ending +information lines. + +Defaults to @samp{#t}. + +@end deftypevr + +@deftypevr {@code{getmail-options-configuration} parameter} parameter-alist extra-parameters +Extra options to include. + +Defaults to @samp{()}. + +@end deftypevr + +@end deftypevr + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} list idle +A list of mailboxes that getmail should wait on the server for new mail +notifications. This depends on the server supporting the IDLE +extension. + +Defaults to @samp{()}. + +@end deftypevr + +@deftypevr {@code{getmail-configuration} parameter} list environment-variables +Environment variables to set for getmail. + +Defaults to @samp{()}. + +@end deftypevr + @subsubheading Mail Aliases Service @cindex email aliases diff --git a/gnu/local.mk b/gnu/local.mk index a0f40d13ae..f7dbf5d919 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -513,6 +513,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/docker.scm \ %D%/services/authentication.scm \ %D%/services/games.scm \ + %D%/services/getmail.scm \ %D%/services/kerberos.scm \ %D%/services/lirc.scm \ %D%/services/virtualization.scm \ diff --git a/gnu/services/getmail.scm b/gnu/services/getmail.scm new file mode 100644 index 0000000000..b807bb3a5d --- /dev/null +++ b/gnu/services/getmail.scm @@ -0,0 +1,380 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2019 Christopher Baines +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix 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 GNU Guix. If not, see . + +(define-module (gnu services getmail) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services configuration) + #:use-module (gnu services shepherd) + #:use-module (gnu system pam) + #:use-module (gnu system shadow) + #:use-module (gnu packages mail) + #:use-module (gnu packages admin) + #:use-module (gnu packages tls) + #:use-module (guix records) + #:use-module (guix store) + #:use-module (guix packages) + #:use-module (guix gexp) + #:use-module (ice-9 match) + #:use-module (ice-9 format) + #:use-module (srfi srfi-1) + #:export (getmail-retriever-configuration + getmail-retriever-configuration-extra-parameters + getmail-destination-configuration + getmail-options-configuration + getmail-configuration-file + getmail-configuration + getmail-service-type)) + +;;; Commentary: +;;; +;;; Service for the getmail mail retriever. +;;; +;;; Code: + +(define (uglify-field-name field-name) + (let ((str (symbol->string field-name))) + (string-join (string-split (if (string-suffix? "?" str) + (substring str 0 (1- (string-length str))) + str) + #\-) + "_"))) + +(define (serialize-field field-name val) + #~(let ((val '#$val)) + (format #f "~a = ~a\n" + #$(uglify-field-name field-name) + (cond + ((list? val) + (string-append + "(" + (string-concatenate + (map (lambda (list-val) + (format #f "\"~a\", " list-val)) + val)) + ")")) + (else + val))))) + +(define (serialize-string field-name val) + (if (string=? val "") + "" + (serialize-field field-name val))) + +(define (string-or-filelike? val) + (or (string? val) + (file-like? val))) +(define (serialize-string-or-filelike field-name val) + (if (equal? val "") + "" + (serialize-field field-name val))) + +(define (serialize-boolean field-name val) + (serialize-field field-name (if val "true" "false"))) + +(define (non-negative-integer? val) + (and (exact-integer? val) (not (negative? val)))) +(define (serialize-non-negative-integer field-name val) + (serialize-field field-name val)) + +(define serialize-list serialize-field) + +(define parameter-alist? list?) +(define (serialize-parameter-alist field-name val) + #~(string-append + #$@(map (match-lambda + ((key . value) + (serialize-field key value))) + val))) + +(define (serialize-getmail-retriever-configuration field-name val) + (serialize-configuration val getmail-retriever-configuration-fields)) + +(define-configuration getmail-retriever-configuration + (type + (string "SimpleIMAPSSLRetriever") + "The type of mail retriever to use. Valid values include +@samp{passwd} and @samp{static}.") + (server + (string 'unset) + "Space separated list of arguments to the userdb driver.") + (username + (string 'unset) + "Space separated list of arguments to the userdb driver.") + (port + (non-negative-integer #f) + "Space separated list of arguments to the userdb driver.") + (password + (string "") + "Override fields from passwd.") + (password-command + (list '()) + "Override fields from passwd.") + (keyfile + (string "") + "PEM-formatted key file to use for the TLS negotiation") + (certfile + (string "") + "PEM-formatted certificate file to use for the TLS negotiation") + (ca-certs + (string "") + "CA certificates to use") + (extra-parameters + (parameter-alist '()) + "Extra retriever parameters")) + +(define (serialize-getmail-destination-configuration field-name val) + (serialize-configuration val getmail-destination-configuration-fields)) + +(define-configuration getmail-destination-configuration + (type + (string 'unset) + "The type of mail destination. Valid values include @samp{Maildir}, +@samp{Mboxrd} and @samp{MDA_external}.") + (path + (string-or-filelike "") + "The path option for the mail destination. The behaviour depends on the +chosen type.") + (extra-parameters + (parameter-alist '()) + "Extra destination parameters")) + +(define (serialize-getmail-options-configuration field-name val) + (serialize-configuration val getmail-options-configuration-fields)) + +(define-configuration getmail-options-configuration + (verbose + (non-negative-integer 1) + "If set to @samp{0}, getmail will only print warnings and errors. A value +of @samp{1} means that messages will be printed about retrieving and deleting +messages. If set to @samp{2}, getmail will print messages about each of it's +actions.") + (read-all + (boolean #t) + "If true, getmail will retrieve all available messages. Otherwise it will +only retrieve messages it hasn't seen previously.") + (delete + (boolean #f) + "If set to true, messages will be deleted from the server after retrieving +and successfully delivering them. Otherwise, messages will be left on the +server.") + (delete-after + (non-negative-integer 0) + "Getmail will delete messages this number of days after seeing them, if +they have not been delivered. This means messages will be left on the server +this number of days after delivering them. A value of @samp{0} disabled this +feature.") + (delete-bigger-than + (non-negative-integer 0) + "Delete messages larger than this of bytes after retrieving them, even if +the delete and delete-after options are disabled. A value of @samp{0} +disables this feature.") + (max-bytes-per-session + (non-negative-integer 0) + "Retrieve messages totalling up to this number of bytes before closing the +session with the server. A value of @samp{0} disables this feature.") + (max-message-size + (non-negative-integer 0) + "Don't retrieve messages larger than this number of bytes. A value of +@samp{0} disables this feature.") + (delivered-to + (boolean #t) + "If true, getmail will add a Delivered-To header to messages.") + (received + (boolean #t) + "If set, getmail adds a Received header to the messages.") + (message-log + (string "") + "Getmail will record a log of its actions to the named file. A value of +@samp{\"\"} disables this feature.") + (message-log-syslog + (boolean #t) + "If true, getmail will record a log of its actions using the system +logger.") + (message-log-verbose + (boolean #t) + "If true, getmail will log information about messages not retrieved and the +reason for not retrieving them, as well as starting and ending information +lines.") + (extra-parameters + (parameter-alist '()) + "Extra options to include.")) + +(define (serialize-getmail-configuration-file field-name val) + (match val + (($ location + retriever destination options) + #~(string-append + "[retriever]\n" + #$(serialize-getmail-retriever-configuration #f retriever) + "\n[destination]\n" + #$(serialize-getmail-destination-configuration #f destination) + "\n[options]\n" + #$(serialize-getmail-options-configuration #f options))))) + +(define-configuration getmail-configuration-file + (retriever + (getmail-retriever-configuration (getmail-retriever-configuration)) + "What mail account to retrieve mail from, and how to access that account.") + (destination + (getmail-destination-configuration (getmail-destination-configuration)) + "What to do with retrieved messages.") + (options + (getmail-options-configuration (getmail-options-configuration)) + "Configure getmail.")) + +(define (serialize-symbol field-name val) "") +(define (serialize-getmail-configuration field-name val) "") + +(define-configuration getmail-configuration + (name + (symbol "unset") + "A symbol to identify the getmail service.") + (package + (package getmail) + "The getmail package to use.") + (user + (string "getmail") + "The user to run getmail as.") + (group + (string "getmail") + "The group to run getmail as.") + (directory + (string "/var/lib/getmail/default") + "The getmail directory to use.") + (rcfile + (getmail-configuration-file (getmail-configuration-file)) + "The getmail configuration file to use.") + (idle + (list '()) + "A list of mailboxes that getmail should wait on the server for new mail +notifications. This depends on the server supporting the IDLE extension.") + (environment-variables + (list '()) + "Environment variables to set for getmail.")) + +(define (generate-getmail-documentation) + (generate-documentation + `((getmail-configuration + ,getmail-configuration-fields + (rcfile getmail-configuration-file)) + (getmail-configuration-file + ,getmail-configuration-file-fields + (retriever getmail-retriever-configuration) + (destination getmail-destination-configuration) + (options getmail-options-configuration)) + (getmail-retriever-configuration ,getmail-retriever-configuration-fields) + (getmail-destination-configuration ,getmail-destination-configuration-fields) + (getmail-options-configuration ,getmail-options-configuration-fields)) + 'getmail-configuration)) + +(define-gexp-compiler (getmail-configuration-file-compiler + (rcfile ) system target) + (gexp->derivation + "getmailrc" + #~(call-with-output-file #$output + (lambda (port) + (display #$(serialize-getmail-configuration-file #f rcfile) + port))) + #:system system + #:target target)) + +(define (getmail-accounts configs) + (let ((users (delete-duplicates + (map getmail-configuration-user + configs))) + (groups (delete-duplicates + (map getmail-configuration-group + configs)))) + (append + (map (lambda (group) + (user-group + (name group) + (system? #t))) + groups) + (map (lambda (user) + (user-account + (name user) + (group (getmail-configuration-group + (find (lambda (config) + (and + (string=? user (getmail-configuration-user config)) + (getmail-configuration-group config))) + configs))) + (system? #t) + (comment "Getmail user") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + users)))) + +(define (getmail-activation configs) + "Return the activation GEXP for CONFIGS." + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + #$@(map + (lambda (config) + #~(let* ((pw (getpw #$(getmail-configuration-user config))) + (uid (passwd:uid pw)) + (gid (passwd:gid pw)) + (getmaildir #$(getmail-configuration-directory config))) + (mkdir-p getmaildir) + (chown getmaildir uid gid))) + configs)))) + +(define (getmail-shepherd-services configs) + "Return a list of for CONFIGS." + (map (match-lambda + (($ location name package + user group directory rcfile idle + environment-variables) + (shepherd-service + (documentation "Run getmail.") + (provision (list (symbol-append 'getmail- name))) + (requirement '(networking)) + (start #~(make-forkexec-constructor + `(#$(file-append package "/bin/getmail") + ,(string-append "--getmaildir=" #$directory) + #$@(map (lambda (idle) + (string-append "--idle=" idle)) + idle) + ,(string-append "--rcfile=" #$rcfile)) + #:user #$user + #:group #$group + #:environment-variables + (list #$@environment-variables) + #:log-file + #$(string-append "/var/log/getmail-" + (symbol->string name))))))) + configs)) + +(define getmail-service-type + (service-type + (name 'getmail) + (extensions + (list (service-extension shepherd-root-service-type + getmail-shepherd-services) + (service-extension activation-service-type + getmail-activation) + (service-extension account-service-type + getmail-accounts))) + (description + "Run @command{getmail}, a mail retriever program.") + (default-value '()) + (compose concatenate) + (extend append))) diff --git a/gnu/tests/mail.scm b/gnu/tests/mail.scm index 33aa4d3437..10e5be71d8 100644 --- a/gnu/tests/mail.scm +++ b/gnu/tests/mail.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2017 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2018 Clément Lassieur +;;; Copyright © 2019 Christopher Baines ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ #:use-module (gnu system) #:use-module (gnu system vm) #:use-module (gnu services) + #:use-module (gnu services getmail) #:use-module (gnu services mail) #:use-module (gnu services networking) #:use-module (guix gexp) @@ -32,7 +34,8 @@ #:use-module (ice-9 ftw) #:export (%test-opensmtpd %test-exim - %test-dovecot)) + %test-dovecot + %test-getmail)) (define %opensmtpd-os (simple-operating-system @@ -394,3 +397,176 @@ Subject: Hello Nice to meet you!") (name "dovecot") (description "Connect to a running Dovecot server.") (value (run-dovecot-test)))) + +(define %getmail-os + (simple-operating-system + (service dhcp-client-service-type) + (service dovecot-service-type + (dovecot-configuration + (disable-plaintext-auth? #f) + (ssl? "no") + (auth-mechanisms '("anonymous" "plain")) + (auth-anonymous-username "alice") + (mail-location + (string-append "maildir:~/Maildir" + ":INBOX=~/Maildir/INBOX" + ":LAYOUT=fs")))) + (service getmail-service-type + (list + (getmail-configuration + (name 'test) + (user "alice") + (directory "/var/lib/getmail/alice") + (idle '("TESTBOX")) + (rcfile + (getmail-configuration-file + (retriever + (getmail-retriever-configuration + (type "SimpleIMAPRetriever") + (server "localhost") + (username "alice") + (port 143) + (extra-parameters + '((password . "testpass") + (mailboxes . ("TESTBOX")))))) + (destination + (getmail-destination-configuration + (type "Maildir") + (path "/home/alice/TestMaildir/"))) + (options + (getmail-options-configuration + (read-all #f)))))))))) + +(define (run-getmail-test) + "Return a test of an OS running Getmail service." + (define vm + (virtual-machine + (operating-system (marionette-operating-system + %getmail-os + #:imported-modules '((gnu services herd)))) + (port-forwardings '((8143 . 143))))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (ice-9 iconv) + (ice-9 rdelim) + (rnrs base) + (rnrs bytevectors) + (srfi srfi-64)) + + (define marionette + (make-marionette '(#$vm))) + + (define* (message-length message #:key (encoding "iso-8859-1")) + (bytevector-length (string->bytevector message encoding))) + + (define message "From: test@example.com\n\ +Subject: Hello Nice to meet you!") + + (mkdir #$output) + (chdir #$output) + + (test-begin "getmail") + + ;; Wait for dovecot to be up and running. + (test-assert "dovecot running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'dovecot)) + marionette)) + + (test-assert "set password for alice" + (marionette-eval + '(system "echo -e \"testpass\ntestpass\" | passwd alice") + marionette)) + + ;; Wait for getmail to be up and running. + (test-assert "getmail-test running" + (marionette-eval + '(let* ((pw (getpw "alice")) + (uid (passwd:uid pw)) + (gid (passwd:gid pw))) + (use-modules (gnu services herd)) + + (for-each + (lambda (dir) + (mkdir dir) + (chown dir uid gid)) + '("/home/alice/TestMaildir" + "/home/alice/TestMaildir/cur" + "/home/alice/TestMaildir/new" + "/home/alice/TestMaildir/tmp" + "/home/alice/TestMaildir/TESTBOX" + "/home/alice/TestMaildir/TESTBOX/cur" + "/home/alice/TestMaildir/TESTBOX/new" + "/home/alice/TestMaildir/TESTBOX/tmp")) + + (start-service 'getmail-test)) + marionette)) + + ;; Check Dovecot service's PID. + (test-assert "service process id" + (let ((pid + (number->string (wait-for-file "/var/run/dovecot/master.pid" + marionette)))) + (marionette-eval `(file-exists? (string-append "/proc/" ,pid)) + marionette))) + + (test-assert "accept an email" + (let ((imap (socket AF_INET SOCK_STREAM 0)) + (addr (make-socket-address AF_INET INADDR_LOOPBACK 8143))) + (connect imap addr) + ;; Be greeted. + (read-line imap) ;OK + ;; Authenticate + (write-line "a AUTHENTICATE ANONYMOUS" imap) + (read-line imap) ;+ + (write-line "c2lyaGM=" imap) + (read-line imap) ;OK + ;; Create a TESTBOX mailbox + (write-line "a CREATE TESTBOX" imap) + (read-line imap) ;OK + ;; Append a message to a TESTBOX mailbox + (write-line (format #f "a APPEND TESTBOX {~a}" + (number->string (message-length message))) + imap) + (read-line imap) ;+ + (write-line message imap) + (read-line imap) ;OK + ;; Logout + (write-line "a LOGOUT" imap) + (close imap) + #t)) + + (sleep 1) + + (test-assert "mail arrived" + (string-contains + (marionette-eval + '(begin + (use-modules (ice-9 ftw) + (ice-9 match)) + (let ((TESTBOX/new "/home/alice/TestMaildir/new/")) + (match (scandir TESTBOX/new) + (("." ".." message-file) + (call-with-input-file + (string-append TESTBOX/new message-file) + get-string-all))))) + marionette) + message)) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "getmail-test" test)) + +(define %test-getmail + (system-test + (name "getmail") + (description "Connect to a running Getmail server.") + (value (run-getmail-test)))) + +%getmail-os -- 2.21.0 From debbugs-submit-bounces@debbugs.gnu.org Fri May 03 15:31:05 2019 Received: (at 33185) by debbugs.gnu.org; 3 May 2019 19:31:05 +0000 Received: from localhost ([127.0.0.1]:49708 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdtU-0002uQ-Sc for submit@debbugs.gnu.org; Fri, 03 May 2019 15:31:02 -0400 Received: from mira.cbaines.net ([212.71.252.8]:58914) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hMdtH-0002tm-3q for 33185@debbugs.gnu.org; Fri, 03 May 2019 15:30:42 -0400 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id CCE5516F53 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 20:30:37 +0100 (BST) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id c4d969d9 for <33185@debbugs.gnu.org>; Fri, 3 May 2019 19:30:37 +0000 (UTC) From: Christopher Baines To: 33185@debbugs.gnu.org Subject: [PATCH 2/3] gnu: Add patchwork. Date: Fri, 3 May 2019 20:30:36 +0100 Message-Id: <20190503193037.27035-2-mail@cbaines.net> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190503193037.27035-1-mail@cbaines.net> References: <87o94jqrff.fsf@cbaines.net> <20190503193037.27035-1-mail@cbaines.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 33185 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/patchutils.scm (patchwork): New variable. --- gnu/packages/patchutils.scm | 167 ++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm index f6197b98ee..687864c008 100644 --- a/gnu/packages/patchutils.scm +++ b/gnu/packages/patchutils.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014, 2018 Eric Bavier ;;; Copyright © 2015, 2018 Leo Famulari ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice +;;; Copyright © 2019 Christopher Baines ;;; ;;; This file is part of GNU Guix. ;;; @@ -31,6 +32,8 @@ #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages check) + #:use-module (gnu packages databases) + #:use-module (gnu packages django) #:use-module (gnu packages file) #:use-module (gnu packages gawk) #:use-module (gnu packages gettext) @@ -300,3 +303,167 @@ directories, and has support for many popular version control systems. Meld helps you review code changes and understand patches. It might even help you to figure out what is going on in that merge you keep avoiding.") (license gpl2))) + +(define-public patchwork + (package + (name "patchwork") + (version "2.1.2") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/getpatchwork/patchwork.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "06ng5pv6744w98zkyfm0ldkmpdgnsql3gbbbh6awq61sr2ndr3qw")))) + (build-system python-build-system) + (arguments + `(;; TODO: Tests require a running database + #:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (add-after 'unpack 'replace-wsgi.py + (lambda* (#:key inputs outputs #:allow-other-keys) + (delete-file "patchwork/wsgi.py") + (call-with-output-file "patchwork/wsgi.py" + (lambda (port) + ;; Embed the PYTHONPATH containing the dependencies, as well + ;; as the python modules in this package in the wsgi.py file, + ;; as this will ensure they are available at runtime. + (define pythonpath + (string-append (getenv "PYTHONPATH") + ":" + (site-packages inputs outputs))) + (display + (string-append " +import os, sys + +sys.path.extend('" pythonpath "'.split(':')) + +from django.core.wsgi import get_wsgi_application + +# By default, assume that patchwork is running as a Guix service, which +# provides the settings as the 'guix.patchwork.settings' Python module. +# +# When using httpd, it's hard to set environment variables, so rely on the +# default set here. +os.environ['DJANGO_SETTINGS_MODULE'] = os.getenv( + 'DJANGO_SETTINGS_MODULE', + 'guix.patchwork.settings' # default +) + +application = get_wsgi_application()\n") port))))) + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (when tests? + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev") + (invoke "python" "-Wonce" "./manage.py" "test" "--noinput")) + #t)) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (out-site-packages (site-packages inputs outputs))) + (for-each (lambda (directory) + (copy-recursively + directory + (string-append out-site-packages directory))) + '(;; Contains the python code + "patchwork" + ;; Contains the templates for the generated HTML + "templates")) + (delete-file-recursively + (string-append out-site-packages "patchwork/tests")) + + ;; Install patchwork related tools + (for-each (lambda (file) + (install-file file (string-append out "/bin"))) + (list + (string-append out-site-packages + "patchwork/bin/pwclient") + (string-append out-site-packages + "patchwork/bin/parsemail.sh") + (string-append out-site-packages + "patchwork/bin/parsemail-batch.sh"))) + + ;; Delete the symlink to pwclient, and replace it with the + ;; actual file, as this can cause issues when serving the file + ;; from a webserver. + (let ((template-pwclient (string-append + out-site-packages + "patchwork/templates/patchwork/pwclient"))) + (delete-file template-pwclient) + (copy-file (string-append out-site-packages + "patchwork/bin/pwclient") + template-pwclient)) + + ;; Collect the static assets, this includes JavaScript, CSS and + ;; fonts. This is a standard Django process when running a + ;; Django application for regular use, and includes assets for + ;; dependencies like the admin site from Django. + ;; + ;; The intent here is that you can serve files from this + ;; directory through a webserver, which is recommended when + ;; running Django applications. + (let ((static-root + (string-append out "/share/patchwork/htdocs"))) + (mkdir-p static-root) + (copy-file "patchwork/settings/production.example.py" + "patchwork/settings/assets.py") + (setenv "DJANGO_SECRET_KEY" "dummyvalue") + (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.assets") + (setenv "STATIC_ROOT" static-root) + (invoke "./manage.py" "collectstatic" "--no-input")) + + ;; The lib directory includes example configuration files that + ;; may be useful when deploying patchwork. + (copy-recursively "lib" + (string-append + out "/share/doc/" ,name "-" ,version))) + #t)) + ;; The hasher script is used from the post-receive.hook + (add-after 'install 'install-hasher + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (out-site-packages (site-packages inputs outputs)) + (out-hasher.py (string-append out-site-packages + "/patchwork/hasher.py"))) + (chmod out-hasher.py #o555) + (symlink out-hasher.py (string-append out "/bin/hasher"))) + #t)) + ;; Create a patchwork specific version of Django's command line admin + ;; utility. + (add-after 'install 'install-patchwork-admin + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/bin")) + (call-with-output-file (string-append out "/bin/patchwork-admin") + (lambda (port) + (simple-format port "#!~A +import os, sys + +if __name__ == \"__main__\": + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv)" (which "python")))) + (chmod (string-append out "/bin/patchwork-admin") #o555)) + #t))))) + (inputs + `(("python-wrapper" ,python-wrapper))) + (propagated-inputs + `(("python-django" ,python-django) + ;; TODO: Make this configurable + ("python-psycopg2" ,python-psycopg2) + ("python-mysqlclient" ,python-mysqlclient) + ("python-django-filter" ,python-django-filter) + ("python-djangorestframework" ,python-djangorestframework) + ("python-django-debug-toolbar" ,python-django-debug-toolbar))) + (synopsis "Web based patch tracking system") + (description + "Patchwork is a patch tracking system. It takes in emails containing +patches, and displays the patches along with comments and state information. +Users can login allowing them to change the state of patches.") + (home-page "http://jk.ozlabs.org/projects/patchwork/") + (license gpl2+))) -- 2.21.0 From debbugs-submit-bounces@debbugs.gnu.org Fri May 31 15:43:40 2019 Received: (at 33185-done) by debbugs.gnu.org; 31 May 2019 19:43:40 +0000 Received: from localhost ([127.0.0.1]:36303 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hWnRD-0001OG-Lu for submit@debbugs.gnu.org; Fri, 31 May 2019 15:43:39 -0400 Received: from mira.cbaines.net ([212.71.252.8]:53366) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hWnRB-0001O4-PN for 33185-done@debbugs.gnu.org; Fri, 31 May 2019 15:43:38 -0400 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 940E71701E for <33185-done@debbugs.gnu.org>; Fri, 31 May 2019 20:43:35 +0100 (BST) Received: from capella (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 710db0c7 for <33185-done@debbugs.gnu.org>; Fri, 31 May 2019 19:43:35 +0000 (UTC) References: <87y3aie8a1.fsf@cbaines.net> <87o94jqrff.fsf@cbaines.net> User-agent: mu4e 1.2.0; emacs 26.2 From: Christopher Baines To: 33185-done@debbugs.gnu.org Subject: Re: [bug#33185] [PATCH 0/7] Add patchwork package and service. In-reply-to: <87o94jqrff.fsf@cbaines.net> Date: Fri, 31 May 2019 20:43:35 +0100 Message-ID: <87k1e6xvdk.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 33185-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Christopher Baines writes: > Christopher Baines writes: > >> These patches add a package for patchwork, a web-based patch tracking >> system, along with some missing dependencies and the beginnings of a >> system service and test. >> >> Everything up to the patchwork package should be ready to merge, but the >> patchwork package, service and system test is currently very rough and >> unready. >> >> >> Christopher Baines (7): >> gnu: Add python-jsmin. >> gnu: Add python-slimit. >> gnu: Add python-django-pipeline. >> gnu: Add python-django-jinja. >> gnu: Add python-django-debug-toolbar. >> gnu: Add patchwork. >> services: Add patchwork. >> >> gnu/packages/django.scm | 130 ++++++++++++++++ >> gnu/packages/patchutils.scm | 95 ++++++++++++ >> gnu/packages/python-web.scm | 50 +++++++ >> gnu/services/web.scm | 291 +++++++++++++++++++++++++++++++++++- >> gnu/tests/web.scm | 104 ++++++++++++- >> 5 files changed, 668 insertions(+), 2 deletions(-) > > Following on from this, I believe the first 5 patches adding the > prerequisite packages for patchwork have now been added. > > The initial package and service for Patchwork wasn't ready to add to > Guix, but I now believe it is at least ready to review. > > In addition to Patchwork, this patch series also includes a service for > Getmail. I believe this is the simplest way of getting patches in to > Patchwork. > > > Christopher Baines (3): > services: Add getmail. > gnu: Add patchwork. > services: Add patchwork. > > doc/guix.texi | 464 ++++++++++++++++++++++++++++++++++++ > gnu/local.mk | 1 + > gnu/packages/patchutils.scm | 166 +++++++++++++ > gnu/services/getmail.scm | 380 +++++++++++++++++++++++++++++ > gnu/services/web.scm | 366 +++++++++++++++++++++++++++- > gnu/tests/mail.scm | 177 +++++++++++++- > gnu/tests/web.scm | 162 ++++++++++++- > 7 files changed, 1713 insertions(+), 3 deletions(-) > create mode 100644 gnu/services/getmail.scm I've gone ahead and merged these now [1]. 1: 2177d9222f8c228fe5cd4e9c98d96f97e9601b86 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlzxg+dfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XdeHA/8CLbWw6KdxUgQrty0Un7vpQxkOeridFOD3TknNs3DMVsTs/NHGeEiJUV+ xHe3IQnDLlR1tqsGg3VQChxGrdZ3nLSNGlVDP4C5srz1qMpWJvnPRynA5z4zgOKx s7T1eiFxFUHAuUouB/U5s1g8c08/EHsoZG+bhzFxxyPiaEOTTWxJo20ONQE1rdAa sd0Prc6x6bMm+avTTVgvbVrdXD2SfC/Pq91ERrwgCL7EbnzKY+PacF+1u+tiCIWC JaORzM+gvjYEiNBTYIh0o+w96HqLGQ3mxsn9eOkaHAN9LNHbyabtPtxQKAEr94Ho 2N8mtmgfqZabbBzuLASbz4xNb3k/94xegRIkgn5244O499NK1ji0HHC7/BeCtpw1 s6rxJSEOTSXaPpiQOUa0mwBPJlWE9oEExucrsg7/R25UscK5EXRlzOHaQ8ocmdRV frEZGtJ2Uap5Tlmu4gmqbvc0PibLF9fI0+9hTlG2GP/6xk/l7eL+UUxOYuP86bju wBzU7xEP8lcLQ0FKgdZMlsTiJWAp7El9+/S66TSuLuyzyEyCwQPbRe+2MRGRn7S0 3JL9ZzWMH2YuaB92XNrhDdouIqXDHrShz0/Zp9+8M0sMJInT6I2fz6V0AEBkzG/3 ciEq/EaSecdsFibh/j3+6aglWaPEQHceSxJ2qXXee0qR0uioF3g= =v7cc -----END PGP SIGNATURE----- --=-=-=-- From unknown Sat Jun 21 03:21:22 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sat, 29 Jun 2019 11:24:06 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator