Add namespace support to dumb-clone

This requires namespacing the HEAD symbolic ref
and the list of refs.

Sending HEAD required some tweaking,
since the file itself refers to a namespaced ref,
but we want to provide the ref with its namespace stripped off.

Signed-off-by: Richard Maw <richard.maw@gmail.com>
This commit is contained in:
Richard Maw 2016-06-25 23:24:20 +01:00
parent 44efabfc5e
commit c8d5732367

View File

@ -86,6 +86,9 @@ void cgit_clone_info(void)
ctx.page.filename = "info/refs"; ctx.page.filename = "info/refs";
cgit_print_http_headers(); cgit_print_http_headers();
for_each_ref(print_ref_info, NULL); for_each_ref(print_ref_info, NULL);
/* NOTE: we pass an empty prefix because we want to enumerate everything
not just all refs under $namespace/refs/ */
cgit_for_each_namespaced_ref_in("", print_ref_info, NULL);
} }
void cgit_clone_objects(void) void cgit_clone_objects(void)
@ -105,5 +108,23 @@ void cgit_clone_objects(void)
void cgit_clone_head(void) void cgit_clone_head(void)
{ {
send_file(git_path("%s", "HEAD")); if (get_git_namespace()) {
unsigned char unused[20];
char *namespaced_head = NULL;
const char *ref;
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, RESOLVE_REF_NO_RECURSE, unused, NULL);
if (!ref) {
cgit_print_error_page(404, "Not found", "Not found");
free(namespaced_head);
return;
}
cgit_print_http_headers();
htmlf("ref: %s\n", strip_namespace(ref));
free(namespaced_head);
} else {
send_file(git_path("%s", "HEAD"));
}
} }