projects/guix·blob next-master · refs

636 lines · 25.8 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2013 Nikita Karetnikov <[email protected]>
3;;; Copyright © 2014,2017, 2018, 2023 Eric Bavier <[email protected]>
4;;; Copyright © 2015, 2018 Leo Famulari <[email protected]>
5;;; Copyright © 2018–2022 Tobias Geerinckx-Rice <[email protected]>
6;;; Copyright © 2019 Christopher Baines <[email protected]>
7;;; Copyright © 2021 Xinglu Chen <[email protected]>
8;;; Copyright © 2022 jgart <[email protected]>
9;;; Copyright © 2023 Andy Tai <[email protected]>
10;;; Copyright © 2023 Efraim Flashner <[email protected]>
11;;; Copyright © 2023 Foundation Devices, Inc. <[email protected]>
12;;;
13;;; This file is part of GNU Guix.
14;;;
15;;; GNU Guix is free software; you can redistribute it and/or modify it
16;;; under the terms of the GNU General Public License as published by
17;;; the Free Software Foundation; either version 3 of the License, or (at
18;;; your option) any later version.
19;;;
20;;; GNU Guix is distributed in the hope that it will be useful, but
21;;; WITHOUT ANY WARRANTY; without even the implied warranty of
22;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23;;; GNU General Public License for more details.
24;;;
25;;; You should have received a copy of the GNU General Public License
26;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
27
28(define-module (gnu packages patchutils)
29 #:use-module ((guix licenses) #:prefix license:)
30 #:use-module (gnu packages autotools)
31 #:use-module (gnu packages base)
32 #:use-module (gnu packages bash)
33 #:use-module (gnu packages check)
34 #:use-module (gnu packages compression)
35 #:use-module (gnu packages databases)
36 #:use-module (gnu packages django)
37 #:use-module (gnu packages file)
38 #:use-module (gnu packages freedesktop)
39 #:use-module (gnu packages gawk)
40 #:use-module (gnu packages gettext)
41 #:use-module (gnu packages glib)
42 #:use-module (gnu packages gnome)
43 #:use-module (gnu packages groff)
44 #:use-module (gnu packages gtk)
45 #:use-module (gnu packages less)
46 #:use-module (gnu packages mail)
47 #:use-module (gnu packages ncurses)
48 #:use-module (gnu packages ocaml)
49 #:use-module (gnu packages package-management)
50 #:use-module (gnu packages perl)
51 #:use-module (gnu packages pkg-config)
52 #:use-module (gnu packages python)
53 #:use-module (gnu packages python-build)
54 #:use-module (gnu packages python-xyz)
55 #:use-module (gnu packages texinfo)
56 #:use-module (gnu packages text-editors)
57 #:use-module (gnu packages time)
58 #:use-module (gnu packages version-control)
59 #:use-module (gnu packages xml)
60 #:use-module (gnu packages)
61 #:use-module (guix build-system glib-or-gtk)
62 #:use-module (guix build-system gnu)
63 #:use-module (guix build-system meson)
64 #:use-module (guix build-system ocaml)
65 #:use-module (guix build-system pyproject)
66 #:use-module (guix download)
67 #:use-module (guix gexp)
68 #:use-module (guix git-download)
69 #:use-module (guix packages)
70 #:use-module (guix utils))
71
72(define-public coccinelle
73 (let ((revision "0")
74 (commit "6608e45f85a10c57a3c910154cf049a5df4d98e4"))
75 (package
76 (name "coccinelle")
77 (version (git-version "1.1.1" revision commit))
78 (source
79 (origin
80 (method git-fetch)
81 (uri (git-reference
82 (url "https://github.com/coccinelle/coccinelle")
83 (commit commit)))
84 (file-name (git-file-name name version))
85 (modules '((guix build utils)))
86 (snippet
87 #~(delete-file-recursively "bundles"))
88 (sha256
89 (base32
90 "08nycmjyckqmqjpi78dcqdbmjq1xp18qdc6023dl90gdi6hmxz9l"))))
91 (build-system gnu-build-system)
92 (arguments
93 (list #:phases
94 #~(modify-phases %standard-phases
95 (add-before 'bootstrap 'prepare-version.sh
96 (lambda _
97 (setenv "MAKE_COCCI_RELEASE" "y")
98 (patch-shebang "version.sh")))
99 (add-before 'check 'set-batch-mode
100 (lambda _
101 (substitute* "Makefile"
102 (("--testall")
103 "--batch_mode --testall")))))))
104 (propagated-inputs
105 (list ocaml-menhir
106 ocaml-num
107 ocaml-parmap
108 ocaml-pcre
109 ocaml-pyml
110 ocaml-stdcompat))
111 (native-inputs
112 (list autoconf
113 automake
114 ocaml
115 ocaml-findlib
116 pkg-config))
117 (home-page "https://coccinelle.lip6.fr")
118 (synopsis "Transformation of C code using semantic patches")
119 (description "Coccinelle is a tool that allows modification of C code
120using semantic patches in the @acronym{SmPL, Semantic Patch Language} for
121specifying desired matches and transformations in the C code.")
122 (license license:gpl2))))
123
124(define-public patchutils
125 (package
126 (name "patchutils")
127 (version "0.4.2")
128 (source
129 (origin
130 (method url-fetch)
131 (uri (string-append "http://cyberelk.net/tim/data/patchutils/stable/"
132 name "-" version ".tar.xz"))
133 (sha256
134 (base32
135 "1va5pzmxbzpi87vdnbjm9qdf9bvzps9xfv0gi4mycgg3bybb0xc8"))))
136 (build-system gnu-build-system)
137 (inputs
138 (list bash-minimal perl python))
139 (arguments
140 '(#:parallel-tests? #f
141 #:phases
142 (modify-phases %standard-phases
143 (add-before 'check 'patch-test-scripts
144 (lambda _
145 (substitute* (find-files "tests" "^run-test$")
146 (("/bin/echo") (which "echo")))))
147 (add-after 'install 'wrap-program
148 ;; Point installed scripts to the utilities they need.
149 (lambda* (#:key inputs outputs #:allow-other-keys)
150 (let* ((out (assoc-ref outputs "out"))
151 (diffutils (assoc-ref inputs "diffutils"))
152 (sed (assoc-ref inputs "sed"))
153 (gawk (assoc-ref inputs "gawk")))
154 (for-each
155 (lambda (prog)
156 (wrap-program (string-append out "/bin/" prog)
157 `("PATH" ":" prefix
158 ,(map (lambda (dir)
159 (string-append dir "/bin"))
160 (list diffutils sed gawk)))))
161 '("dehtmldiff" "editdiff" "espdiff"))))))))
162 (home-page "http://cyberelk.net/tim/software/patchutils")
163 (synopsis "Collection of tools for manipulating patch files")
164 (description
165 "Patchutils is a collection of programs that can manipulate patch files
166in useful ways such as interpolating between two pre-patches, combining two
167incremental patches, fixing line numbers in hand-edited patches, and simply
168listing the files modified by a patch.")
169 (license license:gpl2+)))
170
171(define-public quilt
172 (package
173 (name "quilt")
174 (version "0.67")
175 (source
176 (origin
177 (method url-fetch)
178 (uri (string-append "mirror://savannah/quilt/"
179 "quilt-" version ".tar.gz"))
180 (sha256
181 (base32 "1hiw05aqysbnnl15zg2n5cr11k0z7rz85fvq8qv6qap7hw4vxqrv"))
182 (patches (search-patches "quilt-grep-compat.patch"))))
183 (build-system gnu-build-system)
184 (native-inputs
185 (list gettext-minimal))
186 (inputs
187 (list bash-minimal perl less file gzip ed
188 diffutils diffstat findutils tar))
189 (arguments
190 '(#:parallel-tests? #f
191 #:phases
192 (modify-phases %standard-phases
193 (delete 'check)
194 (add-after 'install 'wrap-program
195 ;; quilt's configure checks for the absolute path to the utilities it
196 ;; needs, but uses only the name when invoking them, so we need to
197 ;; make sure the quilt script can find those utilities when run.
198 (lambda* (#:key inputs outputs #:allow-other-keys)
199 (let ((cmd-path (lambda (cmd) (dirname (which cmd))))
200 (out (assoc-ref outputs "out")))
201 (wrap-program (string-append out "/bin/quilt")
202 `("PATH" ":" prefix
203 ,(map cmd-path
204 (list "bash" "diff" "diffstat" "ed" "file" "find" "grep"
205 "gzip" "less" "patch" "perl" "rm" "sed" "tar"))))
206 (wrap-program (string-append out "/share/quilt/scripts/backup-files")
207 `("PATH" ":" prefix
208 ,(map cmd-path
209 (list "find" "grep" "mkdir")))))))
210 (add-after 'compress-documentation 'check
211 (lambda _
212 (substitute* '("test/run" "test/edit.test")
213 (("/bin/sh") (which "sh"))
214 (("rm -rf") (string-append (which "rm") " -rf")))
215 (substitute* "Makefile"
216 (("^(PATH|QUILT_DIR).*" &)
217 (string-append "#" &)) ; Test the installed 'quilt'
218 (("export QUILT_DIR") "export")
219 (("\\| sort") (string-append "| " (which "sort")))
220 (("\\| sed") (string-append "| " (which "sed")))
221 (("(chmod|touch)" &) (which &)))
222 ;; Tests are scripts interpreted by `test/run` and may specify
223 ;; the execution of several tools. But PATH will be empty, so
224 ;; rewrite with the full file name:
225 (setenv "PATH" (string-append %output "/bin" ":" (getenv "PATH")))
226 (substitute* (find-files "test" "\\.test$")
227 (("([\\$\\|] )([[:graph:]]+)([[:blank:]\n]+)"
228 & > cmd <)
229 (if (string=? cmd "zcat")
230 ;; The `zcat` program is a script, and it will not be able
231 ;; to invoke its `gzip` with PATH unset. It's a simple
232 ;; script though, so just translate here:
233 (string-append > (which "gzip") " -cd " <)
234 (or (and=> (which cmd)
235 (lambda (p) (string-append > p <)))
236 &))))
237 (let ((make (which "make")))
238 ;; Assert the installed 'quilt' can find utilities it needs.
239 (unsetenv "PATH")
240 ;; Used by some tests for access to internal "scripts"
241 (setenv "QUILT_DIR" (string-append %output "/share/quilt"))
242 (invoke make "check")))))))
243 (home-page "https://savannah.nongnu.org/projects/quilt/")
244 (synopsis "Script for managing patches to software")
245 (description
246 "Quilt allows you to easily manage large numbers of patches by keeping
247track of the changes each patch makes. Patches can be applied, un-applied,
248refreshed, and more.")
249 (license license:gpl2)))
250
251(define-public colordiff
252 (package
253 (name "colordiff")
254 (version "1.0.21")
255 (source
256 (origin
257 (method url-fetch)
258 (uri (list (string-append "https://www.colordiff.org/colordiff-"
259 version ".tar.gz")
260 (string-append "http://www.colordiff.org/archive/colordiff-"
261 version ".tar.gz")))
262 (sha256
263 (base32 "05g64z4ls1i70rpzznjxy2cpjgywisnwj9ssx9nq1w7hgqjz8c4v"))))
264 (build-system gnu-build-system)
265 (arguments
266 `(#:tests? #f ; no tests
267 #:make-flags (list (string-append "DESTDIR=" (assoc-ref %outputs "out"))
268 "INSTALL_DIR=/bin" "MAN_DIR=/share/man/man1")
269 #:phases
270 (modify-phases %standard-phases
271 (delete 'configure) ; no configure script
272 (delete 'build)))) ; nothing to build
273 (inputs
274 (list perl xmlto))
275 (home-page "https://www.colordiff.org")
276 (synopsis "Display diff output with colors")
277 (description
278 "Colordiff is Perl script wrapper on top of diff command which provides
279'syntax highlighting' for various patch formats.")
280 (license license:gpl2+)))
281
282(define-public vbindiff
283 (package
284 (name "vbindiff")
285 (version "3.0_beta5")
286 (source (origin
287 (method url-fetch)
288 (uri (string-append "https://www.cjmweb.net/vbindiff/vbindiff-"
289 version ".tar.gz"))
290 (sha256
291 (base32
292 "1f1kj4jki08bnrwpzi663mjfkrx4wnfpzdfwd2qgijlkx5ysjkgh"))))
293 (build-system gnu-build-system)
294 (inputs
295 (list ncurses))
296 (home-page "https://www.cjmweb.net/vbindiff/")
297 (synopsis "Console-based tool for comparing binary data")
298 (description "Visual Binary Diff (@command{vbindiff}) displays files in
299hexadecimal and ASCII (or EBCDIC). It can also display two files at once, and
300highlight the differences between them. It works well with large files (up to 4
301GiB).")
302 (license license:gpl2+)))
303
304(define-public meld
305 (package
306 (name "meld")
307 (version "3.23.0")
308 (source
309 (origin
310 (method url-fetch)
311 (uri (string-append "mirror://gnome/sources/meld/"
312 (version-major+minor version)
313 "/meld-" version ".tar.xz"))
314 (sha256
315 (base32 "19n273shqs8l5lrlic0hr5iv1mp9223ijf3pkh8a49g08112lg4q"))))
316 (build-system meson-build-system)
317 (native-inputs
318 (list desktop-file-utils
319 (list gtk+ "bin") ;for gtk-update-icon-cache
320 intltool
321 itstool
322 libxml2
323 `(,glib "bin") ; for glib-compile-schemas
324 gobject-introspection
325 pkg-config
326 python))
327 (inputs
328 (list bash-minimal
329 python
330 python-pycairo
331 python-pygobject
332 gsettings-desktop-schemas
333 gtksourceview-4))
334 (propagated-inputs
335 (list dconf))
336 (arguments
337 (list
338 #:glib-or-gtk? #t
339 #:imported-modules `(,@%meson-build-system-modules
340 (guix build python-build-system))
341 #:modules '((guix build meson-build-system)
342 ((guix build python-build-system) #:prefix python:)
343 (guix build utils))
344 #:phases
345 #~(modify-phases %standard-phases
346 (add-after 'install 'copy-styles
347 (lambda* (#:key inputs outputs #:allow-other-keys)
348 (let ((styles "/share/gtksourceview-4/styles"))
349 (copy-recursively
350 (string-append (assoc-ref inputs "gtksourceview") styles)
351 (string-append (assoc-ref outputs "out") styles)))))
352 (add-after 'glib-or-gtk-wrap 'python-and-gi-wrap
353 (lambda* (#:key inputs outputs #:allow-other-keys)
354 (wrap-program (search-input-file outputs "bin/meld")
355 `("GUIX_PYTHONPATH" = (,(getenv "GUIX_PYTHONPATH")
356 ,(python:site-packages inputs outputs)))
357 `("GI_TYPELIB_PATH" = (,(getenv "GI_TYPELIB_PATH")))))))))
358 (home-page "https://meldmerge.org/")
359 (synopsis "Compare files, directories and working copies")
360 (description "Meld is a visual diff and merge tool targeted at
361developers. Meld helps you compare files, directories, and version controlled
362projects. It provides two- and three-way comparison of both files and
363directories, and has support for many popular version control systems.
364
365Meld helps you review code changes and understand patches. It might even help
366you to figure out what is going on in that merge you keep avoiding.")
367 (license license:gpl2)))
368
369(define-public patchwork
370 (package
371 (name "patchwork")
372 (version "3.2.1")
373 (source
374 (origin
375 (method git-fetch)
376 (uri (git-reference
377 (url "https://github.com/getpatchwork/patchwork")
378 (commit (string-append "v" version))))
379 (file-name (git-file-name name version))
380 (sha256
381 (base32 "04ikawdyhjwspxvhazbp5f5vym672y0jcw8rd2m75h9ipcpnyxim"))))
382 (build-system pyproject-build-system)
383 (arguments
384 (list
385 #:tests? #f ;TODO: Tests require a running database
386 #:phases
387 #~(modify-phases %standard-phases
388 (delete 'configure)
389 (delete 'build)
390 (add-after 'unpack 'replace-wsgi.py
391 (lambda* (#:key inputs outputs #:allow-other-keys)
392 (delete-file "patchwork/wsgi.py")
393 (call-with-output-file "patchwork/wsgi.py"
394 (lambda (port)
395 ;; Embed the PYTHONPATH containing the dependencies, as well
396 ;; as the python modules in this package in the wsgi.py file,
397 ;; as this will ensure they are available at runtime.
398 (define pythonpath
399 (string-append (getenv "GUIX_PYTHONPATH") ":"
400 (site-packages inputs outputs)))
401 (display (string-append
402 "\nimport os, sys\n\nsys.path.extend('" pythonpath
403 "'.split(':'))
404
405from django.core.wsgi import get_wsgi_application
406
407# By default, assume that patchwork is running as a Guix service, which
408# provides the settings as the 'guix.patchwork.settings' Python module.
409#
410# When using httpd, it's hard to set environment variables, so rely on the
411# default set here.
412os.environ['DJANGO_SETTINGS_MODULE'] = os.getenv(
413 'DJANGO_SETTINGS_MODULE',
414 'guix.patchwork.settings' # default
415)
416
417application = get_wsgi_application()\n") port)))))
418 (replace 'check
419 (lambda* (#:key tests? #:allow-other-keys)
420 (when tests?
421 (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.dev")
422 (invoke "python" "-Wonce" "./manage.py" "test" "--noinput"))))
423 (replace 'install
424 (lambda* (#:key inputs outputs #:allow-other-keys)
425 (let ((out (assoc-ref outputs "out"))
426 (out-site-packages (site-packages inputs outputs)))
427 (for-each (lambda (directory)
428 (copy-recursively directory
429 (string-append out-site-packages
430 "/" directory)))
431 '( ;Contains the python code
432 "patchwork"
433 ;; Contains the templates for the generated HTML
434 "templates"))
435 (delete-file-recursively (string-append out-site-packages
436 "/patchwork/tests"))
437
438 (call-with-output-file
439 (string-append out-site-packages "/version.txt")
440 (lambda (port)
441 (display #$version port)
442 (newline port)))
443
444 ;; Install patchwork related tools
445 (for-each
446 (lambda (file)
447 (install-file file (string-append out "/bin")))
448 (list
449 (string-append out-site-packages
450 "/patchwork/bin/parsemail.sh")
451 (string-append out-site-packages
452 "/patchwork/bin/parsemail-batch.sh")))
453
454 ;; Collect the static assets, this includes JavaScript, CSS and
455 ;; fonts. This is a standard Django process when running a
456 ;; Django application for regular use, and includes assets for
457 ;; dependencies like the admin site from Django.
458 ;;
459 ;; The intent here is that you can serve files from this
460 ;; directory through a webserver, which is recommended when
461 ;; running Django applications.
462 (let ((static-root
463 (string-append out "/share/patchwork/htdocs")))
464 ;; Patch the STATICFILES_DIRS entry
465 (substitute* (string-append
466 out-site-packages
467 "/patchwork/settings/base.py")
468 (("os\\.path\\.join\\(ROOT\\_DIR, 'htdocs'\\)")
469 (string-append "'" static-root "'")))
470
471 (mkdir-p static-root)
472 (copy-file "patchwork/settings/production.example.py"
473 "patchwork/settings/assets.py")
474 (setenv "DJANGO_SECRET_KEY" "dummyvalue")
475 (setenv "DJANGO_SETTINGS_MODULE" "patchwork.settings.assets")
476 (setenv "STATIC_ROOT" static-root)
477 (invoke "./manage.py" "collectstatic" "--no-input"))
478
479 ;; The lib directory includes example configuration files that
480 ;; may be useful when deploying patchwork.
481 (copy-recursively "lib"
482 (string-append out "/share/doc/"
483 #$name "-"
484 #$version)))))
485 ;; The hasher script is used from the post-receive.hook
486 (add-after 'install 'install-hasher
487 (lambda* (#:key inputs outputs #:allow-other-keys)
488 (let* ((out (assoc-ref outputs "out"))
489 (out-site-packages (site-packages inputs outputs))
490 (out-hasher.py (string-append out-site-packages
491 "/patchwork/hasher.py")))
492 (chmod out-hasher.py #o555)
493 (symlink out-hasher.py
494 (string-append out "/bin/hasher")))))
495 ;; Create a patchwork specific version of Django's command line admin
496 ;; utility.
497 (add-after 'install 'install-patchwork-admin
498 (lambda _
499 (mkdir-p (string-append #$output "/bin"))
500 (call-with-output-file (string-append #$output
501 "/bin/patchwork-admin")
502 (lambda (port)
503 (simple-format port "#!~A
504import os, sys
505
506if __name__ == \"__main__\":
507 from django.core.management import execute_from_command_line
508
509 execute_from_command_line(sys.argv)" (which "python"))))
510 (chmod (string-append #$output "/bin/patchwork-admin")
511 #o555))))))
512 (native-inputs (list python-setuptools))
513 (inputs (list python-wrapper))
514 (propagated-inputs
515 (list python-django
516 python-tzdata
517 ;; TODO: Make this configurable
518 python-psycopg2
519 python-mysqlclient
520 python-django-filter
521 python-django-rest-framework
522 python-django-debug-toolbar))
523 (synopsis "Web based patch tracking system")
524 (description
525 "Patchwork is a patch tracking system. It takes in emails containing
526patches, and displays the patches along with comments and state information.
527Users can login allowing them to change the state of patches.")
528 (home-page "http://jk.ozlabs.org/projects/patchwork/")
529 (license license:gpl2+)))
530
531(define-public wdiff
532 (package
533 (name "wdiff")
534 (version "1.2.2")
535 (source
536 (origin
537 (method url-fetch)
538 (uri (string-append "mirror://gnu/wdiff/wdiff-"
539 version ".tar.gz"))
540 (sha256
541 (base32
542 "0sxgg0ms5lhi4aqqvz1rj4s77yi9wymfm3l3gbjfd1qchy66kzrl"))))
543 (build-system gnu-build-system)
544 (arguments
545 (list
546 #:phases
547 #~(modify-phases %standard-phases
548 (add-before 'check 'fix-testsuite
549 (lambda _
550 (substitute* "tests/testsuite"
551 (("#! /bin/sh")
552 (string-append "#!" (which "sh")))))))))
553 (native-inputs
554 (list which
555 ;; For some reason wdiff.info gets rebuilt.
556 texinfo))
557 (home-page "https://www.gnu.org/software/wdiff/")
558 (synopsis "Word difference finder")
559 (description
560 "GNU Wdiff is a front-end to the diff program from Diffutils that
561allows you to compare files on a word-by-word basis, where a word is anything
562between whitespace.")
563 (license license:gpl3+)))
564
565(define-public wiggle
566 (package
567 (name "wiggle")
568 (version "1.3")
569 (source (origin
570 (method git-fetch)
571 (uri (git-reference
572 (url "https://github.com/neilbrown/wiggle")
573 (commit (string-append "v" version))))
574 (file-name (git-file-name name version))
575 (sha256
576 (base32
577 "18ilzr9sbal1j8p1d94ilm1j5blac5cngvcvjpdmgmpw6diy2ldf"))))
578 (build-system gnu-build-system)
579 (arguments
580 (list
581 #:make-flags
582 #~(list "CFLAGS=-I. -O3" "INSTALL=install" "STRIP=-s"
583 (string-append "CC=" #$(cc-for-target))
584 (string-append "BINDIR=" #$output "/bin")
585 (string-append "MANDIR=" #$output "/share/man")
586 (string-append "PREFIX=" #$output))
587 #:test-target "test"
588 #:phases
589 #~(modify-phases %standard-phases
590 (delete 'configure))))
591 (home-page "http://neil.brown.name/wiggle/")
592 (inputs (list ncurses))
593 (native-inputs (list groff))
594 (synopsis "Apply patches with conflicts")
595 (description
596 "@code{wiggle} attempts to apply patches to a target file even if the
597patches do not match perfectly.")
598 (license license:gpl2+)))
599
600(define-public pwclient
601 (package
602 (name "pwclient")
603 (version "1.3.0")
604 (source
605 (origin
606 (method git-fetch)
607 (uri (git-reference
608 (url "https://github.com/getpatchwork/pwclient")
609 (commit version)))
610 (file-name (git-file-name name version))
611 (sha256
612 (base32 "1xckwvcqklzpyh3xs4k2zm40ifp0q5fdkj2vmgb8vhfvl1ivs6jv"))))
613 (build-system pyproject-build-system)
614 (arguments
615 (list
616 #:phases
617 #~(modify-phases %standard-phases
618 (add-before 'build 'set-PBR_VERSION
619 (lambda _
620 (setenv "PBR_VERSION" #$version)))
621 (add-after 'install 'install-man-page
622 (lambda _
623 (install-file "man/pwclient.1"
624 (string-append #$output "/share/man/man1")))))))
625 (native-inputs
626 (list python-pbr
627 python-pytest
628 python-pytest-cov
629 python-mock
630 python-setuptools))
631 (home-page "https://github.com/getpatchwork/pwclient")
632 (synopsis "Command-line client for the Patchwork patch tracking tool")
633 (description
634 "pwclient is a VCS-agnostic tool for interacting with Patchwork, the
635web-based patch tracking system.")
636 (license license:gpl2+)))