commit - 5bda3ef83752a447e1afc97850d2bd6bd250ca55
commit + b3f1f953873b10d3c02529f3bd93e49a4f25299b
blob - 576258d3e841036bb8ed701120d7377a2608de0a
blob + 17f519ce9b2d439d5522350672bebcdfb9aaa76e
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
#include "buf.h"
#include "gotweb.h"
-#include "gotweb_ui.h"
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
{
const struct got_error *error = NULL;
struct gw_dir *gw_dir = NULL;
- char *html, *navs;
- char *href_next = NULL, *href_prev = NULL;
+ char *href_next = NULL, *href_prev = NULL, *href_summary = NULL;
+ char *href_briefs = NULL, *href_commits = NULL, *href_tree = NULL;
unsigned int prev_disp = 0, next_disp = 1, dir_c = 0;
enum kcgi_err kerr;
if (error)
return error;
- kerr = khttp_puts(gw_trans->gw_req, index_projects_header);
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_header", KATTR__MAX);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_header_project", KATTR__MAX);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_puts(gw_trans->gw_html_req, "Project");
if (kerr != KCGI_OK)
return gw_kcgi_error(kerr);
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
- if (TAILQ_EMPTY(&gw_trans->gw_dirs)) {
- if (asprintf(&html, index_projects_empty,
- gw_trans->gw_conf->got_repos_path) == -1)
- return got_error_from_errno("asprintf");
- kerr = khttp_puts(gw_trans->gw_req, html);
+ if (gw_trans->gw_conf->got_show_repo_description) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_header_description", KATTR__MAX);
if (kerr != KCGI_OK)
- error = gw_kcgi_error(kerr);
- free(html);
+ return gw_kcgi_error(kerr);
+ kerr = khtml_puts(gw_trans->gw_html_req, "Description");
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ }
+
+ if (gw_trans->gw_conf->got_show_repo_owner) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_header_owner", KATTR__MAX);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_puts(gw_trans->gw_html_req, "Owner");
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ }
+
+ if (gw_trans->gw_conf->got_show_repo_age) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_header_age", KATTR__MAX);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_puts(gw_trans->gw_html_req, "Last Change");
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ }
+
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+
+ if (TAILQ_EMPTY(&gw_trans->gw_dirs)) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_wrapper", KATTR__MAX);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_puts(gw_trans->gw_html_req,
+ "No repositories found in ");
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_puts(gw_trans->gw_html_req,
+ gw_trans->gw_conf->got_repos_path);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "dotted_line", KATTR__MAX);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK)
+ return gw_kcgi_error(kerr);
return error;
}
prev_disp++;
- if (error)
- return error;
- if(asprintf(&navs, index_navs, gw_dir->name, gw_dir->name,
- gw_dir->name, gw_dir->name) == -1)
- return got_error_from_errno("asprintf");
-
- if (asprintf(&html, index_projects, gw_dir->name, gw_dir->name,
- gw_dir->description, gw_dir->owner ? gw_dir->owner : "",
- gw_dir->age,
- navs) == -1)
- return got_error_from_errno("asprintf");
-
- kerr = khttp_puts(gw_trans->gw_req, html);
- free(navs);
- free(html);
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_wrapper", KATTR__MAX);
if (kerr != KCGI_OK)
return gw_kcgi_error(kerr);
+
+ if (asprintf(&href_summary, "?path=%s&action=summary",
+ gw_dir->name) == -1) {
+ error = got_error_from_errno("asprintf");
+ return error;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "index_project", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A, KATTR_HREF,
+ href_summary, KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req, gw_dir->name);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 2);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ if (gw_trans->gw_conf->got_show_repo_description) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
+ KATTR_ID, "index_project_description", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req,
+ gw_dir->description ? gw_dir->description : "");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ }
+ if (gw_trans->gw_conf->got_show_repo_owner) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
+ KATTR_ID, "index_project_owner", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req,
+ gw_dir->owner ? gw_dir->owner : "");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ }
+ if (gw_trans->gw_conf->got_show_repo_age) {
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
+ KATTR_ID, "index_project_age", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req,
+ gw_dir->age ? gw_dir->age : "");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ }
+
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "navs_wrapper", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "navs", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A, KATTR_HREF,
+ href_summary, KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req, "summary");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req, " | ");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ if (asprintf(&href_briefs, "?path=%s&action=briefs",
+ gw_dir->name) == -1) {
+ error = got_error_from_errno("asprintf");
+ goto done;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A, KATTR_HREF,
+ href_briefs, KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req, "commit briefs");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ kerr = khtml_puts(gw_trans->gw_html_req, " | ");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ if (asprintf(&href_commits, "?path=%s&action=commits",
+ gw_dir->name) == -1) {
+ error = got_error_from_errno("asprintf");
+ goto done;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A, KATTR_HREF,
+ href_commits, KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req, "commits");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ kerr = khtml_puts(gw_trans->gw_html_req, " | ");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ if (asprintf(&href_tree, "?path=%s&action=tree",
+ gw_dir->name) == -1) {
+ error = got_error_from_errno("asprintf");
+ goto done;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A, KATTR_HREF,
+ href_tree, KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_puts(gw_trans->gw_html_req, "tree");
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 4);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV, KATTR_ID,
+ "dotted_line", KATTR__MAX);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+ kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
+
+ free(href_summary);
+ href_summary = NULL;
+ free(href_briefs);
+ href_briefs = NULL;
+ free(href_commits);
+ href_commits = NULL;
+ free(href_tree);
+ href_tree = NULL;
+
if (gw_trans->gw_conf->got_max_repos_display == 0)
continue;
if (next_disp == gw_trans->gw_conf->got_max_repos_display) {
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
KATTR_ID, "np_wrapper", KATTR__MAX);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
KATTR_ID, "nav_prev", KATTR__MAX);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
} else if ((gw_trans->gw_conf->got_max_repos_display > 0) &&
(gw_trans->page > 0) &&
(next_disp == gw_trans->gw_conf->got_max_repos_display ||
prev_disp == gw_trans->repos_total)) {
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
KATTR_ID, "np_wrapper", KATTR__MAX);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
KATTR_ID, "nav_prev", KATTR__MAX);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
}
if ((gw_trans->gw_conf->got_max_repos_display > 0) &&
(next_disp == gw_trans->gw_conf->got_max_repos_display ||
prev_disp == gw_trans->repos_total)) {
if (asprintf(&href_prev, "?page=%d",
- gw_trans->page - 1) == -1)
- return got_error_from_errno("asprintf");
+ gw_trans->page - 1) == -1) {
+ error = got_error_from_errno("asprintf");
+ goto done;
+ }
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A,
KATTR_HREF, href_prev, KATTR__MAX);
free(href_prev);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
kerr = khtml_puts(gw_trans->gw_html_req, "Previous");
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
}
kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
gw_trans->gw_conf->got_max_repos_display) {
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
KATTR_ID, "nav_next", KATTR__MAX);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
if (asprintf(&href_next, "?page=%d",
- gw_trans->page + 1) == -1)
- return got_error_from_errno("calloc");
+ gw_trans->page + 1) == -1) {
+ error = got_error_from_errno("calloc");
+ goto done;
+ }
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_A,
KATTR_HREF, href_next, KATTR__MAX);
free(href_next);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
kerr = khtml_puts(gw_trans->gw_html_req, "Next");
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
kerr = khtml_closeelem(gw_trans->gw_html_req, 3);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
next_disp = 0;
break;
}
(next_disp == gw_trans->gw_conf->got_max_repos_display ||
prev_disp == gw_trans->repos_total)) {
kerr = khtml_closeelem(gw_trans->gw_html_req, 2);
- if (kerr != KCGI_OK)
- return gw_kcgi_error(kerr);
+ if (kerr != KCGI_OK) {
+ error = gw_kcgi_error(kerr);
+ goto done;
+ }
}
-
next_disp++;
}
+done:
+ free(href_summary);
+ free(href_briefs);
+ free(href_commits);
+ free(href_tree);
return error;
}
if (strncmp(refname, "refs/heads/", 11) == 0)
refname += 11;
-
kerr = khtml_attr(gw_trans->gw_html_req, KELEM_DIV,
KATTR_ID, "heads_wrapper", KATTR__MAX);
if (kerr != KCGI_OK)
blob - 6847a568df9220759fab03cc9828e0cd1f5c3abf (mode 644)
blob + /dev/null
--- gotweb/gotweb_ui.h
+++ /dev/null
-/*
- * Copyright (c) 2019, 2020 Tracey Emery <tracey@traceyemery.net>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef GOTWEB_UI_H
-#define GOTWEB_UI_H
-
-/* index.tmpl */
-
-char *index_projects_header =
- "<div id='index_header'>" \
- "<div id='index_header_project'>Project</div>" \
- "<div id='index_header_description'>Description</div>" \
- "<div id='index_header_owner'>Owner</div>" \
- "<div id='index_header_age'>Last Change</div>" \
- "</div>";
-
-char *index_projects =
- "<div id='index_wrapper'>" \
- "<div id='index_project'>" \
- "<a href='?path=%s&action=summary'>%s</a>" \
- "</div>" \
- "<div id='index_project_description'>%s</div>" \
- "<div id='index_project_owner'>%s</div>" \
- "<div id='index_project_age'>%s</div>" \
- "<div id='navs_wrapper'>" \
- "<div id='navs'>%s</div>" \
- "</div>" \
- "</div>" \
- "<div id='dotted_line'></div>";
-
-char *index_projects_empty =
- "<div id='index_wrapper'>" \
- "No repositories found in %s" \
- "</div>" \
- "<div id='dotted_line'></div>";
-
-char *index_navs =
- "<a href='?path=%s&action=summary'>summary</a> | " \
- "<a href='?path=%s&action=briefs'>commit briefs</a> | " \
- "<a href='?path=%s&action=commits'>commits</a> | " \
- "<a href='?path=%s&action=tree'>tree</a>";
-
-#endif /* GOTWEB_UI_H */