From e397ff7024293223f48f235fcf072fc526cae7af Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Thu, 25 Oct 2007 09:30:06 +0200 Subject: Add functions and types for ref lists This adds two structs, refinfo and reflist, and functions for building a list of refs. Signed-off-by: Lars Hjemli --- cgit.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'cgit.h') diff --git a/cgit.h b/cgit.h index e96311f..75e919b 100644 --- a/cgit.h +++ b/cgit.h @@ -98,6 +98,21 @@ struct taginfo { char *msg; }; +struct refinfo { + const char *refname; + struct object *object; + union { + struct taginfo *tag; + struct commitinfo *commit; + }; +}; + +struct reflist { + struct refinfo **refs; + int alloc; + int count; +}; + extern const char *cgit_version; extern struct repolist cgit_repolist; @@ -162,6 +177,10 @@ extern int chk_non_negative(int result, char *msg); extern int hextoint(char c); extern char *trim_end(const char *str, char c); +extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); +extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, + int flags, void *cb_data); + extern void *cgit_free_commitinfo(struct commitinfo *info); extern int cgit_diff_files(const unsigned char *old_sha1, -- cgit v1.2.3-70-g09d2 From fe211c7eef6c7d3e39486d6a7484d3b4debff88f Mon Sep 17 00:00:00 2001 From: Lars Hjemli 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 'cgit.h') 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-70-g09d2 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 'cgit.h') 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-70-g09d2 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 'cgit.h') 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-70-g09d2 From 7937d06090dd5e19145ec6fa8befc5770954b30c Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 27 Oct 2007 10:36:53 +0200 Subject: Add support for refs view This enables the new urls $repo/refs, $repo/refs/heads and $repo/refs/tags, which can be used to print _all_ branches and/or tags. Signed-off-by: Lars Hjemli --- Makefile | 2 +- cgit.c | 3 +++ cgit.h | 2 ++ shared.c | 2 +- ui-refs.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 ui-refs.c (limited to 'cgit.h') diff --git a/Makefile b/Makefile index 8e3da72..36b5ff6 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \ ui-summary.o ui-log.o ui-tree.o ui-commit.o ui-diff.o \ - ui-snapshot.o ui-blob.o ui-tag.o + ui-snapshot.o ui-blob.o ui-tag.o ui-refs.o .PHONY: all git install clean distclean force-version get-git diff --git a/cgit.c b/cgit.c index 1b85b15..cc18ed4 100644 --- a/cgit.c +++ b/cgit.c @@ -103,6 +103,9 @@ static void cgit_print_repo_page(struct cacheitem *item) case CMD_COMMIT: cgit_print_commit(cgit_query_sha1); break; + case CMD_REFS: + cgit_print_refs(); + break; case CMD_TAG: cgit_print_tag(cgit_query_sha1); break; diff --git a/cgit.h b/cgit.h index a1fe527..d9a15f4 100644 --- a/cgit.h +++ b/cgit.h @@ -28,6 +28,7 @@ #define CMD_BLOB 5 #define CMD_SNAPSHOT 6 #define CMD_TAG 7 +#define CMD_REFS 8 /* * Dateformats used on misc. pages @@ -260,6 +261,7 @@ extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char * extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path); extern void cgit_print_tree(const char *rev, char *path); extern void cgit_print_commit(char *hex); +extern void cgit_print_refs(); extern void cgit_print_tag(char *revname); extern void cgit_print_diff(const char *new_hex, const char *old_hex, const char *prefix); extern void cgit_print_snapshot(struct cacheitem *item, const char *head, diff --git a/shared.c b/shared.c index ff600db..7eb2b0e 100644 --- a/shared.c +++ b/shared.c @@ -66,7 +66,7 @@ int htmlfd = 0; int cgit_get_cmd_index(const char *cmd) { static char *cmds[] = {"log", "commit", "diff", "tree", "blob", - "snapshot", "tag", NULL}; + "snapshot", "tag", "refs", NULL}; int i; for(i = 0; cmds[i]; i++) diff --git a/ui-refs.c b/ui-refs.c new file mode 100644 index 0000000..295f5ba --- /dev/null +++ b/ui-refs.c @@ -0,0 +1,30 @@ +/* ui-refs.c: browse symbolic refs + * + * Copyright (C) 2006 Lars Hjemli + * + * Licensed under GNU General Public License v2 + * (see COPYING for full license text) + */ + +#include "cgit.h" + + + + +void cgit_print_refs() +{ + + html(""); + + if (cgit_query_path && !strncmp(cgit_query_path, "heads", 5)) + cgit_print_branches(0); + else if (cgit_query_path && !strncmp(cgit_query_path, "tags", 4)) + cgit_print_tags(0); + else { + cgit_print_branches(0); + html(""); + cgit_print_tags(0); + } + + html("
 
"); +} -- cgit v1.2.3-70-g09d2 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 'cgit.h') 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