Diffstat (limited to 'ui-shared.c')
| -rw-r--r-- | ui-shared.c | 64 |
1 files changed, 57 insertions, 7 deletions
diff --git a/ui-shared.c b/ui-shared.c index 968933f..80f4aee 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -121,6 +121,18 @@ const char *cgit_repobasename(const char *reponame) return rvbuf; } +char *cgit_currurl() +{ + if (!ctx.cfg.virtual_root) + return ctx.cfg.script_name; + else if (ctx.qry.page) + return fmt("%s/%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo, ctx.qry.page); + else if (ctx.qry.repo) + return fmt("%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo); + else + return fmt("%s/", ctx.cfg.virtual_root); +} + static void site_url(const char *page, const char *search, const char *sort, int ofs) { char *delim = "?"; @@ -421,8 +433,8 @@ void cgit_stats_link(const char *name, const char *title, const char *class, reporevlink("stats", name, title, class, head, NULL, path); } -static void cgit_self_link(char *name, const char *title, const char *class, - struct cgit_context *ctx) +void cgit_self_link(char *name, const char *title, const char *class, + struct cgit_context *ctx) { if (!strcmp(ctx->qry.page, "repolist")) cgit_index_link(name, title, class, ctx->qry.search, ctx->qry.sort, @@ -501,8 +513,8 @@ void cgit_object_link(struct object *obj) reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); } -static struct string_list_item *lookup_path(struct string_list *list, - const char *path) +struct string_list_item *lookup_path(struct string_list *list, + const char *path) { struct string_list_item *item; @@ -705,14 +717,53 @@ void cgit_print_docend() html("</body>\n</html>\n"); } -static int print_branch_option(const char *refname, const unsigned char *sha1, - int flags, void *cb_data) +int print_branch_option(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) { char *name = (char *)refname; html_option(name, name, ctx.qry.head); return 0; } +int print_archive_ref(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) +{ + struct tag *tag; + struct taginfo *info; + struct object *obj; + char buf[256], *url; + unsigned char fileid[20]; + int *header = (int *)cb_data; + + if (prefixcmp(refname, "refs/archives")) + return 0; + strncpy(buf, refname + 14, sizeof(buf)); + obj = parse_object(sha1); + if (!obj) + return 1; + if (obj->type == OBJ_TAG) { + tag = lookup_tag(sha1); + if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) + return 0; + hashcpy(fileid, tag->tagged->sha1); + } else if (obj->type != OBJ_BLOB) { + return 0; + } else { + hashcpy(fileid, sha1); + } + if (!*header) { + html("<h1>download</h1>\n"); + *header = 1; + } + url = cgit_pageurl(ctx.qry.repo, "blob", + fmt("id=%s&path=%s", sha1_to_hex(fileid), + buf)); + html_link_open(url, NULL, "menu"); + html_txt(strlpart(buf, 20)); + html_link_close(); + return 0; +} + void cgit_add_hidden_formfields(int incl_head, int incl_search, const char *page) { @@ -932,5 +983,4 @@ void cgit_print_snapshot_links(const char *repo, const char *head, cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename); html("<br/>"); } - free(prefix); } |