[PATCH] gnu: java-jmh: Switch to maven-build-system.

  • Done
  • quality assurance status badge
Details
One participant
  • Julien Lepiller
Owner
unassigned
Submitted by
Julien Lepiller
Severity
normal
J
J
Julien Lepiller wrote on 1 Jun 2021 00:41
(address . guix-patches@gnu.org)
20210601004100.69baa2d0@tachikoma.lepiller.eu
Hi Guix!

I'm excited to submit this patch series, as it adds the first package
to guix that uses the maven-build-system.

The series first improves the maven build system, so it actually works
with jmh :)

The series then changes a few dependencies to install to the maven
repository structure (lib/m2), so they can be detected by maven during
the build.

Since the series updates files that are used by the ant-build-system,
it unfortunately needs to update all java packages. Grepping for
"build-system ant-build-system", it shows 302 packages, which is
two packages above the limit for master. However, since most java
packages are fast to build, I'd like to ask for an exception to this
rule and push to master directly.

Patches will follow :)
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 01/14] guix: java-utils: Factorize pom.xml generation.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-1-julien@lepiller.eu
* guix/build/java-utils.scm (generate-pom.xml): New procedure.
* gnu/packages/maven.scm (java-surefire-junit4): Use it.
* gnu/packages/java.scm (java-qdox, java-jsr250, java-jsr305)
(java-aopalliance, java-jboss-el-api-spec)
(java-jboss-interceptors-api-spec): Use it.
(java-qdox-M9): Ensure the generated pom file has the correct version.
---
gnu/packages/java.scm | 117 ++++++--------------------------------
gnu/packages/maven.scm | 28 ++++-----
guix/build/java-utils.scm | 29 ++++++++++
3 files changed, 58 insertions(+), 116 deletions(-)

