summaryrefslogtreecommitdiff
path: root/guix/git.scm
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2018-03-20 00:49:05 -0400
committerMark H Weaver <mhw@netris.org>2018-03-20 00:49:05 -0400
commit647888845c0d7b9ea1b51a3e3492d4d2382f4468 (patch)
treebe34c5ec88db452c63253dc4a15f9f4cf199b1e6 /guix/git.scm
parentfe15613cdf8623574ce64c05416dd3fab41eef86 (diff)
parentc657716ede8932da356635802534aa13205a6ecd (diff)
downloadguix-patches-647888845c0d7b9ea1b51a3e3492d4d2382f4468.tar
guix-patches-647888845c0d7b9ea1b51a3e3492d4d2382f4468.tar.gz
Merge branch 'master' into core-updates
Diffstat (limited to 'guix/git.scm')
-rw-r--r--guix/git.scm40
1 files changed, 29 insertions, 11 deletions
diff --git a/guix/git.scm b/guix/git.scm
index fc41e2ace3..d31c35f64f 100644
--- a/guix/git.scm
+++ b/guix/git.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -27,6 +28,8 @@
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-34)
+ #:use-module (srfi srfi-35)
#:export (%repository-cache-directory
latest-repository-commit))
@@ -94,17 +97,32 @@ create the store directory name."
(define (switch-to-ref repository ref)
"Switch to REPOSITORY's branch, commit or tag specified by REF."
- (let* ((oid (match ref
- (('branch . branch)
- (reference-target
- (branch-lookup repository branch BRANCH-REMOTE)))
- (('commit . commit)
- (string->oid commit))
- (('tag . tag)
- (reference-name->oid repository
- (string-append "refs/tags/" tag)))))
- (obj (object-lookup repository oid)))
- (reset repository obj RESET_HARD)))
+ (define obj
+ (match ref
+ (('branch . branch)
+ (let ((oid (reference-target
+ (branch-lookup repository branch BRANCH-REMOTE))))
+ (object-lookup repository oid)))
+ (('commit . commit)
+ (let ((len (string-length commit)))
+ ;; 'object-lookup-prefix' appeared in Guile-Git in Mar. 2018, so we
+ ;; can't be sure it's available. Furthermore, 'string->oid' used to
+ ;; read out-of-bounds when passed a string shorter than 40 chars,
+ ;; which is why we delay calls to it below.
+ (if (< len 40)
+ (if (module-defined? (resolve-interface '(git object))
+ 'object-lookup-prefix)
+ (object-lookup-prefix repository (string->oid commit) len)
+ (raise (condition
+ (&message
+ (message "long Git object ID is required")))))
+ (object-lookup repository (string->oid commit)))))
+ (('tag . tag)
+ (let ((oid (reference-name->oid repository
+ (string-append "refs/tags/" tag))))
+ (object-lookup repository oid)))))
+
+ (reset repository obj RESET_HARD))
(define* (latest-repository-commit store url
#:key