]> gitweb.ps.run Git - ps-cgit/blobdiff - ui-shared.c
tests: add tests for links with space in path and/or args
[ps-cgit] / ui-shared.c
index bc14e70f919a793809dd2fdf65ef8e9c47bee872..5aa911956aa3cbf344b437e15aad761f5cd11d86 100644 (file)
@@ -319,7 +319,8 @@ void cgit_log_link(const char *name, const char *title, const char *class,
 }
 
 void cgit_commit_link(char *name, const char *title, const char *class,
-                     const char *head, const char *rev, int toggle_ssdiff)
+                     const char *head, const char *rev, const char *path,
+                     int toggle_ssdiff)
 {
        if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) {
                name[ctx.cfg.max_msg_len] = '\0';
@@ -330,7 +331,7 @@ void cgit_commit_link(char *name, const char *title, const char *class,
 
        char *delim;
 
-       delim = repolink(title, class, "commit", head, NULL);
+       delim = repolink(title, class, "commit", head, path);
        if (rev && strcmp(rev, ctx.qry.head)) {
                html(delim);
                html("id=");
@@ -340,6 +341,18 @@ void cgit_commit_link(char *name, const char *title, const char *class,
        if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) {
                html(delim);
                html("ss=1");
+               delim = "&";
+       }
+       if (ctx.qry.context > 0 && ctx.qry.context != 3) {
+               html(delim);
+               html("context=");
+               htmlf("%d", ctx.qry.context);
+               delim = "&";
+       }
+       if (ctx.qry.ignorews) {
+               html(delim);
+               html("ignorews=1");
+               delim = "&";
        }
        html("'>");
        html_txt(name);
@@ -381,6 +394,18 @@ void cgit_diff_link(const char *name, const char *title, const char *class,
        if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) {
                html(delim);
                html("ss=1");
+               delim = "&";
+       }
+       if (ctx.qry.context > 0 && ctx.qry.context != 3) {
+               html(delim);
+               html("context=");
+               htmlf("%d", ctx.qry.context);
+               delim = "&";
+       }
+       if (ctx.qry.ignorews) {
+               html(delim);
+               html("ignorews=1");
+               delim = "&";
        }
        html("'>");
        html_txt(name);
@@ -388,9 +413,9 @@ void cgit_diff_link(const char *name, const char *title, const char *class,
 }
 
 void cgit_patch_link(const char *name, const char *title, const char *class,
-                    const char *head, const char *rev)
+                    const char *head, const char *rev, const char *path)
 {
-       reporevlink("patch", name, title, class, head, rev, NULL);
+       reporevlink("patch", name, title, class, head, rev, path);
 }
 
 void cgit_stats_link(const char *name, const char *title, const char *class,
@@ -399,6 +424,64 @@ void cgit_stats_link(const char *name, const char *title, const char *class,
        reporevlink("stats", name, title, class, head, NULL, path);
 }
 
+void cgit_self_link(char *name, const char *title, const char *class,
+                   struct cgit_context *ctx)
+{
+       if (!strcmp(ctx->qry.page, "repolist"))
+               return cgit_index_link(name, title, class, ctx->qry.search,
+                                      ctx->qry.ofs);
+       else if (!strcmp(ctx->qry.page, "summary"))
+               return cgit_summary_link(name, title, class, ctx->qry.head);
+       else if (!strcmp(ctx->qry.page, "tag"))
+               return cgit_tag_link(name, title, class, ctx->qry.head,
+                                    ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL);
+       else if (!strcmp(ctx->qry.page, "tree"))
+               return cgit_tree_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+                                     ctx->qry.path);
+       else if (!strcmp(ctx->qry.page, "plain"))
+               return 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, "log"))
+               return cgit_log_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+                                     ctx->qry.path, ctx->qry.ofs,
+                                     ctx->qry.grep, ctx->qry.search,
+                                     ctx->qry.showmsg);
+       else if (!strcmp(ctx->qry.page, "commit"))
+               return cgit_commit_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+                                     ctx->qry.path, 0);
+       else if (!strcmp(ctx->qry.page, "patch"))
+               return cgit_patch_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+                                     ctx->qry.path);
+       else if (!strcmp(ctx->qry.page, "refs"))
+               return cgit_refs_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+                                     ctx->qry.path);
+       else if (!strcmp(ctx->qry.page, "snapshot"))
+               return cgit_snapshot_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+                                     ctx->qry.path);
+       else if (!strcmp(ctx->qry.page, "diff"))
+               return cgit_diff_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.sha1, ctx->qry.sha2,
+                                     ctx->qry.path, 0);
+       else if (!strcmp(ctx->qry.page, "stats"))
+               return cgit_stats_link(name, title, class, ctx->qry.head,
+                                     ctx->qry.path);
+
+       /* Don't known how to make link for this page */
+       repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path);
+       html("><!-- cgit_self_link() doesn't know how to make link for page '");
+       html_txt(ctx->qry.page);
+       html("' -->");
+       html_txt(name);
+       html("</a>");
+}
+
 void cgit_object_link(struct object *obj)
 {
        char *page, *shortrev, *fullrev, *name;
@@ -408,7 +491,7 @@ void cgit_object_link(struct object *obj)
        shortrev[10] = '\0';
        if (obj->type == OBJ_COMMIT) {
                 cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL,
-                                ctx.qry.head, fullrev, 0);
+                                ctx.qry.head, fullrev, NULL, 0);
                return;
        } else if (obj->type == OBJ_TREE)
                page = "tree";
