From 8c07c7eb1dadf179c51fc23e1969aacf0169b697 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Mon, 14 Mar 2022 18:04:31 +0530 Subject: forge: Allow deep clone on derivation jobs. * guix/forge/forge.scm (derivation-job-gexp): Accept #:deep-clone? argument and pass on to latest-git-checkout. * guix/forge/build/git.scm (download-git-to-store): Accept #:deep-clone? argument, and deep clone the git repository if it is #t. Explicitly specify the first commit to `git log' so that only the first commit message is displayed. --- guix/forge/build/git.scm | 30 +++++++++++++++++++----------- guix/forge/forge.scm | 13 ++++++++++--- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/guix/forge/build/git.scm b/guix/forge/build/git.scm index 1434d07..098be83 100644 --- a/guix/forge/build/git.scm +++ b/guix/forge/build/git.scm @@ -40,10 +40,14 @@ (newline) (force-output)) -(define* (download-git-to-store store name url #:key branch show-commit?) +(define* (download-git-to-store store name url #:key branch show-commit? deep-clone?) "Download BRANCH of git repository from URL to STORE under NAME and return store path. If BRANCH is not specified, the default branch is -downloaded. git and certificates should be in the environment." +downloaded. git and certificates should be in the environment. + +If DEEP-CLONE? is #t, the git repository is deep cloned and the .git +directory is included in the store. Else, the git repository is +shallow cloned and the .git directory is not included." (call-with-temporary-directory (lambda (directory) (with-directory-excursion directory @@ -55,21 +59,25 @@ downloaded. git and certificates should be in the environment." (invoke-error-exit-status condition)) (exit #f))) (apply invoke - "git" "clone" "--quiet" "--depth" "1" - ;; Append file:// to local repository path so that - ;; shallow clone works. - (if (string-prefix? "/" url) - (string-append "file://" url) - url) - (append (if branch + "git" "clone" "--quiet" + (append (if deep-clone? + (list) + (list "--depth" "1")) + ;; Append file:// to local repository path so + ;; that shallow clone works. + (list (if (string-prefix? "/" url) + (string-append "file://" url) + url)) + (if branch (list "--branch" branch) (list)) (list ".")))) (when show-commit? (hline) - (invoke "git" "--no-pager" "log") + (invoke "git" "log" "HEAD~1..HEAD") (hline)) - (delete-file-recursively ".git")) + (unless deep-clone? + (delete-file-recursively ".git"))) (add-to-store store name #t "sha256" directory)))) (define latest-git-checkout diff --git a/guix/forge/forge.scm b/guix/forge/forge.scm index e88edb0..f8acc80 100644 --- a/guix/forge/forge.scm +++ b/guix/forge/forge.scm @@ -156,15 +156,21 @@ (name (guix-module-name? name)))) (define* (derivation-job-gexp project job gexp-producer - #:key (guix-daemon-uri (%daemon-socket-uri))) + #:key (guix-daemon-uri (%daemon-socket-uri)) deep-clone?) "Return a G-expression that builds another G-expression as a derivation and returns its output path. GEXP-PRODUCER is a G-expression that expands to a lambda function. The lambda function takes one argument---the latest git checkout of PROJECT, a object---and returns a G-expression describing a derivation to run. JOB is a object representing -the job that this derivation will be part of. GUIX_DAEMON_URI is a -file name or URI designating the Guix daemon endpoint." +the job that this derivation will be part of. + +GUIX_DAEMON_URI is a file name or URI designating the Guix daemon +endpoint. + +If DEEP-CLONE? is #t, the git checkout is a deep clone of the +repository that includes the .git directory. Else, it is a shallow +clone and does not include the .git directory." (with-imported-modules (source-module-closure '((forge build git) (guix gexp) (guix profiles)) @@ -209,6 +215,7 @@ file name or URI designating the Guix daemon endpoint." #$(string-append (forge-project-name project) "-checkout") #$(forge-project-repository project) + #:deep-clone? #$deep-clone? #:show-commit? #t)) (drv (gexp->derivation #$(string-append (forge-laminar-job-name job) -- cgit v1.2.3