1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
4 ;;; This file is part of GNU Guix.
6 ;;; GNU Guix is free software; you can redistribute it and/or modify it
7 ;;; under the terms of the GNU General Public License as published by
8 ;;; the Free Software Foundation; either version 3 of the License, or (at
9 ;;; your option) any later version.
11 ;;; GNU Guix is distributed in the hope that it will be useful, but
12 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;;; GNU General Public License for more details.
16 ;;; You should have received a copy of the GNU General Public License
17 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
19 (define-module (guix build git)
20 #:use-module (guix build utils)
25 ;;; This is the build-side support code of (guix git-download). It allows a
26 ;;; Git repository to be cloned and checked out at a specific commit.
30 (define* (git-fetch url commit directory
31 #:key (git-command "git") recursive?)
32 "Fetch COMMIT from URL into DIRECTORY. COMMIT must be a valid Git commit
33 identifier. When RECURSIVE? is true, all the sub-modules of URL are fetched,
34 recursively. Return #t on success, #f otherwise."
36 ;; Disable TLS certificate verification. The hash of the checkout is known
38 (setenv "GIT_SSL_NO_VERIFY" "true")
40 (let ((args `("clone" ,@(if recursive? '("--recursive") '())
42 (and (zero? (apply system* git-command args))
43 (with-directory-excursion directory
44 (system* git-command "tag" "-l")
45 (and (zero? (system* git-command "checkout" commit))
47 ;; The contents of '.git' vary as a function of the current
48 ;; status of the Git repo. Since we want a fixed output, this
49 ;; directory needs to be taken out.
50 (delete-file-recursively ".git")
53 ;; In sub-modules, '.git' is a flat file, not a directory,
54 ;; so we can use 'find-files' here.
55 (for-each delete-file-recursively
56 (find-files directory "^\\.git$")))