List for cgit developers and users
 help / color / mirror / Atom feed
From: richard.maw at gmail.com (Richard Maw)
Subject: [PATCH 06/16] Look up refs in namespace with cgit_get_sha1
Date: Fri, 15 Jul 2016 23:59:52 +0100	[thread overview]
Message-ID: <20160715230002.29547-7-richard.maw@gmail.com> (raw)
In-Reply-To: <20160715230002.29547-1-richard.maw@gmail.com>

This causes all ref resolving to look for the requested branch
inside the current namespace.

Previously any form of git revision would be accepted,
but ref resolving isn't namespace aware
and it would be infeasible to replicate all its behaviour,
so we stick to providing the most common cases
of a sha1, an absolute ref, or a partial ref.

Signed-off-by: Richard Maw <richard.maw at gmail.com>
---
 shared.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)

diff --git a/shared.c b/shared.c
index d82c07b..81a5cd8 100644
--- a/shared.c
+++ b/shared.c
@@ -602,7 +602,52 @@ char *get_mimetype_for_filename(const char *filename)
 	return NULL;
 }
 
+static int namespaced_dwim_ref_get_sha1(const char *name, unsigned char *sha1)
+{
+	/* The standard git name disambiguation order is:
+	     $name
+	     refs/$name
+	     refs/tags/$name
+	     refs/heads/$name
+	     refs/remotes/$name (not sure why)
+	     refs/remotes/$name/HEAD
+	   we don't care about remotes, so we can skip those,
+	   and we can't specify a prefix for dwm_ref,
+	   so we have to do this ourselves */
+	static const char *namespaced_ref_patterns[] = {
+		"%s%s",
+		"%srefs/%s",
+		"%srefs/tags/%s",
+		"%srefs/heads/%s",
+		NULL,
+	};
+	const char **p;
+
+	for (p = namespaced_ref_patterns; *p; p++) {
+		char *fullref = NULL;
+		const char *r;
+		fullref = mkpathdup(*p, get_git_namespace(), name);
+		r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING, sha1, NULL);
+		free(fullref);
+		if (r)
+			return 0;
+	}
+	return 1;
+}
+
 int cgit_get_sha1(const char *name, unsigned char *sha1)
 {
-	return get_sha1(name, sha1);
+	if (ctx.repo->namespace) {
+		/* If we have a namespace, we can get either a sha1,
+		   or a possibly abbreviated ref.
+		   Advanced ref forms are not supported at this time
+		   as this would require reimplementing all of ref parsing.
+		   If get_sha1_with_context grows support for a namespaced flag
+		   then this code may go away. */
+		if (get_sha1_hex(name, sha1) == 0)
+			return 0;
+		return namespaced_dwim_ref_get_sha1(name, sha1);
+	} else {
+		return get_sha1(name, sha1);
+	}
 }
-- 
2.9.0



  parent reply	other threads:[~2016-07-15 22:59 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-15 22:59 [PATCH 00/16] [V2] Add namespace support to cgit richard.maw
2016-07-15 22:59 ` [PATCH 01/16] Fix archive generation richard.maw
2016-07-15 22:59 ` [PATCH 02/16] Add a wrapper for get_sha1 called cgit_get_sha1 richard.maw
2016-07-15 22:59 ` [PATCH 03/16] Parse repo.namespace richard.maw
2016-07-15 22:59 ` [PATCH 04/16] Print out parsed namespace on request richard.maw
2016-07-15 22:59 ` [PATCH 05/16] Set GIT_NAMESPACE when repo.namespace is provided richard.maw
2016-07-15 22:59 ` richard.maw [this message]
2016-07-29 14:32   ` [PATCH 06/16] Look up refs in namespace with cgit_get_sha1 Jason
     [not found]     ` <CAB2VqoZZiAsWpA1YbXARLaq8VMcWLJyXDG6-w0ag1JBOp_0M0Q@mail.gmail.com>
2016-07-29 16:54       ` richard.maw
2016-07-30 15:21         ` richard.maw
2016-07-15 22:59 ` [PATCH 07/16] Guess the default branch based on current namespace richard.maw
2016-07-29 14:36   ` Jason
2016-07-29 15:42     ` richard.maw
2016-07-15 22:59 ` [PATCH 08/16] Add cgit_for_each_namespaced_ref_in helper richard.maw
2016-07-15 22:59 ` [PATCH 09/16] Find the default branch based on the contents of the namespace richard.maw
2016-07-15 22:59 ` [PATCH 10/16] Only display refs in current namespace richard.maw
2016-07-15 22:59 ` [PATCH 11/16] Add namespace support to dumb-clone richard.maw
2016-07-29 14:38   ` Jason
2016-07-15 22:59 ` [PATCH 12/16] Display notes from namespace richard.maw
2016-07-29 14:44   ` Jason
2016-07-29 15:56     ` richard.maw
2016-07-15 22:59 ` [PATCH 13/16] Add documentation for repo.namespace richard.maw
2016-07-29 14:48   ` Jason
2016-07-29 15:59     ` richard.maw
2016-07-15 23:00 ` [PATCH 14/16] Allow agefile to be set per-repository richard.maw
2016-07-15 23:00 ` [PATCH 15/16] Update contrib script to update agefiles per namespace richard.maw
2016-07-29 14:51   ` Jason
2016-07-29 16:01     ` richard.maw
2016-07-15 23:00 ` [PATCH 16/16] Add documentation for repo.agefile richard.maw
2016-07-15 23:10 ` [PATCH 00/16] [V2] Add namespace support to cgit richard.maw
2016-07-28 16:40   ` richard.maw
2016-07-28 21:20     ` Jason

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160715230002.29547-7-richard.maw@gmail.com \
    --to=cgit@lists.zx2c4.com \
    /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.
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 NNTP newsgroup(s).