summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix/git.scm18
1 files changed, 16 insertions, 2 deletions
diff --git a/guix/git.scm b/guix/git.scm
index ebe2600209..a957773873 100644
--- a/guix/git.scm
+++ b/guix/git.scm
@@ -360,8 +360,22 @@ dynamic extent of EXP."
(define (reference-available? repository ref)
"Return true if REF, a reference such as '(commit . \"cabba9e\"), is
definitely available in REPOSITORY, false otherwise."
- (false-if-git-not-found
- (->bool (resolve-reference repository ref))))
+ ;; Note: this must not rely on 'resolve-reference', as that procedure always
+ ;; resolves the references for branch names such as master. The semantic we
+ ;; want here is that unless the reference is exact (e.g. a commit), the
+ ;; reference should not be considered available, has it could have changed
+ ;; on the remote.
+ (match ref
+ ((or ('commit . commit)
+ ('tag-or-commit . (? commit-id? commit)))
+ (let ((len (string-length commit))
+ (oid (string->oid commit)))
+ (false-if-git-not-found
+ (->bool (if (< len 40)
+ (object-lookup-prefix repository oid len OBJ-COMMIT)
+ (commit-lookup repository oid))))))
+ (_
+ #f)))
(define (clone-from-swh url tag-or-commit output)
"Attempt to clone TAG-OR-COMMIT (a string), which originates from URL, using