git: Add ‘tag->commit’ and use it in (guix channels).

* guix/git.scm (tag->commit): New procedure, taken from…
(resolve-reference): … here.  Use it in the ‘tag’ case.
* guix/channels.scm (resolve-channel-news-entry-tag): Use ‘tag->commit’
instead of custom code.

Change-Id: I46ea387345dc1b695ce0702991a52d0cde29e2f0
This commit is contained in:
Ludovic Courtès 2024-03-31 23:31:21 +02:00
parent 088e181c0a
commit 96d2de0185
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 18 additions and 17 deletions

View file

@ -26,6 +26,7 @@ (define-module (guix channels)
commit-difference
repository-info
commit-short-id
tag->commit
with-repository)
#:autoload (guix git-authenticate) (authenticate-repository)
#:autoload (guix openpgp) (openpgp-public-key-fingerprint
@ -1148,14 +1149,8 @@ (define (resolve-channel-news-entry-tag repository entry)
cannot be found."
(if (channel-news-entry-commit entry)
entry
(let* ((tag (channel-news-entry-tag entry))
(reference (reference-lookup repository
(string-append "refs/tags/" tag)))
(target (reference-target reference))
(oid (let ((obj (object-lookup repository target)))
(if (= OBJ-TAG (object-type obj)) ;annotated tag?
(tag-target-id (tag-lookup repository target))
target))))
(let* ((tag (channel-news-entry-tag entry))
(oid (object-id (tag->commit repository tag))))
(channel-news-entry (oid->string oid) tag
(channel-news-entry-title entry)
(channel-news-entry-body entry)))))

View file

@ -68,6 +68,7 @@ (define-module (guix git)
commit-descendant?
commit-id?
commit-short-id
tag->commit
remote-refs
@ -237,6 +238,19 @@ (define (commit-id? str)
(define commit-short-id
(compose (cut string-take <> 7) oid->string commit-id))
(define (tag->commit repository tag)
"Resolve TAG in REPOSITORY and return the corresponding object, usually a
commit."
(let* ((oid (reference-name->oid repository
(string-append "refs/tags/" tag)))
(obj (object-lookup repository oid)))
;; OID may designate an "annotated tag" object or a "commit" object.
;; Return the commit object in both cases.
(if (= OBJ-TAG (object-type obj))
(object-lookup repository
(tag-target-id (tag-lookup repository oid)))
obj)))
(define (resolve-reference repository ref)
"Resolve the branch, commit or tag specified by REF, and return the
corresponding Git object."
@ -283,15 +297,7 @@ (define (resolve-reference repository ref)
;; There's no such tag, so it must be a commit ID.
(resolve `(commit . ,str)))))))
(('tag . tag)
(let* ((oid (reference-name->oid repository
(string-append "refs/tags/" tag)))
(obj (object-lookup repository oid)))
;; OID may designate an "annotated tag" object or a "commit" object.
;; Return the commit object in both cases.
(if (= OBJ-TAG (object-type obj))
(object-lookup repository
(tag-target-id (tag-lookup repository oid)))
obj))))))
(tag->commit repository tag)))))
(define (switch-to-ref repository ref)
"Switch to REPOSITORY's branch, commit or tag specified by REF. Return the