]> git.cameronkatri.com Git - cgit.git/blobdiff - ui-shared.c
Bump version.
[cgit.git] / ui-shared.c
index 315dedbc3c055cd4bb02d984647abb8308b11763..739505a865cc7660621f28666474ec9c6d624718 100644 (file)
@@ -1,6 +1,6 @@
 /* ui-shared.c: common web output functions
  *
- * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ * Copyright (C) 2006-2017 cgit Development Team <cgit@lists.zx2c4.com>
  *
  * Licensed under GNU General Public License v2
  *   (see COPYING for full license text)
@@ -10,6 +10,7 @@
 #include "ui-shared.h"
 #include "cmd.h"
 #include "html.h"
+#include "version.h"
 
 static const char cgit_doctype[] =
 "<!DOCTYPE html>\n";
@@ -132,25 +133,38 @@ 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;
 }
 
+const char *cgit_snapshot_prefix(const struct cgit_repo *repo)
+{
+       if (repo->snapshot_prefix)
+               return repo->snapshot_prefix;
+
+       return cgit_repobasename(repo->url);
+}
+
 static void site_url(const char *page, const char *search, const char *sort, int ofs, int always_root)
 {
        char *delim = "?";
@@ -304,6 +318,12 @@ void cgit_plain_link(const char *name, const char *title, const char *class,
        reporevlink("plain", name, title, class, head, rev, path);
 }
 
+void cgit_blame_link(const char *name, const char *title, const char *class,
+                    const char *head, const char *rev, const char *path)
+{
+       reporevlink("blame", name, title, class, head, rev, path);
+}
+
 void cgit_log_link(const char *name, const char *title, const char *class,
                   const char *head, const char *rev, const char *path,
                   int ofs, const char *grep, const char *pattern, int showmsg,
@@ -478,6 +498,10 @@ static void cgit_self_link(char *name, const char *title, const char *class)
                cgit_plain_link(name, title, class, ctx.qry.head,
                                ctx.qry.has_sha1 ? ctx.qry.sha1 : 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.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,
@@ -535,7 +559,7 @@ void cgit_object_link(struct object *obj)
                page = "tag";
        else
                page = "blob";
-       name = fmt("%s %s...", typename(obj->type), shortrev);
+       name = fmt("%s %s...", type_name(obj->type), shortrev);
        reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL);
 }
 
@@ -756,6 +780,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)
@@ -775,8 +801,8 @@ void cgit_print_docend(void)
        if (ctx.cfg.footer)
                html_include(ctx.cfg.footer);
        else {
-               htmlf("<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit %s</a> at ",
-                       cgit_version);
+               htmlf("<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit %s</a> "
+                       "(<a href='https://git-scm.com/'>git %s</a>) at ", cgit_version, git_version_string);
                html_txt(show_date(time(NULL), 0, cgit_date_mode(DATE_ISO8601)));
                html("</div>\n");
        }
@@ -958,8 +984,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");
 }
@@ -983,8 +1007,12 @@ void cgit_print_pageheader(void)
                cgit_log_link("log", NULL, hc("log"), ctx.qry.head,
                              NULL, ctx.qry.vpath, 0, NULL, NULL,
                              ctx.qry.showmsg, ctx.qry.follow);
-               cgit_tree_link("tree", NULL, hc("tree"), ctx.qry.head,
-                              ctx.qry.sha1, ctx.qry.vpath);
+               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);
+               else
+                       cgit_tree_link("tree", NULL, hc("tree"), ctx.qry.head,
+                                      ctx.qry.sha1, ctx.qry.vpath);
                cgit_commit_link("commit", NULL, hc("commit"),
                                 ctx.qry.head, ctx.qry.sha1, ctx.qry.vpath);
                cgit_diff_link("diff", NULL, hc("diff"), ctx.qry.head,
@@ -1013,7 +1041,7 @@ void cgit_print_pageheader(void)
                html_option("committer", "committer", ctx.qry.grep);
                html_option("range", "range", ctx.qry.grep);
                html("</select>\n");
-               html("<input class='txt' type='text' size='10' name='q' value='");
+               html("<input class='txt' type='search' size='10' name='q' value='");
                html_attr(ctx.qry.search);
                html("'/>\n");
                html("<input type='submit' value='search'/>\n");
@@ -1028,7 +1056,7 @@ void cgit_print_pageheader(void)
                html("<form method='get' action='");
                html_attr(currenturl);
                html("'>\n");
-               html("<input type='text' name='q' size='10' value='");
+               html("<input type='search' name='q' size='10' value='");
                html_attr(ctx.qry.search);
                html("'/>\n");
                html("<input type='submit' value='search'/>\n");
@@ -1088,23 +1116,43 @@ void cgit_compose_snapshot_prefix(struct strbuf *filename, const char *base,
        strbuf_addf(filename, "%s-%s", base, ref);
 }
 
-void cgit_print_snapshot_links(const char *repo, const char *head,
-                              const char *hex, int snapshots)
+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;
 
-       cgit_compose_snapshot_prefix(&filename, cgit_repobasename(repo), hex);
+       basename = cgit_snapshot_prefix(repo);
+       if (starts_with(ref, basename))
+               strbuf_addstr(&filename, ref);
+       else
+               cgit_compose_snapshot_prefix(&filename, basename, ref);
+
        prefixlen = filename.len;
        for (f = cgit_snapshot_formats; f->suffix; f++) {
-               if (!(snapshots & f->bit))
+               if (!(repo->snapshots & cgit_snapshot_format_bit(f)))
                        continue;
                strbuf_setlen(&filename, prefixlen);
                strbuf_addstr(&filename, f->suffix);
                cgit_snapshot_link(filename.buf, NULL, NULL, NULL, NULL,
                                   filename.buf);
-               html("<br/>");
+               if (cgit_snapshot_get_sig(ref, f)) {
+                       strbuf_addstr(&filename, ".asc");
+                       html(" (");
+                       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);
        }
        strbuf_release(&filename);
 }