summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2007-05-20 20:13:17 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-20 20:13:17 (UTC)
commit271ac5a7e6b5b67f54fdd16e8542aa282f1c7140 (patch) (unidiff)
treed93a0bce06fca8db57ed1a98aa5e2e45199af845
parentdc3ac3f76077c5d612d42e8beb4878e43acfc58a (diff)
parent7b39144a541ab5be8bcd2748a5be89389bee7192 (diff)
downloadcgit-271ac5a7e6b5b67f54fdd16e8542aa282f1c7140.zip
cgit-271ac5a7e6b5b67f54fdd16e8542aa282f1c7140.tar.gz
cgit-271ac5a7e6b5b67f54fdd16e8542aa282f1c7140.tar.bz2
Merge branch 'repogroups'
* repogroups: Adjust apperance of repogroup headers Don't highlight repogroup headings Teach cgit how to group repositories by category
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.css5
-rw-r--r--cgit.h2
-rw-r--r--shared.c4
-rw-r--r--ui-repolist.c10
4 files changed, 21 insertions, 0 deletions
diff --git a/cgit.css b/cgit.css
index 6c7f9c3..5dd43b0 100644
--- a/cgit.css
+++ b/cgit.css
@@ -332,24 +332,29 @@ table.diff td div.head {
332table.diff td div.hunk { 332table.diff td div.hunk {
333 color: #009; 333 color: #009;
334} 334}
335 335
336table.diff td div.add { 336table.diff td div.add {
337 color: green; 337 color: green;
338} 338}
339 339
340table.diff td div.del { 340table.diff td div.del {
341 color: red; 341 color: red;
342} 342}
343 343
344.sha1 { 344.sha1 {
345 font-family: courier; 345 font-family: courier;
346 font-size: 90%; 346 font-size: 90%;
347} 347}
348 348
349.left { 349.left {
350 text-align: left; 350 text-align: left;
351} 351}
352 352
353.right { 353.right {
354 text-align: right; 354 text-align: right;
355} 355}
356
357table.list td.repogroup {
358 padding-top: 1em;
359 border-bottom: solid 1px #777;
360}
diff --git a/cgit.h b/cgit.h
index e0879bd..8927236 100644
--- a/cgit.h
+++ b/cgit.h
@@ -26,94 +26,96 @@
26#define CMD_DIFF 3 26#define CMD_DIFF 3
27#define CMD_TREE 4 27#define CMD_TREE 4
28#define CMD_VIEW 5 28#define CMD_VIEW 5
29#define CMD_BLOB 6 29#define CMD_BLOB 6
30#define CMD_SNAPSHOT 7 30#define CMD_SNAPSHOT 7
31 31
32typedef void (*configfn)(const char *name, const char *value); 32typedef void (*configfn)(const char *name, const char *value);
33typedef void (*filepair_fn)(struct diff_filepair *pair); 33typedef void (*filepair_fn)(struct diff_filepair *pair);
34typedef void (*linediff_fn)(char *line, int len); 34typedef void (*linediff_fn)(char *line, int len);
35 35
36struct cacheitem { 36struct cacheitem {
37 char *name; 37 char *name;
38 struct stat st; 38 struct stat st;
39 int ttl; 39 int ttl;
40 int fd; 40 int fd;
41}; 41};
42 42
43struct repoinfo { 43struct repoinfo {
44 char *url; 44 char *url;
45 char *name; 45 char *name;
46 char *path; 46 char *path;
47 char *desc; 47 char *desc;
48 char *owner; 48 char *owner;
49 char *defbranch; 49 char *defbranch;
50 char *group;
50 char *module_link; 51 char *module_link;
51 int snapshots; 52 int snapshots;
52 int enable_log_filecount; 53 int enable_log_filecount;
53 int enable_log_linecount; 54 int enable_log_linecount;
54}; 55};
55 56
56struct repolist { 57struct repolist {
57 int length; 58 int length;
58 int count; 59 int count;
59 struct repoinfo *repos; 60 struct repoinfo *repos;
60}; 61};
61 62
62struct commitinfo { 63struct commitinfo {
63 struct commit *commit; 64 struct commit *commit;
64 char *author; 65 char *author;
65 char *author_email; 66 char *author_email;
66 unsigned long author_date; 67 unsigned long author_date;
67 char *committer; 68 char *committer;
68 char *committer_email; 69 char *committer_email;
69 unsigned long committer_date; 70 unsigned long committer_date;
70 char *subject; 71 char *subject;
71 char *msg; 72 char *msg;
72}; 73};
73 74
74struct taginfo { 75struct taginfo {
75 char *tagger; 76 char *tagger;
76 char *tagger_email; 77 char *tagger_email;
77 int tagger_date; 78 int tagger_date;
78 char *msg; 79 char *msg;
79}; 80};
80 81
81extern const char cgit_version[]; 82extern const char cgit_version[];
82 83
83extern struct repolist cgit_repolist; 84extern struct repolist cgit_repolist;
84extern struct repoinfo *cgit_repo; 85extern struct repoinfo *cgit_repo;
85extern int cgit_cmd; 86extern int cgit_cmd;
86 87
87extern char *cgit_root_title; 88extern char *cgit_root_title;
88extern char *cgit_css; 89extern char *cgit_css;
89extern char *cgit_logo; 90extern char *cgit_logo;
90extern char *cgit_index_header; 91extern char *cgit_index_header;
91extern char *cgit_logo_link; 92extern char *cgit_logo_link;
92extern char *cgit_module_link; 93extern char *cgit_module_link;
93extern char *cgit_virtual_root; 94extern char *cgit_virtual_root;
94extern char *cgit_script_name; 95extern char *cgit_script_name;
95extern char *cgit_cache_root; 96extern char *cgit_cache_root;
97extern char *cgit_repo_group;
96 98
97extern int cgit_nocache; 99extern int cgit_nocache;
98extern int cgit_snapshots; 100extern int cgit_snapshots;
99extern int cgit_enable_log_filecount; 101extern int cgit_enable_log_filecount;
100extern int cgit_enable_log_linecount; 102extern int cgit_enable_log_linecount;
101extern int cgit_max_lock_attempts; 103extern int cgit_max_lock_attempts;
102extern int cgit_cache_root_ttl; 104extern int cgit_cache_root_ttl;
103extern int cgit_cache_repo_ttl; 105extern int cgit_cache_repo_ttl;
104extern int cgit_cache_dynamic_ttl; 106extern int cgit_cache_dynamic_ttl;
105extern int cgit_cache_static_ttl; 107extern int cgit_cache_static_ttl;
106extern int cgit_cache_max_create_time; 108extern int cgit_cache_max_create_time;
107 109
108extern int cgit_max_msg_len; 110extern int cgit_max_msg_len;
109extern int cgit_max_repodesc_len; 111extern int cgit_max_repodesc_len;
110extern int cgit_max_commit_count; 112extern int cgit_max_commit_count;
111 113
112extern int cgit_query_has_symref; 114extern int cgit_query_has_symref;
113extern int cgit_query_has_sha1; 115extern int cgit_query_has_sha1;
114 116
115extern char *cgit_querystring; 117extern char *cgit_querystring;
116extern char *cgit_query_repo; 118extern char *cgit_query_repo;
117extern char *cgit_query_page; 119extern char *cgit_query_page;
118extern char *cgit_query_search; 120extern char *cgit_query_search;
119extern char *cgit_query_head; 121extern char *cgit_query_head;
diff --git a/shared.c b/shared.c
index 45fde7f..65af11a 100644
--- a/shared.c
+++ b/shared.c
@@ -1,47 +1,48 @@
1/* shared.c: global vars + some callback functions 1/* shared.c: global vars + some callback functions
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11struct repolist cgit_repolist; 11struct repolist cgit_repolist;
12struct repoinfo *cgit_repo; 12struct repoinfo *cgit_repo;
13int cgit_cmd; 13int cgit_cmd;
14 14
15char *cgit_root_title = "Git repository browser"; 15char *cgit_root_title = "Git repository browser";
16char *cgit_css = "/cgit.css"; 16char *cgit_css = "/cgit.css";
17char *cgit_logo = "/git-logo.png"; 17char *cgit_logo = "/git-logo.png";
18char *cgit_index_header = NULL; 18char *cgit_index_header = NULL;
19char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/"; 19char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/";
20char *cgit_module_link = "./?repo=%s&page=commit&id=%s"; 20char *cgit_module_link = "./?repo=%s&page=commit&id=%s";
21char *cgit_virtual_root = NULL; 21char *cgit_virtual_root = NULL;
22char *cgit_script_name = CGIT_SCRIPT_NAME; 22char *cgit_script_name = CGIT_SCRIPT_NAME;
23char *cgit_cache_root = "/var/cache/cgit"; 23char *cgit_cache_root = "/var/cache/cgit";
24char *cgit_repo_group = NULL;
24 25
25int cgit_nocache = 0; 26int cgit_nocache = 0;
26int cgit_snapshots = 0; 27int cgit_snapshots = 0;
27int cgit_enable_log_filecount = 0; 28int cgit_enable_log_filecount = 0;
28int cgit_enable_log_linecount = 0; 29int cgit_enable_log_linecount = 0;
29int cgit_max_lock_attempts = 5; 30int cgit_max_lock_attempts = 5;
30int cgit_cache_root_ttl = 5; 31int cgit_cache_root_ttl = 5;
31int cgit_cache_repo_ttl = 5; 32int cgit_cache_repo_ttl = 5;
32int cgit_cache_dynamic_ttl = 5; 33int cgit_cache_dynamic_ttl = 5;
33int cgit_cache_static_ttl = -1; 34int cgit_cache_static_ttl = -1;
34int cgit_cache_max_create_time = 5; 35int cgit_cache_max_create_time = 5;
35 36
36int cgit_max_msg_len = 60; 37int cgit_max_msg_len = 60;
37int cgit_max_repodesc_len = 60; 38int cgit_max_repodesc_len = 60;
38int cgit_max_commit_count = 50; 39int cgit_max_commit_count = 50;
39 40
40int cgit_query_has_symref = 0; 41int cgit_query_has_symref = 0;
41int cgit_query_has_sha1 = 0; 42int cgit_query_has_sha1 = 0;
42 43
43char *cgit_querystring = NULL; 44char *cgit_querystring = NULL;
44char *cgit_query_repo = NULL; 45char *cgit_query_repo = NULL;
45char *cgit_query_page = NULL; 46char *cgit_query_page = NULL;
46char *cgit_query_head = NULL; 47char *cgit_query_head = NULL;
47char *cgit_query_search = NULL; 48char *cgit_query_search = NULL;
@@ -78,48 +79,49 @@ int chk_positive(int result, char *msg)
78 die("%s: %s", msg, strerror(errno)); 79 die("%s: %s", msg, strerror(errno));
79 return result; 80 return result;
80} 81}
81 82
82struct repoinfo *add_repo(const char *url) 83struct repoinfo *add_repo(const char *url)
83{ 84{
84 struct repoinfo *ret; 85 struct repoinfo *ret;
85 86
86 if (++cgit_repolist.count > cgit_repolist.length) { 87 if (++cgit_repolist.count > cgit_repolist.length) {
87 if (cgit_repolist.length == 0) 88 if (cgit_repolist.length == 0)
88 cgit_repolist.length = 8; 89 cgit_repolist.length = 8;
89 else 90 else
90 cgit_repolist.length *= 2; 91 cgit_repolist.length *= 2;
91 cgit_repolist.repos = xrealloc(cgit_repolist.repos, 92 cgit_repolist.repos = xrealloc(cgit_repolist.repos,
92 cgit_repolist.length * 93 cgit_repolist.length *
93 sizeof(struct repoinfo)); 94 sizeof(struct repoinfo));
94 } 95 }
95 96
96 ret = &cgit_repolist.repos[cgit_repolist.count-1]; 97 ret = &cgit_repolist.repos[cgit_repolist.count-1];
97 ret->url = xstrdup(url); 98 ret->url = xstrdup(url);
98 ret->name = ret->url; 99 ret->name = ret->url;
99 ret->path = NULL; 100 ret->path = NULL;
100 ret->desc = NULL; 101 ret->desc = NULL;
101 ret->owner = NULL; 102 ret->owner = NULL;
103 ret->group = cgit_repo_group;
102 ret->defbranch = "master"; 104 ret->defbranch = "master";
103 ret->snapshots = cgit_snapshots; 105 ret->snapshots = cgit_snapshots;
104 ret->enable_log_filecount = cgit_enable_log_filecount; 106 ret->enable_log_filecount = cgit_enable_log_filecount;
105 ret->enable_log_linecount = cgit_enable_log_linecount; 107 ret->enable_log_linecount = cgit_enable_log_linecount;
106 ret->module_link = cgit_module_link; 108 ret->module_link = cgit_module_link;
107 return ret; 109 return ret;
108} 110}
109 111
110struct repoinfo *cgit_get_repoinfo(const char *url) 112struct repoinfo *cgit_get_repoinfo(const char *url)
111{ 113{
112 int i; 114 int i;
113 struct repoinfo *repo; 115 struct repoinfo *repo;
114 116
115 for (i=0; i<cgit_repolist.count; i++) { 117 for (i=0; i<cgit_repolist.count; i++) {
116 repo = &cgit_repolist.repos[i]; 118 repo = &cgit_repolist.repos[i];
117 if (!strcmp(repo->url, url)) 119 if (!strcmp(repo->url, url))
118 return repo; 120 return repo;
119 } 121 }
120 return NULL; 122 return NULL;
121} 123}
122 124
123void cgit_global_config_cb(const char *name, const char *value) 125void cgit_global_config_cb(const char *name, const char *value)
124{ 126{
125 if (!strcmp(name, "root-title")) 127 if (!strcmp(name, "root-title"))
@@ -139,48 +141,50 @@ void cgit_global_config_cb(const char *name, const char *value)
139 else if (!strcmp(name, "nocache")) 141 else if (!strcmp(name, "nocache"))
140 cgit_nocache = atoi(value); 142 cgit_nocache = atoi(value);
141 else if (!strcmp(name, "snapshots")) 143 else if (!strcmp(name, "snapshots"))
142 cgit_snapshots = atoi(value); 144 cgit_snapshots = atoi(value);
143 else if (!strcmp(name, "enable-log-filecount")) 145 else if (!strcmp(name, "enable-log-filecount"))
144 cgit_enable_log_filecount = atoi(value); 146 cgit_enable_log_filecount = atoi(value);
145 else if (!strcmp(name, "enable-log-linecount")) 147 else if (!strcmp(name, "enable-log-linecount"))
146 cgit_enable_log_linecount = atoi(value); 148 cgit_enable_log_linecount = atoi(value);
147 else if (!strcmp(name, "cache-root")) 149 else if (!strcmp(name, "cache-root"))
148 cgit_cache_root = xstrdup(value); 150 cgit_cache_root = xstrdup(value);
149 else if (!strcmp(name, "cache-root-ttl")) 151 else if (!strcmp(name, "cache-root-ttl"))
150 cgit_cache_root_ttl = atoi(value); 152 cgit_cache_root_ttl = atoi(value);
151 else if (!strcmp(name, "cache-repo-ttl")) 153 else if (!strcmp(name, "cache-repo-ttl"))
152 cgit_cache_repo_ttl = atoi(value); 154 cgit_cache_repo_ttl = atoi(value);
153 else if (!strcmp(name, "cache-static-ttl")) 155 else if (!strcmp(name, "cache-static-ttl"))
154 cgit_cache_static_ttl = atoi(value); 156 cgit_cache_static_ttl = atoi(value);
155 else if (!strcmp(name, "cache-dynamic-ttl")) 157 else if (!strcmp(name, "cache-dynamic-ttl"))
156 cgit_cache_dynamic_ttl = atoi(value); 158 cgit_cache_dynamic_ttl = atoi(value);
157 else if (!strcmp(name, "max-message-length")) 159 else if (!strcmp(name, "max-message-length"))
158 cgit_max_msg_len = atoi(value); 160 cgit_max_msg_len = atoi(value);
159 else if (!strcmp(name, "max-repodesc-length")) 161 else if (!strcmp(name, "max-repodesc-length"))
160 cgit_max_repodesc_len = atoi(value); 162 cgit_max_repodesc_len = atoi(value);
161 else if (!strcmp(name, "max-commit-count")) 163 else if (!strcmp(name, "max-commit-count"))
162 cgit_max_commit_count = atoi(value); 164 cgit_max_commit_count = atoi(value);
165 else if (!strcmp(name, "repo.group"))
166 cgit_repo_group = xstrdup(value);
163 else if (!strcmp(name, "repo.url")) 167 else if (!strcmp(name, "repo.url"))
164 cgit_repo = add_repo(value); 168 cgit_repo = add_repo(value);
165 else if (!strcmp(name, "repo.name")) 169 else if (!strcmp(name, "repo.name"))
166 cgit_repo->name = xstrdup(value); 170 cgit_repo->name = xstrdup(value);
167 else if (cgit_repo && !strcmp(name, "repo.path")) 171 else if (cgit_repo && !strcmp(name, "repo.path"))
168 cgit_repo->path = xstrdup(value); 172 cgit_repo->path = xstrdup(value);
169 else if (cgit_repo && !strcmp(name, "repo.desc")) 173 else if (cgit_repo && !strcmp(name, "repo.desc"))
170 cgit_repo->desc = xstrdup(value); 174 cgit_repo->desc = xstrdup(value);
171 else if (cgit_repo && !strcmp(name, "repo.owner")) 175 else if (cgit_repo && !strcmp(name, "repo.owner"))
172 cgit_repo->owner = xstrdup(value); 176 cgit_repo->owner = xstrdup(value);
173 else if (cgit_repo && !strcmp(name, "repo.defbranch")) 177 else if (cgit_repo && !strcmp(name, "repo.defbranch"))
174 cgit_repo->defbranch = xstrdup(value); 178 cgit_repo->defbranch = xstrdup(value);
175 else if (cgit_repo && !strcmp(name, "repo.snapshots")) 179 else if (cgit_repo && !strcmp(name, "repo.snapshots"))
176 cgit_repo->snapshots = cgit_snapshots * atoi(value); 180 cgit_repo->snapshots = cgit_snapshots * atoi(value);
177 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount")) 181 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
178 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value); 182 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
179 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount")) 183 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
180 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value); 184 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value);
181 else if (cgit_repo && !strcmp(name, "repo.module-link")) 185 else if (cgit_repo && !strcmp(name, "repo.module-link"))
182 cgit_repo->module_link= xstrdup(value); 186 cgit_repo->module_link= xstrdup(value);
183 else if (!strcmp(name, "include")) 187 else if (!strcmp(name, "include"))
184 cgit_read_config(value, cgit_global_config_cb); 188 cgit_read_config(value, cgit_global_config_cb);
185} 189}
186 190
diff --git a/ui-repolist.c b/ui-repolist.c
index 8e367a2..33e3e7f 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -1,56 +1,66 @@
1/* ui-repolist.c: functions for generating the repolist page 1/* ui-repolist.c: functions for generating the repolist page
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11void cgit_print_repolist(struct cacheitem *item) 11void cgit_print_repolist(struct cacheitem *item)
12{ 12{
13 struct repoinfo *repo; 13 struct repoinfo *repo;
14 int i; 14 int i;
15 char *last_group = NULL;
15 16
16 cgit_print_docstart(cgit_root_title, item); 17 cgit_print_docstart(cgit_root_title, item);
17 cgit_print_pageheader(cgit_root_title, 0); 18 cgit_print_pageheader(cgit_root_title, 0);
18 19
19 html("<table class='list nowrap'>"); 20 html("<table class='list nowrap'>");
20 if (cgit_index_header) { 21 if (cgit_index_header) {
21 html("<tr class='nohover'><td colspan='4' class='include-block'>"); 22 html("<tr class='nohover'><td colspan='4' class='include-block'>");
22 html_include(cgit_index_header); 23 html_include(cgit_index_header);
23 html("</td></tr>"); 24 html("</td></tr>");
24 } 25 }
25 html("<tr class='nohover'>" 26 html("<tr class='nohover'>"
26 "<th class='left'>Name</th>" 27 "<th class='left'>Name</th>"
27 "<th class='left'>Description</th>" 28 "<th class='left'>Description</th>"
28 "<th class='left'>Owner</th>" 29 "<th class='left'>Owner</th>"
29 "<th class='left'>Links</th></tr>\n"); 30 "<th class='left'>Links</th></tr>\n");
30 31
31 for (i=0; i<cgit_repolist.count; i++) { 32 for (i=0; i<cgit_repolist.count; i++) {
32 repo = &cgit_repolist.repos[i]; 33 repo = &cgit_repolist.repos[i];
34 if ((last_group == NULL && repo->group != NULL) ||
35 (last_group != NULL && repo->group == NULL) ||
36 (last_group != NULL && repo->group!= NULL &&
37 strcmp(repo->group, last_group))) {
38 html("<tr class='nohover'><td colspan='4' class='repogroup'>");
39 html_txt(repo->group);
40 html("</td></tr>");
41 last_group = repo->group;
42 }
33 html("<tr><td>"); 43 html("<tr><td>");
34 html_link_open(cgit_repourl(repo->url), NULL, NULL); 44 html_link_open(cgit_repourl(repo->url), NULL, NULL);
35 html_txt(repo->name); 45 html_txt(repo->name);
36 html_link_close(); 46 html_link_close();
37 html("</td><td>"); 47 html("</td><td>");
38 html_ntxt(cgit_max_repodesc_len, repo->desc); 48 html_ntxt(cgit_max_repodesc_len, repo->desc);
39 html("</td><td>"); 49 html("</td><td>");
40 html_txt(repo->owner); 50 html_txt(repo->owner);
41 html("</td><td>"); 51 html("</td><td>");
42 html_link_open(cgit_pageurl(repo->name, "commit", NULL), 52 html_link_open(cgit_pageurl(repo->name, "commit", NULL),
43 "Commit: display last commit", NULL); 53 "Commit: display last commit", NULL);
44 html("C</a> "); 54 html("C</a> ");
45 html_link_open(cgit_pageurl(repo->name, "diff", NULL), 55 html_link_open(cgit_pageurl(repo->name, "diff", NULL),
46 "Diff: see changes introduced by last commit", NULL); 56 "Diff: see changes introduced by last commit", NULL);
47 html("D</a> "); 57 html("D</a> ");
48 html_link_open(cgit_pageurl(repo->name, "log", NULL), 58 html_link_open(cgit_pageurl(repo->name, "log", NULL),
49 "Log: show history of the main branch", NULL); 59 "Log: show history of the main branch", NULL);
50 html("L</a> "); 60 html("L</a> ");
51 html_link_open(cgit_pageurl(repo->name, "tree", NULL), 61 html_link_open(cgit_pageurl(repo->name, "tree", NULL),
52 "Tree: browse the files in the main branch", NULL); 62 "Tree: browse the files in the main branch", NULL);
53 html("T</a>"); 63 html("T</a>");
54 html("</td></tr>\n"); 64 html("</td></tr>\n");
55 } 65 }
56 html("</table>"); 66 html("</table>");