]> git.cameronkatri.com Git - cgit.git/blobdiff - ui-shared.c
tests: try with commit-graph
[cgit.git] / ui-shared.c
index 8a786e0a3e27e63d1e6f19c28b85e0fc1c326673..151ac1797aa99351e63b9872d6f804eedda65431 100644 (file)
@@ -68,15 +68,48 @@ char *cgit_hosturl(void)
 char *cgit_currenturl(void)
 {
        const char *root = cgit_rooturl();
-       size_t len = strlen(root);
 
        if (!ctx.qry.url)
                return xstrdup(root);
-       if (len && root[len - 1] == '/')
+       if (root[0] && root[strlen(root) - 1] == '/')
                return fmtalloc("%s%s", root, ctx.qry.url);
        return fmtalloc("%s/%s", root, ctx.qry.url);
 }
 
+char *cgit_currentfullurl(void)
+{
+       const char *root = cgit_rooturl();
+       const char *orig_query = ctx.env.query_string ? ctx.env.query_string : "";
+       size_t len = strlen(orig_query);
+       char *query = xmalloc(len + 2), *start_url, *ret;
+
+       /* Remove all url=... parts from query string */
+       memcpy(query + 1, orig_query, len + 1);
+       query[0] = '?';
+       start_url = query;
+       while ((start_url = strstr(start_url, "url=")) != NULL) {
+               if (start_url[-1] == '?' || start_url[-1] == '&') {
+                       const char *end_url = strchr(start_url, '&');
+                       if (end_url)
+                               memmove(start_url, end_url + 1, strlen(end_url));
+                       else
+                               start_url[0] = '\0';
+               } else
+                       ++start_url;
+       }
+       if (!query[1])
+               query[0] = '\0';
+
+       if (!ctx.qry.url)
+               ret = fmtalloc("%s%s", root, query);
+       else if (root[0] && root[strlen(root) - 1] == '/')
+               ret = fmtalloc("%s%s%s", root, ctx.qry.url, query);
+       else
+               ret = fmtalloc("%s/%s%s", root, ctx.qry.url, query);
+       free(query);
+       return ret;
+}
+
 const char *cgit_rooturl(void)
 {
        if (ctx.cfg.virtual_root)
@@ -133,20 +166,25 @@ const char *cgit_repobasename(const char *reponame)
        static char rvbuf[1024];
        int p;
        const char *rv;
-       strncpy(rvbuf, reponame, sizeof(rvbuf));
-       if (rvbuf[sizeof(rvbuf)-1])
+       size_t len;
+
+       len = strlcpy(rvbuf, reponame, sizeof(rvbuf));
+       if (len >= sizeof(rvbuf))
                die("cgit_repobasename: truncated repository name '%s'", reponame);
-       p = strlen(rvbuf)-1;
+       p = len - 1;
        /* strip trailing slashes */
-       while (p && rvbuf[p] == '/') rvbuf[p--] = 0;
+       while (p && rvbuf[p] == '/')
+               rvbuf[p--] = '\0';
        /* strip trailing .git */
        if (p >= 3 && starts_with(&rvbuf[p-3], ".git")) {
-               p -= 3; rvbuf[p--] = 0;
+               p -= 3;
+               rvbuf[p--] = '\0';
        }
        /* strip more trailing slashes if any */
-       while ( p && rvbuf[p] == '/') rvbuf[p--] = 0;
+       while (p && rvbuf[p] == '/')
+               rvbuf[p--] = '\0';
        /* find last slash in the remaining string */
-       rv = strrchr(rvbuf,'/');
+       rv = strrchr(rvbuf, '/');
        if (rv)
                return ++rv;
        return rvbuf;
@@ -483,45 +521,45 @@ static void cgit_self_link(char *name, const char *title, const char *class)
        else if (!strcmp(ctx.qry.page, "summary"))
                cgit_summary_link(name, title, class, ctx.qry.head);
        else if (!strcmp(ctx.qry.page, "tag"))
-               cgit_tag_link(name, title, class, ctx.qry.has_sha1 ?
-                              ctx.qry.sha1 : ctx.qry.head);
+               cgit_tag_link(name, title, class, ctx.qry.has_oid ?
+                              ctx.qry.oid : ctx.qry.head);
        else if (!strcmp(ctx.qry.page, "tree"))
                cgit_tree_link(name, title, class, ctx.qry.head,
-                              ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                              ctx.qry.has_oid ? ctx.qry.oid : NULL,
                               ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "plain"))
                cgit_plain_link(name, title, class, ctx.qry.head,
-                               ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                               ctx.qry.has_oid ? ctx.qry.oid : NULL,
                                ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "blame"))
                cgit_blame_link(name, title, class, ctx.qry.head,
-                               ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                               ctx.qry.has_oid ? ctx.qry.oid : NULL,
                                ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "log"))
                cgit_log_link(name, title, class, ctx.qry.head,
-                             ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                             ctx.qry.has_oid ? ctx.qry.oid : NULL,
                              ctx.qry.path, ctx.qry.ofs,
                              ctx.qry.grep, ctx.qry.search,
                              ctx.qry.showmsg, ctx.qry.follow);
        else if (!strcmp(ctx.qry.page, "commit"))
                cgit_commit_link(name, title, class, ctx.qry.head,
-                                ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                                ctx.qry.has_oid ? ctx.qry.oid : NULL,
                                 ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "patch"))
                cgit_patch_link(name, title, class, ctx.qry.head,
-                               ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                               ctx.qry.has_oid ? ctx.qry.oid : NULL,
                                ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "refs"))
                cgit_refs_link(name, title, class, ctx.qry.head,
-                              ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                              ctx.qry.has_oid ? ctx.qry.oid : NULL,
                               ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "snapshot"))
                cgit_snapshot_link(name, title, class, ctx.qry.head,
-                                  ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+                                  ctx.qry.has_oid ? ctx.qry.oid : NULL,
                                   ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "diff"))
                cgit_diff_link(name, title, class, ctx.qry.head,
-                              ctx.qry.sha1, ctx.qry.sha2,
+                              ctx.qry.oid, ctx.qry.oid2,
                               ctx.qry.path);
        else if (!strcmp(ctx.qry.page, "stats"))
                cgit_stats_link(name, title, class, ctx.qry.head,
@@ -775,6 +813,8 @@ void cgit_print_docstart(void)
                cgit_add_clone_urls(print_rel_vcs_link);
        if (ctx.cfg.head_include)
                html_include(ctx.cfg.head_include);
+       if (ctx.repo && ctx.repo->extra_head_content)
+               html(ctx.repo->extra_head_content);
        html("</head>\n");
        html("<body>\n");
        if (ctx.cfg.header)
@@ -878,10 +918,10 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search,
            strcmp(ctx.qry.head, ctx.repo->defbranch))
                html_hidden("h", ctx.qry.head);
 
