~ruther/guix-local

35a6dabcf1386fa33539a4d022dc3a46b536de64 — Ludovic Courtès 10 years ago 4828ff9
git-download: Correctly implement recursive checkouts.

Previously, the 'git checkout' invocation would remove sub-modules that
had been initialized by 'git clone --recursive'.

* guix/build/git.scm (git-fetch): Never use "git clone --recursive".
Invoke "git submodule update --init --recursive" after "git checkout".
Remove '.git' directories as the last step.
1 files changed, 24 insertions(+), 19 deletions(-)

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


@@ 37,23 37,28 @@ recursively.  Return #t on success, #f otherwise."
  ;; in advance anyway.
  (setenv "GIT_SSL_NO_VERIFY" "true")

  (let ((args `("clone" ,@(if recursive? '("--recursive") '())
                ,url ,directory)))
    (and (zero? (apply system* git-command args))
         (with-directory-excursion directory
           (system* git-command "tag" "-l")
           (and (zero? (system* git-command "checkout" commit))
                (begin
                  ;; The contents of '.git' vary as a function of the current
                  ;; status of the Git repo.  Since we want a fixed output, this
                  ;; directory needs to be taken out.
                  (delete-file-recursively ".git")

                  (when recursive?
                    ;; In sub-modules, '.git' is a flat file, not a directory,
                    ;; so we can use 'find-files' here.
                    (for-each delete-file-recursively
                              (find-files directory "^\\.git$")))
                  #t))))))
  ;; We cannot use "git clone --recursive" since the following "git checkout"
  ;; effectively removes sub-module checkouts as of Git 2.6.3.
  (and (zero? (system* git-command "clone" url directory))
       (with-directory-excursion directory
         (system* git-command "tag" "-l")
         (and (zero? (system* git-command "checkout" commit))
              (begin
                (when recursive?
                  ;; Now is the time to fetch sub-modules.
                  (unless (zero? (system* git-command "submodule" "update"
                                          "--init" "--recursive"))
                    (error "failed to fetch sub-modules" url))

                  ;; In sub-modules, '.git' is a flat file, not a directory,
                  ;; so we can use 'find-files' here.
                  (for-each delete-file-recursively
                            (find-files directory "^\\.git$")))

                ;; The contents of '.git' vary as a function of the current
                ;; status of the Git repo.  Since we want a fixed output, this
                ;; directory needs to be taken out.
                (delete-file-recursively ".git")
                #t)))))

;;; git.scm ends here