From: Efraim Flashner <efraim@flashner.co.il>
To: Charles <charles.b.jackson@protonmail.com>
Cc: 49242@debbugs.gnu.org
Subject: [bug#49242] Update UglifyJs (& dependencies) and update dependents
Date: Mon, 12 Jul 2021 15:52:19 +0300 [thread overview]
Message-ID: <YOw7A4sfSo5c7JEI@3900XT> (raw)
In-Reply-To: <eTocMn2EyY9WgxEbHnnAPrUrDLQORJdZfbHzIvC9K625Y4TsMZCd5GikjbG4ZVpYZDfcapI0O4lAmvF2cZP7rl605TOYm4OjkukHgWo7vYY=@protonmail.com>
[-- Attachment #1: Type: text/plain, Size: 22958 bytes --]
This should be two patches, one to add node-uglify-js and one to switch
over to the new version. Other comments inline.
I'm torn on putting uglify-js in a separate package module. I'm not
entirely sure how deprecating packages works across modules, but I guess
that's what I suggested below.
It'd probably be best to put it in an uglifyjs.scm and rename the
package to uglifyjs instead of node-uglify-js.
On Sun, Jun 27, 2021 at 04:01:21PM +0000, Charles via Guix-patches via wrote:
> From 53b96b21be2946e84e9687096313557a83c2e103 Mon Sep 17 00:00:00 2001
> From: Charles <charles.b.jackson@protonmail.com>
> Date: Sat, 26 Jun 2021 14:44:23 -0500
> Subject: [PATCH] gnu: Update UglifyJs.
>
> This change is to update the UglifyJs library. This updated Javascript
> implementation is by the same author as the original Common Lisp version and
> is the official successor. It supports many commonly found features of
> ECMAscript 6.
>
> * gnu/packages/lisp-xyz.scm (uglify-js): Remove variable.
> * gnu/packages/node-xyz.scm (node-uglify-js): Add new variable.
> * guix/build-system/minify.scm (default-uglify-js): Update module-ref.
> * gnu/packages/bioinformatics.scm (bismark): Update inputs.
> * gnu/packages/ci.scm (laminar): Update inputs.
> * gnu/packages/cran.scm (r-shiny): Update inputs.
> * gnu/packages/cran.scm (r-shinytree): Update inputs.
> * gnu/packages/cran.scm (r-colourpicker): Update inputs.
> * gnu/packages/cran.scm (r-threejs): Update inputs.
> * gnu/packages/cran.scm (r-flexdashboard): Update inputs.
> * gnu/packages/cran.scm (r-bios2cor): Update inputs.
> * gnu/packages/cran.scm (r-rintrojs): Update inputs.
> * gnu/packages/cran.scm (r-dygraphs): Update inputs.
> * gnu/packages/javascript.scm (js-mathjax): Update inputs.
> * gnu/packages/web.scm (hpcguix-web): Update inputs.
> ---
> gnu/packages/bioinformatics.scm | 6 ++--
> gnu/packages/ci.scm | 6 ++--
> gnu/packages/cran.scm | 36 ++++++++++-----------
> gnu/packages/javascript.scm | 6 ++--
> gnu/packages/lisp-xyz.scm | 52 ------------------------------
> gnu/packages/node-xyz.scm | 24 ++++++++++++++
> gnu/packages/web.scm | 4 +--
> guix/build-system/minify.scm | 4 +--
> guix/build/minify-build-system.scm | 2 +-
> 9 files changed, 56 insertions(+), 84 deletions(-)
>
> diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
> index 7a1c8cc8e3..d11159b88c 100644
> --- a/gnu/packages/bioinformatics.scm
> +++ b/gnu/packages/bioinformatics.scm
> @@ -105,7 +105,6 @@
> #:use-module (gnu packages java-compression)
> #:use-module (gnu packages jemalloc)
> #:use-module (gnu packages linux)
> - #:use-module (gnu packages lisp-xyz)
> #:use-module (gnu packages logging)
> #:use-module (gnu packages lsof)
> #:use-module (gnu packages machine-learning)
> @@ -114,6 +113,7 @@
> #:use-module (gnu packages mpi)
> #:use-module (gnu packages ncurses)
> #:use-module (gnu packages node)
> + #:use-module (gnu packages node-xyz)
> #:use-module (gnu packages ocaml)
> #:use-module (gnu packages pcre)
> #:use-module (gnu packages parallel)
> @@ -9245,7 +9245,7 @@ Browser.")
> (lambda* (#:key inputs #:allow-other-keys)
> (let* ((file (assoc-ref inputs "plotly.js"))
> (installed "plotly/plotly.js"))
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" file)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" file)))
> (call-with-output-file installed
> (cut dump-port minified <>))))
> #t))
> @@ -9303,7 +9303,7 @@ Browser.")
> "v1.39.4/dist/plotly.js"))
> (sha256
> (base32 "138mwsr4nf5qif4mrxx286mpnagxd1xwl6k8aidrjgknaqg88zyr"))))
> - ("uglify-js" ,uglify-js)))
> + ("node-uglify-js" ,node-uglify-js)))
> (home-page "https://www.bioinformatics.babraham.ac.uk/projects/bismark/")
> (synopsis "Map bisulfite treated sequence reads and analyze methylation")
> (description "Bismark is a program to map bisulfite treated sequencing
> diff --git a/gnu/packages/ci.scm b/gnu/packages/ci.scm
> index 0bcde0fad5..9f9f5d6c20 100644
> --- a/gnu/packages/ci.scm
> +++ b/gnu/packages/ci.scm
> @@ -38,7 +38,7 @@
> #:use-module (gnu packages guile)
> #:use-module (gnu packages guile-xyz)
> #:use-module (gnu packages gnupg)
> - #:use-module (gnu packages lisp-xyz)
> + #:use-module (gnu packages node-xyz)
> #:use-module (gnu packages mail)
> #:use-module (gnu packages package-management)
> #:use-module (gnu packages perl)
> @@ -252,7 +252,7 @@ intended as a replacement for Hydra.")
> (let* ((file
> (assoc-ref inputs (string-append name ".js")))
> (port
> - (open-pipe* OPEN_READ "uglify-js" file))
> + (open-pipe* OPEN_READ "uglifyjs" file))
> (destination
> (string-append
> "../build/js/" name ".min.js")))
> @@ -282,7 +282,7 @@ intended as a replacement for Hydra.")
> ("zlib" ,zlib)))
> (native-inputs
> `(("googletest" ,googletest)
> - ("uglify-js" ,uglify-js)
> + ("node-uglify-js" ,node-uglify-js)
>
> ("vue.js"
> ,(origin (method url-fetch)
> diff --git a/gnu/packages/cran.scm b/gnu/packages/cran.scm
> index e01b2417d2..69d98d34aa 100644
> --- a/gnu/packages/cran.scm
> +++ b/gnu/packages/cran.scm
> @@ -83,13 +83,13 @@
> #:use-module (gnu packages java)
> #:use-module (gnu packages javascript)
> #:use-module (gnu packages libevent)
> - #:use-module (gnu packages lisp-xyz)
> #:use-module (gnu packages machine-learning)
> #:use-module (gnu packages maths)
> #:use-module (gnu packages mpi)
> #:use-module (gnu packages multiprecision)
> #:use-module (gnu packages networking)
> #:use-module (gnu packages node)
> + #:use-module (gnu packages node-xyz)
> #:use-module (gnu packages pcre)
> #:use-module (gnu packages pdf)
> #:use-module (gnu packages perl)
> @@ -1991,7 +1991,7 @@ previewing themes in real time.")
> ("js-strftime" ,js-strftime)
> ("js-highlight" ,js-highlight)))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("node-uglify-js" ,node-uglify-js)
> ("gfortran" ,gfortran)
> ("js-bootstrap-accessibility"
> ,(origin
> @@ -2058,7 +2058,7 @@ responsive, and powerful applications with minimal effort.")
> (for-each (lambda (source target)
> (format #t "Processing ~a --> ~a~%"
> source target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> @@ -2073,7 +2073,7 @@ responsive, and powerful applications with minimal effort.")
> (inputs
> `(("js-requirejs" ,js-requirejs)))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("node-uglify-js" ,node-uglify-js)
> ("js-jquery"
> ,(origin
> (method url-fetch)
> @@ -2111,7 +2111,7 @@ supports interactive trees, to enable rich, editable trees in Shiny.")
> (lambda _
> (with-directory-excursion "inst/AdminLTE"
> (delete-file "app.min.js")
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" "app.js")))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" "app.js")))
> (call-with-output-file "app.min.js"
> (lambda (port)
> (dump-port minified port))))))))))
> @@ -2120,7 +2120,7 @@ supports interactive trees, to enable rich, editable trees in Shiny.")
> ("r-promises" ,r-promises)
> ("r-shiny" ,r-shiny)))
> (native-inputs
> - `(("uglify-js" ,uglify-js)))
> + `(("node-uglify-js" ,node-uglify-js)))
> (home-page "https://rstudio.github.io/shinydashboard/")
> (synopsis "Create dashboards with shiny")
> (description "This package provides an extension to the Shiny web
> @@ -14849,7 +14849,7 @@ to easily call your own custom JavaScript functions from R.")
> (format #t "Processing ~a --> ~a~%"
> source target)
> (delete-file target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> @@ -14865,7 +14865,7 @@ to easily call your own custom JavaScript functions from R.")
> ("r-shinyjs" ,r-shinyjs)))
> (native-inputs
> `(("r-knitr" ,r-knitr)
> - ("uglify-js" ,uglify-js)
> + ("node-uglify-js" ,node-uglify-js)
> ("js-jquery"
> ,(origin
> (method url-fetch)
> @@ -17276,7 +17276,7 @@ and Learning to Rank measures (LambdaMart).")
> (format #t "Processing ~a --> ~a~%"
> source target)
> (delete-file target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> @@ -17288,7 +17288,7 @@ and Learning to Rank measures (LambdaMart).")
> ("r-htmlwidgets" ,r-htmlwidgets)
> ("r-igraph" ,r-igraph)))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("node-uglify-js" ,node-uglify-js)
> ("js-jquery"
> ,(origin
> (method url-fetch)
> @@ -17523,7 +17523,7 @@ etc.). Text boxes with automatic word wrap are also supported.")
> (for-each (lambda (source target)
> (format #t "Processing ~a --> ~a~%"
> source target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> @@ -17537,7 +17537,7 @@ etc.). Text boxes with automatic word wrap are also supported.")
> ("r-rmarkdown" ,r-rmarkdown)
> ("r-shiny" ,r-shiny)))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("node-uglify-js" ,node-uglify-js)
> ("js-raphael"
> ,(origin
> (method url-fetch)
> @@ -19380,14 +19380,14 @@ tools for help in data interpretation.")
> (for-each (lambda (source target)
> (format #t "Processing ~a --> ~a~%"
> source target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> sources targets))))
> #t)))))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("node-uglify-js" ,node-uglify-js)
> ;; NOTE: Make sure that this version of d3 is still valid when
> ;; upgrading the package.
> ("d3.v4.js"
> @@ -19645,14 +19645,14 @@ cell free DNA} (cfDNA).")
> (for-each (lambda (source target)
> (format #t "Processing ~a --> ~a~%"
> source target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> sources targets))))
> #t)))))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("node-uglify-js" ,node-uglify-js)
> ("intro.js"
> ,(origin
> (method url-fetch)
> @@ -23716,14 +23716,14 @@ documents, Shiny applications, Plumber APIs, plots, and static web content.")
> (for-each (lambda (source target)
> (format #t "Processing ~a --> ~a~%"
> source target)
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
> (call-with-output-file target
> (lambda (port)
> (dump-port minified port)))))
> sources targets))))
> #t)))))
> (native-inputs
> - `(("uglify-js" ,uglify-js)
> + `(("uglify-js" ,node-uglify-js)
> ;; They actually use version 1.11.1, but this more recent version
> ;; should be just fine.
> ("js-jquery"
> diff --git a/gnu/packages/javascript.scm b/gnu/packages/javascript.scm
> index a935d321c5..2dc1c330a2 100644
> --- a/gnu/packages/javascript.scm
> +++ b/gnu/packages/javascript.scm
> @@ -26,7 +26,7 @@
> #:use-module (gnu packages)
> #:use-module (gnu packages base)
> #:use-module (gnu packages compression)
> - #:use-module (gnu packages lisp-xyz)
> + #:use-module (gnu packages node-xyz)
> #:use-module (gnu packages readline)
> #:use-module (gnu packages web)
> #:use-module (guix packages)
> @@ -163,7 +163,7 @@ context menu in TypeScript.")
> (cond
> ((string-match "\\.js$" file)
> (mkdir-p (dirname installed))
> - (let ((minified (open-pipe* OPEN_READ "uglify-js" file)))
> + (let ((minified (open-pipe* OPEN_READ "uglifyjs" file)))
> (call-with-output-file installed
> (lambda (port)
> (dump-port minified port)))
> @@ -179,7 +179,7 @@ context menu in TypeScript.")
> (native-inputs
> `(("font-mathjax" ,font-mathjax)
> ("glibc-utf8-locales" ,glibc-utf8-locales)
> - ("uglify-js" ,uglify-js)
> + ("node-uglify-js" ,node-uglify-js)
> ,@(package-native-inputs font-mathjax)))
> (synopsis "JavaScript display engine for LaTeX, MathML, and AsciiMath")
> (description "MathJax is a JavaScript display engine for LaTeX, MathML,
> diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
> index a4a5d6f543..3c891162ee 100644
> --- a/gnu/packages/lisp-xyz.scm
> +++ b/gnu/packages/lisp-xyz.scm
> @@ -1276,58 +1276,6 @@ compressor. It works on data produced by @code{parse-js} to generate a
> (define-public ecl-cl-uglify-js
> (sbcl-package->ecl-package sbcl-cl-uglify-js))
>
It would be better to keep this and deprecate it, then people will have
a warning that it's changed.
(define-public uglify-js
(deprecated-package "uglify-js" node-uglify-js))
> -(define-public uglify-js
> - (package
> - (inherit sbcl-cl-uglify-js)
> - (name "uglify-js")
> - (build-system trivial-build-system)
> - (arguments
> - `(#:modules ((guix build utils))
> - #:builder
> - (let* ((bin (string-append (assoc-ref %outputs "out") "/bin/"))
> - (script (string-append bin "uglify-js")))
> - (use-modules (guix build utils))
> - (mkdir-p bin)
> - (with-output-to-file script
> - (lambda _
> - (format #t "#!~a/bin/sbcl --script
> -
> - (require :asdf)
> - (asdf:initialize-source-registry
> - #p\"~a/etc/common-lisp/source-registry.conf.d/\")
> - (asdf:initialize-output-translations
> - #p\"~a/etc/common-lisp/asdf-output-translations.conf.d/\")"
> - (assoc-ref %build-inputs "sbcl")
> - (assoc-ref %build-inputs "sbcl-cl-uglify-js")
> - (assoc-ref %build-inputs "sbcl-cl-uglify-js"))
> - ;; FIXME: cannot use progn here because otherwise it fails to
> - ;; find cl-uglify-js.
> - (for-each
> - write
> - '(;; Quiet, please!
> - (let ((*standard-output* (make-broadcast-stream))
> - (*error-output* (make-broadcast-stream)))
> - (asdf:load-system :cl-uglify-js))
> - (let ((file (cadr *posix-argv*)))
> - (if file
> - (format t "~a"
> - (cl-uglify-js:ast-gen-code
> - (cl-uglify-js:ast-mangle
> - (cl-uglify-js:ast-squeeze
> - (with-open-file (in file)
> - (parse-js:parse-js in))))
> - :beautify nil))
> - (progn
> - (format *error-output*
> - "Please provide a JavaScript file.~%")
> - (sb-ext:exit :code 1))))))))
> - (chmod script #o755)
> - #t)))
> - (inputs
> - `(("sbcl" ,sbcl)
> - ("sbcl-cl-uglify-js" ,sbcl-cl-uglify-js)))
> - (synopsis "JavaScript compressor")))
> -
> (define-public sbcl-cl-strings
> (let ((revision "1")
> (commit "c5c5cbafbf3e6181d03c354d66e41a4f063f00ae"))
> diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
> index 7818b44d9e..3661fdb0c4 100644
> --- a/gnu/packages/node-xyz.scm
> +++ b/gnu/packages/node-xyz.scm
> @@ -357,3 +357,27 @@ if desired.")
> (description "Acornjs is a Javascrip parser with many options and an
> architecture supporting plugins.")
> (license license:expat)))
> +
> +(define-public node-uglify-js
> + (package
> + (name "node-uglify-js")
> + (version "3.13.9")
> + (source
> + (origin
> + (method url-fetch)
> + (uri (string-append
> + "https://github.com/mishoo/UglifyJS/archive/refs/tags/v"
> + version ".tar.gz"))
This one also should be downloaded using git-fetch.
> + (sha256
> + (base32 "0dpgkqwyrkqlvixwl841375s134slnj3h0viff1cpxq81mxqph09"))))
> + (build-system node-build-system)
> + (inputs
> + `(("semver" ,node-semver)
> + ("acorn" ,node-acorn)))
> + (home-page "https://lisperator.net/uglifyjs/")
> + (synopsis "JavaScript parser / mangler / compressor / beautifier toolkit")
Make sure you have two spaces between each sentence.
> + (description "UglifyJS is a JavaScript compressor/minifier written in
> +JavaScript. It also contains tools that allow one to automate working with
> +JavaScript code: parser, code generator, compressor, mangler, scope analyzer,
> +tree walker, and tree transformer.")
> + (license license:bsd-2)))
> diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
> index 412308b417..6d39103b5b 100644
> --- a/gnu/packages/web.scm
> +++ b/gnu/packages/web.scm
> @@ -138,7 +138,7 @@
> #:use-module (gnu packages libunistring)
> #:use-module (gnu packages libunwind)
> #:use-module (gnu packages linux)
> - #:use-module (gnu packages lisp-xyz)
> + #:use-module (gnu packages node-xyz)
> #:use-module (gnu packages lsof)
> #:use-module (gnu packages lua)
> #:use-module (gnu packages mail)
> @@ -7759,7 +7759,7 @@ compressed JSON header blocks.
> (native-inputs
> `(("autoconf" ,autoconf)
> ("automake" ,automake)
> - ("uglify-js" ,uglify-js)
> + ("node-uglify-js" ,node-uglify-js)
> ("pkg-config" ,pkg-config)))
> (inputs
> `(("guile" ,@(assoc-ref (package-native-inputs guix) "guile"))
> diff --git a/guix/build-system/minify.scm b/guix/build-system/minify.scm
> index 28a6781c06..add6b9f080 100644
> --- a/guix/build-system/minify.scm
> +++ b/guix/build-system/minify.scm
> @@ -44,8 +44,8 @@
> (define (default-uglify-js)
> "Return the default package to minify JavaScript source files."
> ;; Lazily resolve the binding to avoid a circular dependency.
> - (let ((mod (resolve-interface '(gnu packages lisp-xyz))))
> - (module-ref mod 'uglify-js)))
> + (let ((mod (resolve-interface '(gnu packages node-xyz))))
> + (module-ref mod 'node-uglify-js)))
>
> (define* (lower name
> #:key source inputs native-inputs outputs system
> diff --git a/guix/build/minify-build-system.scm b/guix/build/minify-build-system.scm
> index 92158a033f..c5a876726f 100644
> --- a/guix/build/minify-build-system.scm
> +++ b/guix/build/minify-build-system.scm
> @@ -39,7 +39,7 @@
> (format #t "minifying ~a\n" file)
> (let* ((base (basename file ".js"))
> (installed (or target (string-append directory base ".min.js")))
> - (minified (open-pipe* OPEN_READ "uglify-js" file)))
> + (minified (open-pipe* OPEN_READ "uglifyjs" file)))
> (call-with-output-file installed
> (cut dump-port minified <>))
> #t))
> --
> 2.32.0
>
--
Efraim Flashner <efraim@flashner.co.il> אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2021-07-12 12:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-27 16:01 [bug#49242] Update UglifyJs (& dependencies) and update dependents Charles via Guix-patches via
[not found] ` <handler.49242.B.162480970015651.ack@debbugs.gnu.org>
2021-07-05 1:50 ` [bug#49242] Acknowledgement (Update UglifyJs (& dependencies) and update dependents) Charles via Guix-patches via
2021-07-12 2:49 ` Charles via Guix-patches via
2021-07-12 7:24 ` Pierre Neidhardt
2021-07-12 12:52 ` [bug#49242] Update UglifyJs (& dependencies) and update dependents Efraim Flashner
2021-07-12 12:52 ` Efraim Flashner [this message]
2021-07-13 5:36 ` Charles via Guix-patches via
2021-07-15 3:38 ` Charles via Guix-patches via
2021-07-19 12:35 ` bug#49242: " Efraim Flashner
2021-07-19 12:34 ` [bug#49242] " Efraim Flashner
2021-07-19 12:34 ` Efraim Flashner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YOw7A4sfSo5c7JEI@3900XT \
--to=efraim@flashner.co.il \
--cc=49242@debbugs.gnu.org \
--cc=charles.b.jackson@protonmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).