diff options
author | Ludovic Courtès <ludo@gnu.org> | 2020-06-07 22:14:56 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2020-06-07 23:10:46 +0200 |
commit | 1fd7de45f218ce572a3fe87764ad15927e3dbdc4 (patch) | |
tree | 403fdff74a8d91fec1b595e203af7b294ff23d4f | |
parent | 715f589ea39146fa66cce5470c0368073c471540 (diff) |
git: 'update-cached-checkout' gracefully handles missing starting commit.
Fixes <https://bugs.gnu.org/41604>
Reported by John Soo <jsoo1@asu.edu> and zimoun <zimon.toutoune@gmail.com>.
* guix/git.scm (false-if-git-not-found): New macro.
(reference-available?): Use it.
(update-cached-checkout): Use it when looking up STARTING-COMMIT.
Set RELATION to 'unrelated when OLD is #false.
-rw-r--r-- | guix/git.scm | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/guix/git.scm b/guix/git.scm index ab3b5075b1..1c45afa050 100644 --- a/guix/git.scm +++ b/guix/git.scm @@ -243,18 +243,23 @@ Return true on success, false on failure." (G_ "Support for submodules is missing; \ please upgrade Guile-Git.~%")))) +(define-syntax-rule (false-if-git-not-found exp) + "Evaluate EXP, returning #false if a GIT_ENOTFOUND error is raised." + (catch 'git-error + (lambda () + exp) + (lambda (key error . rest) + (if (= GIT_ENOTFOUND (git-error-code error)) + #f + (apply throw key error rest))))) + (define (reference-available? repository ref) "Return true if REF, a reference such as '(commit . \"cabba9e\"), is definitely available in REPOSITORY, false otherwise." (match ref (('commit . commit) - (catch 'git-error - (lambda () - (->bool (commit-lookup repository (string->oid commit)))) - (lambda (key error . rest) - (if (= GIT_ENOTFOUND (git-error-code error)) - #f - (apply throw key error rest))))) + (false-if-git-not-found + (->bool (commit-lookup repository (string->oid commit))))) (_ #f))) @@ -311,10 +316,13 @@ When RECURSIVE? is true, check out submodules as well, if any." (new (and starting-commit (commit-lookup repository oid))) (old (and starting-commit - (commit-lookup repository - (string->oid starting-commit)))) + (false-if-git-not-found + (commit-lookup repository + (string->oid starting-commit))))) (relation (and starting-commit - (commit-relation old new)))) + (if old + (commit-relation old new) + 'unrelated)))) ;; Reclaim file descriptors and memory mappings associated with ;; REPOSITORY as soon as possible. |