~ruther/guix-local

811b249397bd805596d8c09e0d7513a30fbe55dd — Ludovic Courtès 2 years ago 7f3ebd6
git-download: Move fallback code to (guix build git).

* guix/build/git.scm (git-fetch-with-fallback): New procedure, with code
taken from…
* guix/git-download.scm (git-fetch): … here.
[modules]: Remove modules that are no longer directly used in ‘build’.
[build]: Use ‘git-fetch-with-fallback’.
2 files changed, 50 insertions(+), 41 deletions(-)

M guix/build/git.scm
M guix/git-download.scm
M guix/build/git.scm => guix/build/git.scm +42 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2016, 2019 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2016, 2019, 2023 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 18,9 18,12 @@

(define-module (guix build git)
  #:use-module (guix build utils)
  #:autoload   (guix build download-nar) (download-nar)
  #:autoload   (guix swh) (%verify-swh-certificate? swh-download)
  #:use-module (srfi srfi-34)
  #:use-module (ice-9 format)
  #:export (git-fetch))
  #:export (git-fetch
            git-fetch-with-fallback))

;;; Commentary:
;;;


@@ 76,4 79,41 @@ recursively.  Return #t on success, #f otherwise."
      (delete-file-recursively ".git")
      #t)))


(define* (git-fetch-with-fallback url commit directory
                                  #:key (git-command "git") recursive?)
  "Like 'git-fetch', fetch COMMIT from URL into DIRECTORY, but fall back to
alternative methods when fetching from URL fails: attempt to download a nar,
and if that also fails, download from the Software Heritage archive."
  (or (git-fetch url commit directory
                 #:recursive? recursive?
                 #:git-command git-command)
      (download-nar directory)

      ;; As a last resort, attempt to download from Software Heritage.
      ;; Disable X.509 certificate verification to avoid depending
      ;; on nss-certs--we're authenticating the checkout anyway.
      ;; XXX: Currently recursive checkouts are not supported.
      (and (not recursive?)
           (parameterize ((%verify-swh-certificate? #f))
             (format (current-error-port)
                     "Trying to download from Software Heritage...~%")

             (swh-download url commit directory)
             (when (file-exists?
                    (string-append directory "/.gitattributes"))
               ;; Perform CR/LF conversion and other changes
               ;; specificied by '.gitattributes'.
               (invoke git-command "-C" directory "init")
               (invoke git-command "-C" directory "config" "--local"
                       "user.email" "you@example.org")
               (invoke git-command "-C" directory "config" "--local"
                       "user.name" "Your Name")
               (invoke git-command "-C" directory "add" ".")
               (invoke git-command "-C" directory "commit" "-am" "init")
               (invoke git-command "-C" directory "read-tree" "--empty")
               (invoke git-command "-C" directory "reset" "--hard")
               (delete-file-recursively
                (string-append directory "/.git")))))))

;;; git.scm ends here

M guix/git-download.scm => guix/git-download.scm +8 -39
@@ 116,19 116,16 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
  (define modules
    (delete '(guix config)
            (source-module-closure '((guix build git)
                                     (guix build utils)
                                     (guix build download-nar)
                                     (guix swh)))))
                                     (guix build utils)))))

  (define build
    (with-imported-modules modules
      (with-extensions (list guile-json gnutls   ;for (guix swh)
      (with-extensions (list guile-json gnutls    ;for (guix swh)
                             guile-lzlib)
        #~(begin
            (use-modules (guix build git)
                         (guix build utils)
                         (guix build download-nar)
                         (guix swh)
                         ((guix build utils)
                          #:select (set-path-environment-variable))
                         (ice-9 match))

            (define recursive?


@@ 151,38 148,10 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
            (setvbuf (current-output-port) 'line)
            (setvbuf (current-error-port) 'line)

            (or (git-fetch (getenv "git url") (getenv "git commit")
                           #$output
                           #:recursive? recursive?
                           #:git-command "git")
                (download-nar #$output)

                ;; As a last resort, attempt to download from Software Heritage.
                ;; Disable X.509 certificate verification to avoid depending
                ;; on nss-certs--we're authenticating the checkout anyway.
                ;; XXX: Currently recursive checkouts are not supported.
                (and (not recursive?)
                     (parameterize ((%verify-swh-certificate? #f))
                       (format (current-error-port)
                               "Trying to download from Software Heritage...~%")

                       (swh-download (getenv "git url") (getenv "git commit")
                                     #$output)
                       (when (file-exists?
                              (string-append #$output "/.gitattributes"))
                         ;; Perform CR/LF conversion and other changes
                         ;; specificied by '.gitattributes'.
                         (invoke "git" "-C" #$output "init")
                         (invoke "git" "-C" #$output "config" "--local"
                                 "user.email" "you@example.org")
                         (invoke "git" "-C" #$output "config" "--local"
                                 "user.name" "Your Name")
                         (invoke "git" "-C" #$output "add" ".")
                         (invoke "git" "-C" #$output "commit" "-am" "init")
                         (invoke "git" "-C" #$output "read-tree" "--empty")
                         (invoke "git" "-C" #$output "reset" "--hard")
                         (delete-file-recursively
                          (string-append #$output "/.git"))))))))))
            (git-fetch-with-fallback (getenv "git url") (getenv "git commit")
                                     #$output
                                     #:recursive? recursive?
                                     #:git-command "git")))))

  (mlet %store-monad ((guile (package->derivation guile system)))
    (gexp->derivation (or name "git-checkout") build