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
@@ -260,96 +260,101 @@ table.diffstat th {
260 font-size: 100%; 260 font-size: 100%;
261} 261}
262 262
263table.diffstat td { 263table.diffstat td {
264 padding: 0.2em 0.2em 0.1em 0.1em; 264 padding: 0.2em 0.2em 0.1em 0.1em;
265 font-size: 100%; 265 font-size: 100%;
266 border: none; 266 border: none;
267} 267}
268 268
269table.diffstat td.mode { 269table.diffstat td.mode {
270 white-space: nowrap; 270 white-space: nowrap;
271} 271}
272 272
273table.diffstat td span.modechange { 273table.diffstat td span.modechange {
274 padding-left: 1em; 274 padding-left: 1em;
275 color: red; 275 color: red;
276} 276}
277 277
278table.diffstat td.add a { 278table.diffstat td.add a {
279 color: green; 279 color: green;
280} 280}
281 281
282table.diffstat td.del a { 282table.diffstat td.del a {
283 color: red; 283 color: red;
284} 284}
285 285
286table.diffstat td.upd a { 286table.diffstat td.upd a {
287 color: blue; 287 color: blue;
288} 288}
289 289
290table.diffstat td.graph { 290table.diffstat td.graph {
291 width: 75%; 291 width: 75%;
292 vertical-align: center; 292 vertical-align: center;
293} 293}
294 294
295table.diffstat td.graph table { 295table.diffstat td.graph table {
296 border: none; 296 border: none;
297} 297}
298 298
299table.diffstat td.graph td { 299table.diffstat td.graph td {
300 padding: 0px; 300 padding: 0px;
301 border: 0px; 301 border: 0px;
302 height: 7pt; 302 height: 7pt;
303} 303}
304 304
305table.diffstat td.graph td.add { 305table.diffstat td.graph td.add {
306 background-color: #5c5; 306 background-color: #5c5;
307} 307}
308 308
309table.diffstat td.graph td.rem { 309table.diffstat td.graph td.rem {
310 background-color: #c55; 310 background-color: #c55;
311} 311}
312 312
313table.diffstat td.graph td.none { 313table.diffstat td.graph td.none {
314 background-color: none; 314 background-color: none;
315} 315}
316 316
317div.diffstat-summary { 317div.diffstat-summary {
318 color: #888; 318 color: #888;
319 padding-top: 0.5em; 319 padding-top: 0.5em;
320} 320}
321 321
322table.diff td { 322table.diff td {
323 font-family: monospace; 323 font-family: monospace;
324 white-space: pre; 324 white-space: pre;
325} 325}
326 326
327table.diff td div.head { 327table.diff td div.head {
328 font-weight: bold; 328 font-weight: bold;
329 padding-top: 1em; 329 padding-top: 1em;
330} 330}
331 331
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
@@ -1,191 +1,193 @@
1#ifndef CGIT_H 1#ifndef CGIT_H
2#define CGIT_H 2#define CGIT_H
3 3
4 4
5#include <git-compat-util.h> 5#include <git-compat-util.h>
6#include <cache.h> 6#include <cache.h>
7#include <grep.h> 7#include <grep.h>
8#include <object.h> 8#include <object.h>
9#include <tree.h> 9#include <tree.h>
10#include <commit.h> 10#include <commit.h>
11#include <tag.h> 11#include <tag.h>
12#include <diff.h> 12#include <diff.h>
13#include <diffcore.h> 13#include <diffcore.h>
14#include <refs.h> 14#include <refs.h>
15#include <revision.h> 15#include <revision.h>
16#include <log-tree.h> 16#include <log-tree.h>
17#include <archive.h> 17#include <archive.h>
18#include <xdiff/xdiff.h> 18#include <xdiff/xdiff.h>
19 19
20 20
21/* 21/*
22 * The valid cgit repo-commands 22 * The valid cgit repo-commands
23 */ 23 */
24#define CMD_LOG 1 24#define CMD_LOG 1
25#define CMD_COMMIT 2 25#define CMD_COMMIT 2
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;
120extern char *cgit_query_sha1; 122extern char *cgit_query_sha1;
121extern char *cgit_query_sha2; 123extern char *cgit_query_sha2;
122extern char *cgit_query_path; 124extern char *cgit_query_path;
123extern char *cgit_query_name; 125extern char *cgit_query_name;
124extern int cgit_query_ofs; 126extern int cgit_query_ofs;
125 127
126extern int htmlfd; 128extern int htmlfd;
127 129
128extern int cgit_get_cmd_index(const char *cmd); 130extern int cgit_get_cmd_index(const char *cmd);
129extern struct repoinfo *cgit_get_repoinfo(const char *url); 131extern struct repoinfo *cgit_get_repoinfo(const char *url);
130extern void cgit_global_config_cb(const char *name, const char *value); 132extern void cgit_global_config_cb(const char *name, const char *value);
131extern void cgit_repo_config_cb(const char *name, const char *value); 133extern void cgit_repo_config_cb(const char *name, const char *value);
132extern void cgit_querystring_cb(const char *name, const char *value); 134extern void cgit_querystring_cb(const char *name, const char *value);
133 135
134extern int chk_zero(int result, char *msg); 136extern int chk_zero(int result, char *msg);
135extern int chk_positive(int result, char *msg); 137extern int chk_positive(int result, char *msg);
136 138
137extern int hextoint(char c); 139extern int hextoint(char c);
138 140
139extern void *cgit_free_commitinfo(struct commitinfo *info); 141extern void *cgit_free_commitinfo(struct commitinfo *info);
140 142
141extern int cgit_diff_files(const unsigned char *old_sha1, 143extern int cgit_diff_files(const unsigned char *old_sha1,
142 const unsigned char *new_sha1, 144 const unsigned char *new_sha1,
143 linediff_fn fn); 145 linediff_fn fn);
144 146
145extern void cgit_diff_tree(const unsigned char *old_sha1, 147extern void cgit_diff_tree(const unsigned char *old_sha1,
146 const unsigned char *new_sha1, 148 const unsigned char *new_sha1,
147 filepair_fn fn); 149 filepair_fn fn);
148 150
149extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 151extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
150 152
151extern char *fmt(const char *format,...); 153extern char *fmt(const char *format,...);
152 154
153extern void html(const char *txt); 155extern void html(const char *txt);
154extern void htmlf(const char *format,...); 156extern void htmlf(const char *format,...);
155extern void html_txt(char *txt); 157extern void html_txt(char *txt);
156extern void html_ntxt(int len, char *txt); 158extern void html_ntxt(int len, char *txt);
157extern void html_attr(char *txt); 159extern void html_attr(char *txt);
158extern void html_hidden(char *name, char *value); 160extern void html_hidden(char *name, char *value);
159extern void html_link_open(char *url, char *title, char *class); 161extern void html_link_open(char *url, char *title, char *class);
160extern void html_link_close(void); 162extern void html_link_close(void);
161extern void html_filemode(unsigned short mode); 163extern void html_filemode(unsigned short mode);
162extern int html_include(const char *filename); 164extern int html_include(const char *filename);
163 165
164extern int cgit_read_config(const char *filename, configfn fn); 166extern int cgit_read_config(const char *filename, configfn fn);
165extern int cgit_parse_query(char *txt, configfn fn); 167extern int cgit_parse_query(char *txt, configfn fn);
166extern struct commitinfo *cgit_parse_commit(struct commit *commit); 168extern struct commitinfo *cgit_parse_commit(struct commit *commit);
167extern struct taginfo *cgit_parse_tag(struct tag *tag); 169extern struct taginfo *cgit_parse_tag(struct tag *tag);
168extern void cgit_parse_url(const char *url); 170extern void cgit_parse_url(const char *url);
169 171
170extern char *cache_safe_filename(const char *unsafe); 172extern char *cache_safe_filename(const char *unsafe);
171extern int cache_lock(struct cacheitem *item); 173extern int cache_lock(struct cacheitem *item);
172extern int cache_unlock(struct cacheitem *item); 174extern int cache_unlock(struct cacheitem *item);
173extern int cache_cancel_lock(struct cacheitem *item); 175extern int cache_cancel_lock(struct cacheitem *item);
174extern int cache_exist(struct cacheitem *item); 176extern int cache_exist(struct cacheitem *item);
175extern int cache_expired(struct cacheitem *item); 177extern int cache_expired(struct cacheitem *item);
176 178
177extern char *cgit_repourl(const char *reponame); 179extern char *cgit_repourl(const char *reponame);
178extern char *cgit_pageurl(const char *reponame, const char *pagename, 180extern char *cgit_pageurl(const char *reponame, const char *pagename,
179 const char *query); 181 const char *query);
180 182
181extern void cgit_print_error(char *msg); 183extern void cgit_print_error(char *msg);
182extern void cgit_print_date(unsigned long secs); 184extern void cgit_print_date(unsigned long secs);
183extern void cgit_print_docstart(char *title, struct cacheitem *item); 185extern void cgit_print_docstart(char *title, struct cacheitem *item);
184extern void cgit_print_docend(); 186extern void cgit_print_docend();
185extern void cgit_print_pageheader(char *title, int show_search); 187extern void cgit_print_pageheader(char *title, int show_search);
186extern void cgit_print_snapshot_start(const char *mimetype, 188extern void cgit_print_snapshot_start(const char *mimetype,
187 const char *filename, 189 const char *filename,
188 struct cacheitem *item); 190 struct cacheitem *item);
189 191
190extern void cgit_print_repolist(struct cacheitem *item); 192extern void cgit_print_repolist(struct cacheitem *item);
191extern void cgit_print_summary(); 193extern void cgit_print_summary();
diff --git a/shared.c b/shared.c
index 45fde7f..65af11a 100644
--- a/shared.c
+++ b/shared.c
@@ -1,258 +1,262 @@
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;
48char *cgit_query_sha1 = NULL; 49char *cgit_query_sha1 = NULL;
49char *cgit_query_sha2 = NULL; 50char *cgit_query_sha2 = NULL;
50char *cgit_query_path = NULL; 51char *cgit_query_path = NULL;
51char *cgit_query_name = NULL; 52char *cgit_query_name = NULL;
52int cgit_query_ofs = 0; 53int cgit_query_ofs = 0;
53 54
54int htmlfd = 0; 55int htmlfd = 0;
55 56
56 57
57int cgit_get_cmd_index(const char *cmd) 58int cgit_get_cmd_index(const char *cmd)
58{ 59{
59 static char *cmds[] = {"log", "commit", "diff", "tree", "view", "blob", "snapshot", NULL}; 60 static char *cmds[] = {"log", "commit", "diff", "tree", "view", "blob", "snapshot", NULL};
60 int i; 61 int i;
61 62
62 for(i = 0; cmds[i]; i++) 63 for(i = 0; cmds[i]; i++)
63 if (!strcmp(cmd, cmds[i])) 64 if (!strcmp(cmd, cmds[i]))
64 return i + 1; 65 return i + 1;
65 return 0; 66 return 0;
66} 67}
67 68
68int chk_zero(int result, char *msg) 69int chk_zero(int result, char *msg)
69{ 70{
70 if (result != 0) 71 if (result != 0)
71 die("%s: %s", msg, strerror(errno)); 72 die("%s: %s", msg, strerror(errno));
72 return result; 73 return result;
73} 74}
74 75
75int chk_positive(int result, char *msg) 76int chk_positive(int result, char *msg)
76{ 77{
77 if (result <= 0) 78 if (result <= 0)
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"))
126 cgit_root_title = xstrdup(value); 128 cgit_root_title = xstrdup(value);
127 else if (!strcmp(name, "css")) 129 else if (!strcmp(name, "css"))
128 cgit_css = xstrdup(value); 130 cgit_css = xstrdup(value);
129 else if (!strcmp(name, "logo")) 131 else if (!strcmp(name, "logo"))
130 cgit_logo = xstrdup(value); 132 cgit_logo = xstrdup(value);
131 else if (!strcmp(name, "index-header")) 133 else if (!strcmp(name, "index-header"))
132 cgit_index_header = xstrdup(value); 134 cgit_index_header = xstrdup(value);
133 else if (!strcmp(name, "logo-link")) 135 else if (!strcmp(name, "logo-link"))
134 cgit_logo_link = xstrdup(value); 136 cgit_logo_link = xstrdup(value);
135 else if (!strcmp(name, "module-link")) 137 else if (!strcmp(name, "module-link"))
136 cgit_module_link = xstrdup(value); 138 cgit_module_link = xstrdup(value);
137 else if (!strcmp(name, "virtual-root")) 139 else if (!strcmp(name, "virtual-root"))
138 cgit_virtual_root = xstrdup(value); 140 cgit_virtual_root = xstrdup(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
187void cgit_querystring_cb(const char *name, const char *value) 191void cgit_querystring_cb(const char *name, const char *value)
188{ 192{
189 if (!strcmp(name,"r")) { 193 if (!strcmp(name,"r")) {
190 cgit_query_repo = xstrdup(value); 194 cgit_query_repo = xstrdup(value);
191 cgit_repo = cgit_get_repoinfo(value); 195 cgit_repo = cgit_get_repoinfo(value);
192 } else if (!strcmp(name, "p")) { 196 } else if (!strcmp(name, "p")) {
193 cgit_query_page = xstrdup(value); 197 cgit_query_page = xstrdup(value);
194 cgit_cmd = cgit_get_cmd_index(value); 198 cgit_cmd = cgit_get_cmd_index(value);
195 } else if (!strcmp(name, "url")) { 199 } else if (!strcmp(name, "url")) {
196 cgit_parse_url(value); 200 cgit_parse_url(value);
197 } else if (!strcmp(name, "q")) { 201 } else if (!strcmp(name, "q")) {
198 cgit_query_search = xstrdup(value); 202 cgit_query_search = xstrdup(value);
199 } else if (!strcmp(name, "h")) { 203 } else if (!strcmp(name, "h")) {
200 cgit_query_head = xstrdup(value); 204 cgit_query_head = xstrdup(value);
201 cgit_query_has_symref = 1; 205 cgit_query_has_symref = 1;
202 } else if (!strcmp(name, "id")) { 206 } else if (!strcmp(name, "id")) {
203 cgit_query_sha1 = xstrdup(value); 207 cgit_query_sha1 = xstrdup(value);
204 cgit_query_has_sha1 = 1; 208 cgit_query_has_sha1 = 1;
205 } else if (!strcmp(name, "id2")) { 209 } else if (!strcmp(name, "id2")) {
206 cgit_query_sha2 = xstrdup(value); 210 cgit_query_sha2 = xstrdup(value);
207 cgit_query_has_sha1 = 1; 211 cgit_query_has_sha1 = 1;
208 } else if (!strcmp(name, "ofs")) { 212 } else if (!strcmp(name, "ofs")) {
209 cgit_query_ofs = atoi(value); 213 cgit_query_ofs = atoi(value);
210 } else if (!strcmp(name, "path")) { 214 } else if (!strcmp(name, "path")) {
211 cgit_query_path = xstrdup(value); 215 cgit_query_path = xstrdup(value);
212 } else if (!strcmp(name, "name")) { 216 } else if (!strcmp(name, "name")) {
213 cgit_query_name = xstrdup(value); 217 cgit_query_name = xstrdup(value);
214 } 218 }
215} 219}
216 220
217void *cgit_free_commitinfo(struct commitinfo *info) 221void *cgit_free_commitinfo(struct commitinfo *info)
218{ 222{
219 free(info->author); 223 free(info->author);
220 free(info->author_email); 224 free(info->author_email);
221 free(info->committer); 225 free(info->committer);
222 free(info->committer_email); 226 free(info->committer_email);
223 free(info->subject); 227 free(info->subject);
224 free(info); 228 free(info);
225 return NULL; 229 return NULL;
226} 230}
227 231
228int hextoint(char c) 232int hextoint(char c)
229{ 233{
230 if (c >= 'a' && c <= 'f') 234 if (c >= 'a' && c <= 'f')
231 return 10 + c - 'a'; 235 return 10 + c - 'a';
232 else if (c >= 'A' && c <= 'F') 236 else if (c >= 'A' && c <= 'F')
233 return 10 + c - 'A'; 237 return 10 + c - 'A';
234 else if (c >= '0' && c <= '9') 238 else if (c >= '0' && c <= '9')
235 return c - '0'; 239 return c - '0';
236 else 240 else
237 return -1; 241 return -1;
238} 242}
239 243
240void cgit_diff_tree_cb(struct diff_queue_struct *q, 244void cgit_diff_tree_cb(struct diff_queue_struct *q,
241 struct diff_options *options, void *data) 245 struct diff_options *options, void *data)
242{ 246{
243 int i; 247 int i;
244 248
245 for (i = 0; i < q->nr; i++) { 249 for (i = 0; i < q->nr; i++) {
246 if (q->queue[i]->status == 'U') 250 if (q->queue[i]->status == 'U')
247 continue; 251 continue;
248 ((filepair_fn)data)(q->queue[i]); 252 ((filepair_fn)data)(q->queue[i]);
249 } 253 }
250} 254}
251 255
252static int load_mmfile(mmfile_t *file, const unsigned char *sha1) 256static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
253{ 257{
254 enum object_type type; 258 enum object_type type;
255 259
256 if (is_null_sha1(sha1)) { 260 if (is_null_sha1(sha1)) {
257 file->ptr = (char *)""; 261 file->ptr = (char *)"";
258 file->size = 0; 262 file->size = 0;
diff --git a/ui-repolist.c b/ui-repolist.c
index 8e367a2..33e3e7f 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -1,58 +1,68 @@
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>");
57 cgit_print_docend(); 67 cgit_print_docend();
58} 68}