]> gitweb.ps.run Git - ps-cgit/blobdiff - ui-shared.c
ui-repolist + ui-shared: Use cgit_summary_link()
[ps-cgit] / ui-shared.c
index a2e0dd2b77c97efa2dbd43df4aed7ef2eae6e2a7..1fc5c0978bde754ce540285cc9300ca84159d2bf 100644 (file)
@@ -34,6 +34,26 @@ void cgit_print_error(char *msg)
        html("</div>\n");
 }
 
+char *cgit_hosturl()
+{
+       char *host, *port;
+
+       host = getenv("HTTP_HOST");
+       if (host) {
+               host = xstrdup(host);
+       } else {
+               host = getenv("SERVER_NAME");
+               if (!host)
+                       return NULL;
+               port = getenv("SERVER_PORT");
+               if (port && atoi(port) != 80)
+                       host = xstrdup(fmt("%s:%d", host, atoi(port)));
+               else
+                       host = xstrdup(host);
+       }
+       return host;
+}
+
 char *cgit_rooturl()
 {
        if (ctx.cfg.virtual_root)
@@ -186,36 +206,36 @@ static char *repolink(char *title, char *class, char *page, char *head,
        }
        html(" href='");
        if (ctx.cfg.virtual_root) {
-               html_attr(ctx.cfg.virtual_root);
+               html_url_path(ctx.cfg.virtual_root);
                if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/')
                        html("/");
-               html_attr(ctx.repo->url);
+               html_url_path(ctx.repo->url);
                if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
                        html("/");
                if (page) {
-                       html(page);
+                       html_url_path(page);
                        html("/");
                        if (path)
-                               html_attr(path);
+                               html_url_path(path);
                }
        } else {
                html(ctx.cfg.script_name);
                html("?url=");
-               html_attr(ctx.repo->url);
+               html_url_arg(ctx.repo->url);
                if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
                        html("/");
                if (page) {
-                       html(page);
+                       html_url_arg(page);
                        html("/");
                        if (path)
-                               html_attr(path);
+                               html_url_arg(path);
                }
                delim = "&amp;";
        }
        if (head && strcmp(head, ctx.repo->defbranch)) {
                html(delim);
                html("h=");
-               html_attr(head);
+               html_url_arg(head);
                delim = "&amp;";
        }
        return fmt("%s", delim);
@@ -230,13 +250,18 @@ static void reporevlink(char *page, char *name, char *title, char *class,
        if (rev && strcmp(rev, ctx.qry.head)) {
                html(delim);
                html("id=");
-               html_attr(rev);
+               html_url_arg(rev);
        }
        html("'>");
        html_txt(name);
        html("</a>");
 }
 
+void cgit_summary_link(char *name, char *title, char *class, char *head)
+{
+       reporevlink(NULL, name, title, class, head, NULL, NULL);
+}
+
 void cgit_tree_link(char *name, char *title, char *class, char *head,
                    char *rev, char *path)
 {
@@ -258,17 +283,17 @@ void cgit_log_link(char *name, char *title, char *class, char *head,
        if (rev && strcmp(rev, ctx.qry.head)) {
                html(delim);
                html("id=");
-               html_attr(rev);
+               html_url_arg(rev);
                delim = "&";
        }
        if (grep && pattern) {
                html(delim);
                html("qt=");
-               html_attr(grep);
+               html_url_arg(grep);
                delim = "&";
                html(delim);
                html("q=");
-               html_attr(pattern);
+               html_url_arg(pattern);
        }
        if (ofs > 0) {
                html(delim);
@@ -313,13 +338,13 @@ void cgit_diff_link(char *name, char *title, char *class, char *head,
        if (new_rev && strcmp(new_rev, ctx.qry.head)) {
                html(delim);
                html("id=");
-               html_attr(new_rev);
+               html_url_arg(new_rev);
                delim = "&amp;";
        }
        if (old_rev) {
                html(delim);
                html("id2=");
-               html_attr(old_rev);
+               html_url_arg(old_rev);
        }
        html("'>");
        html_txt(name);
@@ -436,6 +461,7 @@ void cgit_print_http_headers(struct cgit_context *ctx)
 
 void cgit_print_docstart(struct cgit_context *ctx)
 {
+       char *host = cgit_hosturl();
        html(cgit_doctype);
        html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n");
        html("<head>\n");
@@ -453,6 +479,13 @@ void cgit_print_docstart(struct cgit_context *ctx)
                html_attr(ctx->cfg.favicon);
                html("'/>\n");
        }
+       if (host && ctx->repo) {
+               html("<link rel='alternate' title='Atom feed' href='http://");
+               html_attr(cgit_hosturl());
+               html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path,
+                                      fmt("h=%s", ctx->qry.head)));
+               html("' type='application/atom+xml'/>");
+       }
        html("</head>\n");
        html("<body>\n");
 }
@@ -570,8 +603,7 @@ void cgit_print_pageheader(struct cgit_context *ctx)
        if (ctx->repo) {
                cgit_index_link("index", NULL, NULL, NULL, 0);
                html(" : ");
-               reporevlink(NULL, ctx->repo->name, NULL, hc(cmd, "summary"),
-                           ctx->qry.head, NULL, NULL);
+               cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL);
                html("</td><td class='form'>");
                html("<form method='get' action=''>\n");
                add_hidden_formfields(0, 1, ctx->qry.page);
@@ -599,8 +631,8 @@ void cgit_print_pageheader(struct cgit_context *ctx)
 
        html("<table class='tabs'><tr><td>\n");
        if (ctx->repo) {
-               reporevlink(NULL, "summary", NULL, hc(cmd, "summary"),
-                           ctx->qry.head, NULL, NULL);
+               cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL,
+                       ctx->qry.head);
                cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head,
                               ctx->qry.sha1, NULL);
                cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head,