Subject: [PATCH v3] gnu: Add git-extras.

From: Greg Hogan <[email-masked]>
Date: Tue, 22 Oct 2024 17:21:10 +0000

This revision updates the package version, necessitating use of a temporary file
to store the PATH modifications to prevent "Argument length too long" errors.

* gnu/packages/version-control.scm (git-extras): New variable.
---
 gnu/packages/version-control.scm | 75 ++++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)

diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 6bd37fee82..b381ea7ef7 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -111,6 +111,7 @@ (define-module (gnu packages version-control)
   #:use-module (gnu packages file)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages freedesktop)
+  #:use-module (gnu packages gawk)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages gl)
   #:use-module (gnu packages glib)
@@ -127,6 +128,7 @@ (define-module (gnu packages version-control)
   #:use-module (gnu packages guile-xyz)
   #:use-module (gnu packages image)
   #:use-module (gnu packages imagemagick)
+  #:use-module (gnu packages less)
   #:use-module (gnu packages libbsd)
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages linux)
@@ -149,6 +151,7 @@ (define-module (gnu packages version-control)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages readline)
+  #:use-module (gnu packages rsync)
   #:use-module (gnu packages ruby)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages texinfo)
@@ -4251,6 +4254,78 @@ (define-public gitlint
 commit messages for style.")
     (license license:expat)))
 
+(define-public git-extras
+  (package
+    (name "git-extras")
+    (version "7.3.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/tj/git-extras")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1lig1sbk83qqvbvpmpcjaf23nk0r7snny5lix75ym1z320970xni"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:make-flags
+      #~(list (string-append "PREFIX=" #$output))
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; No configure script, build process, or tests.
+          (delete 'bootstrap)
+          (delete 'configure)
+          (delete 'build)
+          (delete 'check)
+          (add-after 'unpack 'hardcode-dependency-paths
+            (lambda* (#:key inputs #:allow-other-keys)
+              ;; Write to and copy from temporary file to prevent
+              ;; "make: bash: Argument list too long" errors.
+              (let* ((temp-file (mkstemp! "temp-file.XXXXXX"))
+                     (temp-filename (port-filename temp-file)))
+                (map (lambda (name)
+                       (format temp-file "export PATH=$PATH:~a/bin~%"
+                               (assoc-ref inputs name)))
+                     (list "coreutils-minimal"
+                           "curl"
+                           "findutils"
+                           "gawk"
+                           "less"
+                           "ncurses"
+                           "procps"
+                           "rsync"
+                           "sed"
+                           "util-linux"))
+                ;; The Makefile injects helper scripts and functions into each
+                ;; script. This substitution injects a PATH appending the bin
+                ;; directory of each non-propagated input in order to minimize
+                ;; the number of packages propagated to the profile.
+                (substitute* "Makefile"
+                  (("head -1 bin/\\$\\(COMMAND\\) > \\$\\(TEMPFILE\\); \\\\" line)
+                   (string-append
+                    line "\n"
+                    "cat " temp-filename " >> $(TEMPFILE); \\")))))))))
+    (propagated-inputs (list git))
+    (inputs
+     (list coreutils-minimal
+           curl
+           findutils
+           gawk
+           less
+           ncurses
+           procps
+           rsync
+           sed
+           util-linux))
+    (home-page "https://github.com/tj/git-extras")
+    (synopsis "Additional Git utilities")
+    (description "The git-extras package provides a collection of additional
+git commands for repository metrics and summarization, commit and log editing,
+developer workflow, and project and release management.")
+    (license license:expat)))
+
 (define-public hut
   (package
     (name "hut")

base-commit: 3bcd0bf9e6c474afb07275f39d121b714d19c9ab
-- 
2.46.1