-       if (ctx.qry.sha1)
-               html_hidden("id", ctx.qry.sha1);
-       if (ctx.qry.sha2)
-               html_hidden("id2", ctx.qry.sha2);
+       if (ctx.qry.oid)
+               html_hidden("id", ctx.qry.oid);
+       if (ctx.qry.oid2)
+               html_hidden("id2", ctx.qry.oid2);
        if (ctx.qry.showmsg)
                html_hidden("showmsg", "1");
 
@@ -905,12 +945,13 @@ static void cgit_print_path_crumbs(char *path)
 {
        char *old_path = ctx.qry.path;
        char *p = path, *q, *end = path + strlen(path);
+       int levels = 0;
 
        ctx.qry.path = NULL;
        cgit_self_link("root", NULL, NULL);
        ctx.qry.path = p = path;
        while (p < end) {
-               if (!(q = strchr(p, '/')))
+               if (!(q = strchr(p, '/')) || levels > 15)
                        q = end;
                *q = '\0';
                html_txt("/");
@@ -918,6 +959,7 @@ static void cgit_print_path_crumbs(char *path)
                if (q < end)
                        *q = '/';
                p = q + 1;
+               ++levels;
        }
        ctx.qry.path = old_path;
 }
@@ -977,8 +1019,6 @@ static void print_header(void)
        } else {
                if (ctx.cfg.root_desc)
                        html_txt(ctx.cfg.root_desc);
-               else if (ctx.cfg.index_info)
-                       html_include(ctx.cfg.index_info);
        }
        html("</td></tr></table>\n");
 }
