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 --- ui-summary.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'ui-summary.c') 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-24-g4f1b 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-24-g4f1b 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 --- ui-summary.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'ui-summary.c') 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-24-g4f1b 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 --- ui-summary.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ui-summary.c') 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-24-g4f1b 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 --- ui-summary.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'ui-summary.c') 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