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) (side-by-side diff)
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 {
table.diff td div.hunk {
color: #009;
}
table.diff td div.add {
color: green;
}
table.diff td div.del {
color: red;
}
.sha1 {
font-family: courier;
font-size: 90%;
}
.left {
text-align: left;
}
.right {
text-align: right;
}
+
+table.list td.repogroup {
+ padding-top: 1em;
+ border-bottom: solid 1px #777;
+}
diff --git a/cgit.h b/cgit.h
index e0879bd..8927236 100644
--- a/cgit.h
+++ b/cgit.h
@@ -26,94 +26,96 @@
#define CMD_DIFF 3
#define CMD_TREE 4
#define CMD_VIEW 5
#define CMD_BLOB 6
#define CMD_SNAPSHOT 7
typedef void (*configfn)(const char *name, const char *value);
typedef void (*filepair_fn)(struct diff_filepair *pair);
typedef void (*linediff_fn)(char *line, int len);
struct cacheitem {
char *name;
struct stat st;
int ttl;
int fd;
};
struct repoinfo {
char *url;
char *name;
char *path;
char *desc;
char *owner;
char *defbranch;
+ char *group;
char *module_link;
int snapshots;
int enable_log_filecount;
int enable_log_linecount;
};
struct repolist {
int length;
int count;
struct repoinfo *repos;
};
struct commitinfo {
struct commit *commit;
char *author;
char *author_email;
unsigned long author_date;
char *committer;
char *committer_email;
unsigned long committer_date;
char *subject;
char *msg;
};
struct taginfo {
char *tagger;
char *tagger_email;
int tagger_date;
char *msg;
};
extern const char cgit_version[];
extern struct repolist cgit_repolist;
extern struct repoinfo *cgit_repo;
extern int cgit_cmd;
extern char *cgit_root_title;
extern char *cgit_css;
extern char *cgit_logo;
extern char *cgit_index_header;
extern char *cgit_logo_link;
extern char *cgit_module_link;
extern char *cgit_virtual_root;
extern char *cgit_script_name;
extern char *cgit_cache_root;
+extern char *cgit_repo_group;
extern int cgit_nocache;
extern int cgit_snapshots;
extern int cgit_enable_log_filecount;
extern int cgit_enable_log_linecount;
extern int cgit_max_lock_attempts;
extern int cgit_cache_root_ttl;
extern int cgit_cache_repo_ttl;
extern int cgit_cache_dynamic_ttl;
extern int cgit_cache_static_ttl;
extern int cgit_cache_max_create_time;
extern int cgit_max_msg_len;
extern int cgit_max_repodesc_len;
extern int cgit_max_commit_count;
extern int cgit_query_has_symref;
extern int cgit_query_has_sha1;
extern char *cgit_querystring;
extern char *cgit_query_repo;
extern char *cgit_query_page;
extern char *cgit_query_search;
extern 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 @@
/* shared.c: global vars + some callback functions
*
* Copyright (C) 2006 Lars Hjemli
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
struct repolist cgit_repolist;
struct repoinfo *cgit_repo;
int cgit_cmd;
char *cgit_root_title = "Git repository browser";
char *cgit_css = "/cgit.css";
char *cgit_logo = "/git-logo.png";
char *cgit_index_header = NULL;
char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/";
char *cgit_module_link = "./?repo=%s&page=commit&id=%s";
char *cgit_virtual_root = NULL;
char *cgit_script_name = CGIT_SCRIPT_NAME;
char *cgit_cache_root = "/var/cache/cgit";
+char *cgit_repo_group = NULL;
int cgit_nocache = 0;
int cgit_snapshots = 0;
int cgit_enable_log_filecount = 0;
int cgit_enable_log_linecount = 0;
int cgit_max_lock_attempts = 5;
int cgit_cache_root_ttl = 5;
int cgit_cache_repo_ttl = 5;
int cgit_cache_dynamic_ttl = 5;
int cgit_cache_static_ttl = -1;
int cgit_cache_max_create_time = 5;
int cgit_max_msg_len = 60;
int cgit_max_repodesc_len = 60;
int cgit_max_commit_count = 50;
int cgit_query_has_symref = 0;
int cgit_query_has_sha1 = 0;
char *cgit_querystring = NULL;
char *cgit_query_repo = NULL;
char *cgit_query_page = NULL;
char *cgit_query_head = NULL;
char *cgit_query_search = NULL;
@@ -78,48 +79,49 @@ int chk_positive(int result, char *msg)
die("%s: %s", msg, strerror(errno));
return result;
}
struct repoinfo *add_repo(const char *url)
{
struct repoinfo *ret;
if (++cgit_repolist.count > cgit_repolist.length) {
if (cgit_repolist.length == 0)
cgit_repolist.length = 8;
else
cgit_repolist.length *= 2;
cgit_repolist.repos = xrealloc(cgit_repolist.repos,
cgit_repolist.length *
sizeof(struct repoinfo));
}
ret = &cgit_repolist.repos[cgit_repolist.count-1];
ret->url = xstrdup(url);
ret->name = ret->url;
ret->path = NULL;
ret->desc = NULL;
ret->owner = NULL;
+ ret->group = cgit_repo_group;
ret->defbranch = "master";
ret->snapshots = cgit_snapshots;
ret->enable_log_filecount = cgit_enable_log_filecount;
ret->enable_log_linecount = cgit_enable_log_linecount;
ret->module_link = cgit_module_link;
return ret;
}
struct repoinfo *cgit_get_repoinfo(const char *url)
{
int i;
struct repoinfo *repo;
for (i=0; i<cgit_repolist.count; i++) {
repo = &cgit_repolist.repos[i];
if (!strcmp(repo->url, url))
return repo;
}
return NULL;
}
void cgit_global_config_cb(const char *name, const char *value)
{
if (!strcmp(name, "root-title"))
@@ -139,48 +141,50 @@ void cgit_global_config_cb(const char *name, const char *value)
else if (!strcmp(name, "nocache"))
cgit_nocache = atoi(value);
else if (!strcmp(name, "snapshots"))
cgit_snapshots = atoi(value);
else if (!strcmp(name, "enable-log-filecount"))
cgit_enable_log_filecount = atoi(value);
else if (!strcmp(name, "enable-log-linecount"))
cgit_enable_log_linecount = atoi(value);
else if (!strcmp(name, "cache-root"))
cgit_cache_root = xstrdup(value);
else if (!strcmp(name, "cache-root-ttl"))
cgit_cache_root_ttl = atoi(value);
else if (!strcmp(name, "cache-repo-ttl"))
cgit_cache_repo_ttl = atoi(value);
else if (!strcmp(name, "cache-static-ttl"))
cgit_cache_static_ttl = atoi(value);
else if (!strcmp(name, "cache-dynamic-ttl"))
cgit_cache_dynamic_ttl = atoi(value);
else if (!strcmp(name, "max-message-length"))
cgit_max_msg_len = atoi(value);
else if (!strcmp(name, "max-repodesc-length"))
cgit_max_repodesc_len = atoi(value);
else if (!strcmp(name, "max-commit-count"))
cgit_max_commit_count = atoi(value);
+ else if (!strcmp(name, "repo.group"))
+ cgit_repo_group = xstrdup(value);
else if (!strcmp(name, "repo.url"))
cgit_repo = add_repo(value);
else if (!strcmp(name, "repo.name"))
cgit_repo->name = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.path"))
cgit_repo->path = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.desc"))
cgit_repo->desc = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.owner"))
cgit_repo->owner = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.defbranch"))
cgit_repo->defbranch = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.snapshots"))
cgit_repo->snapshots = cgit_snapshots * atoi(value);
else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value);
else if (cgit_repo && !strcmp(name, "repo.module-link"))
cgit_repo->module_link= xstrdup(value);
else if (!strcmp(name, "include"))
cgit_read_config(value, cgit_global_config_cb);
}
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 @@
/* ui-repolist.c: functions for generating the repolist page
*
* Copyright (C) 2006 Lars Hjemli
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
void cgit_print_repolist(struct cacheitem *item)
{
struct repoinfo *repo;
int i;
+ char *last_group = NULL;
cgit_print_docstart(cgit_root_title, item);
cgit_print_pageheader(cgit_root_title, 0);
html("<table class='list nowrap'>");
if (cgit_index_header) {
html("<tr class='nohover'><td colspan='4' class='include-block'>");
html_include(cgit_index_header);
html("</td></tr>");
}
html("<tr class='nohover'>"
"<th class='left'>Name</th>"
"<th class='left'>Description</th>"
"<th class='left'>Owner</th>"
"<th class='left'>Links</th></tr>\n");
for (i=0; i<cgit_repolist.count; i++) {
repo = &cgit_repolist.repos[i];
+ if ((last_group == NULL && repo->group != NULL) ||
+ (last_group != NULL && repo->group == NULL) ||
+ (last_group != NULL && repo->group!= NULL &&
+ strcmp(repo->group, last_group))) {
+ html("<tr class='nohover'><td colspan='4' class='repogroup'>");
+ html_txt(repo->group);
+ html("</td></tr>");
+ last_group = repo->group;
+ }
html("<tr><td>");
html_link_open(cgit_repourl(repo->url), NULL, NULL);
html_txt(repo->name);
html_link_close();
html("</td><td>");
html_ntxt(cgit_max_repodesc_len, repo->desc);
html("</td><td>");
html_txt(repo->owner);
html("</td><td>");
html_link_open(cgit_pageurl(repo->name, "commit", NULL),
"Commit: display last commit", NULL);
html("C</a> ");
html_link_open(cgit_pageurl(repo->name, "diff", NULL),
"Diff: see changes introduced by last commit", NULL);
html("D</a> ");
html_link_open(cgit_pageurl(repo->name, "log", NULL),
"Log: show history of the main branch", NULL);
html("L</a> ");
html_link_open(cgit_pageurl(repo->name, "tree", NULL),
"Tree: browse the files in the main branch", NULL);
html("T</a>");
html("</td></tr>\n");
}
html("</table>");