commit - 2c251c14c84a96ddb3a968cd30fd889ba363f805
commit + 387a29ba0be6aa0e59ef9a8f3f18564079b6aa88
blob - 8f9b2cf6f568f007f0e1d1cce187828cc667f290
blob + 106ff970598595629b38dd4456b7d32c91379c50
--- 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 - 9b5a4fc668ccf2e333d79adfff2a4d9501126311
blob + 2922ef159120afa07a3dd281602a31b6479d5deb
--- gotweb/files/cgi-bin/gw_tmpl/summary.tmpl
+++ gotweb/files/cgi-bin/gw_tmpl/summary.tmpl
@@repo_age@@
@@cloneurl@@
</div>
- @@summary_shortlog@@
- @@summary_tags@@
- @@summary_heads@@
+ @@content@@
</div>
@@siteowner@@
</div>
blob - 3eac38fa7a0a786b60a6c550fe90389aa8e71e6f
blob + 48c07924b4fb065bd5524cc99e8a0c1aac9e4364
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
unsigned int action;
unsigned int page;
unsigned int repos_total;
- enum kmime mime;
+ enum kmime mime;
};
enum gw_key {
TEMPL_REPO_OWNER,
TEMPL_REPO_AGE,
TEMPL_CLONEURL,
- TEMPL_SUMMARY_SHORTLOG,
- TEMPL_SUMMARY_TAGS,
- TEMPL_SUMMARY_HEADS,
TEMPL__MAX
};
+enum ref_tm {
+ TM_DIFF,
+ TM_LONG,
+};
+
static const char *const templs[TEMPL__MAX] = {
"head",
"header",
"repo_owner",
"repo_age",
"cloneurl",
- "summary_shortlog",
- "summary_tags",
- "summary_heads",
};
static const struct kvalid gw_keys[KEY__MAX] = {
static char *gw_get_repo_owner(struct trans *,
char *);
static char *gw_get_repo_age(struct trans *,
- char *, char *);
+ char *, char *, int);
static char *gw_get_clone_url(struct trans *, char *);
static char *gw_get_got_link(struct trans *);
static char *gw_get_site_link(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_snapshot(struct trans *);
+static const struct got_error* gw_summary(struct trans *);
static const struct got_error* gw_tree(struct trans *);
struct gw_query_action {
{ GW_BLOBDIFF, "blobdiff", gw_blob_diff, "gw_tmpl/index.tmpl" },
{ GW_COMMIT, "commit", gw_commit, "gw_tmpl/index.tmpl" },
{ GW_COMMITDIFF, "commit_diff", gw_commit_diff, "gw_tmpl/index.tmpl" },
- { GW_ERR, NULL, NULL, "gw_tmpl/err.tmpl" },
+ { GW_ERR, NULL, NULL, "gw_tmpl/index.tmpl" },
{ GW_HISTORY, "history", gw_history, "gw_tmpl/index.tmpl" },
{ 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_SNAPSHOT, "snapshot", gw_snapshot, "gw_tmpl/index.tmpl" },
- { GW_SUMMARY, "summary", NULL, "gw_tmpl/summary.tmpl" },
+ { GW_SUMMARY, "summary", gw_summary, "gw_tmpl/summary.tmpl" },
{ GW_TREE, "tree", gw_tree, "gw_tmpl/index.tmpl" },
};
const struct got_error *error = NULL;
struct gw_dir *dir = NULL;
char *html, *navs, *next, *prev;
- unsigned int prev_disp = 0, next_disp = 1, dir_c = 0;
+ unsigned int prev_disp = 0, next_disp = 1, dir_c = 0;
error = gw_load_got_paths(gw_trans);
if (error && error->code != GOT_ERR_OK)
}
static const struct got_error *
+gw_summary(struct trans *gw_trans)
+{
+ const struct got_error *error = NULL;
+
+ khttp_puts(gw_trans->gw_req, summary_shortlog);
+ khttp_puts(gw_trans->gw_req, summary_tags);
+ khttp_puts(gw_trans->gw_req, summary_heads);
+ return error;
+}
+
+static const struct got_error *
gw_tree(struct trans *gw_trans)
{
const struct got_error *error = NULL;
gw_dir->description = gw_get_repo_description(gw_trans,
gw_dir->path);
gw_dir->owner = gw_get_repo_owner(gw_trans, gw_dir->path);
- gw_dir->age = gw_get_repo_age(gw_trans, gw_dir->path, NULL);
+ gw_dir->age = gw_get_repo_age(gw_trans, gw_dir->path, "refs/heads",
+ TM_DIFF);
gw_dir->url = gw_get_clone_url(gw_trans, gw_dir->path);
errored:
return got_error_from_errno("asprintf");
if ((asprintf(&gw_trans->repo_path, "%s/%s",
- gw_trans->gw_conf->got_repos_path, p->parsed.s)) == -1)
+ gw_trans->gw_conf->got_repos_path, p->parsed.s)) == -1)
return got_error_from_errno("asprintf");
if ((p = gw_trans->gw_req->fieldmap[KEY_COMMIT_ID]))
gw_trans->page = p->parsed.i;
if (gw_trans->action == GW_RAW)
- gw_trans->mime = KMIME_TEXT_PLAIN;
+ gw_trans->mime = KMIME_TEXT_PLAIN;
return error;
}
khttp_head(gw_trans->gw_req, kresps[KRESP_ALLOW], "GET");
khttp_head(gw_trans->gw_req, kresps[KRESP_STATUS], "%s",
khttps[code]);
- khttp_head(gw_trans->gw_req, kresps[KRESP_CONTENT_TYPE], "%s",
+ khttp_head(gw_trans->gw_req, kresps[KRESP_CONTENT_TYPE], "%s",
kmimetypes[mime]);
khttp_head(gw_trans->gw_req, "X-Content-Type-Options", "nosniff");
khttp_head(gw_trans->gw_req, "X-Frame-Options", "DENY");
case(TEMPL_REPO_AGE):
if (gw_trans->gw_conf->got_show_repo_age) {
repo_age = gw_get_repo_age(gw_trans,
- gw_trans->repo_path, NULL);
+ gw_trans->repo_path, "refs/heads", TM_LONG);
if (repo_age != NULL) {
if ((asprintf(&repo_age_h, summary_last_change,
- repo_age)) == -1)
+ repo_age)) == -1)
return 0;
khttp_puts(gw_trans->gw_req, repo_age_h);
free(repo_age);
}
break;
- case(TEMPL_SUMMARY_SHORTLOG):
- khttp_puts(gw_trans->gw_req, summary_shortlog);
- break;
- case(TEMPL_SUMMARY_TAGS):
- khttp_puts(gw_trans->gw_req, summary_tags);
- break;
- case(TEMPL_SUMMARY_HEADS):
- khttp_puts(gw_trans->gw_req, summary_heads);
- break;
default:
return 0;
break;
}
static char *
-gw_get_repo_age(struct trans *gw_trans, char *dir, char *repo_ref)
+gw_get_repo_age(struct trans *gw_trans, char *dir, char *repo_ref, int ref_tm)
{
const struct got_error *error = NULL;
struct got_object_id *id = NULL;
struct got_reflist_head refs;
struct got_reflist_entry *re;
struct got_reference *head_ref;
+ struct tm tm;
time_t committer_time = 0, cmp_time = 0, diff_time;
char *repo_age = NULL, *years = "years ago", *months = "months ago";
char *weeks = "weeks ago", *days = "days ago", *hours = "hours ago";
char *minutes = "minutes ago", *seconds = "seconds ago";
char *now = "right now";
+ char datebuf[BUFFER_SIZE];
+
+ if (repo_ref == NULL)
+ return NULL;
SIMPLEQ_INIT(&refs);
if (gw_trans->gw_conf->got_show_repo_age == false) {
if (error != NULL)
goto err;
- error = got_ref_list(&refs, repo, "refs/heads", got_ref_cmp_by_name,
+ error = got_ref_list(&refs, repo, repo_ref, got_ref_cmp_by_name,
NULL);
if (error != NULL)
goto err;
if (error != NULL)
goto err;
+ /* here is what breaks tags, so adjust */
error = got_object_open_as_commit(&commit, repo, id);
if (error != NULL)
goto err;
committer_time =
got_object_commit_get_committer_time(commit);
- if (repo_ref != NULL && (strcmp(refname, repo_ref) == 0)) {
- cmp_time = 0;
- break;
- }
- if (committer_time > cmp_time)
+ if (cmp_time < committer_time)
cmp_time = committer_time;
}
- if (repo_ref != NULL && (strcmp(refname, repo_ref) != 0)) {
- asprintf(&repo_age, "");
- goto noref;
- }
-
if (cmp_time != 0)
committer_time = cmp_time;
- diff_time = time(NULL) - committer_time;
- if (diff_time > 60 * 60 * 24 * 365 * 2)
- asprintf(&repo_age, "%lld %s", (diff_time / 60 / 60 / 24 / 365),
- years);
- else if (diff_time > 60 * 60 * 24 * (365 / 12) * 2)
- asprintf(&repo_age, "%lld %s", (diff_time / 60 / 60 / 24 /
- (365 / 12)), months);
- else if (diff_time > 60 * 60 * 24 * 7 * 2)
- asprintf(&repo_age, "%lld %s", (diff_time / 60 / 60 / 24 / 7),
- weeks);
- else if (diff_time > 60 * 60 * 24 * 2)
- asprintf(&repo_age, "%lld %s", (diff_time / 60 / 60 / 24),
- days);
- else if (diff_time > 60 * 60 * 2)
- asprintf(&repo_age, "%lld %s", (diff_time / 60 / 60), hours);
- else if (diff_time > 60 * 2)
- asprintf(&repo_age, "%lld %s", (diff_time / 60), minutes);
- else if (diff_time > 2)
- asprintf(&repo_age, "%lld %s", diff_time, seconds);
- else
- asprintf(&repo_age, "%s", now);
+ switch (ref_tm) {
+ case TM_DIFF:
+ diff_time = time(NULL) - committer_time;
+ if (diff_time > 60 * 60 * 24 * 365 * 2) {
+ if ((asprintf(&repo_age, "%lld %s",
+ (diff_time / 60 / 60 / 24 / 365), years)) == -1)
+ return NULL;
+ } else if (diff_time > 60 * 60 * 24 * (365 / 12) * 2) {
+ if ((asprintf(&repo_age, "%lld %s",
+ (diff_time / 60 / 60 / 24 / (365 / 12)),
+ months)) == -1)
+ return NULL;
+ } else if (diff_time > 60 * 60 * 24 * 7 * 2) {
+ if ((asprintf(&repo_age, "%lld %s",
+ (diff_time / 60 / 60 / 24 / 7), weeks)) == -1)
+ return NULL;
+ } else if (diff_time > 60 * 60 * 24 * 2) {
+ if ((asprintf(&repo_age, "%lld %s",
+ (diff_time / 60 / 60 / 24), days)) == -1)
+ return NULL;
+ } else if (diff_time > 60 * 60 * 2) {
+ if ((asprintf(&repo_age, "%lld %s",
+ (diff_time / 60 / 60), hours)) == -1)
+ return NULL;
+ } else if (diff_time > 60 * 2) {
+ if ((asprintf(&repo_age, "%lld %s", (diff_time / 60),
+ minutes)) == -1)
+ return NULL;
+ } else if (diff_time > 2) {
+ if ((asprintf(&repo_age, "%lld %s", diff_time,
+ seconds)) == -1)
+ return NULL;
+ } else {
+ if ((asprintf(&repo_age, "%s", now)) == -1)
+ return NULL;
+ }
+ break;
+ case TM_LONG:
+ if (cmp_time != 0) {
+ if (gmtime_r(&committer_time, &tm) == NULL)
+ return NULL;
+ if (strftime(datebuf, sizeof(datebuf),
+ "%G-%m-%d %H:%M:%S (%z)",
+ &tm) >= sizeof(datebuf))
+ return NULL;
+
+ if ((asprintf(&repo_age, "%s", datebuf)) == -1)
+ return NULL;
+ } else {
+ if ((asprintf(&repo_age, "")) == -1)
+ return NULL;
+ }
+ break;
+ }
noref:
got_ref_list_free(&refs);
if ((gw_trans->gw_conf =
malloc(sizeof(struct gotweb_conf))) == NULL) {
gw_malloc = false;
- error = got_error_from_errno("malloc");
+ error = got_error_from_errno("malloc");
goto err;
}