aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@gmail.com>2016-06-25 22:42:33 +0100
committerRichard Maw <richard.maw@gmail.com>2016-07-13 20:09:37 +0100
commitd25bfb99f9d1f02dcaf1cae3ffce35b9ea5471fd (patch)
tree0cd065fbdc7f77bf0ce834e1bdb11a88410ab010
parente407fe721380dddca7527611342d5aef49c28f33 (diff)
Guess the default branch based on current namespace
resolve_ref_unsafe() can't be told to be namespace aware, so we need to prepend the namespace beforehand. Additionally, we need to add the RESOLVE_REF_NO_RECURSE flag, since otherwise if the commit that is pointed to exists in the root namespace, it will opt to return that rather than the value in the namespace, presumably preferring shorter ref names to longer ones. Signed-off-by: Richard Maw <richard.maw@gmail.com>
-rw-r--r--cgit.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/cgit.c b/cgit.c
index eae2f34..d9fe2b9 100644
--- a/cgit.c
+++ b/cgit.c
@@ -474,11 +474,17 @@ static char *guess_defbranch(void)
{
const char *ref;
unsigned char sha1[20];
-
- ref = resolve_ref_unsafe("HEAD", 0, sha1, NULL);
- if (!ref || !starts_with(ref, "refs/heads/"))
+ char *namespaced_head = NULL;
+
+ if (get_git_namespace())
+ namespaced_head = mkpathdup("%sHEAD", get_git_namespace());
+ /* NOTE: RESOLVE_REF_NO_RECURSE is required to prevent it resolving HEAD
+ into a ref outside of the namespace. */
+ ref = resolve_ref_unsafe(namespaced_head ?: "HEAD", RESOLVE_REF_NO_RECURSE, sha1, NULL);
+ free(namespaced_head);
+ if (!ref || !starts_with(strip_namespace(ref), "refs/heads/"))
return "master";
- return xstrdup(ref + 11);
+ return xstrdup(strip_namespace(ref) + 11);
}
/* The caller must free filename and ref after calling this. */
static inline void parse_readme(const char *readme, char **filename, char **ref, struct cgit_repo *repo)