From 756e336fa008c2469b4a7317ad5c641ed48f25d6 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Tue, 5 Sep 2023 16:30:22 -0400 Subject: Revert "guix: git: Avoid touching the network unless needed in 'reference-available?'." MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a789dd58656d5f7f1b8edf790d77753fc71670af, which broke e.g.: guix time-machine -C <(echo %default-channels) -- describe Add an explanatory comment as suggested. Reported-by: Ludovic Courtès --- guix/git.scm | 18 ++++++++++++++++-- 1 file 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 -- cgit 1.4.1