GNU bug report logs - #54796
[PATCH v3 00/22] Add importer for hex.pm and rebar3 build-system for Erlang

Previous Next

Package: guix-patches;

Reported by: Hartmut Goebel <h.goebel <at> crazy-compilers.com>

Date: Fri, 8 Apr 2022 17:03:01 UTC

Severity: normal

Tags: patch

Done: Hartmut Goebel <h.goebel <at> crazy-compilers.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 54796 in the body.
You can then email your comments to 54796 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:03:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Hartmut Goebel <h.goebel <at> crazy-compilers.com>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Fri, 08 Apr 2022 17:03:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: guix-patches <at> gnu.org
Subject: [PATCH v3 00/22] Add importer for hex.pm and rebar3 build-system for
 Erlang
Date: Fri,  8 Apr 2022 19:01:55 +0200
Hi,

this is an updated version of #42180 and #51061 (both are closed
already). Notable changes are:

* the „extracting downloader“ and „hexpm-fetch” are gone

* documentation added for both the importer and the rebar3-build-system

* tests added for the importer

Some remarks on the patches:

* First patch adds a file guix/hexpm-download.scm, containing
  definitions for the hex.pm repository. These are combined in
  this module here since different build-systems (will) use it.

* The importer tries to detect the build system to be used. For Elexir
  packages it creates package definitions using the “mix-build-system‘. This I
  will add later (WIP).

* Next there patches provide the packages required rebar3, rebar3 itself and
  some plugins for rebar3.

Open question:

* Shall the build system actually be called „rebar*3*“ or just „rebar“? There
  is also a build-tool „rebar2“, which is obsoltete and not supported by this
  build-system. Anyhow, somewhen in the future there might be some „rebar4“,
  which we might be able to cover with the same build-system. WDYT?


Hartmut Goebel (22):
  import: Add hex.pm importer.
  gnu: Add erlang-cf.
  gnu: Add erlang-certifi.
  gnu: Add erlang-erlware-commons.
  gnu: Add erlang-cth-readable.
  gnu: Add erlang-bbmustache.
  gnu: Add erlang-getopt.
  gnu: Add erlang-eunit-formatters.
  gnu: Add erlang-providers.
  gnu: Add erlang-parse-trans.
  gnu: Add erlang-hex-core.
  gnu: Add erlang-ssl-verify-fun.
  gnu: Add erlang-relx.
  gnu: Add erlang-edown.
  gnu: Add erlang-jsone.
  gnu: Add erlang-proper.
  gnu: Add erlang-covertool.
  gnu: Add rebar3.
  gnu: Add rebar3-raw-deps.
  gnu: Add rebar3-git-vsn.
  gnu: Add rebar3-proper.
  build-system: Add 'rebar3-build-system'.

 Makefile.am                        |   6 +
 doc/guix.texi                      |  70 ++++-
 gnu/packages/erlang.scm            | 488 +++++++++++++++++++++++++++++
 guix/build-system/rebar3.scm       | 143 +++++++++
 guix/build/rebar3-build-system.scm | 147 +++++++++
 guix/hexpm-download.scm            |  40 +++
 guix/import/hexpm.scm              | 347 ++++++++++++++++++++
 guix/scripts/import.scm            |   2 +-
 guix/scripts/import/hexpm.scm      | 109 +++++++
 po/guix/POTFILES.in                |   1 +
 tests/hexpm.scm                    | 257 +++++++++++++++
 11 files changed, 1608 insertions(+), 2 deletions(-)
 create mode 100644 guix/build-system/rebar3.scm
 create mode 100644 guix/build/rebar3-build-system.scm
 create mode 100644 guix/hexpm-download.scm
 create mode 100644 guix/import/hexpm.scm
 create mode 100644 guix/scripts/import/hexpm.scm
 create mode 100644 tests/hexpm.scm

-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:02 GMT) Full text and rfc822 format available.

Message #8 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 01/22] import: Add hex.pm importer.
Date: Fri,  8 Apr 2022 19:03:34 +0200
hex.pm is a package repository for Erlang and Elixir.

* doc/guix.texi (Invoking guix import): Document it.
* guix/scripts/import/hexpm.scm, guix/import/hexpm.scm,
  guix/hexpm-download.scm: New files.
* tests/hexpm.scm: New file.
* Makefile.am (MODULES, SCM_TESTS): Register them.
* po/guix/POTFILES.in: Likewise.
* guix/scripts/import.scm (importers): Add "hexpm".
---
 Makefile.am                   |   4 +
 doc/guix.texi                 |  29 ++-
 guix/hexpm-download.scm       |  40 ++++
 guix/import/hexpm.scm         | 347 ++++++++++++++++++++++++++++++++++
 guix/scripts/import.scm       |   2 +-
 guix/scripts/import/hexpm.scm | 109 +++++++++++
 po/guix/POTFILES.in           |   1 +
 tests/hexpm.scm               | 257 +++++++++++++++++++++++++
 8 files changed, 787 insertions(+), 2 deletions(-)
 create mode 100644 guix/hexpm-download.scm
 create mode 100644 guix/import/hexpm.scm
 create mode 100644 guix/scripts/import/hexpm.scm
 create mode 100644 tests/hexpm.scm

diff --git a/Makefile.am b/Makefile.am
index aedb514ee1..be2c183206 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -100,6 +100,7 @@ MODULES =					\
   guix/git-download.scm				\
   guix/hg-download.scm				\
   guix/hash.scm					\
+  guix/hexpm-download.scm			\
   guix/swh.scm					\
   guix/monads.scm				\
   guix/monad-repl.scm				\
@@ -263,6 +264,7 @@ MODULES =					\
   guix/import/gnu.scm				\
   guix/import/go.scm				\
   guix/import/hackage.scm			\
+  guix/import/hexpm.scm				\
   guix/import/json.scm				\
   guix/import/kde.scm				\
   guix/import/launchpad.scm   			\
@@ -311,6 +313,7 @@ MODULES =					\
   guix/scripts/import/gnu.scm			\
   guix/scripts/import/go.scm			\
   guix/scripts/import/hackage.scm		\
+  guix/scripts/import/hexpm.scm			\
   guix/scripts/import/json.scm  		\
   guix/scripts/import/minetest.scm  		\
   guix/scripts/import/opam.scm			\
@@ -488,6 +491,7 @@ SCM_TESTS =					\
   tests/graph.scm				\
   tests/gremlin.scm				\
   tests/hackage.scm				\
+  tests/hexpm.scm				\
   tests/home-import.scm				\
   tests/http-client.scm				\
   tests/import-git.scm				\
diff --git a/doc/guix.texi b/doc/guix.texi
index e8ef4286be..6c17b26d70 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -48,7 +48,7 @@ Copyright @copyright{} 2017 Thomas Danckaert@*
 Copyright @copyright{} 2017 humanitiesNerd@*
 Copyright @copyright{} 2017, 2021 Christine Lemmer-Webber@*
 Copyright @copyright{} 2017, 2018, 2019, 2020, 2021, 2022 Marius Bakke@*
-Copyright @copyright{} 2017, 2019, 2020 Hartmut Goebel@*
+Copyright @copyright{} 2017, 2019, 2020, 2022 Hartmut Goebel@*
 Copyright @copyright{} 2017, 2019, 2020, 2021 Maxim Cournoyer@*
 Copyright @copyright{} 2017–2022 Tobias Geerinckx-Rice@*
 Copyright @copyright{} 2017 George Clemmer@*
@@ -12817,6 +12817,33 @@ guix import egg arrays@@1.0
 @end example
 
 Additional options include:
+@table @code
+@item --recursive
+@itemx -r
+Traverse the dependency graph of the given upstream package recursively
+and generate package expressions for all those packages that are not yet
+in Guix.
+@end table
+
+@item hexpm
+@cindex hexpm
+Import metadata from the hex.pm Erlang and Elixir package repository
+@uref{https://hex.pm, hex.pm}, as in this example:
+
+@example
+guix import hexpm stun
+@end example
+
+The importer tries to determine the build system used by the package.
+
+The hexpm importer also allows you to specify a version string:
+
+@example
+guix import hexpm cf@@0.3.0
+@end example
+
+Additional options include:
+
 @table @code
 @item --recursive
 @itemx -r
diff --git a/guix/hexpm-download.scm b/guix/hexpm-download.scm
new file mode 100644
index 0000000000..e2f0eb22a8
--- /dev/null
+++ b/guix/hexpm-download.scm
@@ -0,0 +1,40 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix hexpm-download)
+  #:use-module (srfi srfi-26)
+  #:export (hexpm-package-url
+            hexpm-uri))
+
+;;;
+;;; Definitions for the hex.pm repository,
+;;; combined here since different build-systems use it.
+;;;
+
+;; URL and paths from
+;; https://github.com/hexpm/specifications/blob/master/endpoints.md
+(define %hexpm-repo-url
+  (make-parameter "https://repo.hex.pm"))
+
+(define hexpm-package-url
+  (string-append (%hexpm-repo-url) "/tarballs/"))
+
+(define (hexpm-uri name version)
+  "Return a URI string for the package hosted at hex.pm corresponding to NAME
+and VERSION."
+  (string-append hexpm-package-url name "-" version ".tar"))
diff --git a/guix/import/hexpm.scm b/guix/import/hexpm.scm
new file mode 100644
index 0000000000..bf7cfb333f
--- /dev/null
+++ b/guix/import/hexpm.scm
@@ -0,0 +1,347 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Cyril Roelandt <tipecaml <at> gmail.com>
+;;; Copyright © 2016 David Craven <david <at> craven.ch>
+;;; Copyright © 2017, 2019-2021 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2019 Martin Becze <mjbecze <at> riseup.net>
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer <at> gmail.com>
+;;; Copyright © 2020-2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix import hexpm)
+  #:use-module (guix base32)
+  #:use-module ((guix download) #:prefix download:)
+  #:use-module (guix hexpm-download)
+  #:use-module (gcrypt hash)
+  #:use-module (guix http-client)
+  #:use-module (json)
+  #:use-module (guix import utils)
+  #:use-module ((guix import json) #:select (json-fetch))
+  #:use-module ((guix build utils)
+                #:select ((package-name->name+version
+                           . hyphen-package-name->name+version)
+                          dump-port))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix monads)
+  #:use-module (guix packages)
+  #:use-module (guix upstream)
+  #:use-module (guix utils)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 regex)
+  #:use-module (ice-9 popen)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-2)
+  #:use-module (srfi srfi-26)
+  #:export (hexpm->guix-package
+            guix-package->hexpm-name
+            strings->licenses   ;;  why used here?
+            hexpm-recursive-import
+            %hexpm-updater))
+
+;;;
+;;; Interface to https://hex.pm/api, version 2.
+;;; REST-API end-points:
+;;;   https://github.com/hexpm/specifications/blob/master/apiary.apib
+;;; Repository end-points:
+;;;   https://github.com/hexpm/specifications/blob/master/endpoints.md
+;;;
+
+(define %hexpm-api-url
+  (make-parameter "https://hex.pm/api"))
+
+(define (package-url name)
+  (string-append (%hexpm-api-url) "/packages/" name))
+
+;;
+;; Hexpm Package. /packages/${name}
+;; https://github.com/hexpm/specifications/blob/master/apiary.apib#Package
+;;
+;; Each package can have several "releases", each of which has its own set of
+;; requirements, build-tool, etc. - see <hexpm-release> below.
+(define-json-mapping <hexpm-pkgdef> make-hexpm-pkgdef hexpm-pkgdef?
+  json->hexpm
+  (name          hexpm-name)                          ; string
+  (html-url      hexpm-html-url      "html_url")      ; string
+  (docs-html-url hexpm-docs-html-url "docs_html_url") ; string | #nil
+  (meta          hexpm-meta "meta" json->hexpm-meta)
+  (versions      hexpm-versions "releases" ; list of <hexpm-version>
+                 (lambda (vector)
+                   (map json->hexpm-version
+                        (vector->list vector))))
+  ;; "latest_version" and "latest_stable_version" are not named in the
+  ;; specification, butt seen in practice.
+  (latest-version hexpm-latest-version "latest_version") ; string
+  (latest-stable  hexpm-latest-stable "latest_stable_version")) ; string
+
+;; Hexpm package metadata.
+(define-json-mapping <hexpm-meta> make-hexpm-meta hexpm-meta?
+  json->hexpm-meta
+  (description hexpm-meta-description)        ;string
+  (licenses    hexpm-meta-licenses "licenses" ;list of strings
+               (lambda (vector)
+                 (or (and vector (vector->list vector))
+                     #f))))
+
+;; Hexpm package versions.
+(define-json-mapping <hexpm-version> make-hexpm-version hexpm-version?
+  json->hexpm-version
+  (number  hexpm-version-number "version")   ;string
+  (url     hexpm-version-url))               ;string
+
+
+(define (lookup-hexpm name)
+  "Look up NAME on hex.pm and return the corresopnding <hexpm> record
+or #f if it was not found."
+  (and=> (json-fetch (package-url name))
+         json->hexpm))
+
+;;
+;; Hexpm release. /packages/${name}/releases/${version}
+;; https://github.com/hexpm/specifications/blob/master/apiary.apib#Release
+;;
+(define-json-mapping <hexpm-release> make-hexpm-release hexpm-release?
+  json->hexpm-release
+  (version hexpm-release-version)  ; string
+  (url     hexpm-release-url)      ; string
+  (meta    hexpm-release-meta "meta" json->hexpm-release-meta)
+  ;; Specification names the next fiels "dependencies", but in practice it is
+  ;; "requirements".
+  (dependencies hexpm-requirements "requirements")) ; list of <hexpm-dependency>
+
+;; Hexpm release meta.
+;; https://github.com/hexpm/specifications/blob/main/package_metadata.md
+(define-json-mapping <hexpm-release-meta>
+  make-hexpm-release-meta hexpm-release-meta?
+  json->hexpm-release-meta
+  (app         hexpm-release-meta-app)        ; string
+  (elixir      hexpm-release-meta-elixir)     ; string
+  (build-tools hexpm-release-meta-build-tools "build_tools" ; list of strings
+               (lambda (vector)
+                 (or (and vector (vector->list vector))
+                     (list)))))
+
+;; Hexpm dependency.  Each requirement has information about the required
+;; version, such as "~> 2.1.2" or ">= 2.1.2 and < 2.2.0", see
+;; <https://hexdocs.pm/elixir/Version.html#module-requirements>, and whether
+;; the dependency is optional.
+(define-json-mapping <hexpm-dependency> make-hexpm-dependency
+  hexpm-dependency?
+  json->hexpm-dependency
+  (name        hexpm-dependency-name "app")   ; string
+  (requirement hexpm-dependency-requirement)  ; string
+  (optional    hexpm-dependency-optional))    ; bool
+
+(define (hexpm-release-dependencies release)
+  "Return the list of dependency names of RELEASE, a <hexpm-release>."
+  (let ((reqs (or (hexpm-requirements release) '#())))
+    (map first reqs)))  ;; TODO: also return required version
+
+
+(define (lookup-hexpm-release version*)
+  "Look up RELEASE on hexpm-version-url and return the corresopnding
+<hexpm-release> record or #f if it was not found."
+  (and=> (json-fetch (hexpm-version-url version*))
+         json->hexpm-release))
+
+
+;;;
+;;; Converting hex.pm packages to Guix packages.
+;;;
+
+(define (maybe-inputs package-inputs input-type)
+  "Given a list of PACKAGE-INPUTS, tries to generate the 'inputs' field of a
+package definition.  INPUT-TYPE, a symbol, is used to populate the name of
+the input field."
+  (match package-inputs
+    (()
+     '())
+    ((package-inputs ...)
+     `((,input-type (list ,@package-inputs))))))
+
+(define (dependencies->package-names names)
+  "Given a list of hexpm package NAMES, returns a list of guix package names
+as symbols."
+  ;; TODO: Base name on languange of dependency.
+  ;; The languange used for implementing the depcendency is not know without
+  ;; recursing the dependencies.  So for now assume more packages are based on
+  ;; Erlang and prefix all dependencies with "erlang-" (the default).
+  (map string->symbol
+       (map hexpm-name->package-name
+            (sort names string-ci<?))))
+
+(define* (make-hexpm-sexp #:key name version tarball-url
+                          home-page synopsis description license
+                          language build-system dependencies
+                          #:allow-other-keys)
+  "Return the `package' s-expression for a hexpm package with the given NAME,
+VERSION, TARBALL-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE. The
+created package's name will stem from LANGUAGE. BUILD-SYSTEM defined the
+build-system, and DEPENDENCIES the inputs for the package."
+  (call-with-temporary-output-file
+   (lambda (temp port)
+     (and (url-fetch tarball-url temp)
+          (values
+       `(package
+         (name ,(hexpm-name->package-name name language))
+         (version ,version)
+         (source (origin
+                   (method url-fetch)
+                   (uri (hexpm-uri ,name version))
+                   (sha256 (base32 ,(guix-hash-url temp)))))
+         (build-system ,build-system)
+         ,@(maybe-inputs (dependencies->package-names dependencies) 'inputs)
+         (synopsis ,synopsis)
+         (description ,(beautify-description description))
+         (home-page ,(match home-page
+                            (() "")
+                            (_ home-page)))
+         (license ,(match license
+                          (() #f)
+                          ((license) license)
+                          (_ `(list ,@license))))))))))
+
+(define (strings->licenses strings)
+  "Convert the list of STRINGS into a list of license objects."
+  (filter-map (lambda (license)
+                (and (not (string-null? license))
+                     (not (any (lambda (elem) (string=? elem license))
+                               '("AND" "OR" "WITH")))
+                     (or (spdx-string->license license)
+                         license)))
+              strings))
+
+(define (hexpm-latest-release package)
+  "Return the version string for the latest stable release of PACKAGE."
+  ;; Use latest-stable if specified (see comment in hexpm-pkgdef above),
+  ;; otherwise compare the lists of release versions.
+  (let ((latest-stable (hexpm-latest-stable package)))
+    (if (not (unspecified? latest-stable))
+        latest-stable
+        (let ((versions (map hexpm-version-number (hexpm-versions package))))
+          (fold (lambda (a b)
+                  (if (version>? a b) a b)) (car versions) versions)))))
+
+(define* (hexpm->guix-package package-name #:key repo version)
+  "Fetch the metadata for PACKAGE-NAME from hexpms.io, and return the
+`package' s-expression corresponding to that package, or #f on failure.
+When VERSION is specified, attempt to fetch that version; otherwise fetch the
+latest version of PACKAGE-NAME."
+
+  (define package
+    (lookup-hexpm package-name))
+
+  (define version-number
+    (and package
+         (or version
+             (hexpm-latest-release package))))
+
+  (define version*
+    (and package
+         (find (lambda (version)
+                 (string=? (hexpm-version-number version)
+                           version-number))
+               (hexpm-versions package))))
+
+  (define release
+    (and package version*
+         (lookup-hexpm-release version*)))
+
+  (define release-meta
+    (and package version*
+         (hexpm-release-meta release)))
+
+  (define build-system
+    (and package version*
+         (let ((build-tools (hexpm-release-meta-build-tools release-meta)))
+           (cond
+            ((member "rebar3" build-tools) 'rebar3-build-system)
+            ((member "mix" build-tools) 'mix-build-system)
+            ((member "make" build-tools) 'gnu-build-system)
+            (else #f)))))
+
+  (define language
+    (and package version*
+         (let ((elixir (hexpm-release-meta-elixir release-meta)))
+           (cond
+            ((and (string? elixir) (not (string-null? elixir))) "elixir")
+            (else "erlang")))))
+
+  (and package version*
+       (let ((dependencies  (hexpm-release-dependencies release))
+             (pkg-meta      (hexpm-meta package))
+             (docs-html-url (hexpm-docs-html-url package)))
+         (values
+          (make-hexpm-sexp
+           #:language language
+           #:build-system build-system
+           #:name package-name
+           #:version version-number
+           #:dependencies dependencies
+           #:home-page (or (and (not (eq? docs-html-url 'null))
+                                docs-html-url)
+                           ;; TODO: Homepage?
+                           (hexpm-html-url package))
+           #:synopsis (hexpm-meta-description pkg-meta)
+           #:description (hexpm-meta-description pkg-meta)
+           #:license (or (and=> (hexpm-meta-licenses pkg-meta)
+                                strings->licenses))
+           #:tarball-url (hexpm-uri package-name version-number))
+          dependencies))))
+
+(define* (hexpm-recursive-import pkg-name #:optional version)
+  (recursive-import pkg-name
+                    #:version version
+                    #:repo->guix-package hexpm->guix-package
+                    #:guix-name hexpm-name->package-name))
+
+(define (guix-package->hexpm-name package)
+  "Return the hex.pm name of PACKAGE."
+  (define (url->hexpm-name url)
+    (hyphen-package-name->name+version
+     (basename (file-sans-extension url))))
+
+  (match (and=> (package-source package) origin-uri)
+    ((? string? url)
+     (url->hexpm-name url))
+    ((lst ...)
+     (any url->hexpm-name lst))
+    (#f #f)))
+
+(define* (hexpm-name->package-name name #:optional (language "erlang"))
+  (string-append language "-" (string-join (string-split name #\_) "-")))
+
+
+;;;
+;;; Updater
+;;;
+
+(define (latest-release package)
+  "Return an <upstream-source> for the latest release of PACKAGE."
+  (let* ((hexpm-name (guix-package->hexpm-name package))
+         (hexpm      (lookup-hexpm hexpm-name))
+         (version    (hexpm-latest-release hexpm))
+         (url        (hexpm-uri hexpm-name version)))
+    (upstream-source
+     (package (package-name package))
+     (version version)
+     (urls (list url)))))
+
+(define %hexpm-updater
+  (upstream-updater
+   (name 'hexpm)
+   (description "Updater for hex.pm packages")
+   (pred (url-prefix-predicate hexpm-package-url))
+   (latest latest-release)))
diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm
index 40fa6759ae..aaadad4adf 100644
--- a/guix/scripts/import.scm
+++ b/guix/scripts/import.scm
@@ -79,7 +79,7 @@ rather than \\n."
 ;;;
 
 (define importers '("gnu" "pypi" "cpan" "hackage" "stackage" "egg" "elpa"
-                    "gem" "go" "cran" "crate" "texlive" "json" "opam"
+                    "gem" "go" "cran" "crate" "texlive" "json" "opam" "hexpm"
                     "minetest"))
 
 (define (resolve-importer name)
diff --git a/guix/scripts/import/hexpm.scm b/guix/scripts/import/hexpm.scm
new file mode 100644
index 0000000000..b49d263f9e
--- /dev/null
+++ b/guix/scripts/import/hexpm.scm
@@ -0,0 +1,109 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014 David Thompson <davet <at> gnu.org>
+;;; Copyright © 2016 David Craven <david <at> craven.ch>
+;;; Copyright © 2019 Martin Becze <mjbecze <at> riseup.net>
+;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix scripts import hexpm)
+  #:use-module (guix ui)
+  #:use-module (guix utils)
+  #:use-module (guix scripts)
+  #:use-module (guix import hexpm)
+  #:use-module (guix scripts import)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-11)
+  #:use-module (srfi srfi-37)
+  #:use-module (srfi srfi-71)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 format)
+  #:export (guix-import-hexpm))
+
+
+;;;
+;;; Command-line options.
+;;;
+
+(define %default-options
+  '())
+
+(define (show-help)
+  (display (G_ "Usage: guix import hexpm PACKAGE-NAME
+Import and convert the hex.pm package for PACKAGE-NAME.\n"))
+  (display (G_ "
+  -h, --help             display this help and exit"))
+  (display (G_ "
+  -V, --version          display version information and exit"))
+  (newline)
+  (display (G_ "
+  -r, --recursive        import packages recursively"))
+  (newline)
+  (show-bug-report-information))
+
+(define %options
+  ;; Specification of the command-line options.
+  (cons* (option '(#\h "help") #f #f
+                 (lambda args
+                   (show-help)
+                   (exit 0)))
+         (option '(#\V "version") #f #f
+                 (lambda args
+                   (show-version-and-exit "guix import hexpm")))
+         (option '(#\r "recursive") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'recursive #t result)))
+         %standard-import-options))
+
+
+;;;
+;;; Entry point.
+;;;
+
+(define (guix-import-hexpm . args)
+  (define (parse-options)
+    ;; Return the alist of option values.
+    (parse-command-line args %options (list %default-options)
+                        #:build-options? #f))
+
+  (let* ((opts (parse-options))
+         (args (filter-map (match-lambda
+                            (('argument . value)
+                             value)
+                            (_ #f))
+                           (reverse opts))))
+    (match args
+      ((spec)
+       (with-error-handling
+         (let ((name version (package-name->name+version spec)))
+           (if (assoc-ref opts 'recursive)
+               ;; Recursive import
+               (map (match-lambda
+                     ((and ('package ('name name) . rest) pkg)
+                      `(define-public ,(string->symbol name)
+                         ,pkg))
+                     (_ #f))
+                    (hexpm-recursive-import name version))
+               ;; Single import
+               (let ((sexp (hexpm->guix-package name #:version version)))
+                 (unless sexp
+                   (leave (G_ "failed to download meta-data for package '~a'~%")
+                          spec))
+                 sexp)))))
+      (()
+       (leave (G_ "too few arguments~%")))
+      ((many ...)
+       (leave (G_ "too many arguments~%"))))))
diff --git a/po/guix/POTFILES.in b/po/guix/POTFILES.in
index 49a8edfef3..ed873fe5d9 100644
--- a/po/guix/POTFILES.in
+++ b/po/guix/POTFILES.in
@@ -134,6 +134,7 @@ guix/scripts/import/gem.scm
 guix/scripts/import/gnu.scm
 guix/scripts/import/go.scm
 guix/scripts/import/hackage.scm
+guix/scripts/import/hexpm.scm
 guix/scripts/import/json.scm
 guix/scripts/import/opam.scm
 guix/scripts/import/pypi.scm
diff --git a/tests/hexpm.scm b/tests/hexpm.scm
new file mode 100644
index 0000000000..84d126c821
--- /dev/null
+++ b/tests/hexpm.scm
@@ -0,0 +1,257 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 David Thompson <davet <at> gnu.org>
+;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
+;;; Copyright © 2018 Oleg Pykhalov <go.wigust <at> gmail.com>
+;;; Copyright © 2021 Sarah Morgensen <iskarian <at> mgsn.dev>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (test-hexpm)
+  #:use-module (guix import hexpm)
+  #:use-module (guix base32)
+  #:use-module (gcrypt hash)
+  #:use-module (guix tests)
+  #:use-module (srfi srfi-64)
+  #:use-module (ice-9 binary-ports)
+  #:use-module (ice-9 match))
+
+(define test-bla-package
+  "{\"name\": \"bla\",
+    \"html_url\": \"https://hex.pm/packages/bla\",
+    \"docs_html_url\": null,
+    \"meta\": {
+        \"description\": \"A cool package\",
+        \"licenses\": [\"MIT\", \"Apache-2.0\"]
+    },
+    \"releases\": [
+        {\"url\": \"https://hex.pm/api/packages/bla/releases/1.5.0\",
+         \"version\": \"1.5.0\"},
+        {\"url\": \"https://hex.pm/api/packages/bla/releases/1.4.7\",
+         \"version\": \"1.4.7\"}
+    ]
+}")
+
+(define test-bla-release
+  "{
+   \"version\": \"1.5.0\",
+   \"url\": \"https://hex.pm/api/packages/bla/releases/1.5.0\",
+   \"requirements\": {
+     \"blubb\":{\"app\": \"blubb\",
+        \"optional\": false,
+        \"requirement\": \"~>0.3\"
+         },
+     \"fasel\":{\"app\": \"fasel\",
+        \"optional\": false,
+        \"requirement\": \"~>1.0\"
+         }
+   },
+   \"meta\":{ \"build_tools\":[\"mix\", \"make\", \"rebar3\"] }
+ }")
+
+(define test-blubb-package
+  "{\"name\": \"blubb\",
+    \"latest_stable_version\": \"0.3.1\",
+    \"latest_version\": \"0.3.1\",
+    \"html_url\": \"https://hex.pm/packages/blubb\",
+    \"docs_html_url\": null,
+    \"meta\": {
+        \"description\": \"Another cool package\",
+        \"licenses\": [\"MIT\"]
+    },
+    \"releases\": [
+        {\"url\": \"https://hex.pm/api/packages/blubb/releases/0.3.1\",
+         \"version\": \"0.3.1\"},
+        {\"url\": \"https://hex.pm/api/packages/blubb/releases/0.3.0\",
+         \"version\": \"0.3.0\"}
+    ]
+}")
+
+(define test-blubb-release
+  "{
+   \"version\": \"0.3.1\",
+   \"url\": \"https://hex.pm/api/packages/blubb/releases/0.3.1\",
+   \"requirements\": {
+     \"fasel\":{\"app\": \"fasel\",
+        \"optional\": false,
+        \"requirement\": \"~>1.0\"
+         }
+   },
+   \"meta\": { \"build_tools\":[\"mix\"] }
+ }")
+
+(define test-fasel-package
+  "{\"name\": \"fasel\",
+    \"latest_stable_version\": \"1.2.1\",
+    \"latest_version\": \"1.2.1\",
+    \"html_url\": \"https://hex.pm/packages/fasel\",
+    \"docs_html_url\": null,
+    \"meta\": {
+        \"description\": \"Yet another cool package\",
+        \"licenses\": [\"GPL\"]
+    },
+    \"releases\": [
+        {\"url\": \"https://hex.pm/api/packages/fasel/releases/1.2.1\",
+         \"version\": \"1.2.1\"}
+    ]
+}")
+
+(define test-fasel-release
+  "{
+   \"version\": \"1.2.1\",
+   \"url\": \"https://hex.pm/api/packages/fasel/releases/1.2.1\",
+   \"requirements\" :{},
+   \"meta\":{ \"build_tools\":[\"make\"] }
+ }")
+
+(test-begin "hexpm")
+
+(test-assert "hexpm->guix-package"
+  ;; Replace network resources with sample data.
+  (mock ((guix http-client) http-fetch
+         (lambda (url . rest)
+           (match url
+             ("https://hex.pm/api/packages/bla"
+              (values (open-input-string test-bla-package)
+                      (string-length test-bla-package)))
+             ("https://hex.pm/api/packages/bla/releases/1.5.0"
+              (values (open-input-string test-bla-release)
+                      (string-length test-bla-release)))
+             (_ (error "http-fetch got unexpected URL: " url)))))
+  (mock ((guix build download) url-fetch
+         (lambda* (url file-name
+                       #:key
+                       (mirrors '()) verify-certificate?)
+           (with-output-to-file file-name
+             (lambda ()
+               (display
+                (match url
+                  ("https://repo.hex.pm/tarballs/bla-1.5.0.tar"
+                   "source")
+                  (_ (error "url-fetch got unexpected URL: " url))))))))
+    (match (hexpm->guix-package "bla")
+      (('package
+         ('name "erlang-bla")
+         ('version "1.5.0")
+         ('source
+          ('origin
+            ('method 'url-fetch)
+            ('uri ('hexpm-uri "bla" 'version))
+            ('sha256
+             ('base32
+              "0zcl4dgcmqwl1g5xb901pd6dz61r1xgmac9mqlwvh022paa6gks1"))))
+         ('build-system 'rebar3-build-system)
+         ('inputs ('list 'erlang-blubb 'erlang-fasel))
+         ('synopsis "A cool package")
+         ('description "This package provides a cool package")
+         ('home-page "https://hex.pm/packages/bla")
+         ('license ('list 'license:expat 'license:asl2.0)))
+       #t)
+      (x
+       (pk 'fail x #f))))))
+
+(test-assert "hexpm-recursive-import"
+  ;; Replace network resources with sample data.
+  (mock ((guix http-client) http-fetch
+         (lambda (url . rest)
+           (match url
+             ("https://hex.pm/api/packages/bla"
+              (values (open-input-string test-bla-package)
+                      (string-length test-bla-package)))
+             ("https://hex.pm/api/packages/bla/releases/1.5.0"
+              (values (open-input-string test-bla-release)
+                      (string-length test-bla-release)))
+             ("https://hex.pm/api/packages/blubb"
+              (values (open-input-string test-blubb-package)
+                      (string-length test-blubb-package)))
+             ("https://hex.pm/api/packages/blubb/releases/0.3.1"
+              (values (open-input-string test-blubb-release)
+                      (string-length test-blubb-release)))
+             ("https://hex.pm/api/packages/fasel"
+              (values (open-input-string test-fasel-package)
+                      (string-length test-fasel-package)))
+             ("https://hex.pm/api/packages/fasel/releases/1.2.1"
+              (values (open-input-string test-fasel-release)
+                      (string-length test-fasel-release)))
+             (_ (error "http-fetch got unexpected URL: " url)))))
+  (mock ((guix build download) url-fetch
+         (lambda* (url file-name
+                       #:key
+                       (mirrors '()) verify-certificate?)
+           (with-output-to-file file-name
+             (lambda ()
+               (display
+                (match url
+                  ("https://repo.hex.pm/tarballs/bla-1.5.0.tar"
+                   "bla-source")
+                  ("https://repo.hex.pm/tarballs/blubb-0.3.1.tar"
+                   "blubb-source")
+                  ("https://repo.hex.pm/tarballs/fasel-1.2.1.tar"
+                   "fasel-source")
+                  (_ (error "url-fetch got unexpected URL: " url))))))))
+        (match (hexpm-recursive-import "bla")
+          ((('package
+              ('name "erlang-blubb")
+              ('version "0.3.1")
+              ('source
+               ('origin
+                 ('method 'url-fetch)
+                 ('uri ('hexpm-uri "blubb" 'version))
+                 ('sha256
+                  ('base32
+                   "17y88b5y8ld7s1c2bcwwwa04pf1cl4402i9zk3inna221ps3ppj2"))))
+              ('build-system 'mix-build-system)
+              ('inputs ('list 'erlang-fasel))
+              ('synopsis "Another cool package")
+              ('description "Another cool package")
+              ('home-page "https://hex.pm/packages/blubb")
+              ('license 'license:expat))
+            ('package
+              ('name "erlang-fasel")
+              ('version "1.2.1")
+              ('source
+               ('origin
+                 ('method 'url-fetch)
+                 ('uri ('hexpm-uri "fasel" 'version))
+                 ('sha256
+                  ('base32
+                   "1k6d70mxwqgq78jrbr7yqnw187yki74jnagybi7nacrj4a67qjha"))))
+              ('build-system 'gnu-build-system)
+              ('synopsis "Yet another cool package")
+              ('description "Yet another cool package")
+              ('home-page "https://hex.pm/packages/fasel")
+              ('license "GPL"))
+            ('package
+              ('name "erlang-bla")
+              ('version "1.5.0")
+              ('source
+               ('origin
+                 ('method 'url-fetch)
+                 ('uri ('hexpm-uri "bla" 'version))
+                 ('sha256
+                  ('base32
+                   "0d3gj746c4swbb1m6ycylxb239jsavvdcizag6bfbg2aqccxwij8"))))
+              ('build-system 'rebar3-build-system)
+              ('inputs ('list 'erlang-blubb 'erlang-fasel))
+              ('synopsis "A cool package")
+              ('description "This package provides a cool package")
+              ('home-page "https://hex.pm/packages/bla")
+              ('license ('list 'license:expat 'license:asl2.0))))
+           #t)
+          (x
+           (pk 'fail x #f))))))
+
+(test-end "hexpm")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:03 GMT) Full text and rfc822 format available.

Message #11 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 02/22] gnu: Add erlang-cf.
Date: Fri,  8 Apr 2022 19:03:35 +0200
* gnu/packages/erlang.scm (erlang-cf): New variable.
---
 gnu/packages/erlang.scm | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 888a0f4f1e..0b9e89d134 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016, 2017 Pjotr Prins <pjotr.guix <at> thebird.nl>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me <at> tobias.gr>
 ;;; Copyright © 2018 Nikita <nikita <at> n0.is>
+;;; Copyright © 2020-2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
 ;;; Copyright © 2021 Oskar Köök <oskar <at> maatriks.ee>
 ;;; Copyright © 2021 Cees de Groot <cg <at> evrl.com>
 ;;;
@@ -26,6 +27,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system emacs)
+  #:use-module (guix build-system rebar3)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix packages)
@@ -203,3 +205,20 @@ built-in support for concurrency, distribution and fault tolerance.")
      "This package provides an Emacs major mode for editing Erlang source
 files.")
     (license license:asl2.0)))
+
+(define-public erlang-cf
+  (package
+    (name "erlang-cf")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "cf" version))
+       (sha256
+        (base32 "0wknz4xkqkhgvlx4vx5619p8m65v7g87lfgsvfy04jrsgm28spii"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/project-fifo/cf")
+    (synopsis "Terminal colour helper for Erlang io and io_lib")
+    (description "This package provides a helper library for termial colour
+printing extending the io:format syntax to add colours.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:03 GMT) Full text and rfc822 format available.

Message #14 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 03/22] gnu: Add erlang-certifi.
Date: Fri,  8 Apr 2022 19:03:36 +0200
* gnu/packages/erlang.scm (erlang-certifi): New variable.
---
 gnu/packages/erlang.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 0b9e89d134..95a18e6f18 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -206,6 +206,30 @@ built-in support for concurrency, distribution and fault tolerance.")
 files.")
     (license license:asl2.0)))
 
+(define-public erlang-certifi
+  (package
+    (name "erlang-certifi")
+    (version "2.9.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "certifi" version))
+       (sha256
+        (base32 "0ha6vmf5p3xlbf5w1msa89frhvfk535rnyfybz9wdmh6vdms8v96"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:tests? #f)) ;; have not been updated for latest cert bundle
+    (home-page "https://github.com/certifi/erlang-certifi/")
+    (synopsis "CA bundle adapted from Mozilla for Erlang")
+    (description "This Erlang library contains a CA bundle that you can
+reference in your Erlang application.  This is useful for systems that do not
+have CA bundles that Erlang can find itself, or where a uniform set of CAs is
+valuable.
+
+This an Erlang specific port of certifi.  The CA bundle is derived from
+Mozilla's canonical set.")
+    (license license:bsd-3)))
+
 (define-public erlang-cf
   (package
     (name "erlang-cf")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:04 GMT) Full text and rfc822 format available.

Message #17 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 04/22] gnu: Add erlang-erlware-commons.
Date: Fri,  8 Apr 2022 19:03:37 +0200
* gnu/packages/erlang.scm (erlang-erlware-commons): New variable.
---
 gnu/packages/erlang.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 95a18e6f18..34761a4d64 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -246,3 +246,30 @@ Mozilla's canonical set.")
     (description "This package provides a helper library for termial colour
 printing extending the io:format syntax to add colours.")
     (license license:expat)))
+
+(define-public erlang-erlware-commons
+  (package
+    (name "erlang-erlware-commons")
+    (version "1.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "erlware_commons" version))
+       (sha256
+        (base32 "18qam9xdzi74wppb0cj4zc8161i0i8djr79z8662m6d276f2jz5m"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-cf))
+    (native-inputs
+     (list git))  ;; Required for tests
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'check-setup
+           (lambda _
+             (setenv "TERM" "xterm")))))) ; enable color in logs
+    (home-page "http://erlware.github.io/erlware_commons/")
+    (synopsis "Additional standard library for Erlang")
+    (description "Erlware Commons is an Erlware project focused on all aspects
+of reusable Erlang components.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:04 GMT) Full text and rfc822 format available.

Message #20 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 05/22] gnu: Add erlang-cth-readable.
Date: Fri,  8 Apr 2022 19:03:38 +0200
* gnu/packages/erlang.scm (erlang-cth-readable): New variable.
---
 gnu/packages/erlang.scm | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 34761a4d64..faf6509a4e 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -247,6 +247,27 @@ Mozilla's canonical set.")
 printing extending the io:format syntax to add colours.")
     (license license:expat)))
 
+(define-public erlang-cth-readable
+  (package
+    (name "erlang-cth-readable")
+    (version "1.5.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "cth_readable" version))
+       (sha256
+        (base32 "104xgybb6iciy6i28pyyrarqzliddi8kjyq43ajaav7y5si42rb8"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-cf))
+    (arguments
+     `(#:tests? #f)) ;; no test-suite in hex-pm package
+    (home-page "https://github.com/ferd/cth_readable")
+    (synopsis "Common Test hooks for more readable logs for Erlang")
+    (description "This package provides an OTP library to be used for CT log
+outputs you want to be readable around all that noise they contain.")
+    (license license:bsd-3)))
+
 (define-public erlang-erlware-commons
   (package
     (name "erlang-erlware-commons")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:04 GMT) Full text and rfc822 format available.

Message #23 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 06/22] gnu: Add erlang-bbmustache.
Date: Fri,  8 Apr 2022 19:03:39 +0200
* gnu/packages/erlang.scm (erlang-bbmustache): New variable.
---
 gnu/packages/erlang.scm | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index faf6509a4e..1682521ca1 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -206,6 +206,38 @@ built-in support for concurrency, distribution and fault tolerance.")
 files.")
     (license license:asl2.0)))
 
+(define-public erlang-bbmustache
+  (package
+    (name "erlang-bbmustache")
+    (version "1.12.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "bbmustache" version))
+       (sha256
+        (base32 "0fvvaxdpziygxl30j59g98qkh2n47xlb7w5dfpsm2bfcsnj372v8"))))
+    (build-system rebar3-build-system)
+    (inputs
+     (list erlang-getopt rebar3-git-vsn
+           erlang-edown))  ; for building the docs
+    (arguments
+     `(#:tests? #f ;; requires mustache specification file
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'build-more
+           (lambda _
+             (invoke "rebar3" "as" "dev" "escriptize")))
+         (add-after 'install 'install-escript
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out")))
+               (install-file "_build/dev/bin/bbmustache"
+                             (string-append out "/bin"))))))))
+    (home-page "https://github.com/soranoba/bbmustache/")
+    (synopsis "Binary pattern match Based Mustache template engine for Erlang")
+    (description "This Erlang library provides a Binary pattern match Based
+Mustache template engine")
+    (license license:expat)))
+
 (define-public erlang-certifi
   (package
     (name "erlang-certifi")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:05 GMT) Full text and rfc822 format available.

Message #26 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 07/22] gnu: Add erlang-getopt.
Date: Fri,  8 Apr 2022 19:03:40 +0200
* gnu/packages/erlang.scm (erlang-getopt): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 1682521ca1..af79e2cd7d 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -326,3 +326,20 @@ outputs you want to be readable around all that noise they contain.")
     (description "Erlware Commons is an Erlware project focused on all aspects
 of reusable Erlang components.")
     (license license:expat)))
+
+(define-public erlang-getopt
+  (package
+    (name "erlang-getopt")
+    (version "1.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "getopt" version))
+       (sha256
+        (base32 "09pasi7ki1rivw9sl7xndj5qgjbdqvcscxk83yk85yr28gm9l0m0"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/jcomellas/getopt")
+    (synopsis "Command-line options parser for Erlang")
+    (description "This package provides an Erlang module to parse command line
+arguments using the GNU getopt syntax.")
+    (license license:bsd-3)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:05 GMT) Full text and rfc822 format available.

Message #29 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 08/22] gnu: Add erlang-eunit-formatters.
Date: Fri,  8 Apr 2022 19:03:41 +0200
* gnu/packages/erlang.scm (erlang-eunit-formatters): New variable.
---
 gnu/packages/erlang.scm | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index af79e2cd7d..154c11f207 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -327,6 +327,22 @@ outputs you want to be readable around all that noise they contain.")
 of reusable Erlang components.")
     (license license:expat)))
 
+(define-public erlang-eunit-formatters
+  (package
+    (name "erlang-eunit-formatters")
+    (version "0.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "eunit_formatters" version))
+       (sha256
+        (base32 "1jb3hzb216r29x2h4pcjwfmx1k81431rgh5v0mp4x5146hhvmj6n"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/seancribbs/eunit_formatters")
+    (synopsis "Better output for eunit suites")
+    (description "This package provides a better output for Erlang eunits.")
+    (license license:asl2.0)))
+
 (define-public erlang-getopt
   (package
     (name "erlang-getopt")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:06 GMT) Full text and rfc822 format available.

Message #32 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 09/22] gnu: Add erlang-providers.
Date: Fri,  8 Apr 2022 19:03:42 +0200
* gnu/packages/erlang.scm (erlang-providers): New variable.
---
 gnu/packages/erlang.scm | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 154c11f207..85e491bb1d 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -359,3 +359,21 @@ of reusable Erlang components.")
     (description "This package provides an Erlang module to parse command line
 arguments using the GNU getopt syntax.")
     (license license:bsd-3)))
+
+(define-public erlang-providers
+  (package
+    (name "erlang-providers")
+    (version "1.9.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "providers" version))
+       (sha256
+        (base32 "05y0kz3xgx77hzn1l05byaisvmk8bgds7c22hrh0a5ba81sfi1yj"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-erlware-commons erlang-getopt))
+    (home-page "https://github.com/tsloughter/providers")
+    (synopsis "Erlang providers library")
+    (description "This package provides an Erlang providers library.")
+    (license license:asl2.0)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:06 GMT) Full text and rfc822 format available.

Message #35 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 10/22] gnu: Add erlang-parse-trans.
Date: Fri,  8 Apr 2022 19:03:43 +0200
* gnu/packages/erlang.scm (erlang-parse-trans): New variable.
---
 gnu/packages/erlang.scm | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 85e491bb1d..fc4b6f47d9 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -360,6 +360,25 @@ of reusable Erlang components.")
 arguments using the GNU getopt syntax.")
     (license license:bsd-3)))
 
+(define-public erlang-parse-trans
+  (package
+    (name "erlang-parse-trans")
+    (version "3.4.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "parse_trans" version))
+       (sha256
+        (base32 "16p4c2xjrvz16kzpr9pmcvi6nxq6rwckqi9fp0ksibaxwxn402k2"))))
+    (build-system rebar3-build-system)
+    (inputs
+     (list erlang-getopt))
+    (home-page "https://github.com/uwiger/parse_trans")
+    (synopsis "Parse transform utilities for Erlang")
+    (description "This package provides parse transform utilities for
+Erlang.")
+    (license license:asl2.0)))
+
 (define-public erlang-providers
   (package
     (name "erlang-providers")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:07 GMT) Full text and rfc822 format available.

Message #38 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 11/22] gnu: Add erlang-hex-core.
Date: Fri,  8 Apr 2022 19:03:44 +0200
* gnu/packages/erlang.scm (erlang-hex-core): New variable.
---
 gnu/packages/erlang.scm | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index fc4b6f47d9..826bc67d40 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -360,6 +360,32 @@ of reusable Erlang components.")
 arguments using the GNU getopt syntax.")
     (license license:bsd-3)))
 
+(define-public erlang-hex-core
+  (package
+    (name "erlang-hex-core")
+    (version "0.8.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "hex_core" version))
+       (sha256
+        (base32 "06p65hlm29ky03vs3fq3qz6px2ylwp8b0f2y75wdf5cm0kx2332b"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "rebar3" "as" "test" "proper")))))))
+    (inputs
+     (list erlang-proper rebar3-proper))
+    (home-page "https://github.com/hexpm/hex_core")
+    (synopsis "Reference implementation of Hex specifications")
+    (description "This package provides the reference implementation of Hex
+specifications.")
+    (license license:asl2.0)))
+
 (define-public erlang-parse-trans
   (package
     (name "erlang-parse-trans")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:07 GMT) Full text and rfc822 format available.

Message #41 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 12/22] gnu: Add erlang-ssl-verify-fun.
Date: Fri,  8 Apr 2022 19:03:45 +0200
* gnu/packages/erlang.scm (erlang-ssl-verify-fun): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 826bc67d40..a7e63db0f3 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -422,3 +422,20 @@ Erlang.")
     (synopsis "Erlang providers library")
     (description "This package provides an Erlang providers library.")
     (license license:asl2.0)))
+
+(define-public erlang-ssl-verify-fun
+  (package
+    (name "erlang-ssl-verify-fun")
+    (version "1.1.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "ssl_verify_fun" version))
+       (sha256
+        (base32 "1026l1z1jh25z8bfrhaw0ryk5gprhrpnirq877zqhg253x3x5c5x"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/deadtrickster/ssl_verify_fun.erl")
+    (synopsis "SSL verification functions for Erlang")
+    (description "This package provides SSL verification functions for
+Erlang.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:08 GMT) Full text and rfc822 format available.

Message #44 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 13/22] gnu: Add erlang-relx.
Date: Fri,  8 Apr 2022 19:03:46 +0200
* gnu/packages/erlang.scm (erlang-relx): New variable.
---
 gnu/packages/erlang.scm | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index a7e63db0f3..626043a1b5 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -423,6 +423,28 @@ Erlang.")
     (description "This package provides an Erlang providers library.")
     (license license:asl2.0)))
 
+(define-public erlang-relx
+  (package
+    (name "erlang-relx")
+    (version "4.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "relx" version))
+       (sha256
+        (base32 "02gmfx1vxg9m3mq4njsqhs4972l4nb8m5p1pdcf64g09ccf17y1g"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-bbmustache))
+    (home-page "https://erlware.github.io/relx/")
+    (synopsis "Release assembler for Erlang/OTP Releases")
+    (description "Relx assembles releases for an Erlang/OTP release.  Given a
+release specification and a list of directories in which to search for OTP
+applications it will generate a release output.  That output depends heavily on
+what plugins available and what options are defined, but usually it is simply
+a well configured release directory.")
+    (license license:asl2.0)))
+
 (define-public erlang-ssl-verify-fun
   (package
     (name "erlang-ssl-verify-fun")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:08 GMT) Full text and rfc822 format available.

Message #47 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 14/22] gnu: Add erlang-edown.
Date: Fri,  8 Apr 2022 19:03:47 +0200
* gnu/packages/erlang.scm (erlang-edown): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 626043a1b5..1a4ff36abb 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -300,6 +300,23 @@ printing extending the io:format syntax to add colours.")
 outputs you want to be readable around all that noise they contain.")
     (license license:bsd-3)))
 
+(define-public erlang-edown
+  (package
+    (name "erlang-edown")
+    (version "0.8.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "edown" version))
+        (sha256
+          (base32 "0ij47gvgs6yfqphj0f54qjzj18crj8y1dsjjlzpp3dp8pscqzbqw"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/uwiger/edown")
+    (synopsis "Markdown extension for EDoc")
+    (description "This package provides an extension for EDoc for generating
+Markdown.")
+    (license license:asl2.0)))
+
 (define-public erlang-erlware-commons
   (package
     (name "erlang-erlware-commons")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:09 GMT) Full text and rfc822 format available.

Message #50 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 15/22] gnu: Add erlang-jsone.
Date: Fri,  8 Apr 2022 19:03:48 +0200
* gnu/packages/erlang.scm (erlang-jsone): New variable.
---
 gnu/packages/erlang.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 1a4ff36abb..91ce74f2d0 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -403,6 +403,30 @@ arguments using the GNU getopt syntax.")
 specifications.")
     (license license:asl2.0)))
 
+(define-public erlang-jsone
+  (package
+    (name "erlang-jsone")
+    (version "1.7.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "jsone" version))
+        (sha256
+          (base32 "1gaxiw76syjp3s9rygskm32y9799b917q752rw8bxj3bxq93g8x3"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-covertool
+           ;; no need to generate a coverage report
+           (lambda _
+             (substitute* "rebar.config"
+               (("\\{project_plugins, \\[covertool\\]\\}\\." _) "")))))))
+    (home-page "https://github.com/sile/jsone/")
+    (synopsis "Erlang JSON Library")
+    (description "An Erlang library for encoding and decoding JSON data.")
+    (license license:expat)))
+
 (define-public erlang-parse-trans
   (package
     (name "erlang-parse-trans")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:09 GMT) Full text and rfc822 format available.

Message #53 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 16/22] gnu: Add erlang-proper.
Date: Fri,  8 Apr 2022 19:03:49 +0200
* gnu/packages/erlang.scm (erlang-proper): New variable.
---
 gnu/packages/erlang.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 91ce74f2d0..9a626a65a2 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -446,6 +446,33 @@ specifications.")
 Erlang.")
     (license license:asl2.0)))
 
+(define-public erlang-proper
+  (package
+    (name "erlang-proper")
+    (version "1.4.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "proper" version))
+        (sha256
+          (base32 "1fwcas4a9kz3w3z1jqdk9lw8822srfjk9lcpvbxkxlsv3115ha0q"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-covertool
+           ;; no need to generate a coverage report
+           (lambda _
+             (substitute* "rebar.config"
+               (("\\{plugins, \\[covertool\\]\\}\\." _) "")))))))
+    (home-page "https://proper-testing.github.io/")
+    (synopsis "QuickCheck-inspired property-based testing tool for Erlang")
+    (description "PropEr is a tool for the automated, semi-random,
+property-based testing of Erlang programs.  It is fully integrated with
+Erlang's type language, and can also be used for the model-based random
+testing of stateful systems.")
+    (license license:gpl3+)))
+
 (define-public erlang-providers
   (package
     (name "erlang-providers")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:09 GMT) Full text and rfc822 format available.

Message #56 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 17/22] gnu: Add erlang-covertool.
Date: Fri,  8 Apr 2022 19:03:50 +0200
* gnu/packages/erlang.scm (erlang-covertool): New variable.
---
 gnu/packages/erlang.scm | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 9a626a65a2..256b622fa3 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -279,6 +279,26 @@ Mozilla's canonical set.")
 printing extending the io:format syntax to add colours.")
     (license license:expat)))
 
+(define-public erlang-covertool
+  (package
+    (name "erlang-covertool")
+    (version "2.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "covertool" version))
+       (sha256
+        (base32 "1p0c1n3nl4063xwi1sv176l1x68xqf07qwvj444a5z888fx6i5aw"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/covertool/covertool")
+    (synopsis "Convert Erlang cover data into Cobertura XML reports")
+    (description "This package provides a build tool and plugin to convert
+exported Erlang cover data sets into Cobertura XML reports, which can then be
+feed to the Jenkins Cobertura plug-in.
+
+On @emph{hex.pm}, this plugin was previously called @code{rebar_covertool}.")
+    (license license:bsd-2)))
+
 (define-public erlang-cth-readable
   (package
     (name "erlang-cth-readable")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:10 GMT) Full text and rfc822 format available.

Message #59 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 18/22] gnu: Add rebar3.
Date: Fri,  8 Apr 2022 19:03:51 +0200
* gnu/packages/erlang.scm (rebar3): New variable.
---
 gnu/packages/erlang.scm | 76 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 256b622fa3..35681e9a73 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -549,3 +549,79 @@ a well configured release directory.")
     (description "This package provides SSL verification functions for
 Erlang.")
     (license license:expat)))
+
+(define-public rebar3
+  (package
+    (name "rebar3")
+    (version "3.18.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/erlang/rebar3")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "09648hzc2mnjwf9klm20cg4hb5rn2xv2gmzcg98ffv37p5yfl327"))))
+    (build-system gnu-build-system)
+    ;; TODO: remove vendored modules, install man-page, install lib(?)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'bootstrap)
+         (add-after 'unpack 'unpack-dependency-sources
+           (lambda* (#:key inputs #:allow-other-keys)
+             (for-each
+              (lambda (pkgname)
+                (let* ((src (string-append pkgname "-source"))
+                       (input (assoc-ref inputs src))
+                       (checkouts-dir (string-append "_checkouts/" pkgname))
+                       (lib-dir (string-append "_build/default/lib/" pkgname)))
+                  (mkdir-p checkouts-dir)
+                  (invoke "tar" "-xf" input "-C" checkouts-dir)
+                  (invoke "tar" "-xzf"
+                          (pk (string-append checkouts-dir "/contents.tar.gz"))
+                          "-C" checkouts-dir)
+                  (mkdir-p lib-dir)
+                  (copy-recursively checkouts-dir lib-dir)))
+              (list "bbmustache" "certifi" "cf" "cth_readable"
+                    "eunit_formatters" "getopt" "hex_core" "erlware_commons"
+                    "parse_trans" "relx" "ssl_verify_fun" "providers"))))
+         (delete 'configure)
+         (replace 'build
+           (lambda _
+             (setenv "HOME" (getcwd))
+             (invoke "./bootstrap")))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out")))
+               (install-file "rebar3" (string-append out "/bin")))))
+         (delete 'check))))
+    (native-inputs
+     (list erlang))
+    (inputs
+     `(("bbmustache-source" ,(package-source erlang-bbmustache))
+       ("certifi-source" ,(package-source erlang-certifi))
+       ("cf-source" ,(package-source erlang-cf))
+       ("cth_readable-source" ,(package-source erlang-cth-readable))
+       ("erlware_commons-source" ,(package-source erlang-erlware-commons))
+       ("eunit_formatters-source" ,(package-source erlang-eunit-formatters))
+       ("getopt-source" ,(package-source erlang-getopt))
+       ("hex_core-source" ,(package-source erlang-hex-core))
+       ("parse_trans-source" ,(package-source erlang-parse-trans))
+       ("relx-source" ,(package-source erlang-relx))
+       ("ssl_verify_fun-source" ,(package-source erlang-ssl-verify-fun))
+       ("providers-source" ,(package-source erlang-providers))))
+    (home-page "https://www.rebar3.org/")
+    (synopsis "Sophisticated build-tool for Erlang projects that follows OTP
+principles")
+    (description "@code{rebar3} is an Erlang build tool that makes it easy to
+compile and test Erlang applications, port drivers and releases.
+
+@code{rebar3} is a self-contained Erlang script, so it's easy to distribute or
+even embed directly in a project.  Where possible, rebar uses standard
+Erlang/OTP conventions for project structures, thus minimizing the amount of
+build configuration work.  @code{rebar3} also provides dependency management,
+enabling application writers to easily re-use common libraries from a variety
+of locations (git, hg, etc).")
+    (license license:asl2.0)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:10 GMT) Full text and rfc822 format available.

Message #62 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 19/22] gnu: Add rebar3-raw-deps.
Date: Fri,  8 Apr 2022 19:03:52 +0200
* gnu/packages/erlang.scm (rebar3-raw-deps): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 35681e9a73..8bd7ba3739 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -625,3 +625,20 @@ build configuration work.  @code{rebar3} also provides dependency management,
 enabling application writers to easily re-use common libraries from a variety
 of locations (git, hg, etc).")
     (license license:asl2.0)))
+
+(define-public rebar3-raw-deps
+  (package
+    (name "rebar3-raw-deps")
+    (version "2.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "rebar3_raw_deps" version))
+       (sha256
+        (base32 "1pzmm3m8gb2s9jn8fp6shzgfmy4mvh2vdci0z6nsm74ma3ffh1i3"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/soranoba/rebar3_raw_deps")
+    (synopsis "Rebar3 plugin for supporting \"raw\" dependencies")
+    (description "This plugin adds support for \"raw\" dependencies to
+rebar3.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:11 GMT) Full text and rfc822 format available.

Message #65 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 20/22] gnu: Add rebar3-git-vsn.
Date: Fri,  8 Apr 2022 19:03:53 +0200
* gnu/packages/erlang.scm (rebar3-git-vsn): New variable.
---
 gnu/packages/erlang.scm | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 8bd7ba3739..acd7c76aa1 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -37,6 +37,7 @@
   #:use-module (gnu packages gl)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages version-control)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages wxwidgets))
 
@@ -642,3 +643,34 @@ of locations (git, hg, etc).")
     (description "This plugin adds support for \"raw\" dependencies to
 rebar3.")
     (license license:expat)))
+
+(define-public rebar3-git-vsn
+  (package
+    (name "rebar3-git-vsn")
+    (version "1.1.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "rebar3_git_vsn" version))
+        (sha256
+          (base32 "1dfz56034pa25axly9vqdzv3phkn8ll0qwrkws96pbgcprhky1hx"))))
+    (build-system rebar3-build-system)
+    (inputs
+     (list git))
+    (arguments
+     `(;; Running the tests require binary artifact (tar-file containing
+       ;; samples git repos)  TODO: remove these from the source
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((git (assoc-ref inputs "git")))
+               (substitute* "src/rebar3_git_vsn.erl"
+                 (("rebar_utils:sh\\(\"git " _)
+                  (string-append "rebar_utils:sh(\"" git "/bin/git ")))))))))
+    (home-page "https://github.com/soranoba/rebar3_git_vsn")
+    (synopsis "Rebar3 plugin for generating the version from git")
+    (description "This plugin adds support for generating the version from
+a git checkout.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:11 GMT) Full text and rfc822 format available.

Message #68 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 21/22] gnu: Add rebar3-proper.
Date: Fri,  8 Apr 2022 19:03:54 +0200
* gnu/packages/erlang.scm (rebar3-proper): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index acd7c76aa1..339d93496b 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -674,3 +674,20 @@ rebar3.")
     (description "This plugin adds support for generating the version from
 a git checkout.")
     (license license:expat)))
+
+(define-public rebar3-proper
+  (package
+    (name "rebar3-proper")
+    (version "0.12.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "rebar3_proper" version))
+        (sha256
+          (base32 "1f174fb6h2071wr7qbw9aqqvnglzsjlylmyi8215fhrmi38w94b6"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/ferd/rebar3_proper")
+    (synopsis "Rebar3 PropEr plugin")
+    (description "This plugin allows running PropEr test suites from within
+rebar3.")
+    (license license:bsd-3)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 08 Apr 2022 17:05:12 GMT) Full text and rfc822 format available.

Message #71 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v3 22/22] build-system: Add 'rebar3-build-system'.
Date: Fri,  8 Apr 2022 19:03:55 +0200
* guix/build-system/rebar3.scm, guix/build/rebar3-build-system.scm: New files.
* Makefile.am (MODULES): Register them.
* doc/guix.texi (Build Systems): Document it.
---
 Makefile.am                        |   2 +
 doc/guix.texi                      |  41 ++++++++
 guix/build-system/rebar3.scm       | 143 ++++++++++++++++++++++++++++
 guix/build/rebar3-build-system.scm | 147 +++++++++++++++++++++++++++++
 4 files changed, 333 insertions(+)
 create mode 100644 guix/build-system/rebar3.scm
 create mode 100644 guix/build/rebar3-build-system.scm

diff --git a/Makefile.am b/Makefile.am
index be2c183206..bb538222b3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -164,6 +164,7 @@ MODULES =					\
   guix/build-system/waf.scm			\
   guix/build-system/r.scm			\
   guix/build-system/rakudo.scm			\
+  guix/build-system/rebar3.scm			\
   guix/build-system/ruby.scm			\
   guix/build-system/scons.scm			\
   guix/build-system/texlive.scm			\
@@ -217,6 +218,7 @@ MODULES =					\
   guix/build/r-build-system.scm			\
   guix/build/renpy-build-system.scm			\
   guix/build/rakudo-build-system.scm		\
+  guix/build/rebar3-build-system.scm		\
   guix/build/ruby-build-system.scm		\
   guix/build/scons-build-system.scm		\
   guix/build/texlive-build-system.scm		\
diff --git a/doc/guix.texi b/doc/guix.texi
index 6c17b26d70..518fabf48d 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -8717,6 +8717,47 @@ with @code{#:zef} or removed by passing @code{#f} to the
 @code{with-zef?} parameter.
 @end defvr
 
+@defvr {Scheme Variable} rebar3-build-system
+This variable is exported by @code{(guix build-system rebar3)}.  It
+implements a build procedure around @code{rebar3}.
+
+It adds both @code{rebar3} and the @code{erlang} to the set of inputs.
+Different packages can be specified with the @code{#:rebar} and
+@code{#:erlang} parameters, respectively.
+
+This build system is based on @code{gnu-build-system}, but with the
+following phases changed:
+
+@table @code
+
+@item unpack
+This phase, after unpacking the source like the @code{gnu-build-system}
+does, checks for a file @code{contents.tar.gz} at the top-level of the
+source.  If this file exists, it will be unpacked, too.  This eases
+handling of package hosted by @i{hex.pm}.
+
+@item bootstrap
+@item configure
+There are no @code{bootstrap} and @code{configure} phase because erlang
+packages typically don’t need to be configured.
+
+@item build
+This phase runs @code{rebar3 compile}
+with the flags listed in @code{#:rebar-flags}.
+
+@item check
+Unless @code{#:tests? #f} is passed,
+this phase runs @code{rebar3 eunit},
+or some other target specified with @code{#:test-target},
+with the flags listed in @code{#:rebar-flags},
+
+@item install
+This installs the files created in the @i{default} profile, or some
+other profile specified with @code{#:install-profile}.
+
+@end table
+@end defvr
+
 @defvr {Scheme Variable} texlive-build-system
 This variable is exported by @code{(guix build-system texlive)}.  It is
 used to build TeX packages in batch mode with a specified engine.  The
diff --git a/guix/build-system/rebar3.scm b/guix/build-system/rebar3.scm
new file mode 100644
index 0000000000..b96c806258
--- /dev/null
+++ b/guix/build-system/rebar3.scm
@@ -0,0 +1,143 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
+;;; Copyright © 2020 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix build-system rebar3)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix monads)
+  #:use-module (guix search-paths)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module ((guix hexpm-download) #:select (hexpm-uri) #:prefix dl:)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-26)
+  #:export (hexpm-uri
+            %rebar3-build-system-modules
+            rebar3-build
+            rebar3-build-system))
+
+;;
+;; Standard build procedure for Erlang packages using Rebar3.
+;;
+
+(define hexpm-uri dl:hexpm-uri)
+
+(define %rebar3-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build rebar3-build-system)
+    ,@%gnu-build-system-modules))
+
+(define (default-rebar3)
+  "Return the default Rebar3 package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((erlang-mod (resolve-interface '(gnu packages erlang))))
+    (module-ref erlang-mod 'rebar3)))
+
+(define (default-erlang)
+  "Return the default Erlang package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((erlang-mod (resolve-interface '(gnu packages erlang))))
+    (module-ref erlang-mod 'erlang)))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (rebar (default-rebar3))
+                (erlang (default-erlang))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME from the given arguments."
+  (define private-keywords
+    '(#:target #:rebar #:erlang #:inputs #:native-inputs))
+
+  (and (not target)                               ;XXX: no cross-compilation
+       (bag
+         (name name)
+         (system system)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs
+                         ;; Keep the standard inputs of 'gnu-build-system'.
+                         ,@(standard-packages)))
+         (build-inputs `(("rebar" ,rebar)
+                         ("erlang" ,erlang) ;; for escriptize
+                         ,@native-inputs))
+         (outputs outputs)
+         (build rebar3-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (rebar3-build name inputs
+                       #:key
+                       guile source
+                       (rebar-flags ''("skip_deps=true" "-vv"))
+                       (tests? #t)
+                       (test-target "eunit")
+                       ;; TODO: install-name  ; default: based on guix package name
+                       (install-profile "default")
+                       (phases '(@ (guix build rebar3-build-system)
+                                   %standard-phases))
+                       (outputs '("out"))
+                       (search-paths '())
+                       (native-search-paths '())
+                       (system (%current-system))
+                       (imported-modules %rebar3-build-system-modules)
+                       (modules '((guix build rebar3-build-system)
+                                  (guix build utils))))
+  "Build SOURCE with INPUTS."
+
+  (define builder
+    (with-imported-modules imported-modules
+      #~(begin
+          (use-modules #$@(sexp->gexp modules))
+
+          #$(with-build-variables inputs outputs
+              #~(rebar3-build #:source #+source
+                      #:system #$system
+                      #:name #$name
+                      #:rebar-flags #$rebar-flags
+                      #:tests? #$tests?
+                      #:test-target #$test-target
+                      ;; TODO: #:install-name #$install-name
+                      #:install-profile #$install-profile
+                      #:phases #$(if (pair? phases)
+                                     (sexp->gexp phases)
+                                     phases)
+                      #:outputs %outputs
+                      #:search-paths '#$(sexp->gexp
+                                         (map search-path-specification->sexp
+                                              search-paths))
+                      #:inputs %build-inputs)))))
+
+  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+                                                  system #:graft? #f)))
+    ;; Note: Always pass #:graft? #f.  Without it, ALLOWED-REFERENCES &
+    ;; co. would be interpreted as referring to grafted packages.
+    (gexp->derivation name builder
+                      #:system system
+                      #:target #f
+                      #:graft? #f
+                      #:guile-for-build guile)))
+
+(define rebar3-build-system
+  (build-system
+    (name 'rebar3)
+    (description "The standard Rebar3 build system")
+    (lower lower)))
diff --git a/guix/build/rebar3-build-system.scm b/guix/build/rebar3-build-system.scm
new file mode 100644
index 0000000000..ae18538ed3
--- /dev/null
+++ b/guix/build/rebar3-build-system.scm
@@ -0,0 +1,147 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016, 2018 Ricardo Wurmus <rekado <at> elephly.net>
+;;; Copyright © 2019 Björn Höfling <bjoern.hoefling <at> bjoernhoefling.de>
+;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix build rebar3-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module ((guix build utils) #:hide (delete))
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 ftw)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (rebar3-build
+            %standard-phases))
+
+;;
+;; Builder-side code of the standard build procedure for Erlang packages using
+;; rebar3.
+;;
+;; TODO: Think about whether bindir ("ebin"), libdir ("priv") and includedir
+;; "(include") need to be configurable
+
+(define %erlang-libdir "/lib/erlang/lib")
+
+(define* (erlang-depends #:key inputs #:allow-other-keys)
+  (define input-directories
+    (match inputs
+      (((_ . dir) ...)
+       dir)))
+  (mkdir-p "_checkouts")
+
+  (for-each
+   (lambda (input-dir)
+     (let ((elibdir (string-append input-dir %erlang-libdir)))
+       (when (directory-exists? elibdir)
+         (for-each
+          (lambda (dirname)
+            (let ((dest (string-append elibdir "/" dirname))
+                  (link (string-append "_checkouts/" dirname)))
+              (when (not (file-exists? link))
+                ;; RETHINK: Maybe better copy and make writable to avoid some
+                ;; error messages e.g. when using with rebar3-git-vsn.
+                (symlink dest link))))
+          (list-directories elibdir)))))
+   input-directories))
+
+(define* (unpack #:key source #:allow-other-keys)
+  "Unpack SOURCE in the working directory, and change directory within the
+source.  When SOURCE is a directory, copy it in a sub-directory of the current
+working directory."
+  (let ((gnu-unpack (assoc-ref gnu:%standard-phases 'unpack)))
+    (gnu-unpack #:source source)
+    ;; Packages from hex.pm typically have a contents.tar.gz containing the
+    ;; actual source. If this tar file exists, extract it.
+    (when (file-exists? "contents.tar.gz")
+      (invoke "tar" "xvf" "contents.tar.gz"))))
+
+(define* (build #:key (rebar-flags '()) #:allow-other-keys)
+  (apply invoke `("rebar3" "compile" ,@rebar-flags)))
+
+(define* (check #:key target (rebar-flags '()) (tests? (not target))
+                (test-target "eunit")
+                #:allow-other-keys)
+  (if tests?
+      (apply invoke `("rebar3" ,test-target ,@rebar-flags))
+      (format #t "test suite not run~%")))
+
+(define (erlang-package? name)
+  "Check if NAME correspond to the name of an Erlang package."
+  (string-prefix? "erlang-" name))
+
+(define (package-name-version->erlang-name name+ver)
+  "Convert the Guix package NAME-VER to the corresponding Erlang name-version
+format.  Essentially drop the prefix used in Guix and replace dashes by
+underscores."
+  (let* ((name- (package-name->name+version name+ver)))
+    (string-join
+     (string-split
+      (if (erlang-package? name-)  ; checks for "erlang-" prefix
+          (string-drop name- (string-length "erlang-"))
+          name-)
+      #\-)
+     "_")))
+
+(define (list-directories directory)
+  "Return file names of the sub-directory of DIRECTORY."
+  (scandir directory
+           (lambda (file)
+             (and (not (member file '("." "..")))
+                  (file-is-directory? (string-append directory "/" file))))))
+
+(define* (install #:key name outputs
+                  (install-name (package-name-version->erlang-name name))
+                  (install-profile "default") ; build profile outputs to install
+                  #:allow-other-keys)
+  (let* ((out (assoc-ref outputs "out"))
+         (pkg-dir (string-append out %erlang-libdir "/" install-name)))
+    (let ((bin-dir (string-append "_build/" install-profile "/bin"))
+          (lib-dir (string-append "_build/" install-profile "/lib")))
+      ;; install _build/PROFILE/bin
+      (when (file-exists? bin-dir)
+        (copy-recursively bin-dir out #:follow-symlinks? #t))
+      ;; install _build/PROFILE/lib/*/{ebin,include,priv}
+      (for-each
+       (lambda (*)
+         (for-each
+          (lambda (dirname)
+            (let ((src-dir (string-append lib-dir "/" * "/" dirname))
+                  (dst-dir (string-append pkg-dir "/" dirname)))
+              (when (file-exists? src-dir)
+                (copy-recursively src-dir dst-dir #:follow-symlinks? #t))
+              (false-if-exception
+               (delete-file (string-append dst-dir "/.gitignore")))))
+          '("ebin" "include" "priv")))
+       (list-directories lib-dir))
+      (false-if-exception
+       (delete-file (string-append pkg-dir "/priv/Run-eunit-loop.expect"))))))
+
+(define %standard-phases
+  (modify-phases gnu:%standard-phases
+    (replace 'unpack unpack)
+    (delete 'bootstrap)
+    (delete 'configure)
+    (add-before 'build 'erlang-depends erlang-depends)
+    (replace 'build build)
+    (replace 'check check)
+    (replace 'install install)))
+
+(define* (rebar3-build #:key inputs (phases %standard-phases)
+                       #:allow-other-keys #:rest args)
+  "Build the given Erlang package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 10:59:02 GMT) Full text and rfc822 format available.

Message #74 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 04/22] gnu: Add erlang-erlware-commons.
Date: Sat, 09 Apr 2022 12:58:35 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (native-inputs
> +     (list git))  ;; Required for tests

Maybe git-minimal/fixed, to avoid rebuilds if 'git' is updated.

Greetings,
MAxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:40:01 GMT) Full text and rfc822 format available.

Message #77 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 03/22] gnu: Add erlang-certifi.
Date: Sat, 09 Apr 2022 13:39:18 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (description "This Erlang library contains a CA bundle that you can
> +reference in your Erlang application.  This is useful for systems that do not
> +have CA bundles that Erlang can find itself, or where a uniform set of CAs is
> +valuable.
> +
> +This an Erlang specific port of certifi.  The CA bundle is derived from

Can this bundle be built from 'nss-certs', such that when nss-certs is
updated (e.g. Mozilla revokes a root certificate due to reasons),
erlang-certifi is up-to-date as well?

Also, if Erlang supports some kind of static linking, then a package
like this might be useful for people wanting to make static binaries to
distribute to (non-Guix) systems.

However, adding packages like nss-certs to the package inputs is
avoided in favour of SSL_CERT_DIR/SSL_CERT_FILE / /etc/ssl/certs, to
avoid rebuilds (*) when nss-certs is updated and because people might
want to use a different set of root certificates (e.g., le-certs, none,
or a list of (non-CA) certificates for a few individual sites).

As such, can this package be avoided as dependency?

Also see:

  * https://issues.guix.gnu.org/54434#8
    (tzdata instead of nss-certs, but same principle)
  * https://lists.gnu.org/archive/html/guix-devel/2017-01/msg00516.html
    (about rebuilds)
  * https://lists.gnu.org/archive/html/guix-devel/2014-02/msg00277.html
    (some security reasons for not including nss-certs in the inputs
    or even the user profile)

(*) nowaday it is less of a concern because of grafting, but grafting
can take a long time.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:42:01 GMT) Full text and rfc822 format available.

Message #80 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 10/22] gnu: Add erlang-parse-trans.
Date: Sat, 09 Apr 2022 13:41:45 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (synopsis "Parse transform utilities for Erlang")
> +    (description "This package provides parse transform utilities for
> +Erlang.")

This description is a bit parse, ‘(guix)Synopses and Descriptions’
recommends longer descriptions.  What's a ‘parse transform utility’?
How do I know if I need one?  What are they useful for?  Are there
limitations and alternatives?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:44:02 GMT) Full text and rfc822 format available.

Message #83 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 13/22] gnu: Add erlang-relx.
Date: Sat, 09 Apr 2022 13:43:43 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (description "Relx assembles releases for an Erlang/OTP release.  Given a

What does ‘Erlang/OTP’ mean here?  Is it like "make dist", or more like
"cargo publish", or "git tag v1.2.3"?

Greetings,
MAxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:46:01 GMT) Full text and rfc822 format available.

Message #86 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 13/22] gnu: Add erlang-relx.
Date: Sat, 09 Apr 2022 13:45:22 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (propagated-inputs
> +     (list erlang-bbmustache))

erlang-relx looks like some kind of tool that can be run and not a
library.  As such, does it belong in erlang.scm or package-
management.scm?  Does the input need to be propagated?  Can the
'erlang-' prefix be dropped?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:49:01 GMT) Full text and rfc822 format available.

Message #89 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 17/22] gnu: Add erlang-covertool.
Date: Sat, 09 Apr 2022 13:48:01 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (home-page "https://github.com/covertool/covertool")
> +    (synopsis "Convert Erlang cover data into Cobertura XML reports")
> +    (description "This package provides a build tool and plugin to convert
> +exported Erlang cover data sets into Cobertura XML reports, which can then be
> +feed to the Jenkins Cobertura plug-in.
> +
> +On @emph{hex.pm}, this plugin was previously called @code{rebar_covertool}.")
> +    (license license:bsd-2)))

What is ‘cover data’?  Is it line coverage information for testing if a
test suite is of good quality, or is it for calculating a minimal
convex covering of a set of points?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:50:02 GMT) Full text and rfc822 format available.

Message #92 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 19/22] gnu: Add rebar3-raw-deps.
Date: Sat, 09 Apr 2022 13:49:54 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +    (synopsis "Rebar3 plugin for supporting \"raw\" dependencies")
> +    (description "This plugin adds support for \"raw\" dependencies to
> +rebar3.")

The synopsis and description are practically identical here.  What is a
‘raw’ depency?  How does someone know if "raw" dependencies might be
useful for their purposes?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:53:01 GMT) Full text and rfc822 format available.

Message #95 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 13:52:36 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +  (docs-html-url hexpm-docs-html-url "docs_html_url") ; string | #nil

There is (currently) no Guix code written in Emacs Lisp.  Do you mean
#f instead of #nil?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:54:02 GMT) Full text and rfc822 format available.

Message #98 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 13:53:30 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +  ;; Specification names the next fiels "dependencies", but in practice it is

typo: fiels -> fields?
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:56:01 GMT) Full text and rfc822 format available.

Message #101 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 13:55:39 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +(define (maybe-inputs package-inputs input-type)
> +  "Given a list of PACKAGE-INPUTS, tries to generate the 'inputs' field of a
> +package definition.  INPUT-TYPE, a symbol, is used to populate the name of
> +the input field."
> +  (match package-inputs
> +    (()
> +     '())
> +    ((package-inputs ...)
> +     `((,input-type (list ,@package-inputs))))))

This procedure 'maybe-inputs', or at least a similar procedure, already
seems to exist in (guix import utils).

Greetings,
MAxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:57:01 GMT) Full text and rfc822 format available.

Message #104 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 13:56:09 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +  ;; TODO: Base name on languange of dependency.
> +  ;; The languange used for implementing the depcendency is not know without
> +  ;; recursing the dependencies.  So for now assume more packages are based on
> +  ;; Erlang and prefix all dependencies with "erlang-" (the default).

typos: depcendency, languange?
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 11:59:02 GMT) Full text and rfc822 format available.

Message #107 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 13:58:45 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +         (name ,(hexpm-name->package-name name language))

Would it possible to detect if a package is a library or a tool, and if
it's the latter, drop the "erlang-" prefix automatically (and move
propagated-inputs to inputs)?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 12:00:02 GMT) Full text and rfc822 format available.

Message #110 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 13:59:35 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +   (lambda (temp port)
> +     (and (url-fetch tarball-url temp)
> +          (values
> +       `(package

WOuld 'alist->package' be useful here?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 12:08:02 GMT) Full text and rfc822 format available.

Message #113 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 09 Apr 2022 14:07:23 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +(test-assert "hexpm->guix-package"
> +  ;; Replace network resources with sample data.
> +  (mock ((guix http-client) http-fetch
> +         (lambda (url . rest)
> +           (match url
> +             ("https://hex.pm/api/packages/bla"
> +              (values (open-input-string test-bla-package)
> +                      (string-length test-bla-package)))
> +             ("https://hex.pm/api/packages/bla/releases/1.5.0"
> +              (values (open-input-string test-bla-release)
> +                      (string-length test-bla-release)))
> +             (_ (error "http-fetch got unexpected URL: " url)))))

From what I've gathered, with-http-server and the like is preferred
above mocking, though with-http-server might need to be extended first
to allow checking the URL (see <https://issues.guix.gnu.org/53389>).

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 13:17:02 GMT) Full text and rfc822 format available.

Message #116 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sat, 09 Apr 2022 15:16:20 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:

> * guix/build-system/rebar3.scm, guix/build/rebar3-build-system.scm: New files.

This patch seems out-of-order.  Wouldn't rebar3-build-system need to be
added before packages using rebar3-build-system?

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 13:20:01 GMT) Full text and rfc822 format available.

Message #119 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sat, 09 Apr 2022 15:19:25 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
> +         (system system)
> +         (host-inputs `(,@(if source
> +                              `(("source" ,source))
> +                              '())
> +                        ,@inputs
> +                         ;; Keep the standard inputs of 'gnu-build-system'.
> +                         ,@(standard-packages)))

(standard-packages) needs to be in 'build-inputs', at least according
to 'lower' in (guix build-system gnu).

> +         (build-inputs `(("rebar" ,rebar)
> +                         ("erlang" ,erlang) ;; for escriptize
> +                         ,@native-inputs))

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 15:19:01 GMT) Full text and rfc822 format available.

Message #122 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 13/22] gnu: Add erlang-relx.
Date: Sat, 9 Apr 2022 17:18:20 +0200
[Message part 1 (text/plain, inline)]
Am 09.04.22 um 13:45 schrieb Maxime Devos:
> erlang-relx looks like some kind of tool that can be run and not a
> library. … Can the 'erlang-' prefix be dropped?

The github repo says: „|relx| is a library used by rebar3“. Thus I'd 
keep the „erlang-“ prefix.

> Does the input need to be propagated?

AFAIK: Like for Python, run-time dependencies of Erlang *libraries* need 
to be propagated. Erlang does not actually have a notion of „library“. 
It's more like Rust where all all dependent sources are expected to be 
available at build-time and then put into the „executable“. Basically 
this is statically linked, so only developers/package-builders are 
effected by this propagation.

Would be great if some experienced Erlang developer would show up and 
show a solution without needing to propagate.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          |h.goebel <at> crazy-compilers.com                |
|www.crazy-compilers.com  | compilers which you thought are impossible |
[Message part 2 (text/html, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 15:20:02 GMT) Full text and rfc822 format available.

Message #125 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 10/22] gnu: Add erlang-parse-trans.
Date: Sat, 9 Apr 2022 17:19:48 +0200
Am 09.04.22 um 13:41 schrieb Maxime Devos:
> This description is a bit parse, ‘(guix)Synopses and Descriptions’
> recommends longer descriptions.
I added a more verbose description based on the projects readme.


-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 15:33:01 GMT) Full text and rfc822 format available.

Message #128 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 13/22] gnu: Add erlang-relx.
Date: Sat, 9 Apr 2022 17:32:25 +0200
Am 09.04.22 um 13:43 schrieb Maxime Devos:
> Hartmut Goebel schreef op vr 08-04-2022 om 19:03 [+0200]:
>> +    (description "Relx assembles releases for an Erlang/OTP release.  Given a
> What does ‘Erlang/OTP’ mean here?  Is it like "make dist", or more like
> "cargo publish", or "git tag v1.2.3"?

OTP is a collection of middleware, libraries, and tools written in 
Erlang programming language (Wikipedia, 
https://en.wikipedia.org/wiki/Open_Telecom_Platform). AFAIU it's much 
like the Java run-time engine plus libraries.

So „Erlang/OTP” is a standing term in the Erlang and Elixir world. Thus 
I would keep it, expecting that Erlang developers understand this.

I can't explain what this library does — all I know is: it's a 
dependency of rebar3.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 15:34:02 GMT) Full text and rfc822 format available.

Message #131 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 04/22] gnu: Add erlang-erlware-commons.
Date: Sat, 9 Apr 2022 17:33:08 +0200
Am 09.04.22 um 12:58 schrieb Maxime Devos:
> Maybe git-minimal/fixed, to avoid rebuilds if 'git' is updated.

Done.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 15:42:02 GMT) Full text and rfc822 format available.

Message #134 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 17/22] gnu: Add erlang-covertool.
Date: Sat, 9 Apr 2022 17:40:54 +0200
Am 09.04.22 um 13:48 schrieb Maxime Devos:
> What is ‘cover data’?

Rephrased into „Convert Erlang code-coverage data generated by @code{cover}
into Cobertura XML reports“

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 15:51:02 GMT) Full text and rfc822 format available.

Message #137 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 19/22] gnu: Add rebar3-raw-deps.
Date: Sat, 9 Apr 2022 17:50:23 +0200
Am 09.04.22 um 13:49 schrieb Maxime Devos:
> The synopsis and description are practically identical here.  What is a
> ‘raw’ depency?  How does someone know if "raw" dependencies might be
> useful for their purposes?

„raw deps” are non-OTP applications.

Rephrased into „This plugin provides support for handling non-OTP 
applications as a dependent libraries“.

(That's all I can tell based on the Readme and from trying to understand 
the code.)

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 16:02:02 GMT) Full text and rfc822 format available.

Message #140 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 9 Apr 2022 18:01:49 +0200
Am 09.04.22 um 13:58 schrieb Maxime Devos:
> Would it possible to detect if a package is a library or a tool, and if
> it's the latter, drop the "erlang-" prefix automatically (and move
> propagated-inputs to inputs)?

Good idea! This would indeed be cool and supportive for the packager. 
Anyhow, AFAIK the meta-data does not provide such information. (Just 
double-checked with https://hex.pm/api/packages/ejabberd and one of the 
releases there.)

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 16:05:02 GMT) Full text and rfc822 format available.

Message #143 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sat, 9 Apr 2022 18:04:05 +0200
Am 09.04.22 um 15:16 schrieb Maxime Devos:
> This patch seems out-of-order.  Wouldn't rebar3-build-system need to be
> added before packages using rebar3-build-system?

However you like. Just tell me.

Since the rebar3 build-system requires rebar3, any way round results in 
a hen-and-egg-problem.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 16:30:03 GMT) Full text and rfc822 format available.

Message #146 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sat, 9 Apr 2022 18:28:58 +0200
Am 09.04.22 um 15:19 schrieb Maxime Devos:
> (standard-packages) needs to be in 'build-inputs', at least according
> to 'lower' in (guix build-system gnu).

Build-systems are inconsistent here: texlive, ruby, python have them in 
host-inputs. gnu, cmake, qt have them in build-inputs. Seems like thus 
generating platform independent code tend to have it in host, the others 
in build.

Can you elaborate the criteria which to choose? (I also just created 
https://issues.guix.gnu.org/54820 for this)

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 16:32:02 GMT) Full text and rfc822 format available.

Message #149 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 9 Apr 2022 18:31:02 +0200
Am 09.04.22 um 13:52 schrieb Maxime Devos:
> There is (currently) no Guix code written in Emacs Lisp.  Do you mean
> #f instead of #nil?

Actually its 'null. Fixed.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 16:51:01 GMT) Full text and rfc822 format available.

Message #152 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sat, 9 Apr 2022 18:50:15 +0200
[Message part 1 (text/plain, inline)]
Am 09.04.22 um 13:55 schrieb Maxime Devos:
> This procedure 'maybe-inputs', or at least a similar procedure, already
> seems to exist in (guix import utils).

Thanks for this hint.

Unfortunately that return „old-style“ inputs:

  (inputs
   `(("erlang-base64url" ,erlang-base64url)


-- 
Regards
Hartmut Goebel

| Hartmut Goebel          |h.goebel <at> crazy-compilers.com                |
|www.crazy-compilers.com  | compilers which you thought are impossible |
[Message part 2 (text/html, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 17:58:02 GMT) Full text and rfc822 format available.

Message #155 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sat, 09 Apr 2022 19:57:38 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op za 09-04-2022 om 18:28 [+0200]:
> Am 09.04.22 um 15:19 schrieb Maxime Devos:
> > (standard-packages) needs to be in 'build-inputs', at least according
> > to 'lower' in (guix build-system gnu).
> 
> Build-systems are inconsistent here: texlive, ruby, python have them in 
> host-inputs. gnu, cmake, qt have them in build-inputs. Seems like thus 
> generating platform independent code tend to have it in host,

ruby and python are, from Guix POV, not platform-independent code, as
they may have baked-in references to platform-specific binaries.
Their build systems don't support cross-compilation yet though ...

>  the others 
> in build.
> 
> Can you elaborate the criteria which to choose? (I also just created 
> https://issues.guix.gnu.org/54820 for this)

Always build-inputs -- some of the not-yet-cross-compiling build
systems do it different, but maybe they will gain cross-compilation
someday, and to do that, (standard-packages) needs to be in the right
place!  I've added some info to <https://issues.guix.gnu.org/54820>.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sat, 09 Apr 2022 20:57:02 GMT) Full text and rfc822 format available.

Message #158 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sat, 09 Apr 2022 22:56:17 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op za 09-04-2022 om 18:04 [+0200]:
> Am 09.04.22 um 15:16 schrieb Maxime Devos:
> > This patch seems out-of-order.  Wouldn't rebar3-build-system need to be
> > added before packages using rebar3-build-system?
> 
> However you like. Just tell me.
> 
> Since the rebar3 build-system requires rebar3, any way round results in 
> a hen-and-egg-problem.
> 

Oh right.  I would do the rebar3 build-system before rebar3.  Then the
packages stil cannot be for quite a few commit, but at there won't be
'Unbound variable: rebar3-build-system’ errors when doing a bisection
with git.

The guix-data-service might still not like it though, so CC'ing cbaines
for input.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 10:28:01 GMT) Full text and rfc822 format available.

Message #161 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 03/22] gnu: Add erlang-certifi.
Date: Sun, 10 Apr 2022 12:27:15 +0200
Am 09.04.22 um 13:39 schrieb Maxime Devos:
> Can this bundle be built from 'nss-certs', such that when nss-certs is
> updated (e.g. Mozilla revokes a root certificate due to reasons),
> erlang-certifi is up-to-date as well?

This package is a sibling of python-certifi [1] and 
go-github-com-certifi-gocertifi. All these contain a copy of the/a CA 
bundle — which is the idea of these packages: „useful for systems that 
do not have CA bundles“. So they intentionally do not honor 
SSL_CERT_DIR/…. They are meant to be used as fall-back for 
libraries/applications honoring SSL_CERT_DIR/….

Neither python-certifi nor gocertifi build on nss-cert. Addind some 
update mechanism into the Guix package is not a good idea IMO: This 
would make “erlang-certif <at> 2.9.0“ contain different certificates than the 
release 2.9.0, making debugging a hell.

> As such, can this package be avoided as dependency?
As of now, rebar3 does not support SSL_CERT_DIR/…. Anyhow there is 
already an open ticket [3] for.

Other libraries/application might still need erlang-certifi, like some 
need python-certifi or gocertif. So anyhow we should keep this package.

[1] https://github.com/certifi/python-certifi
[2] https://github.com/certifi/gocertifi
[3] https://github.com/erlang/rebar3/issues/2696

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |]





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 10:37:02 GMT) Full text and rfc822 format available.

Message #164 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sun, 10 Apr 2022 12:36:41 +0200
Am 09.04.22 um 14:07 schrieb Maxime Devos:
>  From what I've gathered, with-http-server and the like is preferred
> above mocking, though with-http-server might need to be extended first
> to allow checking the URL (see<https://issues.guix.gnu.org/53389>).

Since this issue is stale (and referring to another stale issue). And I 
don't want to block this patch series by stale issues.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 11:23:02 GMT) Full text and rfc822 format available.

Message #167 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sun, 10 Apr 2022 13:22:01 +0200
[Message part 1 (text/plain, inline)]
Am 09.04.22 um 13:59 schrieb Maxime Devos:
> WOuld 'alist->package' be useful here?

Thanks for pointing me to that. Unfortunately, since records are used 
here (not alists) and since „alist->package“ expects the licenses to be 
an alist, too, the code using „alist->package“ would be quite ugly.

Your tip brought me to „package->code“. Sadly I dif not get this to 
work: I failed converting

         ,@(maybe-inputs (dependencies->package-names dependencies) 'inputs)

into the unquoted form.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          |h.goebel <at> crazy-compilers.com                |
|www.crazy-compilers.com  | compilers which you thought are impossible |
[Message part 2 (text/html, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 12:27:02 GMT) Full text and rfc822 format available.

Message #170 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 01/22] import: Add hex.pm importer.
Date: Sun, 10 Apr 2022 14:26:44 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op zo 10-04-2022 om 12:36 [+0200]:
> Am 09.04.22 um 14:07 schrieb Maxime Devos:
> >   From what I've gathered, with-http-server and the like is preferred
> > above mocking, though with-http-server might need to be extended first
> > to allow checking the URL (see<https://issues.guix.gnu.org/53389>).
> 
> Since this issue is stale (and referring to another stale issue). And I 
> don't want to block this patch series by stale issues.

Ok.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:48:01 GMT) Full text and rfc822 format available.

Message #173 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sun, 10 Apr 2022 20:47:05 +0200
Am 09.04.22 um 19:57 schrieb Maxime Devos:
> Always build-inputs

Done.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:50:02 GMT) Full text and rfc822 format available.

Message #176 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v3 22/22] build-system: Add
 'rebar3-build-system'.
Date: Sun, 10 Apr 2022 20:49:19 +0200
Am 09.04.22 um 22:56 schrieb Maxime Devos:
> Oh right.  I would do the rebar3 build-system before rebar3.  Then the
> packages stil cannot be for quite a few commit, but at there won't be
> 'Unbound variable: rebar3-build-system’ errors when doing a bisection
> with git.

Good point. Changed.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:02 GMT) Full text and rfc822 format available.

Message #179 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 00/22] Add importer for hex.pm and rebar3 build-system for
 Erlang
Date: Sun, 10 Apr 2022 20:57:19 +0200
Thanks to Maxime Devos for the review of V3. Do ease review for other
reviewers, here is a complete set of updated patches, incorporating Maxime's
comments.

Cover text from v3:

this is an updated version of #42180 and #51061 (both are closed
already). Notable changes are:

* the „extracting downloader“ and „hexpm-fetch” are gone

* documentation added for both the importer and the rebar3-build-system

* tests added for the importer

Some remarks on the patches:

* First patch adds a file guix/hexpm-download.scm, containing
  definitions for the hex.pm repository. These are combined in
  this module here since different build-systems (will) use it.

* The importer tries to detect the build system to be used. For Elexir
  packages it creates package definitions using the “mix-build-system‘. This I
  will add later (WIP).

* Next there patches provide the packages required rebar3, rebar3 itself and
  some plugins for rebar3.

Open question:

* Shall the build system actually be called „rebar*3*“ or just „rebar“? There
  is also a build-tool „rebar2“, which is obsoltete and not supported by this
  build-system. Anyhow, somewhen in the future there might be some „rebar4“,
  which we might be able to cover with the same build-system. WDYT?

Hartmut Goebel (22):
  import: Add hex.pm importer.
  build-system: Add 'rebar3-build-system'.
  gnu: Add erlang-cf.
  gnu: Add erlang-certifi.
  gnu: Add erlang-erlware-commons.
  gnu: Add erlang-cth-readable.
  gnu: Add erlang-bbmustache.
  gnu: Add erlang-getopt.
  gnu: Add erlang-eunit-formatters.
  gnu: Add erlang-providers.
  gnu: Add erlang-parse-trans.
  gnu: Add erlang-hex-core.
  gnu: Add erlang-ssl-verify-fun.
  gnu: Add erlang-relx.
  gnu: Add erlang-edown.
  gnu: Add erlang-jsone.
  gnu: Add erlang-proper.
  gnu: Add erlang-covertool.
  gnu: Add rebar3.
  gnu: Add rebar3-raw-deps.
  gnu: Add rebar3-git-vsn.
  gnu: Add rebar3-proper.

 Makefile.am                        |   5 +
 doc/guix.texi                      |  70 +++-
 gnu/packages/erlang.scm            | 493 +++++++++++++++++++++++++++++
 guix/build-system/rebar3.scm       | 143 +++++++++
 guix/build/rebar3-build-system.scm | 147 +++++++++
 guix/hexpm-download.scm            |  40 +++
 guix/import/hexpm.scm              | 347 ++++++++++++++++++++
 guix/scripts/import.scm            |   2 +-
 guix/scripts/import/hexpm.scm      | 109 +++++++
 guix/upstream.scm                  |   1 +
 tests/hexpm.scm                    | 257 +++++++++++++++
 11 files changed, 1612 insertions(+), 2 deletions(-)
 create mode 100644 guix/build-system/rebar3.scm
 create mode 100644 guix/build/rebar3-build-system.scm
 create mode 100644 guix/hexpm-download.scm
 create mode 100644 guix/import/hexpm.scm
 create mode 100644 guix/scripts/import/hexpm.scm
 create mode 100644 tests/hexpm.scm

-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:02 GMT) Full text and rfc822 format available.

Message #182 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 02/22] build-system: Add 'rebar3-build-system'.
Date: Sun, 10 Apr 2022 20:57:00 +0200
* guix/build-system/rebar3.scm, guix/build/rebar3-build-system.scm: New files.
* Makefile.am (MODULES): Add them.
---
 Makefile.am                        |   2 +
 doc/guix.texi                      |  41 ++++++++
 guix/build-system/rebar3.scm       | 143 ++++++++++++++++++++++++++++
 guix/build/rebar3-build-system.scm | 147 +++++++++++++++++++++++++++++
 4 files changed, 333 insertions(+)
 create mode 100644 guix/build-system/rebar3.scm
 create mode 100644 guix/build/rebar3-build-system.scm

diff --git a/Makefile.am b/Makefile.am
index 46481dac2c..e2321d1098 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -164,6 +164,7 @@ MODULES =					\
   guix/build-system/waf.scm			\
   guix/build-system/r.scm			\
   guix/build-system/rakudo.scm			\
+  guix/build-system/rebar3.scm			\
   guix/build-system/ruby.scm			\
   guix/build-system/scons.scm			\
   guix/build-system/texlive.scm			\
@@ -217,6 +218,7 @@ MODULES =					\
   guix/build/r-build-system.scm			\
   guix/build/renpy-build-system.scm			\
   guix/build/rakudo-build-system.scm		\
+  guix/build/rebar3-build-system.scm		\
   guix/build/ruby-build-system.scm		\
   guix/build/scons-build-system.scm		\
   guix/build/texlive-build-system.scm		\
diff --git a/doc/guix.texi b/doc/guix.texi
index 6c17b26d70..518fabf48d 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -8717,6 +8717,47 @@ with @code{#:zef} or removed by passing @code{#f} to the
 @code{with-zef?} parameter.
 @end defvr
 
+@defvr {Scheme Variable} rebar3-build-system
+This variable is exported by @code{(guix build-system rebar3)}.  It
+implements a build procedure around @code{rebar3}.
+
+It adds both @code{rebar3} and the @code{erlang} to the set of inputs.
+Different packages can be specified with the @code{#:rebar} and
+@code{#:erlang} parameters, respectively.
+
+This build system is based on @code{gnu-build-system}, but with the
+following phases changed:
+
+@table @code
+
+@item unpack
+This phase, after unpacking the source like the @code{gnu-build-system}
+does, checks for a file @code{contents.tar.gz} at the top-level of the
+source.  If this file exists, it will be unpacked, too.  This eases
+handling of package hosted by @i{hex.pm}.
+
+@item bootstrap
+@item configure
+There are no @code{bootstrap} and @code{configure} phase because erlang
+packages typically don’t need to be configured.
+
+@item build
+This phase runs @code{rebar3 compile}
+with the flags listed in @code{#:rebar-flags}.
+
+@item check
+Unless @code{#:tests? #f} is passed,
+this phase runs @code{rebar3 eunit},
+or some other target specified with @code{#:test-target},
+with the flags listed in @code{#:rebar-flags},
+
+@item install
+This installs the files created in the @i{default} profile, or some
+other profile specified with @code{#:install-profile}.
+
+@end table
+@end defvr
+
 @defvr {Scheme Variable} texlive-build-system
 This variable is exported by @code{(guix build-system texlive)}.  It is
 used to build TeX packages in batch mode with a specified engine.  The
diff --git a/guix/build-system/rebar3.scm b/guix/build-system/rebar3.scm
new file mode 100644
index 0000000000..753dcf0989
--- /dev/null
+++ b/guix/build-system/rebar3.scm
@@ -0,0 +1,143 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
+;;; Copyright © 2020 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix build-system rebar3)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix monads)
+  #:use-module (guix search-paths)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module ((guix hexpm-download) #:select (hexpm-uri) #:prefix dl:)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-26)
+  #:export (hexpm-uri
+            %rebar3-build-system-modules
+            rebar3-build
+            rebar3-build-system))
+
+;;
+;; Standard build procedure for Erlang packages using Rebar3.
+;;
+
+(define hexpm-uri dl:hexpm-uri)
+
+(define %rebar3-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build rebar3-build-system)
+    ,@%gnu-build-system-modules))
+
+(define (default-rebar3)
+  "Return the default Rebar3 package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((erlang-mod (resolve-interface '(gnu packages erlang))))
+    (module-ref erlang-mod 'rebar3)))
+
+(define (default-erlang)
+  "Return the default Erlang package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((erlang-mod (resolve-interface '(gnu packages erlang))))
+    (module-ref erlang-mod 'erlang)))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (rebar (default-rebar3))
+                (erlang (default-erlang))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME from the given arguments."
+  (define private-keywords
+    '(#:target #:rebar #:erlang #:inputs #:native-inputs))
+
+  (and (not target)                               ;XXX: no cross-compilation
+       (bag
+         (name name)
+         (system system)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs))
+         (build-inputs `(("rebar" ,rebar)
+                         ("erlang" ,erlang) ;; for escriptize
+                         ,@native-inputs
+                         ;; Keep the standard inputs of 'gnu-build-system'.
+                         ,@(standard-packages)))
+         (outputs outputs)
+         (build rebar3-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (rebar3-build name inputs
+                       #:key
+                       guile source
+                       (rebar-flags ''("skip_deps=true" "-vv"))
+                       (tests? #t)
+                       (test-target "eunit")
+                       ;; TODO: install-name  ; default: based on guix package name
+                       (install-profile "default")
+                       (phases '(@ (guix build rebar3-build-system)
+                                   %standard-phases))
+                       (outputs '("out"))
+                       (search-paths '())
+                       (native-search-paths '())
+                       (system (%current-system))
+                       (imported-modules %rebar3-build-system-modules)
+                       (modules '((guix build rebar3-build-system)
+                                  (guix build utils))))
+  "Build SOURCE with INPUTS."
+
+  (define builder
+    (with-imported-modules imported-modules
+      #~(begin
+          (use-modules #$@(sexp->gexp modules))
+
+          #$(with-build-variables inputs outputs
+              #~(rebar3-build #:source #+source
+                      #:system #$system
+                      #:name #$name
+                      #:rebar-flags #$rebar-flags
+                      #:tests? #$tests?
+                      #:test-target #$test-target
+                      ;; TODO: #:install-name #$install-name
+                      #:install-profile #$install-profile
+                      #:phases #$(if (pair? phases)
+                                     (sexp->gexp phases)
+                                     phases)
+                      #:outputs %outputs
+                      #:search-paths '#$(sexp->gexp
+                                         (map search-path-specification->sexp
+                                              search-paths))
+                      #:inputs %build-inputs)))))
+
+  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+                                                  system #:graft? #f)))
+    ;; Note: Always pass #:graft? #f.  Without it, ALLOWED-REFERENCES &
+    ;; co. would be interpreted as referring to grafted packages.
+    (gexp->derivation name builder
+                      #:system system
+                      #:target #f
+                      #:graft? #f
+                      #:guile-for-build guile)))
+
+(define rebar3-build-system
+  (build-system
+    (name 'rebar3)
+    (description "The standard Rebar3 build system")
+    (lower lower)))
diff --git a/guix/build/rebar3-build-system.scm b/guix/build/rebar3-build-system.scm
new file mode 100644
index 0000000000..ae18538ed3
--- /dev/null
+++ b/guix/build/rebar3-build-system.scm
@@ -0,0 +1,147 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016, 2018 Ricardo Wurmus <rekado <at> elephly.net>
+;;; Copyright © 2019 Björn Höfling <bjoern.hoefling <at> bjoernhoefling.de>
+;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix build rebar3-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module ((guix build utils) #:hide (delete))
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 ftw)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (rebar3-build
+            %standard-phases))
+
+;;
+;; Builder-side code of the standard build procedure for Erlang packages using
+;; rebar3.
+;;
+;; TODO: Think about whether bindir ("ebin"), libdir ("priv") and includedir
+;; "(include") need to be configurable
+
+(define %erlang-libdir "/lib/erlang/lib")
+
+(define* (erlang-depends #:key inputs #:allow-other-keys)
+  (define input-directories
+    (match inputs
+      (((_ . dir) ...)
+       dir)))
+  (mkdir-p "_checkouts")
+
+  (for-each
+   (lambda (input-dir)
+     (let ((elibdir (string-append input-dir %erlang-libdir)))
+       (when (directory-exists? elibdir)
+         (for-each
+          (lambda (dirname)
+            (let ((dest (string-append elibdir "/" dirname))
+                  (link (string-append "_checkouts/" dirname)))
+              (when (not (file-exists? link))
+                ;; RETHINK: Maybe better copy and make writable to avoid some
+                ;; error messages e.g. when using with rebar3-git-vsn.
+                (symlink dest link))))
+          (list-directories elibdir)))))
+   input-directories))
+
+(define* (unpack #:key source #:allow-other-keys)
+  "Unpack SOURCE in the working directory, and change directory within the
+source.  When SOURCE is a directory, copy it in a sub-directory of the current
+working directory."
+  (let ((gnu-unpack (assoc-ref gnu:%standard-phases 'unpack)))
+    (gnu-unpack #:source source)
+    ;; Packages from hex.pm typically have a contents.tar.gz containing the
+    ;; actual source. If this tar file exists, extract it.
+    (when (file-exists? "contents.tar.gz")
+      (invoke "tar" "xvf" "contents.tar.gz"))))
+
+(define* (build #:key (rebar-flags '()) #:allow-other-keys)
+  (apply invoke `("rebar3" "compile" ,@rebar-flags)))
+
+(define* (check #:key target (rebar-flags '()) (tests? (not target))
+                (test-target "eunit")
+                #:allow-other-keys)
+  (if tests?
+      (apply invoke `("rebar3" ,test-target ,@rebar-flags))
+      (format #t "test suite not run~%")))
+
+(define (erlang-package? name)
+  "Check if NAME correspond to the name of an Erlang package."
+  (string-prefix? "erlang-" name))
+
+(define (package-name-version->erlang-name name+ver)
+  "Convert the Guix package NAME-VER to the corresponding Erlang name-version
+format.  Essentially drop the prefix used in Guix and replace dashes by
+underscores."
+  (let* ((name- (package-name->name+version name+ver)))
+    (string-join
+     (string-split
+      (if (erlang-package? name-)  ; checks for "erlang-" prefix
+          (string-drop name- (string-length "erlang-"))
+          name-)
+      #\-)
+     "_")))
+
+(define (list-directories directory)
+  "Return file names of the sub-directory of DIRECTORY."
+  (scandir directory
+           (lambda (file)
+             (and (not (member file '("." "..")))
+                  (file-is-directory? (string-append directory "/" file))))))
+
+(define* (install #:key name outputs
+                  (install-name (package-name-version->erlang-name name))
+                  (install-profile "default") ; build profile outputs to install
+                  #:allow-other-keys)
+  (let* ((out (assoc-ref outputs "out"))
+         (pkg-dir (string-append out %erlang-libdir "/" install-name)))
+    (let ((bin-dir (string-append "_build/" install-profile "/bin"))
+          (lib-dir (string-append "_build/" install-profile "/lib")))
+      ;; install _build/PROFILE/bin
+      (when (file-exists? bin-dir)
+        (copy-recursively bin-dir out #:follow-symlinks? #t))
+      ;; install _build/PROFILE/lib/*/{ebin,include,priv}
+      (for-each
+       (lambda (*)
+         (for-each
+          (lambda (dirname)
+            (let ((src-dir (string-append lib-dir "/" * "/" dirname))
+                  (dst-dir (string-append pkg-dir "/" dirname)))
+              (when (file-exists? src-dir)
+                (copy-recursively src-dir dst-dir #:follow-symlinks? #t))
+              (false-if-exception
+               (delete-file (string-append dst-dir "/.gitignore")))))
+          '("ebin" "include" "priv")))
+       (list-directories lib-dir))
+      (false-if-exception
+       (delete-file (string-append pkg-dir "/priv/Run-eunit-loop.expect"))))))
+
+(define %standard-phases
+  (modify-phases gnu:%standard-phases
+    (replace 'unpack unpack)
+    (delete 'bootstrap)
+    (delete 'configure)
+    (add-before 'build 'erlang-depends erlang-depends)
+    (replace 'build build)
+    (replace 'check check)
+    (replace 'install install)))
+
+(define* (rebar3-build #:key inputs (phases %standard-phases)
+                       #:allow-other-keys #:rest args)
+  "Build the given Erlang package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:03 GMT) Full text and rfc822 format available.

Message #185 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 01/22] import: Add hex.pm importer.
Date: Sun, 10 Apr 2022 20:56:59 +0200
hex.pm is a package repository for Erlang and Elixir.

* guix/scripts/import.scm (importers): Add "hexpm".
* guix/scripts/import/hexpm.scm, guix/import/hexpm.scm,
  guix/hexpm-download.scm: New files.
* guix/import/utils.scm (source-spec->object): Add "hexpm-fetch" to list of
  fetch methods.
* guix/upstream.scm (package-update/hexpm-fetch): New function.
  (%method-updates) Add it.
* Makefile.am: Add them.
---
 Makefile.am                   |   3 +
 doc/guix.texi                 |  29 ++-
 guix/hexpm-download.scm       |  40 ++++
 guix/import/hexpm.scm         | 347 ++++++++++++++++++++++++++++++++++
 guix/scripts/import.scm       |   2 +-
 guix/scripts/import/hexpm.scm | 109 +++++++++++
 guix/upstream.scm             |   1 +
 tests/hexpm.scm               | 257 +++++++++++++++++++++++++
 8 files changed, 786 insertions(+), 2 deletions(-)
 create mode 100644 guix/hexpm-download.scm
 create mode 100644 guix/import/hexpm.scm
 create mode 100644 guix/scripts/import/hexpm.scm
 create mode 100644 tests/hexpm.scm

diff --git a/Makefile.am b/Makefile.am
index aedb514ee1..46481dac2c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -100,6 +100,7 @@ MODULES =					\
   guix/git-download.scm				\
   guix/hg-download.scm				\
   guix/hash.scm					\
+  guix/hexpm-download.scm			\
   guix/swh.scm					\
   guix/monads.scm				\
   guix/monad-repl.scm				\
@@ -263,6 +264,7 @@ MODULES =					\
   guix/import/gnu.scm				\
   guix/import/go.scm				\
   guix/import/hackage.scm			\
+  guix/import/hexpm.scm				\
   guix/import/json.scm				\
   guix/import/kde.scm				\
   guix/import/launchpad.scm   			\
@@ -311,6 +313,7 @@ MODULES =					\
   guix/scripts/import/gnu.scm			\
   guix/scripts/import/go.scm			\
   guix/scripts/import/hackage.scm		\
+  guix/scripts/import/hexpm.scm			\
   guix/scripts/import/json.scm  		\
   guix/scripts/import/minetest.scm  		\
   guix/scripts/import/opam.scm			\
diff --git a/doc/guix.texi b/doc/guix.texi
index e8ef4286be..6c17b26d70 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -48,7 +48,7 @@ Copyright @copyright{} 2017 Thomas Danckaert@*
 Copyright @copyright{} 2017 humanitiesNerd@*
 Copyright @copyright{} 2017, 2021 Christine Lemmer-Webber@*
 Copyright @copyright{} 2017, 2018, 2019, 2020, 2021, 2022 Marius Bakke@*
-Copyright @copyright{} 2017, 2019, 2020 Hartmut Goebel@*
+Copyright @copyright{} 2017, 2019, 2020, 2022 Hartmut Goebel@*
 Copyright @copyright{} 2017, 2019, 2020, 2021 Maxim Cournoyer@*
 Copyright @copyright{} 2017–2022 Tobias Geerinckx-Rice@*
 Copyright @copyright{} 2017 George Clemmer@*
@@ -12817,6 +12817,33 @@ guix import egg arrays@@1.0
 @end example
 
 Additional options include:
+@table @code
+@item --recursive
+@itemx -r
+Traverse the dependency graph of the given upstream package recursively
+and generate package expressions for all those packages that are not yet
+in Guix.
+@end table
+
+@item hexpm
+@cindex hexpm
+Import metadata from the hex.pm Erlang and Elixir package repository
+@uref{https://hex.pm, hex.pm}, as in this example:
+
+@example
+guix import hexpm stun
+@end example
+
+The importer tries to determine the build system used by the package.
+
+The hexpm importer also allows you to specify a version string:
+
+@example
+guix import hexpm cf@@0.3.0
+@end example
+
+Additional options include:
+
 @table @code
 @item --recursive
 @itemx -r
diff --git a/guix/hexpm-download.scm b/guix/hexpm-download.scm
new file mode 100644
index 0000000000..e2f0eb22a8
--- /dev/null
+++ b/guix/hexpm-download.scm
@@ -0,0 +1,40 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix hexpm-download)
+  #:use-module (srfi srfi-26)
+  #:export (hexpm-package-url
+            hexpm-uri))
+
+;;;
+;;; Definitions for the hex.pm repository,
+;;; combined here since different build-systems use it.
+;;;
+
+;; URL and paths from
+;; https://github.com/hexpm/specifications/blob/master/endpoints.md
+(define %hexpm-repo-url
+  (make-parameter "https://repo.hex.pm"))
+
+(define hexpm-package-url
+  (string-append (%hexpm-repo-url) "/tarballs/"))
+
+(define (hexpm-uri name version)
+  "Return a URI string for the package hosted at hex.pm corresponding to NAME
+and VERSION."
+  (string-append hexpm-package-url name "-" version ".tar"))
diff --git a/guix/import/hexpm.scm b/guix/import/hexpm.scm
new file mode 100644
index 0000000000..39ac9ed5db
--- /dev/null
+++ b/guix/import/hexpm.scm
@@ -0,0 +1,347 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Cyril Roelandt <tipecaml <at> gmail.com>
+;;; Copyright © 2016 David Craven <david <at> craven.ch>
+;;; Copyright © 2017, 2019-2021 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2019 Martin Becze <mjbecze <at> riseup.net>
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer <at> gmail.com>
+;;; Copyright © 2020-2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix import hexpm)
+  #:use-module (guix base32)
+  #:use-module ((guix download) #:prefix download:)
+  #:use-module (guix hexpm-download)
+  #:use-module (gcrypt hash)
+  #:use-module (guix http-client)
+  #:use-module (json)
+  #:use-module (guix import utils)
+  #:use-module ((guix import json) #:select (json-fetch))
+  #:use-module ((guix build utils)
+                #:select ((package-name->name+version
+                           . hyphen-package-name->name+version)
+                          dump-port))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix monads)
+  #:use-module (guix packages)
+  #:use-module (guix upstream)
+  #:use-module (guix utils)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 regex)
+  #:use-module (ice-9 popen)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-2)
+  #:use-module (srfi srfi-26)
+  #:export (hexpm->guix-package
+            guix-package->hexpm-name
+            strings->licenses   ;;  why used here?
+            hexpm-recursive-import
+            %hexpm-updater))
+
+;;;
+;;; Interface to https://hex.pm/api, version 2.
+;;; REST-API end-points:
+;;;   https://github.com/hexpm/specifications/blob/master/apiary.apib
+;;; Repository end-points:
+;;;   https://github.com/hexpm/specifications/blob/master/endpoints.md
+;;;
+
+(define %hexpm-api-url
+  (make-parameter "https://hex.pm/api"))
+
+(define (package-url name)
+  (string-append (%hexpm-api-url) "/packages/" name))
+
+;;
+;; Hexpm Package. /packages/${name}
+;; https://github.com/hexpm/specifications/blob/master/apiary.apib#Package
+;;
+;; Each package can have several "releases", each of which has its own set of
+;; requirements, build-tool, etc. - see <hexpm-release> below.
+(define-json-mapping <hexpm-pkgdef> make-hexpm-pkgdef hexpm-pkgdef?
+  json->hexpm
+  (name          hexpm-name)                          ; string
+  (html-url      hexpm-html-url      "html_url")      ; string
+  (docs-html-url hexpm-docs-html-url "docs_html_url") ; string | 'null
+  (meta          hexpm-meta "meta" json->hexpm-meta)
+  (versions      hexpm-versions "releases" ; list of <hexpm-version>
+                 (lambda (vector)
+                   (map json->hexpm-version
+                        (vector->list vector))))
+  ;; "latest_version" and "latest_stable_version" are not named in the
+  ;; specification, butt seen in practice.
+  (latest-version hexpm-latest-version "latest_version") ; string
+  (latest-stable  hexpm-latest-stable "latest_stable_version")) ; string
+
+;; Hexpm package metadata.
+(define-json-mapping <hexpm-meta> make-hexpm-meta hexpm-meta?
+  json->hexpm-meta
+  (description hexpm-meta-description)        ;string
+  (licenses    hexpm-meta-licenses "licenses" ;list of strings
+               (lambda (vector)
+                 (or (and vector (vector->list vector))
+                     #f))))
+
+;; Hexpm package versions.
+(define-json-mapping <hexpm-version> make-hexpm-version hexpm-version?
+  json->hexpm-version
+  (number  hexpm-version-number "version")   ;string
+  (url     hexpm-version-url))               ;string
+
+
+(define (lookup-hexpm name)
+  "Look up NAME on hex.pm and return the corresopnding <hexpm> record
+or #f if it was not found."
+  (and=> (json-fetch (package-url name))
+         json->hexpm))
+
+;;
+;; Hexpm release. /packages/${name}/releases/${version}
+;; https://github.com/hexpm/specifications/blob/master/apiary.apib#Release
+;;
+(define-json-mapping <hexpm-release> make-hexpm-release hexpm-release?
+  json->hexpm-release
+  (version hexpm-release-version)  ; string
+  (url     hexpm-release-url)      ; string
+  (meta    hexpm-release-meta "meta" json->hexpm-release-meta)
+  ;; Specification names the next fields "dependencies", but in practice it is
+  ;; "requirements".
+  (dependencies hexpm-requirements "requirements")) ; list of <hexpm-dependency>
+
+;; Hexpm release meta.
+;; https://github.com/hexpm/specifications/blob/main/package_metadata.md
+(define-json-mapping <hexpm-release-meta>
+  make-hexpm-release-meta hexpm-release-meta?
+  json->hexpm-release-meta
+  (app         hexpm-release-meta-app)        ; string
+  (elixir      hexpm-release-meta-elixir)     ; string
+  (build-tools hexpm-release-meta-build-tools "build_tools" ; list of strings
+               (lambda (vector)
+                 (or (and vector (vector->list vector))
+                     (list)))))
+
+;; Hexpm dependency.  Each requirement has information about the required
+;; version, such as "~> 2.1.2" or ">= 2.1.2 and < 2.2.0", see
+;; <https://hexdocs.pm/elixir/Version.html#module-requirements>, and whether
+;; the dependency is optional.
+(define-json-mapping <hexpm-dependency> make-hexpm-dependency
+  hexpm-dependency?
+  json->hexpm-dependency
+  (name        hexpm-dependency-name "app")   ; string
+  (requirement hexpm-dependency-requirement)  ; string
+  (optional    hexpm-dependency-optional))    ; bool
+
+(define (hexpm-release-dependencies release)
+  "Return the list of dependency names of RELEASE, a <hexpm-release>."
+  (let ((reqs (or (hexpm-requirements release) '#())))
+    (map first reqs)))  ;; TODO: also return required version
+
+
+(define (lookup-hexpm-release version*)
+  "Look up RELEASE on hexpm-version-url and return the corresopnding
+<hexpm-release> record or #f if it was not found."
+  (and=> (json-fetch (hexpm-version-url version*))
+         json->hexpm-release))
+
+
+;;;
+;;; Converting hex.pm packages to Guix packages.
+;;;
+
+(define (maybe-inputs package-inputs input-type)
+  "Given a list of PACKAGE-INPUTS, tries to generate the 'inputs' field of a
+package definition.  INPUT-TYPE, a symbol, is used to populate the name of
+the input field."
+  (match package-inputs
+    (()
+     '())
+    ((package-inputs ...)
+     `((,input-type (list ,@package-inputs))))))
+
+(define (dependencies->package-names names)
+  "Given a list of hexpm package NAMES, returns a list of guix package names
+as symbols."
+  ;; TODO: Base name on language of dependency.
+  ;; The language used for implementing the dependency is not know without
+  ;; recursing the dependencies.  So for now assume more packages are based on
+  ;; Erlang and prefix all dependencies with "erlang-" (the default).
+  (map string->symbol
+       (map hexpm-name->package-name
+            (sort names string-ci<?))))
+
+(define* (make-hexpm-sexp #:key name version tarball-url
+                          home-page synopsis description license
+                          language build-system dependencies
+                          #:allow-other-keys)
+  "Return the `package' s-expression for a hexpm package with the given NAME,
+VERSION, TARBALL-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE. The
+created package's name will stem from LANGUAGE. BUILD-SYSTEM defined the
+build-system, and DEPENDENCIES the inputs for the package."
+  (call-with-temporary-output-file
+   (lambda (temp port)
+     (and (url-fetch tarball-url temp)
+          (values
+       `(package
+         (name ,(hexpm-name->package-name name language))
+         (version ,version)
+         (source (origin
+                   (method url-fetch)
+                   (uri (hexpm-uri ,name version))
+                   (sha256 (base32 ,(guix-hash-url temp)))))
+         (build-system ,build-system)
+         ,@(maybe-inputs (dependencies->package-names dependencies) 'inputs)
+         (synopsis ,synopsis)
+         (description ,(beautify-description description))
+         (home-page ,(match home-page
+                            (() "")
+                            (_ home-page)))
+         (license ,(match license
+                          (() #f)
+                          ((license) license)
+                          (_ `(list ,@license))))))))))
+
+(define (strings->licenses strings)
+  "Convert the list of STRINGS into a list of license objects."
+  (filter-map (lambda (license)
+                (and (not (string-null? license))
+                     (not (any (lambda (elem) (string=? elem license))
+                               '("AND" "OR" "WITH")))
+                     (or (spdx-string->license license)
+                         license)))
+              strings))
+
+(define (hexpm-latest-release package)
+  "Return the version string for the latest stable release of PACKAGE."
+  ;; Use latest-stable if specified (see comment in hexpm-pkgdef above),
+  ;; otherwise compare the lists of release versions.
+  (let ((latest-stable (hexpm-latest-stable package)))
+    (if (not (unspecified? latest-stable))
+        latest-stable
+        (let ((versions (map hexpm-version-number (hexpm-versions package))))
+          (fold (lambda (a b)
+                  (if (version>? a b) a b)) (car versions) versions)))))
+
+(define* (hexpm->guix-package package-name #:key repo version)
+  "Fetch the metadata for PACKAGE-NAME from hexpms.io, and return the
+`package' s-expression corresponding to that package, or #f on failure.
+When VERSION is specified, attempt to fetch that version; otherwise fetch the
+latest version of PACKAGE-NAME."
+
+  (define package
+    (lookup-hexpm package-name))
+
+  (define version-number
+    (and package
+         (or version
+             (hexpm-latest-release package))))
+
+  (define version*
+    (and package
+         (find (lambda (version)
+                 (string=? (hexpm-version-number version)
+                           version-number))
+               (hexpm-versions package))))
+
+  (define release
+    (and package version*
+         (lookup-hexpm-release version*)))
+
+  (define release-meta
+    (and package version*
+         (hexpm-release-meta release)))
+
+  (define build-system
+    (and package version*
+         (let ((build-tools (hexpm-release-meta-build-tools release-meta)))
+           (cond
+            ((member "rebar3" build-tools) 'rebar3-build-system)
+            ((member "mix" build-tools) 'mix-build-system)
+            ((member "make" build-tools) 'gnu-build-system)
+            (else #f)))))
+
+  (define language
+    (and package version*
+         (let ((elixir (hexpm-release-meta-elixir release-meta)))
+           (cond
+            ((and (string? elixir) (not (string-null? elixir))) "elixir")
+            (else "erlang")))))
+
+  (and package version*
+       (let ((dependencies  (hexpm-release-dependencies release))
+             (pkg-meta      (hexpm-meta package))
+             (docs-html-url (hexpm-docs-html-url package)))
+         (values
+          (make-hexpm-sexp
+           #:language language
+           #:build-system build-system
+           #:name package-name
+           #:version version-number
+           #:dependencies dependencies
+           #:home-page (or (and (not (eq? docs-html-url 'null))
+                                docs-html-url)
+                           ;; TODO: Homepage?
+                           (hexpm-html-url package))
+           #:synopsis (hexpm-meta-description pkg-meta)
+           #:description (hexpm-meta-description pkg-meta)
+           #:license (or (and=> (hexpm-meta-licenses pkg-meta)
+                                strings->licenses))
+           #:tarball-url (hexpm-uri package-name version-number))
+          dependencies))))
+
+(define* (hexpm-recursive-import pkg-name #:optional version)
+  (recursive-import pkg-name
+                    #:version version
+                    #:repo->guix-package hexpm->guix-package
+                    #:guix-name hexpm-name->package-name))
+
+(define (guix-package->hexpm-name package)
+  "Return the hex.pm name of PACKAGE."
+  (define (url->hexpm-name url)
+    (hyphen-package-name->name+version
+     (basename (file-sans-extension url))))
+
+  (match (and=> (package-source package) origin-uri)
+    ((? string? url)
+     (url->hexpm-name url))
+    ((lst ...)
+     (any url->hexpm-name lst))
+    (#f #f)))
+
+(define* (hexpm-name->package-name name #:optional (language "erlang"))
+  (string-append language "-" (string-join (string-split name #\_) "-")))
+
+
+;;;
+;;; Updater
+;;;
+
+(define (latest-release package)
+  "Return an <upstream-source> for the latest release of PACKAGE."
+  (let* ((hexpm-name (guix-package->hexpm-name package))
+         (hexpm      (lookup-hexpm hexpm-name))
+         (version    (hexpm-latest-release hexpm))
+         (url        (hexpm-uri hexpm-name version)))
+    (upstream-source
+     (package (package-name package))
+     (version version)
+     (urls (list url)))))
+
+(define %hexpm-updater
+  (upstream-updater
+   (name 'hexpm)
+   (description "Updater for hex.pm packages")
+   (pred (url-prefix-predicate hexpm-package-url))
+   (latest latest-release)))
diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm
index 40fa6759ae..aaadad4adf 100644
--- a/guix/scripts/import.scm
+++ b/guix/scripts/import.scm
@@ -79,7 +79,7 @@ rather than \\n."
 ;;;
 
 (define importers '("gnu" "pypi" "cpan" "hackage" "stackage" "egg" "elpa"
-                    "gem" "go" "cran" "crate" "texlive" "json" "opam"
+                    "gem" "go" "cran" "crate" "texlive" "json" "opam" "hexpm"
                     "minetest"))
 
 (define (resolve-importer name)
diff --git a/guix/scripts/import/hexpm.scm b/guix/scripts/import/hexpm.scm
new file mode 100644
index 0000000000..b49d263f9e
--- /dev/null
+++ b/guix/scripts/import/hexpm.scm
@@ -0,0 +1,109 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014 David Thompson <davet <at> gnu.org>
+;;; Copyright © 2016 David Craven <david <at> craven.ch>
+;;; Copyright © 2019 Martin Becze <mjbecze <at> riseup.net>
+;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix scripts import hexpm)
+  #:use-module (guix ui)
+  #:use-module (guix utils)
+  #:use-module (guix scripts)
+  #:use-module (guix import hexpm)
+  #:use-module (guix scripts import)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-11)
+  #:use-module (srfi srfi-37)
+  #:use-module (srfi srfi-71)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 format)
+  #:export (guix-import-hexpm))
+
+
+;;;
+;;; Command-line options.
+;;;
+
+(define %default-options
+  '())
+
+(define (show-help)
+  (display (G_ "Usage: guix import hexpm PACKAGE-NAME
+Import and convert the hex.pm package for PACKAGE-NAME.\n"))
+  (display (G_ "
+  -h, --help             display this help and exit"))
+  (display (G_ "
+  -V, --version          display version information and exit"))
+  (newline)
+  (display (G_ "
+  -r, --recursive        import packages recursively"))
+  (newline)
+  (show-bug-report-information))
+
+(define %options
+  ;; Specification of the command-line options.
+  (cons* (option '(#\h "help") #f #f
+                 (lambda args
+                   (show-help)
+                   (exit 0)))
+         (option '(#\V "version") #f #f
+                 (lambda args
+                   (show-version-and-exit "guix import hexpm")))
+         (option '(#\r "recursive") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'recursive #t result)))
+         %standard-import-options))
+
+
+;;;
+;;; Entry point.
+;;;
+
+(define (guix-import-hexpm . args)
+  (define (parse-options)
+    ;; Return the alist of option values.
+    (parse-command-line args %options (list %default-options)
+                        #:build-options? #f))
+
+  (let* ((opts (parse-options))
+         (args (filter-map (match-lambda
+                            (('argument . value)
+                             value)
+                            (_ #f))
+                           (reverse opts))))
+    (match args
+      ((spec)
+       (with-error-handling
+         (let ((name version (package-name->name+version spec)))
+           (if (assoc-ref opts 'recursive)
+               ;; Recursive import
+               (map (match-lambda
+                     ((and ('package ('name name) . rest) pkg)
+                      `(define-public ,(string->symbol name)
+                         ,pkg))
+                     (_ #f))
+                    (hexpm-recursive-import name version))
+               ;; Single import
+               (let ((sexp (hexpm->guix-package name #:version version)))
+                 (unless sexp
+                   (leave (G_ "failed to download meta-data for package '~a'~%")
+                          spec))
+                 sexp)))))
+      (()
+       (leave (G_ "too few arguments~%")))
+      ((many ...)
+       (leave (G_ "too many arguments~%"))))))
diff --git a/guix/upstream.scm b/guix/upstream.scm
index 6666803a92..b0f77fb7d0 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -464,6 +464,7 @@ SOURCE, an <upstream-source>."
                                         #:key-download key-download)))
          (values version tarball source))))))
 
+
 (define* (package-update/git-fetch store package source #:key key-download)
   "Return the version, checkout, and SOURCE, to update PACKAGE to
 SOURCE, an <upstream-source>."
diff --git a/tests/hexpm.scm b/tests/hexpm.scm
new file mode 100644
index 0000000000..84d126c821
--- /dev/null
+++ b/tests/hexpm.scm
@@ -0,0 +1,257 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 David Thompson <davet <at> gnu.org>
+;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
+;;; Copyright © 2018 Oleg Pykhalov <go.wigust <at> gmail.com>
+;;; Copyright © 2021 Sarah Morgensen <iskarian <at> mgsn.dev>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (test-hexpm)
+  #:use-module (guix import hexpm)
+  #:use-module (guix base32)
+  #:use-module (gcrypt hash)
+  #:use-module (guix tests)
+  #:use-module (srfi srfi-64)
+  #:use-module (ice-9 binary-ports)
+  #:use-module (ice-9 match))
+
+(define test-bla-package
+  "{\"name\": \"bla\",
+    \"html_url\": \"https://hex.pm/packages/bla\",
+    \"docs_html_url\": null,
+    \"meta\": {
+        \"description\": \"A cool package\",
+        \"licenses\": [\"MIT\", \"Apache-2.0\"]
+    },
+    \"releases\": [
+        {\"url\": \"https://hex.pm/api/packages/bla/releases/1.5.0\",
+         \"version\": \"1.5.0\"},
+        {\"url\": \"https://hex.pm/api/packages/bla/releases/1.4.7\",
+         \"version\": \"1.4.7\"}
+    ]
+}")
+
+(define test-bla-release
+  "{
+   \"version\": \"1.5.0\",
+   \"url\": \"https://hex.pm/api/packages/bla/releases/1.5.0\",
+   \"requirements\": {
+     \"blubb\":{\"app\": \"blubb\",
+        \"optional\": false,
+        \"requirement\": \"~>0.3\"
+         },
+     \"fasel\":{\"app\": \"fasel\",
+        \"optional\": false,
+        \"requirement\": \"~>1.0\"
+         }
+   },
+   \"meta\":{ \"build_tools\":[\"mix\", \"make\", \"rebar3\"] }
+ }")
+
+(define test-blubb-package
+  "{\"name\": \"blubb\",
+    \"latest_stable_version\": \"0.3.1\",
+    \"latest_version\": \"0.3.1\",
+    \"html_url\": \"https://hex.pm/packages/blubb\",
+    \"docs_html_url\": null,
+    \"meta\": {
+        \"description\": \"Another cool package\",
+        \"licenses\": [\"MIT\"]
+    },
+    \"releases\": [
+        {\"url\": \"https://hex.pm/api/packages/blubb/releases/0.3.1\",
+         \"version\": \"0.3.1\"},
+        {\"url\": \"https://hex.pm/api/packages/blubb/releases/0.3.0\",
+         \"version\": \"0.3.0\"}
+    ]
+}")
+
+(define test-blubb-release
+  "{
+   \"version\": \"0.3.1\",
+   \"url\": \"https://hex.pm/api/packages/blubb/releases/0.3.1\",
+   \"requirements\": {
+     \"fasel\":{\"app\": \"fasel\",
+        \"optional\": false,
+        \"requirement\": \"~>1.0\"
+         }
+   },
+   \"meta\": { \"build_tools\":[\"mix\"] }
+ }")
+
+(define test-fasel-package
+  "{\"name\": \"fasel\",
+    \"latest_stable_version\": \"1.2.1\",
+    \"latest_version\": \"1.2.1\",
+    \"html_url\": \"https://hex.pm/packages/fasel\",
+    \"docs_html_url\": null,
+    \"meta\": {
+        \"description\": \"Yet another cool package\",
+        \"licenses\": [\"GPL\"]
+    },
+    \"releases\": [
+        {\"url\": \"https://hex.pm/api/packages/fasel/releases/1.2.1\",
+         \"version\": \"1.2.1\"}
+    ]
+}")
+
+(define test-fasel-release
+  "{
+   \"version\": \"1.2.1\",
+   \"url\": \"https://hex.pm/api/packages/fasel/releases/1.2.1\",
+   \"requirements\" :{},
+   \"meta\":{ \"build_tools\":[\"make\"] }
+ }")
+
+(test-begin "hexpm")
+
+(test-assert "hexpm->guix-package"
+  ;; Replace network resources with sample data.
+  (mock ((guix http-client) http-fetch
+         (lambda (url . rest)
+           (match url
+             ("https://hex.pm/api/packages/bla"
+              (values (open-input-string test-bla-package)
+                      (string-length test-bla-package)))
+             ("https://hex.pm/api/packages/bla/releases/1.5.0"
+              (values (open-input-string test-bla-release)
+                      (string-length test-bla-release)))
+             (_ (error "http-fetch got unexpected URL: " url)))))
+  (mock ((guix build download) url-fetch
+         (lambda* (url file-name
+                       #:key
+                       (mirrors '()) verify-certificate?)
+           (with-output-to-file file-name
+             (lambda ()
+               (display
+                (match url
+                  ("https://repo.hex.pm/tarballs/bla-1.5.0.tar"
+                   "source")
+                  (_ (error "url-fetch got unexpected URL: " url))))))))
+    (match (hexpm->guix-package "bla")
+      (('package
+         ('name "erlang-bla")
+         ('version "1.5.0")
+         ('source
+          ('origin
+            ('method 'url-fetch)
+            ('uri ('hexpm-uri "bla" 'version))
+            ('sha256
+             ('base32
+              "0zcl4dgcmqwl1g5xb901pd6dz61r1xgmac9mqlwvh022paa6gks1"))))
+         ('build-system 'rebar3-build-system)
+         ('inputs ('list 'erlang-blubb 'erlang-fasel))
+         ('synopsis "A cool package")
+         ('description "This package provides a cool package")
+         ('home-page "https://hex.pm/packages/bla")
+         ('license ('list 'license:expat 'license:asl2.0)))
+       #t)
+      (x
+       (pk 'fail x #f))))))
+
+(test-assert "hexpm-recursive-import"
+  ;; Replace network resources with sample data.
+  (mock ((guix http-client) http-fetch
+         (lambda (url . rest)
+           (match url
+             ("https://hex.pm/api/packages/bla"
+              (values (open-input-string test-bla-package)
+                      (string-length test-bla-package)))
+             ("https://hex.pm/api/packages/bla/releases/1.5.0"
+              (values (open-input-string test-bla-release)
+                      (string-length test-bla-release)))
+             ("https://hex.pm/api/packages/blubb"
+              (values (open-input-string test-blubb-package)
+                      (string-length test-blubb-package)))
+             ("https://hex.pm/api/packages/blubb/releases/0.3.1"
+              (values (open-input-string test-blubb-release)
+                      (string-length test-blubb-release)))
+             ("https://hex.pm/api/packages/fasel"
+              (values (open-input-string test-fasel-package)
+                      (string-length test-fasel-package)))
+             ("https://hex.pm/api/packages/fasel/releases/1.2.1"
+              (values (open-input-string test-fasel-release)
+                      (string-length test-fasel-release)))
+             (_ (error "http-fetch got unexpected URL: " url)))))
+  (mock ((guix build download) url-fetch
+         (lambda* (url file-name
+                       #:key
+                       (mirrors '()) verify-certificate?)
+           (with-output-to-file file-name
+             (lambda ()
+               (display
+                (match url
+                  ("https://repo.hex.pm/tarballs/bla-1.5.0.tar"
+                   "bla-source")
+                  ("https://repo.hex.pm/tarballs/blubb-0.3.1.tar"
+                   "blubb-source")
+                  ("https://repo.hex.pm/tarballs/fasel-1.2.1.tar"
+                   "fasel-source")
+                  (_ (error "url-fetch got unexpected URL: " url))))))))
+        (match (hexpm-recursive-import "bla")
+          ((('package
+              ('name "erlang-blubb")
+              ('version "0.3.1")
+              ('source
+               ('origin
+                 ('method 'url-fetch)
+                 ('uri ('hexpm-uri "blubb" 'version))
+                 ('sha256
+                  ('base32
+                   "17y88b5y8ld7s1c2bcwwwa04pf1cl4402i9zk3inna221ps3ppj2"))))
+              ('build-system 'mix-build-system)
+              ('inputs ('list 'erlang-fasel))
+              ('synopsis "Another cool package")
+              ('description "Another cool package")
+              ('home-page "https://hex.pm/packages/blubb")
+              ('license 'license:expat))
+            ('package
+              ('name "erlang-fasel")
+              ('version "1.2.1")
+              ('source
+               ('origin
+                 ('method 'url-fetch)
+                 ('uri ('hexpm-uri "fasel" 'version))
+                 ('sha256
+                  ('base32
+                   "1k6d70mxwqgq78jrbr7yqnw187yki74jnagybi7nacrj4a67qjha"))))
+              ('build-system 'gnu-build-system)
+              ('synopsis "Yet another cool package")
+              ('description "Yet another cool package")
+              ('home-page "https://hex.pm/packages/fasel")
+              ('license "GPL"))
+            ('package
+              ('name "erlang-bla")
+              ('version "1.5.0")
+              ('source
+               ('origin
+                 ('method 'url-fetch)
+                 ('uri ('hexpm-uri "bla" 'version))
+                 ('sha256
+                  ('base32
+                   "0d3gj746c4swbb1m6ycylxb239jsavvdcizag6bfbg2aqccxwij8"))))
+              ('build-system 'rebar3-build-system)
+              ('inputs ('list 'erlang-blubb 'erlang-fasel))
+              ('synopsis "A cool package")
+              ('description "This package provides a cool package")
+              ('home-page "https://hex.pm/packages/bla")
+              ('license ('list 'license:expat 'license:asl2.0))))
+           #t)
+          (x
+           (pk 'fail x #f))))))
+
+(test-end "hexpm")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:03 GMT) Full text and rfc822 format available.

Message #188 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 03/22] gnu: Add erlang-cf.
Date: Sun, 10 Apr 2022 20:57:01 +0200
* gnu/packages/erlang.scm (erlang-cf): New variable.
---
 gnu/packages/erlang.scm | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 888a0f4f1e..0b9e89d134 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016, 2017 Pjotr Prins <pjotr.guix <at> thebird.nl>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me <at> tobias.gr>
 ;;; Copyright © 2018 Nikita <nikita <at> n0.is>
+;;; Copyright © 2020-2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>
 ;;; Copyright © 2021 Oskar Köök <oskar <at> maatriks.ee>
 ;;; Copyright © 2021 Cees de Groot <cg <at> evrl.com>
 ;;;
@@ -26,6 +27,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system emacs)
+  #:use-module (guix build-system rebar3)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix packages)
@@ -203,3 +205,20 @@ built-in support for concurrency, distribution and fault tolerance.")
      "This package provides an Emacs major mode for editing Erlang source
 files.")
     (license license:asl2.0)))
+
+(define-public erlang-cf
+  (package
+    (name "erlang-cf")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "cf" version))
+       (sha256
+        (base32 "0wknz4xkqkhgvlx4vx5619p8m65v7g87lfgsvfy04jrsgm28spii"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/project-fifo/cf")
+    (synopsis "Terminal colour helper for Erlang io and io_lib")
+    (description "This package provides a helper library for termial colour
+printing extending the io:format syntax to add colours.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:03 GMT) Full text and rfc822 format available.

Message #191 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 04/22] gnu: Add erlang-certifi.
Date: Sun, 10 Apr 2022 20:57:02 +0200
* gnu/packages/erlang.scm (erlang-certifi): New variable.
---
 gnu/packages/erlang.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 0b9e89d134..02ea0deed1 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -206,6 +206,30 @@ built-in support for concurrency, distribution and fault tolerance.")
 files.")
     (license license:asl2.0)))
 
+(define-public erlang-certifi
+  (package
+    (name "erlang-certifi")
+    (version "2.9.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "certifi" version))
+       (sha256
+        (base32 "0ha6vmf5p3xlbf5w1msa89frhvfk535rnyfybz9wdmh6vdms8v96"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:tests? #f)) ;; have not been updated for latest cert bundle
+    (home-page "https://github.com/certifi/erlang-certifi/")
+    (synopsis "Erlang CA certificate bundle")
+    (description "This Erlang library contains a CA bundle that you can
+reference in your Erlang application.  This is useful for systems that do not
+have CA bundles that Erlang can find itself, or where a uniform set of CAs is
+valuable.
+
+This an Erlang specific port of certifi.  The CA bundle is derived from
+Mozilla's canonical set.")
+    (license license:bsd-3)))
+
 (define-public erlang-cf
   (package
     (name "erlang-cf")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:04 GMT) Full text and rfc822 format available.

Message #194 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 05/22] gnu: Add erlang-erlware-commons.
Date: Sun, 10 Apr 2022 20:57:03 +0200
* gnu/packages/erlang.scm (erlang-erlware-commons): New variable.
---
 gnu/packages/erlang.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 02ea0deed1..98f6a44cb4 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -246,3 +246,30 @@ Mozilla's canonical set.")
     (description "This package provides a helper library for termial colour
 printing extending the io:format syntax to add colours.")
     (license license:expat)))
+
+(define-public erlang-erlware-commons
+  (package
+    (name "erlang-erlware-commons")
+    (version "1.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "erlware_commons" version))
+       (sha256
+        (base32 "18qam9xdzi74wppb0cj4zc8161i0i8djr79z8662m6d276f2jz5m"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-cf))
+    (native-inputs
+     (list git-minimal/fixed))  ;; Required for tests
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'check-setup
+           (lambda _
+             (setenv "TERM" "xterm")))))) ; enable color in logs
+    (home-page "http://erlware.github.io/erlware_commons/")
+    (synopsis "Additional standard library for Erlang")
+    (description "Erlware Commons is an Erlware project focused on all aspects
+of reusable Erlang components.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:04 GMT) Full text and rfc822 format available.

Message #197 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 06/22] gnu: Add erlang-cth-readable.
Date: Sun, 10 Apr 2022 20:57:04 +0200
* gnu/packages/erlang.scm (erlang-cth-readable): New variable.
---
 gnu/packages/erlang.scm | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 98f6a44cb4..a06de3bb87 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -247,6 +247,27 @@ Mozilla's canonical set.")
 printing extending the io:format syntax to add colours.")
     (license license:expat)))
 
+(define-public erlang-cth-readable
+  (package
+    (name "erlang-cth-readable")
+    (version "1.5.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "cth_readable" version))
+       (sha256
+        (base32 "104xgybb6iciy6i28pyyrarqzliddi8kjyq43ajaav7y5si42rb8"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-cf))
+    (arguments
+     `(#:tests? #f)) ;; no test-suite in hex-pm package
+    (home-page "https://github.com/ferd/cth_readable")
+    (synopsis "Common Test hooks for more readable logs for Erlang")
+    (description "This package provides an OTP library to be used for CT log
+outputs you want to be readable around all that noise they contain.")
+    (license license:bsd-3)))
+
 (define-public erlang-erlware-commons
   (package
     (name "erlang-erlware-commons")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:05 GMT) Full text and rfc822 format available.

Message #200 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 07/22] gnu: Add erlang-bbmustache.
Date: Sun, 10 Apr 2022 20:57:05 +0200
* gnu/packages/erlang.scm (erlang-bbmustache): New variable.
---
 gnu/packages/erlang.scm | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index a06de3bb87..c025eb83cd 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -206,6 +206,38 @@ built-in support for concurrency, distribution and fault tolerance.")
 files.")
     (license license:asl2.0)))
 
+(define-public erlang-bbmustache
+  (package
+    (name "erlang-bbmustache")
+    (version "1.12.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "bbmustache" version))
+       (sha256
+        (base32 "0fvvaxdpziygxl30j59g98qkh2n47xlb7w5dfpsm2bfcsnj372v8"))))
+    (build-system rebar3-build-system)
+    (inputs
+     (list erlang-getopt rebar3-git-vsn
+           erlang-edown))  ; for building the docs
+    (arguments
+     `(#:tests? #f ;; requires mustache specification file
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'build-more
+           (lambda _
+             (invoke "rebar3" "as" "dev" "escriptize")))
+         (add-after 'install 'install-escript
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out")))
+               (install-file "_build/dev/bin/bbmustache"
+                             (string-append out "/bin"))))))))
+    (home-page "https://github.com/soranoba/bbmustache/")
+    (synopsis "Binary pattern match Based Mustache template engine for Erlang")
+    (description "This Erlang library provides a Binary pattern match Based
+Mustache template engine")
+    (license license:expat)))
+
 (define-public erlang-certifi
   (package
     (name "erlang-certifi")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:05 GMT) Full text and rfc822 format available.

Message #203 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 08/22] gnu: Add erlang-getopt.
Date: Sun, 10 Apr 2022 20:57:06 +0200
* gnu/packages/erlang.scm (erlang-getopt): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index c025eb83cd..2b4d0bfdc3 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -326,3 +326,20 @@ outputs you want to be readable around all that noise they contain.")
     (description "Erlware Commons is an Erlware project focused on all aspects
 of reusable Erlang components.")
     (license license:expat)))
+
+(define-public erlang-getopt
+  (package
+    (name "erlang-getopt")
+    (version "1.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "getopt" version))
+       (sha256
+        (base32 "09pasi7ki1rivw9sl7xndj5qgjbdqvcscxk83yk85yr28gm9l0m0"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/jcomellas/getopt")
+    (synopsis "Command-line options parser for Erlang")
+    (description "This package provides an Erlang module to parse command line
+arguments using the GNU getopt syntax.")
+    (license license:bsd-3)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:06 GMT) Full text and rfc822 format available.

Message #206 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 09/22] gnu: Add erlang-eunit-formatters.
Date: Sun, 10 Apr 2022 20:57:07 +0200
* gnu/packages/erlang.scm (erlang-eunit-formatters): New variable.
---
 gnu/packages/erlang.scm | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 2b4d0bfdc3..0b4fe327a5 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -327,6 +327,22 @@ outputs you want to be readable around all that noise they contain.")
 of reusable Erlang components.")
     (license license:expat)))
 
+(define-public erlang-eunit-formatters
+  (package
+    (name "erlang-eunit-formatters")
+    (version "0.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "eunit_formatters" version))
+       (sha256
+        (base32 "1jb3hzb216r29x2h4pcjwfmx1k81431rgh5v0mp4x5146hhvmj6n"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/seancribbs/eunit_formatters")
+    (synopsis "Better output for eunit suites")
+    (description "This package provides a better output for Erlang eunits.")
+    (license license:asl2.0)))
+
 (define-public erlang-getopt
   (package
     (name "erlang-getopt")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:06 GMT) Full text and rfc822 format available.

Message #209 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 10/22] gnu: Add erlang-providers.
Date: Sun, 10 Apr 2022 20:57:08 +0200
* gnu/packages/erlang.scm (erlang-providers): New variable.
---
 gnu/packages/erlang.scm | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 0b4fe327a5..351484b5d6 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -359,3 +359,21 @@ of reusable Erlang components.")
     (description "This package provides an Erlang module to parse command line
 arguments using the GNU getopt syntax.")
     (license license:bsd-3)))
+
+(define-public erlang-providers
+  (package
+    (name "erlang-providers")
+    (version "1.9.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "providers" version))
+       (sha256
+        (base32 "05y0kz3xgx77hzn1l05byaisvmk8bgds7c22hrh0a5ba81sfi1yj"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-erlware-commons erlang-getopt))
+    (home-page "https://github.com/tsloughter/providers")
+    (synopsis "Erlang providers library")
+    (description "This package provides an Erlang providers library.")
+    (license license:asl2.0)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:07 GMT) Full text and rfc822 format available.

Message #212 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 11/22] gnu: Add erlang-parse-trans.
Date: Sun, 10 Apr 2022 20:57:09 +0200
* gnu/packages/erlang.scm (erlang-parse-trans): New variable.
---
 gnu/packages/erlang.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 351484b5d6..df6c722f68 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -360,6 +360,29 @@ of reusable Erlang components.")
 arguments using the GNU getopt syntax.")
     (license license:bsd-3)))
 
+(define-public erlang-parse-trans
+  (package
+    (name "erlang-parse-trans")
+    (version "3.4.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "parse_trans" version))
+       (sha256
+        (base32 "16p4c2xjrvz16kzpr9pmcvi6nxq6rwckqi9fp0ksibaxwxn402k2"))))
+    (build-system rebar3-build-system)
+    (inputs
+     (list erlang-getopt))
+    (home-page "https://github.com/uwiger/parse_trans")
+    (synopsis "Parse transform utilities for Erlang")
+    (description "This package captures some useful patterns in parse
+transformation and code generation for Erlang.
+
+For example generating standardized accessor functions for records or
+evaluating an expression at compile-time and substitute the result as a
+compile-time constant.")
+    (license license:asl2.0)))
+
 (define-public erlang-providers
   (package
     (name "erlang-providers")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:07 GMT) Full text and rfc822 format available.

Message #215 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 13/22] gnu: Add erlang-ssl-verify-fun.
Date: Sun, 10 Apr 2022 20:57:11 +0200
* gnu/packages/erlang.scm (erlang-ssl-verify-fun): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 219cc04b05..b151f5c695 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -426,3 +426,20 @@ compile-time constant.")
     (synopsis "Erlang providers library")
     (description "This package provides an Erlang providers library.")
     (license license:asl2.0)))
+
+(define-public erlang-ssl-verify-fun
+  (package
+    (name "erlang-ssl-verify-fun")
+    (version "1.1.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "ssl_verify_fun" version))
+       (sha256
+        (base32 "1026l1z1jh25z8bfrhaw0ryk5gprhrpnirq877zqhg253x3x5c5x"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/deadtrickster/ssl_verify_fun.erl")
+    (synopsis "SSL verification functions for Erlang")
+    (description "This package provides SSL verification functions for
+Erlang.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:08 GMT) Full text and rfc822 format available.

Message #218 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 12/22] gnu: Add erlang-hex-core.
Date: Sun, 10 Apr 2022 20:57:10 +0200
* gnu/packages/erlang.scm (erlang-hex-core): New variable.
---
 gnu/packages/erlang.scm | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index df6c722f68..219cc04b05 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -360,6 +360,32 @@ of reusable Erlang components.")
 arguments using the GNU getopt syntax.")
     (license license:bsd-3)))
 
+(define-public erlang-hex-core
+  (package
+    (name "erlang-hex-core")
+    (version "0.8.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "hex_core" version))
+       (sha256
+        (base32 "06p65hlm29ky03vs3fq3qz6px2ylwp8b0f2y75wdf5cm0kx2332b"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "rebar3" "as" "test" "proper")))))))
+    (inputs
+     (list erlang-proper rebar3-proper))
+    (home-page "https://github.com/hexpm/hex_core")
+    (synopsis "Reference implementation of Hex specifications")
+    (description "This package provides the reference implementation of Hex
+specifications.")
+    (license license:asl2.0)))
+
 (define-public erlang-parse-trans
   (package
     (name "erlang-parse-trans")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:08 GMT) Full text and rfc822 format available.

Message #221 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 14/22] gnu: Add erlang-relx.
Date: Sun, 10 Apr 2022 20:57:12 +0200
* gnu/packages/erlang.scm (erlang-relx): New variable.
---
 gnu/packages/erlang.scm | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index b151f5c695..9c8f61b714 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -427,6 +427,28 @@ compile-time constant.")
     (description "This package provides an Erlang providers library.")
     (license license:asl2.0)))
 
+(define-public erlang-relx
+  (package
+    (name "erlang-relx")
+    (version "4.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "relx" version))
+       (sha256
+        (base32 "02gmfx1vxg9m3mq4njsqhs4972l4nb8m5p1pdcf64g09ccf17y1g"))))
+    (build-system rebar3-build-system)
+    (propagated-inputs
+     (list erlang-bbmustache))
+    (home-page "https://erlware.github.io/relx/")
+    (synopsis "Release assembler for Erlang/OTP Releases")
+    (description "Relx assembles releases for an Erlang/OTP release.  Given a
+release specification and a list of directories in which to search for OTP
+applications it will generate a release output.  That output depends heavily on
+what plugins available and what options are defined, but usually it is simply
+a well configured release directory.")
+    (license license:asl2.0)))
+
 (define-public erlang-ssl-verify-fun
   (package
     (name "erlang-ssl-verify-fun")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:09 GMT) Full text and rfc822 format available.

Message #224 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 15/22] gnu: Add erlang-edown.
Date: Sun, 10 Apr 2022 20:57:13 +0200
* gnu/packages/erlang.scm (erlang-edown): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 9c8f61b714..a8beb7e34c 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -300,6 +300,23 @@ printing extending the io:format syntax to add colours.")
 outputs you want to be readable around all that noise they contain.")
     (license license:bsd-3)))
 
+(define-public erlang-edown
+  (package
+    (name "erlang-edown")
+    (version "0.8.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "edown" version))
+        (sha256
+          (base32 "0ij47gvgs6yfqphj0f54qjzj18crj8y1dsjjlzpp3dp8pscqzbqw"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/uwiger/edown")
+    (synopsis "Markdown extension for EDoc")
+    (description "This package provides an extension for EDoc for generating
+Markdown.")
+    (license license:asl2.0)))
+
 (define-public erlang-erlware-commons
   (package
     (name "erlang-erlware-commons")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:58:09 GMT) Full text and rfc822 format available.

Message #227 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 16/22] gnu: Add erlang-jsone.
Date: Sun, 10 Apr 2022 20:57:14 +0200
* gnu/packages/erlang.scm (erlang-jsone): New variable.
---
 gnu/packages/erlang.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index a8beb7e34c..fdc59894c0 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -403,6 +403,30 @@ arguments using the GNU getopt syntax.")
 specifications.")
     (license license:asl2.0)))
 
+(define-public erlang-jsone
+  (package
+    (name "erlang-jsone")
+    (version "1.7.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "jsone" version))
+        (sha256
+          (base32 "1gaxiw76syjp3s9rygskm32y9799b917q752rw8bxj3bxq93g8x3"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-covertool
+           ;; no need to generate a coverage report
+           (lambda _
+             (substitute* "rebar.config"
+               (("\\{project_plugins, \\[covertool\\]\\}\\." _) "")))))))
+    (home-page "https://github.com/sile/jsone/")
+    (synopsis "Erlang JSON Library")
+    (description "An Erlang library for encoding and decoding JSON data.")
+    (license license:expat)))
+
 (define-public erlang-parse-trans
   (package
     (name "erlang-parse-trans")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:59:02 GMT) Full text and rfc822 format available.

Message #230 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 17/22] gnu: Add erlang-proper.
Date: Sun, 10 Apr 2022 20:57:15 +0200
* gnu/packages/erlang.scm (erlang-proper): New variable.
---
 gnu/packages/erlang.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index fdc59894c0..33ac324074 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -450,6 +450,33 @@ evaluating an expression at compile-time and substitute the result as a
 compile-time constant.")
     (license license:asl2.0)))
 
+(define-public erlang-proper
+  (package
+    (name "erlang-proper")
+    (version "1.4.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "proper" version))
+        (sha256
+          (base32 "1fwcas4a9kz3w3z1jqdk9lw8822srfjk9lcpvbxkxlsv3115ha0q"))))
+    (build-system rebar3-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-covertool
+           ;; no need to generate a coverage report
+           (lambda _
+             (substitute* "rebar.config"
+               (("\\{plugins, \\[covertool\\]\\}\\." _) "")))))))
+    (home-page "https://proper-testing.github.io/")
+    (synopsis "QuickCheck-inspired property-based testing tool for Erlang")
+    (description "PropEr is a tool for the automated, semi-random,
+property-based testing of Erlang programs.  It is fully integrated with
+Erlang's type language, and can also be used for the model-based random
+testing of stateful systems.")
+    (license license:gpl3+)))
+
 (define-public erlang-providers
   (package
     (name "erlang-providers")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:59:02 GMT) Full text and rfc822 format available.

Message #233 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 18/22] gnu: Add erlang-covertool.
Date: Sun, 10 Apr 2022 20:57:16 +0200
* gnu/packages/erlang.scm (erlang-covertool): New variable.
---
 gnu/packages/erlang.scm | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 33ac324074..18ea933333 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -279,6 +279,27 @@ Mozilla's canonical set.")
 printing extending the io:format syntax to add colours.")
     (license license:expat)))
 
+(define-public erlang-covertool
+  (package
+    (name "erlang-covertool")
+    (version "2.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "covertool" version))
+       (sha256
+        (base32 "1p0c1n3nl4063xwi1sv176l1x68xqf07qwvj444a5z888fx6i5aw"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/covertool/covertool")
+    (synopsis "Convert Erlang code-coverage data generated by @code{cover}
+into Cobertura XML reports")
+    (description "This package provides a build tool and plugin to convert
+exported Erlang @code{cover} data sets into Cobertura XML reports, which can
+then be feed to the Jenkins Cobertura plug-in.
+
+On @emph{hex.pm}, this plugin was previously called @code{rebar_covertool}.")
+    (license license:bsd-2)))
+
 (define-public erlang-cth-readable
   (package
     (name "erlang-cth-readable")
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:59:02 GMT) Full text and rfc822 format available.

Message #236 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 19/22] gnu: Add rebar3.
Date: Sun, 10 Apr 2022 20:57:17 +0200
* gnu/packages/erlang.scm (rebar3): New variable.
---
 gnu/packages/erlang.scm | 76 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index 18ea933333..e8f43e7de2 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -554,3 +554,79 @@ a well configured release directory.")
     (description "This package provides SSL verification functions for
 Erlang.")
     (license license:expat)))
+
+(define-public rebar3
+  (package
+    (name "rebar3")
+    (version "3.18.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/erlang/rebar3")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "09648hzc2mnjwf9klm20cg4hb5rn2xv2gmzcg98ffv37p5yfl327"))))
+    (build-system gnu-build-system)
+    ;; TODO: remove vendored modules, install man-page, install lib(?)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'bootstrap)
+         (add-after 'unpack 'unpack-dependency-sources
+           (lambda* (#:key inputs #:allow-other-keys)
+             (for-each
+              (lambda (pkgname)
+                (let* ((src (string-append pkgname "-source"))
+                       (input (assoc-ref inputs src))
+                       (checkouts-dir (string-append "_checkouts/" pkgname))
+                       (lib-dir (string-append "_build/default/lib/" pkgname)))
+                  (mkdir-p checkouts-dir)
+                  (invoke "tar" "-xf" input "-C" checkouts-dir)
+                  (invoke "tar" "-xzf"
+                          (pk (string-append checkouts-dir "/contents.tar.gz"))
+                          "-C" checkouts-dir)
+                  (mkdir-p lib-dir)
+                  (copy-recursively checkouts-dir lib-dir)))
+              (list "bbmustache" "certifi" "cf" "cth_readable"
+                    "eunit_formatters" "getopt" "hex_core" "erlware_commons"
+                    "parse_trans" "relx" "ssl_verify_fun" "providers"))))
+         (delete 'configure)
+         (replace 'build
+           (lambda _
+             (setenv "HOME" (getcwd))
+             (invoke "./bootstrap")))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out")))
+               (install-file "rebar3" (string-append out "/bin")))))
+         (delete 'check))))
+    (native-inputs
+     (list erlang))
+    (inputs
+     `(("bbmustache-source" ,(package-source erlang-bbmustache))
+       ("certifi-source" ,(package-source erlang-certifi))
+       ("cf-source" ,(package-source erlang-cf))
+       ("cth_readable-source" ,(package-source erlang-cth-readable))
+       ("erlware_commons-source" ,(package-source erlang-erlware-commons))
+       ("eunit_formatters-source" ,(package-source erlang-eunit-formatters))
+       ("getopt-source" ,(package-source erlang-getopt))
+       ("hex_core-source" ,(package-source erlang-hex-core))
+       ("parse_trans-source" ,(package-source erlang-parse-trans))
+       ("relx-source" ,(package-source erlang-relx))
+       ("ssl_verify_fun-source" ,(package-source erlang-ssl-verify-fun))
+       ("providers-source" ,(package-source erlang-providers))))
+    (home-page "https://www.rebar3.org/")
+    (synopsis "Sophisticated build-tool for Erlang projects that follows OTP
+principles")
+    (description "@code{rebar3} is an Erlang build tool that makes it easy to
+compile and test Erlang applications, port drivers and releases.
+
+@code{rebar3} is a self-contained Erlang script, so it's easy to distribute or
+even embed directly in a project.  Where possible, rebar uses standard
+Erlang/OTP conventions for project structures, thus minimizing the amount of
+build configuration work.  @code{rebar3} also provides dependency management,
+enabling application writers to easily re-use common libraries from a variety
+of locations (git, hg, etc).")
+    (license license:asl2.0)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:59:03 GMT) Full text and rfc822 format available.

Message #239 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 20/22] gnu: Add rebar3-raw-deps.
Date: Sun, 10 Apr 2022 20:57:18 +0200
* gnu/packages/erlang.scm (rebar3-raw-deps): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index e8f43e7de2..e5331a37a5 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -630,3 +630,20 @@ build configuration work.  @code{rebar3} also provides dependency management,
 enabling application writers to easily re-use common libraries from a variety
 of locations (git, hg, etc).")
     (license license:asl2.0)))
+
+(define-public rebar3-raw-deps
+  (package
+    (name "rebar3-raw-deps")
+    (version "2.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (hexpm-uri "rebar3_raw_deps" version))
+       (sha256
+        (base32 "1pzmm3m8gb2s9jn8fp6shzgfmy4mvh2vdci0z6nsm74ma3ffh1i3"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/soranoba/rebar3_raw_deps")
+    (synopsis "Rebar3 plugin for supporting \"raw\" dependencies")
+    (description "This plugin provides support for handling non-OTP
+applications as a dependent libraries.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:59:03 GMT) Full text and rfc822 format available.

Message #242 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 21/22] gnu: Add rebar3-git-vsn.
Date: Sun, 10 Apr 2022 20:57:19 +0200
* gnu/packages/erlang.scm (rebar3-git-vsn): New variable.
---
 gnu/packages/erlang.scm | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index e5331a37a5..c6cffd9906 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -37,6 +37,7 @@
   #:use-module (gnu packages gl)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages version-control)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages wxwidgets))
 
@@ -647,3 +648,34 @@ of locations (git, hg, etc).")
     (description "This plugin provides support for handling non-OTP
 applications as a dependent libraries.")
     (license license:expat)))
+
+(define-public rebar3-git-vsn
+  (package
+    (name "rebar3-git-vsn")
+    (version "1.1.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "rebar3_git_vsn" version))
+        (sha256
+          (base32 "1dfz56034pa25axly9vqdzv3phkn8ll0qwrkws96pbgcprhky1hx"))))
+    (build-system rebar3-build-system)
+    (inputs
+     (list git-minimal/fixed))
+    (arguments
+     `(;; Running the tests require binary artifact (tar-file containing
+       ;; samples git repos)  TODO: remove these from the source
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((git (assoc-ref inputs "git-minimal")))
+               (substitute* "src/rebar3_git_vsn.erl"
+                 (("rebar_utils:sh\\(\"git " _)
+                  (string-append "rebar_utils:sh(\"" git "/bin/git ")))))))))
+    (home-page "https://github.com/soranoba/rebar3_git_vsn")
+    (synopsis "Rebar3 plugin for generating the version from git")
+    (description "This plugin adds support for generating the version from
+a git checkout.")
+    (license license:expat)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Sun, 10 Apr 2022 18:59:04 GMT) Full text and rfc822 format available.

Message #245 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796 <at> debbugs.gnu.org
Subject: [PATCH v4 22/22] gnu: Add rebar3-proper.
Date: Sun, 10 Apr 2022 20:57:20 +0200
* gnu/packages/erlang.scm (rebar3-proper): New variable.
---
 gnu/packages/erlang.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index c6cffd9906..ea441e1c2a 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -679,3 +679,20 @@ applications as a dependent libraries.")
     (description "This plugin adds support for generating the version from
 a git checkout.")
     (license license:expat)))
+
+(define-public rebar3-proper
+  (package
+    (name "rebar3-proper")
+    (version "0.12.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (hexpm-uri "rebar3_proper" version))
+        (sha256
+          (base32 "1f174fb6h2071wr7qbw9aqqvnglzsjlylmyi8215fhrmi38w94b6"))))
+    (build-system rebar3-build-system)
+    (home-page "https://github.com/ferd/rebar3_proper")
+    (synopsis "Rebar3 PropEr plugin")
+    (description "This plugin allows running PropEr test suites from within
+rebar3.")
+    (license license:bsd-3)))
-- 
2.30.2





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Mon, 11 Apr 2022 12:05:01 GMT) Full text and rfc822 format available.

Message #248 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v4 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Mon, 11 Apr 2022 14:04:48 +0200
[Message part 1 (text/plain, inline)]
Hartmut Goebel schreef op zo 10-04-2022 om 20:57 [+0200]:
> * Shall the build system actually be called „rebar*3*“ or just „rebar“? There
>   is also a build-tool „rebar2“, which is obsoltete and not supported by this
>   build-system. Anyhow, somewhen in the future there might be some „rebar4“,
>   which we might be able to cover with the same build-system. WDYT?

Was the rebar2 --> rebar3 change mostly backwards-compatible, and would
a hypothetical rebar2 or rebar4 build system look mostly the same?
If both hold, I would treat rebar2 --> rebar3 as ‘merely’ a package
update from python <at> 2 to python <at> 3 -- some breaking changes, but no need
for separate build systems (and hence, no 3 suffix)

If rebar2, rebar3 and rebar4 would require completely different phases
and use different file formats or such, IMO a separate build system
(and hence, a 2, 3 or 4 suffix) may be useful.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 29 Apr 2022 13:07:01 GMT) Full text and rfc822 format available.

Message #251 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 29 Apr 2022 15:06:16 +0200
Hi,

Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> * guix/build-system/rebar3.scm, guix/build/rebar3-build-system.scm: New files.
> * Makefile.am (MODULES): Add them.

Please mention the guix.texi changes here.

> +@defvr {Scheme Variable} rebar3-build-system
> +This variable is exported by @code{(guix build-system rebar3)}.  It
> +implements a build procedure around @code{rebar3}.

Please provide a bit more context, like: “[…] around
@uref{http://example.org,rebar3}, a build system for programs written in
the Erlang language.”

> +source.  If this file exists, it will be unpacked, too.  This eases
> +handling of package hosted by @i{hex.pm}.

Rather: “hosted at @uref{https://hex.pm/}, the Erlang package
repository.”

> +       (lambda (*)
> +         (for-each
> +          (lambda (dirname)
> +            (let ((src-dir (string-append lib-dir "/" * "/" dirname))
> +                  (dst-dir (string-append pkg-dir "/" dirname)))
> +              (when (file-exists? src-dir)
> +                (copy-recursively src-dir dst-dir #:follow-symlinks? #t))
> +              (false-if-exception
> +               (delete-file (string-append dst-dir "/.gitignore")))))
> +          '("ebin" "include" "priv")))

“ebin” and “priv” are non-standard directory names.  It would be ideal
to avoid them, unless this is a hard requirement for Erlang/rebar3?

Otherwise LGTM!

Thanks,
Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 29 Apr 2022 13:14:01 GMT) Full text and rfc822 format available.

Message #254 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 29 Apr 2022 15:13:04 +0200
Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> hex.pm is a package repository for Erlang and Elixir.
>
> * guix/scripts/import.scm (importers): Add "hexpm".
> * guix/scripts/import/hexpm.scm, guix/import/hexpm.scm,
>   guix/hexpm-download.scm: New files.
> * guix/import/utils.scm (source-spec->object): Add "hexpm-fetch" to list of
>   fetch methods.
> * guix/upstream.scm (package-update/hexpm-fetch): New function.
>   (%method-updates) Add it.
> * Makefile.am: Add them.

Please mention tests/hexpm.scm.


[...]

> +(define-module (guix hexpm-download)
> +  #:use-module (srfi srfi-26)
> +  #:export (hexpm-package-url
> +            hexpm-uri))

How about moving these two procedures to (guix build-system rebar3)?
This is what is done in similar cases, for example with ‘pypi-uri’.

> +++ b/guix/scripts/import/hexpm.scm
> @@ -0,0 +1,109 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2014 David Thompson <davet <at> gnu.org>
> +;;; Copyright © 2016 David Craven <david <at> craven.ch>
> +;;; Copyright © 2019 Martin Becze <mjbecze <at> riseup.net>
> +;;; Copyright © 2020, 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>

I think it’s fine to keep just your name here; it’s a short file and one
could argue that the bits found in all these files aren’t inventive.  :-)

> +  #:use-module (srfi srfi-11)
> +  #:use-module (srfi srfi-71)

I think you can drop these two imports.

> +++ b/guix/upstream.scm
> @@ -464,6 +464,7 @@ SOURCE, an <upstream-source>."
>                                          #:key-download key-download)))
>           (values version tarball source))))))
>  
> +

Oops.  :-)

> +++ b/tests/hexpm.scm
> @@ -0,0 +1,257 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2015 David Thompson <davet <at> gnu.org>
> +;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
> +;;; Copyright © 2018 Oleg Pykhalov <go.wigust <at> gmail.com>
> +;;; Copyright © 2021 Sarah Morgensen <iskarian <at> mgsn.dev>
> +;;; Copyright © 2022 Hartmut Goebel <h.goebel <at> crazy-compilers.com>

Same comment here.

> +(test-assert "hexpm->guix-package"
> +  ;; Replace network resources with sample data.
> +  (mock ((guix http-client) http-fetch
> +         (lambda (url . rest)

I have a preference for spawning an HTTP server, if that’s possible, as
is done in tests/cpan.scm for instance.

But it’s already been a long ride, so we can keep that for later.

Otherwise LGTM.

Great to see this new importer!

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 29 Apr 2022 13:17:02 GMT) Full text and rfc822 format available.

Message #257 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 29 Apr 2022 15:16:09 +0200
Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> * gnu/packages/erlang.scm (rebar3): New variable.

[...]

> +    (inputs
> +     `(("bbmustache-source" ,(package-source erlang-bbmustache))
> +       ("certifi-source" ,(package-source erlang-certifi))
> +       ("cf-source" ,(package-source erlang-cf))
> +       ("cth_readable-source" ,(package-source erlang-cth-readable))
> +       ("erlware_commons-source" ,(package-source erlang-erlware-commons))
> +       ("eunit_formatters-source" ,(package-source erlang-eunit-formatters))
> +       ("getopt-source" ,(package-source erlang-getopt))
> +       ("hex_core-source" ,(package-source erlang-hex-core))
> +       ("parse_trans-source" ,(package-source erlang-parse-trans))
> +       ("relx-source" ,(package-source erlang-relx))
> +       ("ssl_verify_fun-source" ,(package-source erlang-ssl-verify-fun))
> +       ("providers-source" ,(package-source erlang-providers))))

Not a blocker, but I’d rather see this eventually changed to use a gexp,
like so:

  #:arguments #~(modify-phases …
                  (add-before …
                    (lambda …
                      (for-each (lambda (source) …)
                                '(#$@(map package-source
                                          (list erlang-bbmustache …)))))))

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 29 Apr 2022 13:19:01 GMT) Full text and rfc822 format available.

Message #260 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org, Maxime Devos <maximedevos <at> telenet.be>
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 29 Apr 2022 15:18:19 +0200
Hi,

Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> Thanks to Maxime Devos for the review of V3. Do ease review for other
> reviewers, here is a complete set of updated patches, incorporating Maxime's
> comments.

Unless Maxime has further comments, this patch series looks ready to me,
modulo the cosmetic changes I suggested (some of which can be made
afterwards).

Hartmut, can we remove guix/extracting-download.scm now?

Thanks folks for all the work!

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 29 Apr 2022 14:34:01 GMT) Full text and rfc822 format available.

Message #263 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Ludovic Courtès <ludo <at> gnu.org>, Hartmut Goebel
 <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 29 Apr 2022 16:33:08 +0200
[Message part 1 (text/plain, inline)]
Ludovic Courtès schreef op vr 29-04-2022 om 15:18 [+0200]:
> Hi,
> 
> Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:
> 
> > Thanks to Maxime Devos for the review of V3. Do ease review for other
> > reviewers, here is a complete set of updated patches, incorporating Maxime's
> > comments.
> 
> Unless Maxime has further comments, this patch series looks ready to me,
> modulo the cosmetic changes I suggested (some of which can be made
> afterwards).

No further comments.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Thu, 05 May 2022 12:42:02 GMT) Full text and rfc822 format available.

Message #266 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Thu, 5 May 2022 14:40:56 +0200
Am 29.04.22 um 15:13 schrieb Ludovic Courtès:
>> +(define-module (guix hexpm-download)
>> +  #:use-module (srfi srfi-26)
>> +  #:export (hexpm-package-url
>> +            hexpm-uri))
> How about moving these two procedures to (guix build-system rebar3)?
> This is what is done in similar cases, for example with ‘pypi-uri’.
>
These definitions are combined in this module, since the WIP 
„mix-build-system“ (for Elixir) will also use it.

Do you want me to move this into the respective build-system modules and 
thus duplicate the data?

-- 

Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Thu, 05 May 2022 12:47:02 GMT) Full text and rfc822 format available.

Message #269 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Thu, 5 May 2022 14:46:24 +0200
Am 29.04.22 um 15:06 schrieb Ludovic Courtès:
> “ebin” and “priv” are non-standard directory names.  It would be ideal
> to avoid them, unless this is a hard requirement for Erlang/rebar3?

AFAIU they are. I'm lacking knowledge about Erlang/OTP internals, and 
this is what I experienced.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Thu, 05 May 2022 12:57:02 GMT) Full text and rfc822 format available.

Message #272 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Maxime Devos <maximedevos <at> telenet.be>, 54796 <at> debbugs.gnu.org
Subject: Re: [bug#54796] [PATCH v4 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Thu, 5 May 2022 14:56:37 +0200
Am 11.04.22 um 14:04 schrieb Maxime Devos:
> If rebar2, rebar3 and rebar4 would require completely different phases
> and use different file formats or such, IMO a separate build system
> (and hence, a 2, 3 or 4 suffix) may be useful.

It took some time to come to a conclusion for me on this:

I'm going to rename it into „rebar-build-system“ (without the number). 
If need arises for some rebar4-build-system, we can still think about 
adding „rebar3-build-system” as an alias.

Rational:

I assume, some rebar2 and rebar4 build-systems would have the same 
phases. „Just” commands might be different. Eg. rebar2 did just 
„compile“ while rebar3 can have „as prod compile“ — which could be 
handled with different means.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Thu, 05 May 2022 20:49:02 GMT) Full text and rfc822 format available.

Message #275 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Thu, 05 May 2022 22:48:09 +0200
Hello,

Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> Am 29.04.22 um 15:13 schrieb Ludovic Courtès:
>>> +(define-module (guix hexpm-download)
>>> +  #:use-module (srfi srfi-26)
>>> +  #:export (hexpm-package-url
>>> +            hexpm-uri))
>> How about moving these two procedures to (guix build-system rebar3)?
>> This is what is done in similar cases, for example with ‘pypi-uri’.
>>
> These definitions are combined in this module, since the WIP
> „mix-build-system“ (for Elixir) will also use it.

OK.

> Do you want me to move this into the respective build-system modules
> and thus duplicate the data?

We don’t want to duplicate it, but it might still make sense to have
them in (guix build-system rebar3) and have it imported by (guix
build-system mix) if needed.

At least I have a slight preference for this over having a short
top-level module ‘just’ for these two procedures.

Thanks,
Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Thu, 05 May 2022 21:07:01 GMT) Full text and rfc822 format available.

Message #278 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Thu, 5 May 2022 23:06:17 +0200
Am 05.05.22 um 22:48 schrieb Ludovic Courtès:
> We don’t want to duplicate it, but it might still make sense to have
> them in (guix build-system rebar3) and have it imported by (guix
> build-system mix) if needed.

Fine for me. I'll change the patches accordingly.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 06 May 2022 14:59:02 GMT) Full text and rfc822 format available.

Message #281 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 6 May 2022 16:58:39 +0200
Am 29.04.22 um 15:16 schrieb Ludovic Courtès:
> Not a blocker, but I’d rather see this eventually changed to use a gexp,
> like so:

Writing some decent code for with is beyond my scheme knowledge. I leave 
this as an excersice for guile experts.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Mon, 09 May 2022 08:26:01 GMT) Full text and rfc822 format available.

Message #284 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Mon, 09 May 2022 10:25:24 +0200
Hi,

Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> Am 29.04.22 um 15:16 schrieb Ludovic Courtès:
>> Not a blocker, but I’d rather see this eventually changed to use a gexp,
>> like so:
>
> Writing some decent code for with is beyond my scheme knowledge. I
> leave this as an excersice for guile experts.

To be fair, there’s not much expertise to be had beyond mimicking the
example I gave you in the parent message; it’s close to working code!

Thanks,
Ludo’.





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Mon, 09 May 2022 10:16:02 GMT) Full text and rfc822 format available.

Message #287 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 54796 <at> debbugs.gnu.org
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Mon, 9 May 2022 12:15:40 +0200
Am 09.05.22 um 10:25 schrieb Ludovic Courtès:
> To be fair, there’s not much expertise to be had beyond mimicking the
> example I gave you in the parent message; it’s close to working code!

This is what I thought. But beside the package, there is also required 
the original package's name (no prefix, underscores instead of dashes). 
And the code I was able to write was ugly.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Tue, 14 Jun 2022 21:30:03 GMT) Full text and rfc822 format available.

Message #290 received at 54796 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796 <at> debbugs.gnu.org, Maxime Devos <maximedevos <at> telenet.be>
Subject: Re: bug#54796: [PATCH v3 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Tue, 14 Jun 2022 23:29:26 +0200
Hi Hartmut,

Maxime Devos <maximedevos <at> telenet.be> skribis:

> Ludovic Courtès schreef op vr 29-04-2022 om 15:18 [+0200]:
>> Hi,
>> 
>> Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:
>> 
>> > Thanks to Maxime Devos for the review of V3. Do ease review for other
>> > reviewers, here is a complete set of updated patches, incorporating Maxime's
>> > comments.
>> 
>> Unless Maxime has further comments, this patch series looks ready to me,
>> modulo the cosmetic changes I suggested (some of which can be made
>> afterwards).
>
> No further comments.

This patch series was reviewed and approved a while back, please feel
free to push it!

There were a couple of suggestions (non-blockers) that you could
implement in subsequent patches.

Thanks,
Ludo’.




Reply sent to Hartmut Goebel <h.goebel <at> crazy-compilers.com>:
You have taken responsibility. (Wed, 15 Jun 2022 09:21:02 GMT) Full text and rfc822 format available.

Notification sent to Hartmut Goebel <h.goebel <at> crazy-compilers.com>:
bug acknowledged by developer. (Wed, 15 Jun 2022 09:21:02 GMT) Full text and rfc822 format available.

Message #295 received at 54796-close <at> debbugs.gnu.org (full text, mbox):

From: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
To: 54796-close <at> debbugs.gnu.org
Subject: Re: [PATCH v4 00/22] Add importer for hex.pm and rebar3 build-system
 for Erlang
Date: Wed, 15 Jun 2022 11:20:49 +0200
Many thanks for the review. Finally I finished this patch series and 
pushed as 9cccf6490d98bd40ea1eb9e84ecf4a2b32614107

Notable changes compared to last review comments:

* removed guix extracting-download - which was an left-over

* build-system is now named rebar (without '3')

* fixed some minor lint-errors

I also validated that all packages are up to date.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel <at> crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





Information forwarded to guix-patches <at> gnu.org:
bug#54796; Package guix-patches. (Fri, 17 Jun 2022 15:26:01 GMT) Full text and rfc822 format available.

Message #298 received at 54796-done <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Hartmut Goebel <h.goebel <at> crazy-compilers.com>
Cc: 54796-done <at> debbugs.gnu.org, Maxime Devos <maximedevos <at> telenet.be>
Subject: Re: [PATCH v4 00/22] Add importer for hex.pm and rebar3
 build-system for Erlang
Date: Fri, 17 Jun 2022 17:25:01 +0200
Hi,

Hartmut Goebel <h.goebel <at> crazy-compilers.com> skribis:

> Many thanks for the review. Finally I finished this patch series and
> pushed as 9cccf6490d98bd40ea1eb9e84ecf4a2b32614107

Yay, well done, thanks!

Ludo’.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sat, 16 Jul 2022 11:24:13 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 277 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.