From: Maxime Devos <maximedevos@telenet.be>
To: 53144@debbugs.gnu.org
Cc: Maxime Devos <maximedevos@telenet.be>
Subject: [bug#53144] [PATCH 11/13] git: Support resolving references without cloning.
Date: Sun, 9 Jan 2022 19:10:13 +0000 [thread overview]
Message-ID: <20220109191015.33058-11-maximedevos@telenet.be> (raw)
In-Reply-To: <20220109191015.33058-1-maximedevos@telenet.be>
* guix/git.scm (remote-refs): Split off some logic to ...
(call-with-detached-remote): ... this new procedure.
(lookup-reference): New procedure.
* tests/git.scm ("lookup-reference: branch and HEAD"): New test.
---
guix/git.scm | 57 +++++++++++++++++++++++++++++++++++++++------------
tests/git.scm | 22 +++++++++++++++++++-
2 files changed, 65 insertions(+), 14 deletions(-)
diff --git a/guix/git.scm b/guix/git.scm
index 43e85a5026..1c07eba584 100644
--- a/guix/git.scm
+++ b/guix/git.scm
@@ -62,6 +62,7 @@ (define-module (guix git)
commit-relation
remote-refs
+ lookup-reference
git-checkout
git-checkout?
@@ -628,6 +629,22 @@ (define (commit-relation old new)
;;; Remote operations.
;;;
+;; TODO: it would be nice to use 'remote-create-detached' here,
+;; but that procedure isn't in any released version of guile-git yet.
+(define (call-with-detached-remote url proc)
+ "Call PROC with a remote for URL. The remote is closed after PROC returns."
+ (call-with-temporary-directory
+ (lambda (cache-directory)
+ (let* ((repository (repository-init cache-directory))
+ ;; Create an in-memory remote so we don't touch disk.
+ (remote (remote-create-anonymous repository url)))
+ (remote-connect remote)
+ (let-values ((result (proc remote)))
+ ;; Wait until we're finished with the repository before closing it.
+ (remote-disconnect remote)
+ (repository-close! repository)
+ (apply values result))))))
+
(define* (remote-refs url #:key tags?)
"Return the list of references advertised at Git repository URL. If TAGS?
is true, limit to only refs/tags."
@@ -649,19 +666,33 @@ (define (remote-head->ref remote)
name)))
(with-libgit2
- (call-with-temporary-directory
- (lambda (cache-directory)
- (let* ((repository (repository-init cache-directory))
- ;; Create an in-memory remote so we don't touch disk.
- (remote (remote-create-anonymous repository url)))
- (remote-connect remote)
-
- (let* ((remote-heads (remote-ls remote))
- (refs (filter-map remote-head->ref remote-heads)))
- ;; Wait until we're finished with the repository before closing it.
- (remote-disconnect remote)
- (repository-close! repository)
- refs))))))
+ (call-with-detached-remote
+ url
+ (lambda (remote)
+ (define remote-heads (remote-ls remote))
+ (filter-map remote-head->ref remote-heads)))))
+
+(define* (lookup-reference url reference-name)
+ "Lookup the reference named REFERENCE-NAME advertised at the Git repository
+at URL and return the commit string. If the reference was not found, return
+#false instead."
+ (define (oid->commit oid)
+ (define str (oid->string oid))
+ ;; FIXME: why is the result of oid->string prefixed by 8 zeroes
+ ;; when remote-ls is used? To make hash collisions harder, it would
+ ;; be nice if the commit was not abbreviated.
+ (if (string-prefix? "00000000" str)
+ (string-drop str 8)
+ str))
+ (define (match? remote-head)
+ (string=? reference-name (remote-head-name remote-head)))
+ (with-libgit2
+ (call-with-detached-remote
+ url
+ (lambda (remote)
+ (define remote-heads (remote-ls remote))
+ (define head (find match? remote-heads))
+ (and=> head (compose oid->commit remote-head-oid))))))
\f
;;;
diff --git a/tests/git.scm b/tests/git.scm
index d0646bbc85..f8eaf9e93b 100644
--- a/tests/git.scm
+++ b/tests/git.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019, 2020 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz
+;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;; Copyright © 2022 Maxime Devos <maximedevos@telenet.be>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -189,4 +190,23 @@ (define-module (test-git)
(tag "v1.1" "Release 1.1"))
(remote-refs directory #:tags? #t)))
+(test-equal "lookup-reference: branch and HEAD"
+ '(#true #true)
+ (with-temporary-git-repository directory
+ '((add "a.txt" "A")
+ (commit "First commit")
+ (branch "a-branch")
+ (add "b.txt" "B")
+ (commit "Second commit"))
+ (with-repository directory repository
+ ;; See 'oid->commit' in (guix git) for why not string=?.
+ (list (string-prefix?
+ (lookup-reference directory "refs/heads/a-branch")
+ (oid->string
+ (commit-id (find-commit repository "First commit"))))
+ (string-prefix?
+ (lookup-reference directory "HEAD")
+ (oid->string
+ (commit-id (find-commit repository "Second commit"))))))))
+
(test-end "git")
--
2.34.0
next prev parent reply other threads:[~2022-01-09 19:12 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-09 19:08 [bug#53144] [PATCH 0/13] Make more git-using packages auto-updatable Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 01/13] doc: Give some tips on Minetest packaging Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 02/13] gnu: minetest-ethereal: Follow new versioning conventions Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 03/13] gnu: minetest-mesecons: " Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 04/13] gnu: minetest-throwing: " Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 05/13] gnu: minetest: Remove obsolete comments about version numbers Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 06/13] gnu: minetest-ethereal: Update to 2022-01-05 Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 07/13] gnu: minetest-mesecons: Update to 2021-11-28 Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 08/13] gnu: minetest-mobs: Update to 2022-01-03 Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 09/13] doc: Document the Minetest importer Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 10/13] upstream: Support incrementing the revision of 'git-version' Maxime Devos
2022-01-18 17:33 ` [bug#53144] [PATCH 0/13] Make more git-using packages auto-updatable Ludovic Courtès
2022-01-09 19:10 ` Maxime Devos [this message]
2022-01-18 17:39 ` Ludovic Courtès
2022-04-03 11:47 ` Maxime Devos
2022-01-09 19:10 ` [bug#53144] [PATCH 12/13] import: Add 'latest-git' updater Maxime Devos
2022-01-18 17:45 ` [bug#53144] [PATCH 0/13] Make more git-using packages auto-updatable Ludovic Courtès
2022-01-09 19:10 ` [bug#53144] [PATCH 13/13] gnu: minetest-throwing-arrows: Use 'latest-git' updater Maxime Devos
2022-01-09 21:15 ` [bug#53144] [PATCH 01/13] doc: Give some tips on Minetest packaging Liliana Marie Prikler
2022-01-09 23:29 ` Maxime Devos
2022-01-10 21:29 ` Liliana Marie Prikler
2022-01-18 17:30 ` [bug#53144] [PATCH 0/13] Make more git-using packages auto-updatable Ludovic Courtès
[not found] ` <handler.53144.B.164175531629466.ack@debbugs.gnu.org>
2022-01-09 19:49 ` [bug#53144] Acknowledgement ([PATCH 0/13] Make more git-using packages auto-updatable) Maxime Devos
2022-06-06 15:15 ` [bug#53144] [PATCH 0/13] Make more git-using packages auto-updatable Maxime Devos
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220109191015.33058-11-maximedevos@telenet.be \
--to=maximedevos@telenet.be \
--cc=53144@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).