@@ -998,20 +1038,20 @@ void cgit_print_pageheader(void)
                cgit_summary_link("summary", NULL, hc("summary"),
                                  ctx.qry.head);
                cgit_refs_link("refs", NULL, hc("refs"), ctx.qry.head,
-                              ctx.qry.sha1, NULL);
+                              ctx.qry.oid, NULL);
                cgit_log_link("log", NULL, hc("log"), ctx.qry.head,
                              NULL, ctx.qry.vpath, 0, NULL, NULL,
                              ctx.qry.showmsg, ctx.qry.follow);
                if (ctx.qry.page && !strcmp(ctx.qry.page, "blame"))
                        cgit_blame_link("blame", NULL, hc("blame"), ctx.qry.head,
-                                       ctx.qry.sha1, ctx.qry.vpath);
+                                       ctx.qry.oid, ctx.qry.vpath);
                else
                        cgit_tree_link("tree", NULL, hc("tree"), ctx.qry.head,
-                                      ctx.qry.sha1, ctx.qry.vpath);
+                                      ctx.qry.oid, ctx.qry.vpath);
                cgit_commit_link("commit", NULL, hc("commit"),
-                                ctx.qry.head, ctx.qry.sha1, ctx.qry.vpath);
+                                ctx.qry.head, ctx.qry.oid, ctx.qry.vpath);
                cgit_diff_link("diff", NULL, hc("diff"), ctx.qry.head,
-                              ctx.qry.sha1, ctx.qry.sha2, ctx.qry.vpath);
+                              ctx.qry.oid, ctx.qry.oid2, ctx.qry.vpath);
                if (ctx.repo->max_stats)
                        cgit_stats_link("stats", NULL, hc("stats"),
                                        ctx.qry.head, ctx.qry.vpath);
@@ -1114,7 +1154,7 @@ void cgit_compose_snapshot_prefix(struct strbuf *filename, const char *base,
 void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
                               const char *separator)
 {
-       const struct cgit_snapshot_formatf;
+       const struct cgit_snapshot_format *f;
        struct strbuf filename = STRBUF_INIT;
        const char *basename;
        size_t prefixlen;
@@ -1127,7 +1167,7 @@ void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
 
        prefixlen = filename.len;
        for (f = cgit_snapshot_formats; f->suffix; f++) {
-               if (!(repo->snapshots & f->bit))
+               if (!(repo->snapshots & cgit_snapshot_format_bit(f)))
                        continue;
                strbuf_setlen(&filename, prefixlen);
                strbuf_addstr(&filename, f->suffix);
@@ -1139,6 +1179,13 @@ void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
                        cgit_snapshot_link("sig", NULL, NULL, NULL, NULL,
                                           filename.buf);
                        html(")");
+               } else if (starts_with(f->suffix, ".tar") && cgit_snapshot_get_sig(ref, &cgit_snapshot_formats[0])) {
+                       strbuf_setlen(&filename, strlen(filename.buf) - strlen(f->suffix));
+                       strbuf_addstr(&filename, ".tar.asc");
+                       html(" (");
+                       cgit_snapshot_link("sig", NULL, NULL, NULL, NULL,
+                                          filename.buf);
+                       html(")");
                }
                html(separator);
        }
@@ -1147,31 +1194,17 @@ void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
 
 void cgit_set_title_from_path(const char *path)
 {
-       size_t path_len, path_index, path_last_end;
-       char *new_title;
+       struct strbuf sb = STRBUF_INIT;
+       const char *slash, *last_slash;
 
        if (!path)
                return;
 
-       path_len = strlen(path);
-       new_title = xmalloc(path_len + 3 + strlen(ctx.page.title) + 1);
-       new_title[0] = '\0';
-
-       for (path_index = path_len, path_last_end = path_len; path_index-- > 0;) {
-               if (path[path_index] == '/') {
-                       if (path_index == path_len - 1) {
-                               path_last_end = path_index - 1;
-                               continue;
-                       }
-                       strncat(new_title, &path[path_index + 1], path_last_end - path_index - 1);
-                       strcat(new_title, "\\");
-                       path_last_end = path_index;
-               }
+       for (last_slash = path + strlen(path); (slash = memrchr(path, '/', last_slash - path)) != NULL; last_slash = slash) {
+               strbuf_add(&sb, slash + 1, last_slash - slash - 1);
+               strbuf_addstr(&sb, " \xc2\xab ");
        }
-       if (path_last_end)
-               strncat(new_title, path, path_last_end);
-
-       strcat(new_title, " - ");
-       strcat(new_title, ctx.page.title);
-       ctx.page.title = new_title;
+       strbuf_add(&sb, path, last_slash - path);
+       strbuf_addf(&sb, " - %s", ctx.page.title);
+       ctx.page.title = strbuf_detach(&sb, NULL);
 }