aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/patchutils.scm132
1 files changed, 132 insertions, 0 deletions
diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm
index 09f5afbb28..f20eb9df3c 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,133 @@ 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 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"))
+ ;; 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")))))
+ (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 "")))