From 0c1ebce2042e69569d99551d7749b97b4e579609 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Thu, 25 Oct 2007 10:13:25 +0200 Subject: Use reflist to print branch info This updates ui-summary.c to use a reflist instead of for_each_branch_ref(), as a step towards more flexible branch handling (filtering/sorting). Signed-off-by: Lars Hjemli --- ui-summary.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'ui-summary.c') diff --git a/ui-summary.c b/ui-summary.c index de8a180..1e895a6 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -10,41 +10,35 @@ static int header; -static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1, - int flags, void *cb_data) +static void cgit_print_branch(struct refinfo *ref) { struct commit *commit; struct commitinfo *info; - char buf[256]; - char *ref; + char *name = (char *)ref->refname; - ref = xstrdup(refname); - strncpy(buf, refname, sizeof(buf)); - commit = lookup_commit(sha1); + commit = lookup_commit(ref->object->sha1); // object is not really parsed at this point, because of some fallout // from previous calls to git functions in cgit_print_log() commit->object.parsed = 0; if (commit && !parse_commit(commit)){ info = cgit_parse_commit(commit); html(""); - cgit_log_link(ref, NULL, NULL, ref, NULL, NULL, 0); + cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0); html(""); cgit_print_age(commit->date, -1, NULL); html(""); html_txt(info->author); html(""); - cgit_commit_link(info->subject, NULL, NULL, ref, NULL); + cgit_commit_link(info->subject, NULL, NULL, name, NULL); html("\n"); cgit_free_commitinfo(info); } else { html(""); - html_txt(buf); + html_txt(name); html(""); - htmlf("*** bad ref %s ***", sha1_to_hex(sha1)); + htmlf("*** bad ref %s ***", sha1_to_hex(ref->object->sha1)); html("\n"); } - free(ref); - return 0; } static void print_tag_header() @@ -144,11 +138,19 @@ static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1, static void cgit_print_branches() { + struct reflist list; + int i; + html("Branch" "Idle" "Author" "Head commit\n"); - for_each_branch_ref(cgit_print_branch_cb, NULL); + + list.refs = NULL; + list.alloc = list.count = 0; + for_each_branch_ref(cgit_refs_cb, &list); + for(i=0; i Date: Thu, 25 Oct 2007 10:28:15 +0200 Subject: Use reflist to print tag info This updates ui-summary.c to use a reflist instead of for_each_tag_ref(), as a step towards more flexible tag handling (filtering/sorting). Signed-off-by: Lars Hjemli --- ui-summary.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'ui-summary.c') diff --git a/ui-summary.c b/ui-summary.c index 1e895a6..c684628 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -50,29 +50,21 @@ static void print_tag_header() header = 1; } -static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1, - int flags, void *cb_data) +static int print_tag(struct refinfo *ref) { struct tag *tag; struct taginfo *info; - struct object *obj; - char buf[256], *url; + char *url, *name = (char *)ref->refname; - strncpy(buf, refname, sizeof(buf)); - obj = parse_object(sha1); - if (!obj) - return 1; - if (obj->type == OBJ_TAG) { - tag = lookup_tag(sha1); + if (ref->object->type == OBJ_TAG) { + tag = lookup_tag(ref->object->sha1); if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) return 2; - if (!header) - print_tag_header(); html(""); url = cgit_pageurl(cgit_query_repo, "tag", - fmt("id=%s", refname)); + fmt("id=%s", name)); html_link_open(url, NULL, NULL); - html_txt(buf); + html_txt(name); html_link_close(); html(""); if (info->tagger_date > 0) @@ -87,9 +79,9 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1, if (!header) print_tag_header(); html(""); - html_txt(buf); + html_txt(name); html(""); - cgit_object_link(obj); + cgit_object_link(ref->object); html("\n"); } return 0; @@ -155,8 +147,18 @@ static void cgit_print_branches() static void cgit_print_tags() { + struct reflist list; + int i; + header = 0; - for_each_tag_ref(cgit_print_tag_cb, NULL); + list.refs = NULL; + list.alloc = list.count = 0; + for_each_tag_ref(cgit_refs_cb, &list); + if (list.count == 0) + return; + print_tag_header(); + for(i=0; i Date: Thu, 25 Oct 2007 20:33:04 +0200 Subject: Sort tags by age This adds a function to compare timestamps and then uses it as callback for qsort() before printing out tags. Signed-off-by: Lars Hjemli --- ui-summary.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'ui-summary.c') diff --git a/ui-summary.c b/ui-summary.c index c684628..43582da 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -10,6 +10,23 @@ static int header; +static int cmp_tag_age(void *a, void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + if (r1->tag->tagger_date != 0 && r2->tag->tagger_date != 0) + return r2->tag->tagger_date - r1->tag->tagger_date; + + if (r1->tag->tagger_date == 0 && r2->tag->tagger_date == 0) + return 0; + + if (r1 == 0) + return +1; + + return -1; +} + static void cgit_print_branch(struct refinfo *ref) { struct commit *commit; @@ -156,6 +173,7 @@ static void cgit_print_tags() for_each_tag_ref(cgit_refs_cb, &list); if (list.count == 0) return; + qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age); print_tag_header(); for(i=0; i Date: Thu, 25 Oct 2007 10:40:16 +0200 Subject: Add support for config param summary-tags This parameter can be used to specify max number of tags to show on the summary page. If not specified, all tags are printed. Signed-off-by: Lars Hjemli --- cgit.h | 1 + shared.c | 3 +++ ui-summary.c | 10 +++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) (limited to 'ui-summary.c') diff --git a/cgit.h b/cgit.h index 75e919b..53e1336 100644 --- a/cgit.h +++ b/cgit.h @@ -143,6 +143,7 @@ extern int cgit_cache_dynamic_ttl; extern int cgit_cache_static_ttl; extern int cgit_cache_max_create_time; extern int cgit_summary_log; +extern int cgit_summary_tags; extern int cgit_max_msg_len; extern int cgit_max_repodesc_len; diff --git a/shared.c b/shared.c index d815cb1..7e5eaba 100644 --- a/shared.c +++ b/shared.c @@ -38,6 +38,7 @@ int cgit_cache_dynamic_ttl = 5; int cgit_cache_static_ttl = -1; int cgit_cache_max_create_time = 5; int cgit_summary_log = 0; +int cgit_summary_tags = 0; int cgit_renamelimit = -1; int cgit_max_msg_len = 60; @@ -181,6 +182,8 @@ void cgit_global_config_cb(const char *name, const char *value) cgit_max_commit_count = atoi(value); else if (!strcmp(name, "summary-log")) cgit_summary_log = atoi(value); + else if (!strcmp(name, "summary-tags")) + cgit_summary_tags = atoi(value); else if (!strcmp(name, "agefile")) cgit_agefile = xstrdup(value); else if (!strcmp(name, "renamelimit")) diff --git a/ui-summary.c b/ui-summary.c index 43582da..3d5eda8 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -162,7 +162,7 @@ static void cgit_print_branches() cgit_print_branch(list.refs[i]); } -static void cgit_print_tags() +static void cgit_print_tags(int maxcount) { struct reflist list; int i; @@ -174,8 +174,12 @@ static void cgit_print_tags() if (list.count == 0) return; qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age); + if (!maxcount) + maxcount = list.count; + else if (maxcount > list.count) + maxcount = list.count; print_tag_header(); - for(i=0; i "); cgit_print_branches(); html(" "); - cgit_print_tags(); + cgit_print_tags(cgit_summary_tags); html(""); } -- cgit v1.2.3-59-g8ed1b From f6310fec783d2721ef61815a0eec525d6a904452 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 27 Oct 2007 10:06:03 +0200 Subject: Move logic for age comparision from cmp_tag_age into cmp_age() Simple refactoring to enable later filtering of branches based on age. Signed-off-by: Lars Hjemli --- ui-summary.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'ui-summary.c') diff --git a/ui-summary.c b/ui-summary.c index 3d5eda8..05170cc 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -10,23 +10,28 @@ static int header; -static int cmp_tag_age(void *a, void *b) +static int cmp_age(int age1, int age2) { - struct refinfo *r1 = *(struct refinfo **)a; - struct refinfo *r2 = *(struct refinfo **)b; - - if (r1->tag->tagger_date != 0 && r2->tag->tagger_date != 0) - return r2->tag->tagger_date - r1->tag->tagger_date; + if (age1 != 0 && age2 != 0) + return age2 - age1; - if (r1->tag->tagger_date == 0 && r2->tag->tagger_date == 0) + if (age1 == 0 && age2 == 0) return 0; - if (r1 == 0) + if (age1 == 0) return +1; return -1; } +static int cmp_tag_age(const void *a, const void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date); +} + static void cgit_print_branch(struct refinfo *ref) { struct commit *commit; -- cgit v1.2.3-59-g8ed1b From 763a6a09deec7290365a0072d25630daa7b417e2 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 27 Oct 2007 10:13:42 +0200 Subject: Add support for config param summary-branches This parameter can be used to specify max number of branches to show on the summary page (if not all branches will be displayed, the "most idle" branches are the ones to be pruned). The default value for this parameter is 0, which disables the pruning. Signed-off-by: Lars Hjemli --- cgit.h | 1 + shared.c | 3 +++ ui-summary.c | 31 ++++++++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) (limited to 'ui-summary.c') diff --git a/cgit.h b/cgit.h index 53e1336..bb0e64c 100644 --- a/cgit.h +++ b/cgit.h @@ -144,6 +144,7 @@ extern int cgit_cache_static_ttl; extern int cgit_cache_max_create_time; extern int cgit_summary_log; extern int cgit_summary_tags; +extern int cgit_summary_branches; extern int cgit_max_msg_len; extern int cgit_max_repodesc_len; diff --git a/shared.c b/shared.c index 7e5eaba..ff600db 100644 --- a/shared.c +++ b/shared.c @@ -39,6 +39,7 @@ int cgit_cache_static_ttl = -1; int cgit_cache_max_create_time = 5; int cgit_summary_log = 0; int cgit_summary_tags = 0; +int cgit_summary_branches = 0; int cgit_renamelimit = -1; int cgit_max_msg_len = 60; @@ -182,6 +183,8 @@ void cgit_global_config_cb(const char *name, const char *value) cgit_max_commit_count = atoi(value); else if (!strcmp(name, "summary-log")) cgit_summary_log = atoi(value); + else if (!strcmp(name, "summary-branches")) + cgit_summary_branches = atoi(value); else if (!strcmp(name, "summary-tags")) cgit_summary_tags = atoi(value); else if (!strcmp(name, "agefile")) diff --git a/ui-summary.c b/ui-summary.c index 05170cc..df79d01 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -24,6 +24,22 @@ static int cmp_age(int age1, int age2) return -1; } +static int cmp_ref_name(const void *a, const void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + return strcmp(r1->refname, r2->refname); +} + +static int cmp_branch_age(const void *a, const void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + return cmp_age(r1->commit->committer_date, r2->commit->committer_date); +} + static int cmp_tag_age(const void *a, const void *b) { struct refinfo *r1 = *(struct refinfo **)a; @@ -150,7 +166,7 @@ static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1, return 0; } -static void cgit_print_branches() +static void cgit_print_branches(int maxcount) { struct reflist list; int i; @@ -163,7 +179,16 @@ static void cgit_print_branches() list.refs = NULL; list.alloc = list.count = 0; for_each_branch_ref(cgit_refs_cb, &list); - for(i=0; i list.count) + maxcount = list.count; + + if (maxcount < list.count) { + qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age); + qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name); + } + + for(i=0; i"); if (cgit_summary_log > 0) html(" "); - cgit_print_branches(); + cgit_print_branches(cgit_summary_branches); html(" "); cgit_print_tags(cgit_summary_tags); html(""); -- cgit v1.2.3-59-g8ed1b From 8efb05f98ad389d1b7f5aac17838401908622dad Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 27 Oct 2007 10:25:40 +0200 Subject: Make cgit_print_branches()/cgit_print_tags() external Signed-off-by: Lars Hjemli --- cgit.h | 2 ++ ui-summary.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'ui-summary.c') diff --git a/cgit.h b/cgit.h index bb0e64c..a1fe527 100644 --- a/cgit.h +++ b/cgit.h @@ -251,6 +251,8 @@ extern void cgit_print_pageheader(char *title, int show_search); extern void cgit_print_snapshot_start(const char *mimetype, const char *filename, struct cacheitem *item); +extern void cgit_print_branches(int maxcount); +extern void cgit_print_tags(int maxcount); extern void cgit_print_repolist(struct cacheitem *item); extern void cgit_print_summary(); diff --git a/ui-summary.c b/ui-summary.c index df79d01..97f1b57 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -166,7 +166,7 @@ static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1, return 0; } -static void cgit_print_branches(int maxcount) +void cgit_print_branches(int maxcount) { struct reflist list; int i; @@ -192,7 +192,7 @@ static void cgit_print_branches(int maxcount) cgit_print_branch(list.refs[i]); } -static void cgit_print_tags(int maxcount) +void cgit_print_tags(int maxcount) { struct reflist list; int i; -- cgit v1.2.3-59-g8ed1b From ac1f493b6bbc589327e9ba3303f112fcd323c6b6 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 27 Oct 2007 10:47:44 +0200 Subject: Add links to the new refs page from summary page If either branches or tags are filtered on the summary page, add a link to refs/heads and/or refs/tags right below the last branch/tag. Signed-off-by: Lars Hjemli --- cgit.h | 2 ++ ui-shared.c | 6 ++++++ ui-summary.c | 13 +++++++++++++ 3 files changed, 21 insertions(+) (limited to 'ui-summary.c') diff --git a/cgit.h b/cgit.h index d9a15f4..f8f0316 100644 --- a/cgit.h +++ b/cgit.h @@ -236,6 +236,8 @@ extern void cgit_log_link(char *name, char *title, char *class, char *head, char *rev, char *path, int ofs); extern void cgit_commit_link(char *name, char *title, char *class, char *head, char *rev); +extern void cgit_refs_link(char *name, char *title, char *class, char *head, + char *rev, char *path); extern void cgit_snapshot_link(char *name, char *title, char *class, char *head, char *rev, char *archivename); extern void cgit_diff_link(char *name, char *title, char *class, char *head, diff --git a/ui-shared.c b/ui-shared.c index 5c5bcf3..e4bb98f 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -227,6 +227,12 @@ void cgit_commit_link(char *name, char *title, char *class, char *head, reporevlink("commit", name, title, class, head, rev, NULL); } +void cgit_refs_link(char *name, char *title, char *class, char *head, + char *rev, char *path) +{ + reporevlink("refs", name, title, class, head, rev, path); +} + void cgit_snapshot_link(char *name, char *title, char *class, char *head, char *rev, char *archivename) { diff --git a/ui-summary.c b/ui-summary.c index 97f1b57..016fea2 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -166,6 +166,13 @@ static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1, return 0; } +static void print_refs_link(char *path) +{ + html(""); + cgit_refs_link("[...]", NULL, NULL, cgit_query_head, NULL, path); + html(""); +} + void cgit_print_branches(int maxcount) { struct reflist list; @@ -190,6 +197,9 @@ void cgit_print_branches(int maxcount) for(i=0; i