X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/eb45342e735818b3c68cbab9b61b23e79ae74418..776200b1c10536174f68fc6599fc709ae620db54:/cgit.c?ds=sidebyside diff --git a/cgit.c b/cgit.c index c86d290..e8acc03 100644 --- a/cgit.c +++ b/cgit.c @@ -45,13 +45,44 @@ static int cgit_prepare_cache(struct cacheitem *item) return 1; } +struct refmatch { + char *req_ref; + char *first_ref; + int match; +}; + +int find_current_ref(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) +{ + struct refmatch *info; + + info = (struct refmatch *)cb_data; + if (!strcmp(refname, info->req_ref)) + info->match = 1; + if (!info->first_ref) + info->first_ref = xstrdup(refname); + return info->match; +} + +char *find_default_branch(struct repoinfo *repo) +{ + struct refmatch info; + + info.req_ref = repo->defbranch; + info.first_ref = NULL; + info.match = 0; + for_each_branch_ref(find_current_ref, &info); + if (info.match) + return info.req_ref; + else + return info.first_ref; +} + static void cgit_print_repo_page(struct cacheitem *item) { - char *title; + char *title, *tmp; int show_search; - - if (!cgit_query_head) - cgit_query_head = cgit_repo->defbranch; + unsigned char sha1[20]; if (chdir(cgit_repo->path)) { title = fmt("%s - %s", cgit_root_title, "Bad request"); @@ -67,6 +98,29 @@ static void cgit_print_repo_page(struct cacheitem *item) show_search = 0; setenv("GIT_DIR", cgit_repo->path, 1); + if (!cgit_query_head) { + cgit_query_head = xstrdup(find_default_branch(cgit_repo)); + cgit_repo->defbranch = cgit_query_head; + } + + if (!cgit_query_head) { + cgit_print_docstart(title, item); + cgit_print_pageheader(title, 0); + cgit_print_error("Repository seems to be empty"); + cgit_print_docend(); + return; + } + + if (get_sha1(cgit_query_head, sha1)) { + tmp = xstrdup(cgit_query_head); + cgit_query_head = cgit_repo->defbranch; + cgit_print_docstart(title, item); + cgit_print_pageheader(title, 0); + cgit_print_error(fmt("Invalid branch: %s", tmp)); + cgit_print_docend(); + return; + } + if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) { cgit_print_snapshot(item, cgit_query_head, cgit_query_sha1, cgit_repobasename(cgit_repo->url), @@ -75,6 +129,11 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } + if (cgit_cmd == CMD_PATCH) { + cgit_print_patch(cgit_query_sha1, item); + return; + } + if (cgit_cmd == CMD_BLOB) { cgit_print_blob(item, cgit_query_sha1, cgit_query_path); return; @@ -94,7 +153,7 @@ static void cgit_print_repo_page(struct cacheitem *item) switch(cgit_cmd) { case CMD_LOG: cgit_print_log(cgit_query_sha1, cgit_query_ofs, - cgit_max_commit_count, cgit_query_search, + cgit_max_commit_count, cgit_query_grep, cgit_query_search, cgit_query_path, 1); break; case CMD_TREE: @@ -103,11 +162,14 @@ static void cgit_print_repo_page(struct cacheitem *item) case CMD_COMMIT: cgit_print_commit(cgit_query_sha1); break; + case CMD_REFS: + cgit_print_refs(); + break; case CMD_TAG: cgit_print_tag(cgit_query_sha1); break; case CMD_DIFF: - cgit_print_diff(cgit_query_sha1, cgit_query_sha2); + cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path); break; default: cgit_print_error("Invalid request");