commit - 9d84e7dd9e16bfa028f8607ebeae226c7ea4c0ed
commit + 4ceb8155ccb971807ae8c7e32ed1357ac23685a2
blob - 106ff970598595629b38dd4456b7d32c91379c50
blob + 8f9b2cf6f568f007f0e1d1cce187828cc667f290
--- Makefile.inc
+++ Makefile.inc
CPPFLAGS += -DGOT_LIBEXECDIR=${LIBEXECDIR} -DGOT_VERSION=${GOT_VERSION}
-#CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
+CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
#CFLAGS += -DGOT_PACK_NO_MMAP
#CFLAGS += -DGOT_NO_OBJ_CACHE
#CFLAGS += -DGOT_OBJ_CACHE_DEBUG
blob - c1ca944f5834b9a6f65edf7f890a8968edafdf78
blob + a55dfa209eaad11211cb2f51ad6f29220cb4ce97
--- gotweb/TODO
+++ gotweb/TODO
Complete stylesheets.
Complete gw_funcs
----
-Remember items
- description
- cloneurl
+
+- Add Prev/Next to shortlogs/logs that have more entries than
+ got_max_commits_display
+
+- Alter gw_get_repo_log full_log int to type more logs output for other options,
+ such as header displays for commit, commit_diff, etc.
+
+- Discuss how much of the gitweb functionality we really need or want. A user
+ can really go down an endless rabbit hole. Is it all worthwhile?
+
+- Redo index header, so columns are removed when content is set to not display
+ in gotweb.conf.
blob - 6593c76079499fdfdc518d7224d06e2fa34b16dd
blob + 3ea47833b3f3410756fa80dd2f323be2bc2b3b29
--- gotweb/files/htdocs/gotweb/gotweb.css
+++ gotweb/files/htdocs/gotweb/gotweb.css
padding-bottom: 5px;
overflow: auto;
}
-#shortlog_wrapper {
+#logbriefs_wrapper {
clear: left;
float: left;
width: 100%;
}
-#shortlog_age {
+#logbriefs_age {
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
width: 7.5em;
overflow: auto;
}
-#shortlog_author {
+#logbriefs_author {
float: left;
padding-top: 5px;
padding-bottom: 5px;
font-style: italic;
overflow: auto;
}
-#shortlog_log {
+#logbriefs_log {
float: left;
+ padding-left: 10px;
padding-right: 10px;
padding-top: 5px;
padding-bottom: 5px;
text-decoration: none;
}
+/* logs.tmpl */
+
+#logs_wrapper {
+ clear: left;
+ float: left;
+ width: 100%;
+}
+#logs_title_wrapper {
+ clear: left;
+ float: left;
+ width: 100%;
+ background-color: LightSlateGray;
+ color: #ffffff;
+}
+#logs_title {
+ padding-left: 10px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+#logs_content {
+ clear: left;
+ float: left;
+ width: 100%;
+}
+#logs_row_wrapper {
+ clear: left;
+ float: left;
+ background-color: #f5fcfb;
+ width: 100%;
+}
+#logs_commit {
+ clear: left;
+ float: left;
+ padding-left: 10px;
+ padding-top: 5px;
+ padding-bottom: 2px;
+}
+#logs_author {
+ clear: left;
+ float: left;
+ padding-left: 10px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+#logs_age {
+ clear: left;
+ float: left;
+ padding-left: 10px;
+ padding-top: 2px;
+ padding-bottom: 5px;
+}
+
+#log {
+ clear: left;
+ float: left;
+ padding-left: 20px;
+ padding-top: 2px;
+ padding-bottom: 20px;
+}
+
/* summary.tmpl */
#summary_wrapper {
width: 100%;
background-color: Khaki;
}
-#summary_shortlog_title_wrapper {
+#summary_logbriefs_title_wrapper {
clear: left;
float: left;
width: 100%;
background-color: LightSlateGray;
color: #ffffff;
}
-#summary_shortlog_title {
+#summary_logbriefs_title {
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
}
-#summary_shortlog_content {
+#summary_logbriefs_content {
clear: left;
float: left;
width: 100%;
blob - 69b21bc7c6576a212fa584990ba15f078a2e2883
blob + debc3faf3bd9431c7b47c2827fed1d20c6d3db67
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
static char *gw_get_time_str(time_t, int);
static char *gw_get_repo_age(struct trans *,
char *, char *, int);
-static char *gw_get_repo_shortlog(struct trans *,
- const char *, int);
+static char *gw_get_repo_log(struct trans *, const char *,
+ char *, int, int);
static char *gw_get_repo_tags(struct trans *);
static char *gw_get_repo_heads(struct trans *);
static char *gw_get_clone_url(struct trans *, char *);
static const struct got_error* gw_index(struct trans *);
static const struct got_error* gw_log(struct trans *);
static const struct got_error* gw_raw(struct trans *);
-static const struct got_error* gw_shortlog(struct trans *);
+static const struct got_error* gw_logbriefs(struct trans *);
static const struct got_error* gw_snapshot(struct trans *);
static const struct got_error* gw_summary(struct trans *);
static const struct got_error* gw_tree(struct trans *);
GW_INDEX,
GW_LOG,
GW_RAW,
- GW_SHORTLOG,
+ GW_LOGBRIEFS,
GW_SNAPSHOT,
GW_SUMMARY,
GW_TREE
{ GW_INDEX, "index", gw_index, "gw_tmpl/index.tmpl" },
{ GW_LOG, "log", gw_log, "gw_tmpl/index.tmpl" },
{ GW_RAW, "raw", gw_raw, "gw_tmpl/index.tmpl" },
- { GW_SHORTLOG, "shortlog", gw_shortlog, "gw_tmpl/index.tmpl" },
+ { GW_LOGBRIEFS, "logbriefs", gw_logbriefs, "gw_tmpl/index.tmpl" },
{ GW_SNAPSHOT, "snapshot", gw_snapshot, "gw_tmpl/index.tmpl" },
{ GW_SUMMARY, "summary", gw_summary, "gw_tmpl/index.tmpl" },
{ GW_TREE, "tree", gw_tree, "gw_tmpl/index.tmpl" },
gw_log(struct trans *gw_trans)
{
const struct got_error *error = NULL;
+ char *log, *log_html;
+ log = gw_get_repo_log(gw_trans, NULL, NULL,
+ gw_trans->gw_conf->got_max_commits_display, 1);
+
+ if (log != NULL && strcmp(log, "") != 0) {
+ if ((asprintf(&log_html, logs, log)) == -1)
+ return got_error_from_errno("asprintf");
+ khttp_puts(gw_trans->gw_req, log_html);
+ free(log_html);
+ free(log);
+ }
return error;
}
}
static const struct got_error *
-gw_shortlog(struct trans *gw_trans)
+gw_logbriefs(struct trans *gw_trans)
{
const struct got_error *error = NULL;
- char *shortlog, *shortlog_html;
+ char *logbriefs, *logbriefs_html;
- shortlog = gw_get_repo_shortlog(gw_trans, NULL,
- gw_trans->gw_conf->got_max_commits_display);
+ logbriefs = gw_get_repo_log(gw_trans, NULL, NULL,
+ gw_trans->gw_conf->got_max_commits_display, 0);
- if (shortlog != NULL && strcmp(shortlog, "") != 0) {
- if ((asprintf(&shortlog_html, summary_shortlog,
- shortlog)) == -1)
+ if (logbriefs != NULL && strcmp(logbriefs, "") != 0) {
+ if ((asprintf(&logbriefs_html, summary_logbriefs,
+ logbriefs)) == -1)
return got_error_from_errno("asprintf");
- khttp_puts(gw_trans->gw_req, shortlog_html);
- free(shortlog_html);
- free(shortlog);
+ khttp_puts(gw_trans->gw_req, logbriefs_html);
+ free(logbriefs_html);
+ free(logbriefs);
}
-
return error;
}
{
const struct got_error *error = NULL;
char *description_html, *repo_owner_html, *repo_age_html,
- *cloneurl_html, *shortlog, *tags, *heads, *shortlog_html,
+ *cloneurl_html, *logbriefs, *tags, *heads, *logbriefs_html,
*tags_html, *heads_html, *age;
error = apply_unveil(gw_trans->gw_dir->path, NULL);
}
khttp_puts(gw_trans->gw_req, div_end);
- shortlog = gw_get_repo_shortlog(gw_trans, NULL, D_MAXSLCOMMDISP);
+ logbriefs = gw_get_repo_log(gw_trans, NULL, NULL, D_MAXSLCOMMDISP, 0);
tags = gw_get_repo_tags(gw_trans);
heads = gw_get_repo_heads(gw_trans);
- if (shortlog != NULL && strcmp(shortlog, "") != 0) {
- if ((asprintf(&shortlog_html, summary_shortlog,
- shortlog)) == -1)
+ if (logbriefs != NULL && strcmp(logbriefs, "") != 0) {
+ if ((asprintf(&logbriefs_html, summary_logbriefs,
+ logbriefs)) == -1)
return got_error_from_errno("asprintf");
- khttp_puts(gw_trans->gw_req, shortlog_html);
- free(shortlog_html);
- free(shortlog);
+ khttp_puts(gw_trans->gw_req, logbriefs_html);
+ free(logbriefs_html);
+ free(logbriefs);
}
if (tags != NULL && strcmp(tags, "") != 0) {
const struct got_error *error = NULL;
DIR *dt;
char *dir_test;
- bool opened = false;
+ int opened = 0;
if ((asprintf(&dir_test, "%s/%s/%s",
gw_trans->gw_conf->got_repos_path, gw_dir->name,
free(dir_test);
} else {
gw_dir->path = strdup(dir_test);
- opened = true;
+ opened = 1;
goto done;
}
if (dt == NULL)
free(dir_test);
else {
- opened = true;
+ opened = 1;
error = got_error(GOT_ERR_NOT_GIT_REPO);
goto errored;
}
}
static char *
-gw_get_repo_shortlog(struct trans *gw_trans, const char *search_pattern,
- int limit)
+gw_get_repo_log(struct trans *gw_trans, const char *search_pattern,
+ char *start_commit, int limit, int full_log)
{
const struct got_error *error;
struct got_repository *repo = NULL;
struct got_commit_object *commit = NULL;
struct got_object_id *id = NULL;
struct got_commit_graph *graph = NULL;
- char *start_commit = NULL, *shortlog = NULL, *id_str = NULL,
- *path = NULL, *in_repo_path = NULL, *commit_row = NULL,
- *commit_age = NULL, *commit_author = NULL, *commit_log = NULL,
- *commit_log0, *newline, *shortlog_navs_html = NULL;
+ char *logbriefs = NULL, *id_str = NULL, *path = NULL,
+ *in_repo_path = NULL, *commit_row = NULL, *commit_age = NULL,
+ *commit_author = NULL, *commit_log = NULL, *commit_log0, *newline,
+ *logbriefs_navs_html = NULL;
regex_t regex;
int have_match;
size_t newsize;
committer_time =
got_object_commit_get_committer_time(commit_disp);
- asprintf(&commit_age, "%s", gw_get_time_str(committer_time,
- TM_DIFF));
- asprintf(&commit_author, "%s",
- got_object_commit_get_author(commit_disp));
- error = got_object_commit_get_logmsg(&commit_log0, commit_disp);
- if (error)
- commit_log = strdup("");
- else {
- commit_log = commit_log0;
- while (*commit_log == '\n')
- commit_log++;
- newline = strchr(commit_log, '\n');
- if (newline)
- *newline = '\0';
+
+ if (full_log) {
+
+ asprintf(&commit_age, "%s",
+ gw_get_time_str(committer_time, TM_LONG));
+ asprintf(&commit_author, "%s",
+ got_object_commit_get_author(commit_disp));
+ error = got_object_commit_get_logmsg(&commit_log0,
+ commit_disp);
+ if (error)
+ commit_log = strdup("");
+ else
+ commit_log = gw_html_escape(commit_log0);
+ asprintf(&logbriefs_navs_html, logbriefs_navs,
+ gw_trans->repo_name, id_str, gw_trans->repo_name,
+ id_str, gw_trans->repo_name, id_str,
+ gw_trans->repo_name, id_str);
+ asprintf(&commit_row, logs_row, id_str,
+ gw_html_escape(commit_author), commit_age,
+ commit_log, logbriefs_navs_html);
+ error = buf_append(&newsize, diffbuf, commit_row,
+ strlen(commit_row));
+ } else {
+ asprintf(&commit_age, "%s",
+ gw_get_time_str(committer_time, TM_DIFF));
+ asprintf(&commit_author, "%s",
+ got_object_commit_get_author(commit_disp));
+ error = got_object_commit_get_logmsg(&commit_log0,
+ commit_disp);
+ if (error)
+ commit_log = strdup("");
+ else {
+ commit_log = commit_log0;
+ while (*commit_log == '\n')
+ commit_log++;
+ newline = strchr(commit_log, '\n');
+ if (newline)
+ *newline = '\0';
+ }
+ asprintf(&logbriefs_navs_html, logbriefs_navs,
+ gw_trans->repo_name, id_str, gw_trans->repo_name,
+ id_str, gw_trans->repo_name, id_str,
+ gw_trans->repo_name, id_str);
+ asprintf(&commit_row, logbriefs_row, commit_age,
+ commit_author, commit_log, logbriefs_navs_html);
+ error = buf_append(&newsize, diffbuf, commit_row,
+ strlen(commit_row));
}
- asprintf(&shortlog_navs_html, shortlog_navs,
- gw_trans->repo_name, id_str, gw_trans->repo_name, id_str,
- gw_trans->repo_name, id_str, gw_trans->repo_name, id_str);
- asprintf(&commit_row, shortlog_row, commit_age, commit_author,
- commit_log, shortlog_navs_html);
- error = buf_append(&newsize, diffbuf, commit_row,
- strlen(commit_row));
free(commit_age);
free(commit_author);
free(commit_log0);
- free(shortlog_navs_html);
+ free(logbriefs_navs_html);
free(commit_row);
free(id_str);
commit_age = NULL;
commit_author = NULL;
commit_log = NULL;
- shortlog_navs_html = NULL;
+ logbriefs_navs_html = NULL;
commit_row = NULL;
id_str = NULL;
if (error || (limit && --limit == 0))
break;
}
- shortlog = strdup(diffbuf->cb_buf);
+ logbriefs = strdup(diffbuf->cb_buf);
got_object_commit_close(commit);
free(path);
if (search_pattern)
regfree(®ex);
- return shortlog;
+ return logbriefs;
done:
if (repo)
got_repo_close(repo);
{
char *tags = NULL;
- asprintf(&tags, tags_row, "30 min ago", "1.0.0", "tag 1.0.0", tags_navs);
+ asprintf(&tags, tags_row, "30 min ago", "1.0.0", "tag 1.0.0",
+ tags_navs);
return tags;
}
struct trans *gw_trans;
struct gw_dir *dir = NULL, *tdir;
const char *page = "index";
- bool gw_malloc = true;
+ int gw_malloc = 1;
if ((gw_trans = malloc(sizeof(struct trans))) == NULL)
errx(1, "malloc");
if ((gw_trans->gw_conf =
malloc(sizeof(struct gotweb_conf))) == NULL) {
- gw_malloc = false;
+ gw_malloc = 0;
error = got_error_from_errno("malloc");
goto err;
}
blob - 4a710632da6fbf66ec0bc3850aa85db8e8b242bc
blob + 2d578f1acd4baa157bf621af57a3f6653c663d29
--- gotweb/gotweb_ui.h
+++ gotweb/gotweb_ui.h
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/*
- * header nav
- *
- * ***index
- * search
- * Projects
- * Project|Description|Owner|Last Commit
- * DIV (summary|shortlog|log|tree)
- * ***summary
- * repo navs | search
- * repo description
- * description
- * owner
- * last commit
- * URL
- * shortlog
- * Date|committer|commit description (commit|commitdiff|tree|snapshot)
- * heads
- * create date | head (shortlog|log|tree)
- *
- *
- *
- * footer
- */
-
#ifndef GOTWEB_UI_H
#define GOTWEB_UI_H
"<div id='cloneurl_title'>Clone URL: </div>" \
"<div id='cloneurl'>%s</div>";
-char *shortlog_row =
- "<div id='shortlog_wrapper'>" \
- "<div id='shortlog_age'>%s</div>" \
- "<div id='shortlog_author'>%s</div>" \
- "<div id='shortlog_log'>%s</div>" \
+char *logbriefs_row =
+ "<div id='logbriefs_wrapper'>" \
+ "<div id='logbriefs_age'>%s</div>" \
+ "<div id='logbriefs_author'>%s</div>" \
+ "<div id='logbriefs_log'>%s</div>" \
"</div>" \
"<div id='navs_wrapper'>" \
"<div id='navs'>%s</div>" \
"</div>" \
"<div id='dotted_line'></div>";
-char *shortlog_navs =
+char *logbriefs_navs =
"<a href='?path=%s&action=commit&commit=%s'>commit</a> | " \
"<a href='?path=%s&action=commitdiff&commit=%s'>diff</a> | " \
"<a href='?path=%s&action=tree&commit=%s'>tree</a> | " \
char *tags_navs =
"<a href='?path=%s&action=tagt&commit=%s'>tag</a> | " \
"<a href='?path=%s&action=commit&commit=%s'>commit</a> | " \
- "<a href='?path=%s&action=shortlog&commit=%s'>shortlog</a> | " \
+ "<a href='?path=%s&action=logbriefs&commit=%s'>Log Briefs</a> | " \
"<a href='?path=%s&action=log&commit=%s'>log</a>";
char *heads_row =
"<div id='dotted_line'></div>";
char *heads_navs =
- "<a href='?path=%s&action=shortlog&headref=%s'>shortlog</a> | " \
+ "<a href='?path=%s&action=logbriefs&headref=%s'>Log Briefs</a> | " \
"<a href='?path=%s&action=log&headref=%s'>log</a> | " \
"<a href='?path=%s&action=tree&headref=%s'>commit</a>";
+/* log.tmpl */
+
+char *logs_wrapper =
+ "<div id='logs_wrapper'>";
+
+char *logs =
+ "<div id='logs_title_wrapper'>" \
+ "<div id='logs_title'>Commits</div></div>" \
+ "<div id='logs_content'>%s</div>";
+
+char *logs_row =
+ "<div id='logs_row_wrapper'>" \
+ "<div id='logs_commit'>Commit: %s</div>" \
+ "<div id='logs_author'>From: %s</div>" \
+ "<div id='logs_age'>Date: %s</div>" \
+ "</div>" \
+ "<div id='dotted_line'></div>" \
+ "<div id='log'>%s</div>" \
+ "<div id='navs_wrapper'>" \
+ "<div id='navs'>%s</div>" \
+ "</div>" \
+ "</div>" \
+ "<div id='dotted_line'></div>";
+
+char *logs_navs =
+ "<a href='?path=%s&action=commit&commit=%s'>commit</a> | " \
+ "<a href='?path=%s&action=commitdiff&commit=%s'>diff</a> | " \
+ "<a href='?path=%s&action=tree&commit=%s'>tree</a> | " \
+ "<a href='?path=%s&action=snapshot&commit=%s'>snapshot</a>";
+
/* index.tmpl */
char *index_projects_header =
char *index_navs =
"<a href='?path=%s&action=summary'>summary</a> | " \
- "<a href='?path=%s&action=shortlog'>shortlog</a> | " \
+ "<a href='?path=%s&action=logbriefs'>log briefs</a> | " \
"<a href='?path=%s&action=log'>log</a> | " \
"<a href='?path=%s&action=tree'>tree</a>";
char *summary_wrapper =
"<div id='summary_wrapper'>";
-char *summary_shortlog =
- "<div id='summary_shortlog_title_wrapper'>" \
- "<div id='summary_shortlog_title'>Shortlog</div></div>" \
- "<div id='summary_shortlog_content'>%s</div>";
+char *summary_logbriefs =
+ "<div id='summary_logbriefs_title_wrapper'>" \
+ "<div id='summary_logbriefs_title'>Log Briefs</div></div>" \
+ "<div id='summary_logbriefs_content'>%s</div>";
char *summary_tags =
"<div id='summary_tags_title_wrapper'>" \