Toggle diff (280 lines)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index a167aafc38..d7118b4ce6 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -3781,25 +3781,11 @@ documentation tools.")
(arguments
`(#:jar-name "qdox.jar"
#:tests? #f; no tests
- #:modules
- ((guix build ant-build-system)
- (guix build java-utils)
- (guix build utils)
- (sxml simple))
#:phases
(modify-phases %standard-phases
(add-before 'install 'create-pom
- (lambda _
- (with-output-to-file "pom.xml"
- (lambda _
- (sxml->xml
- `((project
- (modelVersion "4.0.0")
- (name "QDox")
- (groupId "com.thoughtworks.qdox")
- (artifactId "qdox")
- (version ,,version))))))
- #t))
+ (generate-pom.xml "pom.xml" "com.thoughtworks.qdox" "qdox" ,version
+ #:name "QDox"))
(replace 'install
(install-from-pom "pom.xml")))))
(home-page "https://github.com/codehaus/qdox")
@@ -3825,7 +3811,14 @@ documentation tools.")
"/qdox-" version "-sources.jar"))
(sha256
(base32
- "1s2jnmx2dkwnaha12lcj26aynywgwa8sslc47z82wx8xai13y4fg"))))))
+ "1s2jnmx2dkwnaha12lcj26aynywgwa8sslc47z82wx8xai13y4fg"))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments java-qdox)
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (replace 'create-pom
+ (generate-pom.xml "pom.xml" "com.thoughtworks.qdox" "qdox" ,version
+ #:name "QDox"))))))))
(define-public java-jarjar
(package
@@ -6397,25 +6390,11 @@ bottlenecks move away from the database in an effectively cached system.")
`(#:tests? #f ; no tests included
#:jdk ,icedtea-8
#:jar-name "jsr250.jar"
- #:modules ((guix build ant-build-system)
- (guix build utils)
- (guix build maven pom)
- (guix build java-utils)
- (sxml simple))
#:phases
(modify-phases %standard-phases
(add-before 'install 'create-pom
- (lambda _
- (with-output-to-file "pom.xml"
- (lambda _
- (sxml->xml
- `((project
- (modelVersion "4.0.0")
- (name "jsr250")
- (groupId "javax.annotation")
- (artifactId "jsr250-api")
- (version ,,version))))))
- #t))
+ (generate-pom.xml "pom.xml" "javax.annotation" "jsr250-api" ,version
+ #:name "jsr250"))
(replace 'install
(install-from-pom "pom.xml")))))
(home-page "https://jcp.org/en/jsr/detail?id=250")
@@ -6444,25 +6423,10 @@ namespaces.")
(arguments
`(#:tests? #f ; no tests included
#:jar-name "jsr305.jar"
- #:modules ((guix build ant-build-system)
- (guix build java-utils)
- (guix build maven pom)
- (guix build utils)
- (sxml simple))
#:phases
(modify-phases %standard-phases
(add-before 'install 'create-pom
- (lambda _
- (with-output-to-file "pom.xml"
- (lambda _
- (sxml->xml
- `((project
- (modelVersion "4.0.0")
- (name "jsr305")
- (groupId "com.google.code.findbugs")
- (artifactId "jsr305")
- (version ,,version))))))
- #t))
+ (generate-pom.xml "pom.xml" "com.google.code.findbugs" "jsr305" ,version))
(replace 'install
(install-from-pom "pom.xml")))))
(home-page "http://findbugs.sourceforge.net/")
@@ -10493,25 +10457,10 @@ this is not a static analysis tool.)")
#:jdk ,icedtea-8
#:tests? #f; no tests
#:source-dir "aopalliance/src/main"
- #:modules ((guix build ant-build-system)
- (guix build utils)
- (guix build maven pom)
- (guix build java-utils)
- (sxml simple))
#:phases
(modify-phases %standard-phases
(add-before 'install 'create-pom
- (lambda _
- (with-output-to-file "pom.xml"
- (lambda _
- (sxml->xml
- `((project
- (modelVersion "4.0.0")
- (name "aopalliance")
- (groupId "aopalliance")
- (artifactId "aopalliance")
- (version "1.0"))))))
- #t))
+ (generate-pom.xml "pom.xml" "aopalliance" "aopalliance" ,version))
(replace 'install
(install-from-pom "pom.xml")))))
(home-page "http://aopalliance.sourceforge.net")
@@ -12110,29 +12059,14 @@ sequences to format your console output which works on every platform.")
(build-system ant-build-system)
(arguments
`(#:jar-name "java-jboss-el-api_spec.jar"
- #:modules ((guix build ant-build-system)
- (guix build utils)
- (guix build maven pom)
- (guix build java-utils)
- (sxml simple))
#:phases
(modify-phases %standard-phases
;; the origin of javax.el:javax.el-api is unknown, so we use this package
;; instead, which implements the same thing. We override the pom file
;; to "rename" the package so it can be found by maven.
(add-before 'install 'override-pom
- (lambda _
- (delete-file "pom.xml")
- (with-output-to-file "pom.xml"
- (lambda _
- (sxml->xml
- `(project
- (modelVersion "4.0.0")
- (name "el-api")
- (groupId "javax.el")
- (artifactId "javax.el-api")
- (version "3.0")))))
- #t))
+ (generate-pom.xml "pom.xml" "javax.el" "javax.el-api" "3.0"
+ #:name "el-api"))
(replace 'install
(install-from-pom "pom.xml")))))
(inputs
@@ -12164,11 +12098,6 @@ JavaServer Pages (JSP).")
#:jdk ,icedtea-8
#:source-dir "."
#:tests? #f; no tests
- #:modules ((guix build ant-build-system)
- (guix build utils)
- (guix build maven pom)
- (guix build java-utils)
- (sxml simple))
#:phases
(modify-phases %standard-phases
;; the origin of javax.interceptor:javax.interceptor-api is unknown,
@@ -12176,18 +12105,8 @@ JavaServer Pages (JSP).")
;; We override the pom file to "rename" the package so it can be found
;; by maven.
(add-before 'install 'override-pom
- (lambda _
- (delete-file "pom.xml")
- (with-output-to-file "pom.xml"
- (lambda _
- (sxml->xml
- `(project
- (modelVersion "4.0.0")
- (name "interceptor-api")
- (groupId "javax.interceptor")
- (artifactId "javax.interceptor-api")
- (version "3.0")))))
- #t))
+ (generate-pom.xml "pom.xml" "javax.interceptor" "javax.interceptor-api"
+ "3.0" #:name "interceptor-api"))
(replace 'install
(install-from-pom "pom.xml")))))
(home-page "https://github.com/jboss/jboss-interceptors-api_spec")
diff --git a/gnu/packages/maven.scm b/gnu/packages/maven.scm
index c637e5c7ae..8f63ee9be2 100644
--- a/gnu/packages/maven.scm
+++ b/gnu/packages/maven.scm
@@ -3424,23 +3424,17 @@ starting from JUnit 4.")))
#:phases
(modify-phases %standard-phases
(add-before 'install 'regenerate-own-pom
- (lambda _
- ;; Surefire struggles resolving artifacts because of this pom
- ;; file, resulting in a NullPointerException when collecting
- ;; Artifacts (and a "Failure detected." message from
- ;; DefaultArtifactResolver). Replace the pom file with a much
- ;; simpler one. Everything is shaded anyway (as used to be the
- ;; case in 2.22), so there will not be missing dependencies.
- (with-output-to-file "surefire-providers/surefire-junit4/pom.xml"
- (lambda _
- (sxml->xml
- `((project
- (modelVersion "4.0.0")
- (name "Surefire JUnit4")
- (groupId "org.apache.maven.surefire")
- (artifactId "surefire-junit4")
- (version ,,(package-version java-surefire-common-java5)))))))
- #t))
+ ;; Surefire struggles resolving artifacts because of this pom
+ ;; file, resulting in a NullPointerException when collecting
+ ;; Artifacts (and a "Failure detected." message from
+ ;; DefaultArtifactResolver). Replace the pom file with a much
+ ;; simpler one. Everything is shaded anyway (as used to be the
+ ;; case in 2.22), so there will not be missing dependencies.
+ (generate-pom.xml
+ "surefire-providers/surefire-junit4/pom.xml"
+ "org.apache.maven.surefire" "surefire-junit4"
+ ,(package-version java-surefire-common-java5)
+ #:name "Surefire JUnit4"))
(add-before 'build 'copy-resources
(lambda _
(mkdir-p "build/classes")
diff --git a/guix/build/java-utils.scm b/guix/build/java-utils.scm
index a868e4d52c..6abd97e118 100644
--- a/guix/build/java-utils.scm
+++ b/guix/build/java-utils.scm
@@ -28,6 +28,7 @@
#:use-module (sxml simple)
#:export (ant-build-javadoc
generate-plugin.xml
+ generate-pom.xml
install-jars
install-javadoc
install-pom-file
@@ -206,3 +207,31 @@ recognize the package as a plugin, and find the entry points in the plugin."
,mojos
(dependencies
,@dependencies)))))))))
+
+(define* (generate-pom.xml pom-file groupid artifactid version
+ #:key (dependencies '())
+ (name artifactid))
+ "Generates the @file{pom.xml} for a project. It is required by Maven to find
+a package, and by the java build system to know where to install a package, when
+a pom.xml doesn't already exist and installing to the maven repository."
+ (lambda _
+ (mkdir-p (dirname pom-file))
+ (with-output-to-file pom-file
+ (lambda _
+ (sxml->xml
+ (sxml-indent
+ `(project
+ (modelVersion "4.0.0")
+ (name ,name)
+ (groupId ,groupid)
+ (artifactId ,artifactid)
+ (version ,version)
+ (dependencies
+ ,@(map
+ (match-lambda
+ ((groupid artifactid version)
+ `(dependency
+ (groupId ,groupid)
+ (artifactId ,artifactid)
+ (version ,version))))
+ dependencies)))))))))
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 02/14] guix: maven: Simplify finding version and group information.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-2-julien@lepiller.eu
* guix/build/maven/pom.scm (pom-version, pom-groupid): Do not use inputs
and local packages information anymore. Adapt file to new arguments.
* guix/build/maven-build-system.scm: Adapt to new arguments.
* guix/build/java-utils.scm: Adapt to new arguments.
---
guix/build/java-utils.scm | 18 +++++++++---------
guix/build/maven-build-system.scm | 6 +++---
guix/build/maven/pom.scm | 26 ++++++++++++--------------
3 files changed, 24 insertions(+), 26 deletions(-)

Toggle diff (171 lines)
diff --git a/guix/build/java-utils.scm b/guix/build/java-utils.scm
index 6abd97e118..5a54a14c1b 100644
--- a/guix/build/java-utils.scm
+++ b/guix/build/java-utils.scm
@@ -2,7 +2,7 @@
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018 Alex Vong <alexvong1995@gmail.com>
-;;; Copyright © 2020 Julien Lepiller <julien@lepiller.eu>
+;;; Copyright © 2020, 2021 Julien Lepiller <julien@lepiller.eu>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -69,9 +69,9 @@ fetched."
(let* ((out (assoc-ref outputs "out"))
(java-inputs (append (map cdr inputs) (map cdr outputs)))
(pom-content (get-pom pom-file))
- (version (pom-version pom-content java-inputs))
+ (version (pom-version pom-content))
(artifact (pom-artifactid pom-content))
- (group (group->dir (pom-groupid pom-content java-inputs)))
+ (group (group->dir (pom-groupid pom-content)))
(repository (string-append out "/lib/m2/" group "/" artifact "/"
version "/"))
(pom-name (string-append repository artifact "-" version ".pom")))
@@ -87,8 +87,8 @@ to ensure that maven can find dependencies."
(manifest (string-append dir "/META-INF/MANIFEST.MF"))
(pom (get-pom pom-file))
(artifact (pom-artifactid pom))
- (group (pom-groupid pom inputs))
- (version (pom-version pom inputs))
+ (group (pom-groupid pom))
+ (version (pom-version pom))
(pom-dir (string-append "META-INF/maven/" group "/" artifact)))
(mkdir-p (string-append dir "/" pom-dir))
(copy-file pom-file (string-append dir "/" pom-dir "/pom.xml"))
@@ -113,9 +113,9 @@ the phase fails."
(let* ((out (assoc-ref outputs "out"))
(java-inputs (append (map cdr inputs) (map cdr outputs)))
(pom-content (get-pom pom-file))
- (version (pom-version pom-content java-inputs))
+ (version (pom-version pom-content))
(artifact (pom-artifactid pom-content))
- (group (group->dir (pom-groupid pom-content java-inputs)))
+ (group (group->dir (pom-groupid pom-content)))
(repository (string-append out "/lib/m2/" group "/" artifact "/"
version "/"))
;; We try to find the file that was built. If it was built from our
@@ -180,9 +180,9 @@ recognize the package as a plugin, and find the entry points in the plugin."
(name (pom-name pom-content))
(description (pom-description pom-content))
(dependencies (pom-dependencies pom-content))
- (version (pom-version pom-content java-inputs))
+ (version (pom-version pom-content))
(artifact (pom-artifactid pom-content))
- (groupid (pom-groupid pom-content java-inputs))
+ (groupid (pom-groupid pom-content))
(mojos
`(mojos
,@(with-directory-excursion directory
diff --git a/guix/build/maven-build-system.scm b/guix/build/maven-build-system.scm
index 534b4ebcee..0456bfdf61 100644
--- a/guix/build/maven-build-system.scm
+++ b/guix/build/maven-build-system.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2020 Julien Lepiller <julien@lepiller.eu>
+;;; Copyright © 2020, 2021 Julien Lepiller <julien@lepiller.eu>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -82,8 +82,8 @@
(let* ((pom (get-pom pom-file))
(java-inputs (map cdr inputs))
(artifact (pom-artifactid pom))
- (group (pom-groupid pom java-inputs local-packages))
- (version (pom-version pom java-inputs local-packages)))
+ (group (pom-groupid pom))
+ (version (pom-version pom)))
(let loop ((modules (pom-ref pom "modules"))
(local-packages
(add-local-package local-packages group artifact version)))
diff --git a/guix/build/maven/pom.scm b/guix/build/maven/pom.scm
index c92d409d2b..327d5f75e8 100644
--- a/guix/build/maven/pom.scm
+++ b/guix/build/maven/pom.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2019, 2020 Julien Lepiller <julien@lepiller.eu>
+;;; Copyright © 2019-2021 Julien Lepiller <julien@lepiller.eu>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -93,13 +93,12 @@ If no result is found, the result is @code{#f}."
(get-pom (car java-inputs))))
#f)))
-(define* (pom-groupid content inputs #:optional local-packages)
+(define* (pom-groupid content)
"Find the groupID of a pom file, potentially looking at its parent pom file.
See @code{find-parent} for the meaning of the arguments."
(if content
(let ((res (or (pom-ref content "groupId")
- (pom-groupid (find-parent content inputs local-packages)
- inputs))))
+ (pom-ref (pom-ref content "parent") "groupId"))))
(cond
((string? res) res)
((null? res) #f)
@@ -114,13 +113,12 @@ See @code{find-parent} for the meaning of the arguments."
(car res)
#f)))
-(define* (pom-version content inputs #:optional local-packages)
+(define* (pom-version content)
"Find the version of a pom file, potentially looking at its parent pom file.
See @code{find-parent} for the meaning of the arguments."
(if content
(let ((res (or (pom-ref content "version")
- (pom-version (find-parent content inputs local-packages)
- inputs))))
+ (pom-ref (pom-ref content "parent") "version"))))
(cond
((string? res) res)
((null? res) #f)
@@ -344,7 +342,7 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
((tag rest ...)
(match tag
(('http://maven.apache.org/POM/4.0.0:plugin plugin ...)
- (let ((group (or (pom-groupid plugin inputs) "org.apache.maven.plugins"))
+ (let ((group (or (pom-groupid plugin) "org.apache.maven.plugins"))
(artifact (pom-artifactid plugin)))
(if (member artifact (or (assoc-ref excludes group) '()))
(fix-plugins rest optional?)
@@ -355,11 +353,11 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
(define* (fix-plugin plugin #:optional optional?)
(let* ((artifact (pom-artifactid plugin))
- (group (or (pom-groupid plugin inputs) "org.apache.maven.plugins"))
+ (group (or (pom-groupid plugin) "org.apache.maven.plugins"))
(version (or (assoc-ref (assoc-ref local-packages group) artifact)
(find-version inputs group artifact optional?)
- (pom-version plugin inputs))))
- (if (pom-version plugin inputs)
+ (pom-version plugin))))
+ (if (pom-version plugin)
(map
(lambda (tag)
(match tag
@@ -373,7 +371,7 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
(define* (fix-dep dep #:optional optional?)
(let* ((artifact (pom-artifactid dep))
- (group (or (pom-groupid dep inputs) (pom-groupid pom inputs)))
+ (group (or (pom-groupid dep) (pom-groupid pom)))
(scope (pom-ref dep "scope"))
(is-optional? (equal? (pom-ref dep "optional") '("true"))))
(format (current-error-port) "maven: ~a:~a :: ~a (optional: ~a)~%"
@@ -382,8 +380,8 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
with-build-dependencies?)
(let ((version (or (assoc-ref (assoc-ref local-packages group) artifact)
(find-version inputs group artifact optional?)
- (pom-version dep inputs))))
- (if (pom-version dep inputs)
+ (pom-version dep))))
+ (if (pom-version dep)
(map
(lambda (tag)
(match tag
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 03/14] guix: maven: Simplify finding local packages and modules.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-3-julien@lepiller.eu
* guix/build/maven-build-system (fix-pom): Fix a single pom file without
recursing
(fix-pom-files): Find local packages and all submodules, and fix them
all at once.
(add-local-package): Move to...
* guix/build/maven/pom.scm (add-local-package): ...here.
(pom-and-submodules, pom-local-packages): New procedures.
---
guix/build/maven-build-system.scm | 41 +++++-------------------
guix/build/maven/pom.scm | 53 ++++++++++++++++++++++++++++++-
2 files changed, 60 insertions(+), 34 deletions(-)

Toggle diff (142 lines)
diff --git a/guix/build/maven-build-system.scm b/guix/build/maven-build-system.scm
index 0456bfdf61..374fa2fdb8 100644
--- a/guix/build/maven-build-system.scm
+++ b/guix/build/maven-build-system.scm
@@ -60,47 +60,22 @@
(invoke "mvn" "-v")
#t)
-(define (add-local-package local-packages group artifact version)
- (define (alist-set lst key val)
- (match lst
- ('() (list (cons key val)))
- (((k . v) lst ...)
- (if (equal? k key)
- (cons (cons key val) lst)
- (cons (cons k v) (alist-set lst key val))))))
- (alist-set local-packages group
- (alist-set (or (assoc-ref local-packages group) '()) artifact
- version)))
-
(define (fix-pom pom-file inputs local-packages excludes)
(chmod pom-file #o644)
(format #t "fixing ~a~%" pom-file)
(fix-pom-dependencies pom-file (map cdr inputs)
#:with-plugins? #t #:with-build-dependencies? #t
#:local-packages local-packages
- #:excludes excludes)
- (let* ((pom (get-pom pom-file))
- (java-inputs (map cdr inputs))
- (artifact (pom-artifactid pom))
- (group (pom-groupid pom))
- (version (pom-version pom)))
- (let loop ((modules (pom-ref pom "modules"))
- (local-packages
- (add-local-package local-packages group artifact version)))
- (pk 'local-packages local-packages)
- (match modules
- (#f local-packages)
- ('() local-packages)
- (((? string? _) modules ...)
- (loop modules local-packages))
- (((_ module) modules ...)
- (loop
- modules
- (fix-pom (string-append (dirname pom-file) "/" module "/pom.xml")
- inputs local-packages excludes)))))))
+ #:excludes excludes))
(define* (fix-pom-files #:key inputs local-packages exclude #:allow-other-keys)
- (fix-pom "pom.xml" inputs local-packages exclude)
+ (let ((local-packages (pom-local-packages "pom.xml" #:local-packages local-packages)))
+ (format (current-error-port) "Fix pom files with local packages: ~a~%" local-packages)
+ (for-each
+ (lambda (pom)
+ (when (file-exists? pom)
+ (fix-pom pom inputs local-packages exclude)))
+ (pom-and-submodules "pom.xml")))
#t)
(define* (build #:key outputs #:allow-other-keys)
diff --git a/guix/build/maven/pom.scm b/guix/build/maven/pom.scm
index 327d5f75e8..8f16cf4d26 100644
--- a/guix/build/maven/pom.scm
+++ b/guix/build/maven/pom.scm
@@ -21,7 +21,8 @@
#:use-module (system foreign)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
- #:export (get-pom
+ #:export (add-local-package
+ get-pom
pom-ref
pom-description
pom-name
@@ -30,8 +31,24 @@
pom-groupid
pom-dependencies
group->dir
+ pom-and-submodules
+ pom-local-packages
fix-pom-dependencies))
+(define (add-local-package local-packages group artifact version)
+ "Takes @var{local-packages}, a list of local packages, and adds a new one
+for @var{group}:@var{artifact} at @var{version}."
+ (define (alist-set lst key val)
+ (match lst
+ ('() (list (cons key val)))
+ (((k . v) lst ...)
+ (if (equal? k key)
+ (cons (cons key val) lst)
+ (cons (cons k v) (alist-set lst key val))))))
+ (alist-set local-packages group
+ (alist-set (or (assoc-ref local-packages group) '()) artifact
+ version)))
+
(define (get-pom file)
"Return the content of a @file{.pom} file."
(let ((pom-content (call-with-input-file file xml->sxml)))
@@ -234,6 +251,40 @@ to re-declare the namespaces in the top-level element."
http://maven.apache.org/xsd/maven-4.0.0.xsd"))
,(map fix-xml sxml)))))
+(define (pom-and-submodules pom-file)
+ "Given @var{pom-file}, the file name of a pom, return the list of pom file
+names that correspond to itself and its submodules, recursively."
+ (define (get-modules modules)
+ (match modules
+ (#f '())
+ ('() '())
+ (((? string? _) rest ...) (get-modules rest))
+ ((('http://maven.apache.org/POM/4.0.0:module mod) rest ...)
+ (let ((pom (string-append (dirname pom-file) "/" mod "/pom.xml")))
+ (if (file-exists? pom)
+ (cons pom (get-modules rest))
+ (get-modules rest))))))
+
+ (let* ((pom (get-pom pom-file))
+ (modules (get-modules (pom-ref pom "modules"))))
+ (cons pom-file
+ (apply append (map pom-and-submodules modules)))))
+
+(define* (pom-local-packages pom-file #:key (local-packages '()))
+ "Given @var{pom-file}, a pom file name, return a list of local packages that
+this repository contains."
+ (let loop ((modules (pom-and-submodules pom-file))
+ (local-packages local-packages))
+ (match modules
+ (() local-packages)
+ ((module modules ...)
+ (let* ((pom (get-pom module))
+ (version (pom-version pom))
+ (artifactid (pom-artifactid pom))
+ (groupid (pom-groupid pom)))
+ (loop modules
+ (add-local-package local-packages groupid artifactid version)))))))
+
(define (group->dir group)
"Convert a group ID to a directory path."
(string-join (string-split group #\.) "/"))
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 04/14] guix: maven: Support fixing extensions.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-4-julien@lepiller.eu
* guix/build/maven/pom.scm (fix-pom-dependencies): Add support for fixing
extension versions.
---
guix/build/maven/pom.scm | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)

Toggle diff (34 lines)
diff --git a/guix/build/maven/pom.scm b/guix/build/maven/pom.scm
index 8f16cf4d26..3a4ad7a216 100644
--- a/guix/build/maven/pom.scm
+++ b/guix/build/maven/pom.scm
@@ -374,8 +374,27 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
`((http://maven.apache.org/POM/4.0.0:plugins
,(fix-plugins plugins))
,@(fix-build rest)))
+ (('http://maven.apache.org/POM/4.0.0:extensions extensions ...)
+ `((http://maven.apache.org/POM/4.0.0:extensions
+ ,(fix-extensions extensions))
+ ,@(fix-build rest)))
(tag (cons tag (fix-build rest)))))))
+ (define* (fix-extensions extensions #:optional optional?)
+ (match extensions
+ ('() '())
+ ((tag rest ...)
+ (match tag
+ (('http://maven.apache.org/POM/4.0.0:extension extension ...)
+ (let ((group (or (pom-groupid extension) "org.apache.maven.plugins"))
+ (artifact (pom-artifactid extension)))
+ (if (member artifact (or (assoc-ref excludes group) '()))
+ (fix-extensions rest optional?)
+ `((http://maven.apache.org/POM/4.0.0:extension
+ ,(fix-plugin extension optional?)); extensions are similar to plugins
+ ,@(fix-extensions rest optional?)))))
+ (tag (cons tag (fix-extensions rest optional?)))))))
+
(define fix-management
(match-lambda
('() '())
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 05/14] guix: maven: Support fixing modules.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-5-julien@lepiller.eu
* guix/build/maven/pom.scm (fix-pom-dependencies): Support fixing
modules that do not exist.
* guix/build/maven-build-system.scm (fix-pom): Fix modules.
---
guix/build/maven-build-system.scm | 1 +
guix/build/maven/pom.scm | 19 ++++++++++++++++++-
2 files changed, 19 insertions(+), 1 deletion(-)

Toggle diff (53 lines)
diff --git a/guix/build/maven-build-system.scm b/guix/build/maven-build-system.scm
index 374fa2fdb8..b3d97c81ea 100644
--- a/guix/build/maven-build-system.scm
+++ b/guix/build/maven-build-system.scm
@@ -65,6 +65,7 @@
(format #t "fixing ~a~%" pom-file)
(fix-pom-dependencies pom-file (map cdr inputs)
#:with-plugins? #t #:with-build-dependencies? #t
+ #:with-modules? #t
#:local-packages local-packages
#:excludes excludes))
diff --git a/guix/build/maven/pom.scm b/guix/build/maven/pom.scm
index 3a4ad7a216..ffb4515179 100644
--- a/guix/build/maven/pom.scm
+++ b/guix/build/maven/pom.scm
@@ -291,7 +291,8 @@ this repository contains."
(define* (fix-pom-dependencies pom-file inputs
#:key with-plugins? with-build-dependencies?
- (excludes '()) (local-packages '()))
+ with-modules? (excludes '())
+ (local-packages '()))
"Open @var{pom-file}, and override its content, rewritting its dependencies
to set their version to the latest version available in the @var{inputs}.
@@ -339,8 +340,24 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
`((http://maven.apache.org/POM/4.0.0:build ,(fix-build build))
,@(fix-pom rest))
(cons tag (fix-pom rest))))
+ (('http://maven.apache.org/POM/4.0.0:modules modules ...)
+ (if with-modules?
+ `((http://maven.apache.org/POM/4.0.0:modules ,(fix-modules modules))
+ ,@(fix-pom rest))
+ (cons tag (fix-pom rest))))
(tag (cons tag (fix-pom rest)))))))
+ (define fix-modules
+ (match-lambda
+ ('() '())
+ ((tag rest ...)
+ (match tag
+ (('http://maven.apache.org/POM/4.0.0:module module)
+ (if (file-exists? (string-append (dirname pom-file) "/" module "/pom.xml"))
+ `((http://maven.apache.org/POM/4.0.0:module ,module) ,@(fix-modules rest))
+ (fix-modules rest)))
+ (tag (cons tag (fix-modules rest)))))))
+
(define fix-dep-management
(match-lambda
('() '())
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 06/14] guix: maven: Look in local packages when searching for package version.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-6-julien@lepiller.eu
* guix/build/maven/pom.scm (fix-pom-dependencies): Also look at local
packages when looking for a package version.
---
guix/build/maven/pom.scm | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)

Toggle diff (41 lines)
diff --git a/guix/build/maven/pom.scm b/guix/build/maven/pom.scm
index ffb4515179..9c0669c7cd 100644
--- a/guix/build/maven/pom.scm
+++ b/guix/build/maven/pom.scm
@@ -481,7 +481,7 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
(cons `(http://maven.apache.org/POM/4.0.0:version ,version) dep)))
dep)))
- (define* (find-version inputs group artifact #:optional optional?)
+ (define (find-packaged-version inputs group artifact)
(let* ((directory (string-append "lib/m2/" (group->dir group)
"/" artifact))
(java-inputs (filter
@@ -493,13 +493,19 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
(versions (append-map ls java-inputs))
(versions (sort versions version>?)))
(if (null? versions)
- (if optional?
#f
- (begin
- (format (current-error-port) "maven: ~a:~a is missing from inputs~%"
- group artifact)
- (throw 'no-such-input group artifact)))
- (car versions))))
+ (car versions))))
+
+ (define* (find-version inputs group artifact #:optional optional?)
+ (let ((packaged-version (find-packaged-version inputs group artifact))
+ (local-version (assoc-ref (assoc-ref local-packages group) artifact)))
+ (or local-version packaged-version
+ (if optional?
+ #f
+ (begin
+ (format (current-error-port) "maven: ~a:~a is missing from inputs~%"
+ group artifact)
+ (throw 'no-such-input group artifact))))))
(let ((tmpfile (string-append pom-file ".tmp")))
(with-output-to-file pom-file
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 07/14] guix: maven: Use a temporary file to fix pom files.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-7-julien@lepiller.eu
* guix/build/maven/pom.scm (fix-pom-dependencies): Actually use the
temporary file that was created.
---
guix/build/maven/pom.scm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

Toggle diff (16 lines)
diff --git a/guix/build/maven/pom.scm b/guix/build/maven/pom.scm
index 9c0669c7cd..9e35e47a7f 100644
--- a/guix/build/maven/pom.scm
+++ b/guix/build/maven/pom.scm
@@ -508,6 +508,7 @@ Returns nothing, but overrides the @var{pom-file} as a side-effect."
(throw 'no-such-input group artifact))))))
(let ((tmpfile (string-append pom-file ".tmp")))
- (with-output-to-file pom-file
+ (with-output-to-file tmpfile
(lambda _
- (sxml->xml (fix-maven-xml (fix-pom pom)))))))
+ (sxml->xml (fix-maven-xml (fix-pom pom)))))
+ (rename-file tmpfile pom-file)))
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 08/14] guix: java-utils: Look for actual jar files.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-8-julien@lepiller.eu
* guix/build/java-utils.scm (install-from-pom): Fix `find-files` to look
only for jar files.
---
guix/build/java-utils.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Toggle diff (15 lines)
diff --git a/guix/build/java-utils.scm b/guix/build/java-utils.scm
index 5a54a14c1b..87c3ac43c9 100644
--- a/guix/build/java-utils.scm
+++ b/guix/build/java-utils.scm
@@ -125,7 +125,7 @@ the phase fails."
version ".jar"))))
;; Otherwise, we try to find any jar file.
(jars (if (null? jars)
- (find-files "." ".*.jar")
+ (find-files "." "\\.jar$")
jars))
(jar-name (string-append repository artifact "-" version ".jar"))
(pom-name (string-append repository artifact "-" version ".pom")))
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 10/14] gnu: java-commons-math3: Install to maven repository.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-10-julien@lepiller.eu
* gnu/packages/java.scm (java-commons-math3)[phases]: Use
install-from-pom.
---
gnu/packages/java.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Toggle diff (15 lines)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 14d02af512..dd9827a351 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -5789,7 +5789,7 @@ overly clever.")
#t))
;; There is no install target.
(replace 'install
- (install-jars "target")))))
+ (install-from-pom "pom.xml")))))
(native-inputs
`(("java-junit" ,java-junit)
("java-hamcrest-core" ,java-hamcrest-core)))
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 09/14] gnu: Add java-jopt-simple-4.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-9-julien@lepiller.eu
* gnu/packges/java.scm (java-jopt-simple-4): New variable.
(java-jopt-simple): Install to maven repository structure.
---
gnu/packages/java.scm | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)

Toggle diff (59 lines)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index d7118b4ce6..14d02af512 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -3,7 +3,7 @@
;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
;;; Copyright © 2016, 2017 Roel Janssen <roel@gnu.org>
;;; Copyright © 2017, 2019, 2021 Carlo Zancanaro <carlo@zancanaro.id.au>
-;;; Copyright © 2017-2020 Julien Lepiller <julien@lepiller.eu>
+;;; Copyright © 2017-2021 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
;;; Copyright © 2016, 2017, 2018 Alex Vong <alexvong1995@gmail.com>
;;; Copyright © 2017, 2019, 2021 Tobias Geerinckx-Rice <me@tobias.gr>
@@ -5715,7 +5715,13 @@ The jMock library
(build-system ant-build-system)
(arguments
`(#:tests? #f ; there are no tests
- #:jar-name "jopt-simple.jar"))
+ #:jar-name "jopt-simple.jar"
+ #:phases
+ (modify-phases %standard-phases
+ (add-before 'install 'create-pom
+ (generate-pom.xml "pom.xml" "net.sf.jopt-simple" "jopt-simple" ,version))
+ (replace 'install
+ (install-from-pom "pom.xml")))))
(home-page "https://pholser.github.io/jopt-simple/")
(synopsis "Java library for parsing command line options")
(description "JOpt Simple is a Java library for parsing command line
@@ -5727,6 +5733,28 @@ retrieval of options and their arguments simple and expressive, without being
overly clever.")
(license license:expat)))
+;; Required by jmh
+(define-public java-jopt-simple-4
+ (package
+ (inherit java-jopt-simple)
+ (version "4.6")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://repo1.maven.org/maven2/"
+ "net/sf/jopt-simple/jopt-simple/"
+ version "/jopt-simple-"
+ version "-sources.jar"))
+ (sha256
+ (base32
+ "0ny82zczxkn201ld0b7rps0ifzjhfs8m1ncdmy1f50145ciszkpd"))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments java-jopt-simple)
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (replace 'create-pom
+ (generate-pom.xml "pom.xml" "net.sf.jopt-simple" "jopt-simple"
+ ,version))))))))
+
(define-public java-commons-math3
(package
(name "java-commons-math3")
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 11/14] gnu: maven-core: Hardcode versions we have in Guix.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-11-julien@lepiller.eu
* gnu/packages/maven.scm (maven-core)[phases]: Replace default hardcoded
versions by versions of packages we have in Guix.
---
gnu/packages/maven.scm | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)

Toggle diff (54 lines)
diff --git a/gnu/packages/maven.scm b/gnu/packages/maven.scm
index 8f63ee9be2..9d65e9b56d 100644
--- a/gnu/packages/maven.scm
+++ b/gnu/packages/maven.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
+;;; Copyright © 2018-2021 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019 Björn Höfling <bjoern.hoefling@bjoernhoefling.de>
;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
@@ -1541,7 +1541,9 @@ process."))))
(add-before 'build 'modify-metainf
(lambda _
(substitute* "build.xml"
- (("message=\"\"") "message=\"Implementation-Version: 3.5.4\n\""))
+ (("message=\"\"")
+ (string-append "message=\"Implementation-Version: "
+ (package-version maven) "\n\"")))
#t))
(add-before 'build 'add-maven-files
(lambda _
@@ -1590,7 +1592,28 @@ artifactId=maven-core" ,(package-version maven-core-bootstrap))))
default-bindings-xml
artifact-handlers-xml)))))))
#t))
- (add-after 'generate-metadata 'rebuild
+ (add-after 'generate-metadata 'fix-plugin-versions
+ (lambda _
+ ;; This file controls the default plugins used by Maven. Ensure
+ ;; we use the versions we have packaged by default
+ (substitute* '("build/classes/META-INF/plexus/default-bindings.xml"
+ "build/classes/META-INF/plexus/components.xml")
+ (("maven-install-plugin:[0-9.]+")
+ (string-append "maven-install-plugin:"
+ ,(package-version maven-install-plugin)))
+ (("maven-resources-plugin:[0-9.]+")
+ (string-append "maven-resources-plugin:"
+ ,(package-version maven-resources-plugin)))
+ (("maven-compiler-plugin:[0-9.]+")
+ (string-append "maven-compiler-plugin:"
+ ,(package-version maven-compiler-plugin)))
+ (("maven-surefire-plugin:[0-9.]+")
+ (string-append "maven-surefire-plugin:"
+ ,(package-version maven-surefire-plugin)))
+ (("maven-jar-plugin:[0-9.]+")
+ (string-append "maven-jar-plugin:"
+ ,(package-version maven-jar-plugin))))))
+ (add-after 'fix-plugin-versions 'rebuild
(lambda _
(invoke "ant" "jar")
#t))))))
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 12/14] gnu: maven-enforcer-parent-pom: Fix pom.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-12-julien@lepiller.eu
* gnu/packages/maven.scm (maven-enforcer-parent-pom): Fix dependency
versions in pom file.
---
gnu/packages/maven.scm | 9 +++++++++
1 file changed, 9 insertions(+)

Toggle diff (22 lines)
diff --git a/gnu/packages/maven.scm b/gnu/packages/maven.scm
index 9d65e9b56d..f7cb168f47 100644
--- a/gnu/packages/maven.scm
+++ b/gnu/packages/maven.scm
@@ -2713,6 +2713,15 @@ Maven project dependencies.")
(modify-phases %standard-phases
(delete 'configure)
(delete 'build)
+ (add-before 'install 'fix-pom-versions
+ (lambda _
+ (substitute* "pom.xml"
+ (("3.8.1") ,(package-version java-commons-lang3))
+ (("1.4.1") ,(package-version maven-resolver-util))
+ (("1.12") ,(package-version java-commons-codec))
+ (("<version>2.2</version>")
+ ,(string-append "<version>" (package-version maven-dependency-tree)
+ "</version>")))))
(replace 'install
(install-pom-file "pom.xml")))))
(propagated-inputs
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 13/14] gnu: java-jmh: Update to 1.32.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-13-julien@lepiller.eu
* gnu/packages/java.scm (java-jmh): Update to 1.32.
[source]: Switch to the git repository.
---
gnu/packages/java.scm | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

Toggle diff (30 lines)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index dd9827a351..c7ae002736 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -5803,16 +5803,16 @@ available in the Java programming language or Commons Lang.")
(define-public java-jmh
(package
(name "java-jmh")
- (version "1.17.5")
+ (version "1.32")
(source (origin
- (method hg-fetch)
- (uri (hg-reference
- (url "http://hg.openjdk.java.net/code-tools/jmh/")
- (changeset version)))
- (file-name (string-append name "-" version "-checkout"))
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/openjdk/jmh")
+ (commit version)))
+ (file-name (git-file-name name version))
(sha256
(base32
- "1fxyxhg9famwcg1prc4cgwb5wzyxqavn3cjm5vz8605xz7x5k084"))))
+ "0i7fa7l3gdqkkgz5ddayp6m46dgbj9rqlz35xffrcbyiz3gpljy0"))))
(build-system ant-build-system)
(arguments
`(#:jar-name "jmh-core.jar"
--
2.31.1
J
J
Julien Lepiller wrote on 1 Jun 2021 00:44
[PATCH 14/14] gnu: java-jmh: Switch to maven-build-system.
(address . 48766@debbugs.gnu.org)
20210531224427.13300-14-julien@lepiller.eu
* gnu/packages/java.scm (java-jmh): Switch to maven-build-system.
---
gnu/packages/java.scm | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)

Toggle diff (58 lines)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index c7ae002736..f597c64811 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -43,6 +43,7 @@
#:use-module (guix utils)
#:use-module (guix build-system ant)
#:use-module (guix build-system gnu)
+ #:use-module (guix build-system maven)
#:use-module (guix build-system trivial)
#:use-module (gnu packages)
#:use-module (gnu packages attr)
@@ -5813,26 +5814,27 @@ available in the Java programming language or Commons Lang.")
(sha256
(base32
"0i7fa7l3gdqkkgz5ddayp6m46dgbj9rqlz35xffrcbyiz3gpljy0"))))
- (build-system ant-build-system)
+ (build-system maven-build-system)
(arguments
- `(#:jar-name "jmh-core.jar"
- #:source-dir "jmh-core/src/main"
- #:test-dir "jmh-core/src/test"
+ `(#:exclude
+ (("org.apache.maven.plugins" .
+ ("maven-source-plugin" "maven-archetype-plugin" "maven-shade-plugin"
+ "maven-site-plugin" "maven-javadoc-plugin" "maven-eclipse-plugin"))
+ ("com.mycila.maven-license-plugin" . ("maven-license-plugin"))
+ ("org.apache.maven.wagon" . ("wagon-ssh")))
+ #:maven-plugins
+ (("maven-enforcer-plugin" ,maven-enforcer-plugin)
+ ,@(default-maven-plugins))
#:phases
(modify-phases %standard-phases
- ;; This seems to be a bug in the JDK. It may not be necessary in
- ;; future versions of the JDK.
- (add-after 'unpack 'fix-bug
+ (add-after 'unpack 'remove-unnecessary
(lambda _
- (with-directory-excursion
- "jmh-core/src/main/java/org/openjdk/jmh/runner/options"
- (substitute* '("IntegerValueConverter.java"
- "ThreadsValueConverter.java")
- (("public Class<Integer> valueType")
- "public Class<? extends Integer> valueType")))
- #t)))))
- (inputs
- `(("java-jopt-simple" ,java-jopt-simple)
+ ;; requires org.apache.maven.archetype:archetype-packaging.
+ ;; Its subprojects also require groovy, kotlin and scala,
+ ;; respectively.
+ (delete-file-recursively "jmh-archetypes"))))))
+ (propagated-inputs
+ `(("java-jopt-simple" ,java-jopt-simple-4)
("java-commons-math3" ,java-commons-math3)))
(native-inputs
`(("java-junit" ,java-junit)
--
2.31.1
J
J
Julien Lepiller wrote on 22 Jun 2021 13:13
Re: [bug#48766] [PATCH] gnu: java-jmh: Switch to maven-build-system.
(address . 48766-done@debbugs.gnu.org)
20210622131331.3936334a@tachikoma.lepiller.eu
After almost a month of silence, pushed to master as
4c98db94b0271aa5371ff00cf98c0ebc70ab1a8d to
1b1eeb3b123162c4d73c939e9ca7bbbb4f79aef1. Thanks!
Closed
?