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: I46ea387345dc1b695ce0702991a52d0cde29e2f0master
parent
088e181c0a
commit
96d2de0185
|
@ -26,6 +26,7 @@
|
|||
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 @@ the field its 'tag' refers to. A 'git-error' exception is raised if the tag
|
|||
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)))))
|
||||
|
|
24
guix/git.scm
24
guix/git.scm
|
@ -68,6 +68,7 @@
|
|||
commit-descendant?
|
||||
commit-id?
|
||||
commit-short-id
|
||||
tag->commit
|
||||
|
||||
remote-refs
|
||||
|
||||
|
@ -237,6 +238,19 @@ is a tag name. This is based on a simple heuristic so use with care!"
|
|||
(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 @@ corresponding Git object."
|
|||
;; 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
|
||||
|
|
Reference in New Issue