@@ -491,7 +574,7 @@ void cgit_print_http_headers(struct cgit_context *ctx)
        else if (ctx->page.mimetype)
                htmlf("Content-Type: %s\n", ctx->page.mimetype);
        if (ctx->page.size)
-               htmlf("Content-Length: %ld\n", ctx->page.size);
+               htmlf("Content-Length: %zd\n", ctx->page.size);
        if (ctx->page.filename)
                htmlf("Content-Disposition: inline; filename=\"%s\"\n",
                      ctx->page.filename);
@@ -650,19 +733,50 @@ static const char *hc(struct cgit_context *ctx, const char *page)
        return strcmp(ctx->qry.page, page) ? NULL : "active";
 }
 
+static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path)
+{
+       char *old_path = ctx->qry.path;
+       char *p = path, *q, *end = path + strlen(path);
+
+       ctx->qry.path = NULL;
+       cgit_self_link("root", NULL, NULL, ctx);
+       ctx->qry.path = p = path;
+       while (p < end) {
+               if (!(q = strchr(p, '/')))
+                       q = end;
+               *q = '\0';
+               html_txt("/");
+               cgit_self_link(p, NULL, NULL, ctx);
+               if (q < end)
+                       *q = '/';
+               p = q + 1;
+       }
+       ctx->qry.path = old_path;
+}
+
 static void print_header(struct cgit_context *ctx)
 {
+       char *logo = NULL, *logo_link = NULL;
+
        html("<table id='header'>\n");
        html("<tr>\n");
 
-       if (ctx->cfg.logo && ctx->cfg.logo[0] != 0) {
+       if (ctx->repo && ctx->repo->logo && *ctx->repo->logo)
+               logo = ctx->repo->logo;
+       else
+               logo = ctx->cfg.logo;
+       if (ctx->repo && ctx->repo->logo_link && *ctx->repo->logo_link)
+               logo_link = ctx->repo->logo_link;
+       else
+               logo_link = ctx->cfg.logo_link;
+       if (logo && *logo) {
                html("<td class='logo' rowspan='2'><a href='");
-               if (ctx->cfg.logo_link)
-                       html_attr(ctx->cfg.logo_link);
+               if (logo_link && *logo_link)
+                       html_attr(logo_link);
                else
                        html_attr(cgit_rooturl());
                html("'><img src='");
-               html_attr(ctx->cfg.logo);
+               html_attr(logo);
                html("' alt='cgit logo'/></a></td>\n");
        }
 
@@ -710,16 +824,17 @@ void cgit_print_pageheader(struct cgit_context *ctx)
                cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head,
                               ctx->qry.sha1, NULL);
                cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head,
-                             NULL, NULL, 0, NULL, NULL, ctx->qry.showmsg);
+                             NULL, ctx->qry.vpath, 0, NULL, NULL,
+                             ctx->qry.showmsg);
                cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head,
-                              ctx->qry.sha1, NULL);
+                              ctx->qry.sha1, ctx->qry.vpath);
                cgit_commit_link("commit", NULL, hc(ctx, "commit"),
-                                ctx->qry.head, ctx->qry.sha1, 0);
+                                ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0);
                cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head,
-                              ctx->qry.sha1, ctx->qry.sha2, NULL, 0);
+                              ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0);
                if (ctx->repo->max_stats)
                        cgit_stats_link("stats", NULL, hc(ctx, "stats"),
-                                       ctx->qry.head, NULL);
+                                       ctx->qry.head, ctx->qry.vpath);
                if (ctx->repo->readme)
                        reporevlink("about", "about", NULL,
                                    hc(ctx, "about"), ctx->qry.head, NULL,
@@ -735,6 +850,7 @@ void cgit_print_pageheader(struct cgit_context *ctx)
                html_option("grep", "log msg", ctx->qry.grep);
                html_option("author", "author", ctx->qry.grep);
                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_attr(ctx->qry.search);
@@ -760,7 +876,7 @@ void cgit_print_pageheader(struct cgit_context *ctx)
        if (ctx->qry.vpath) {
                html("<div class='path'>");
                html("path: ");
-               html_txt(ctx->qry.vpath);
+               cgit_print_path_crumbs(ctx, ctx->qry.vpath);
                html("</div>");
        }
        html("<div class='content'>");