-char *cgit_root = "/usr/src/git";
-char *cgit_root_title = "Git repository browser";
-char *cgit_css = "/cgit.css";
-char *cgit_logo = "/git-logo.png";
-char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/";
-char *cgit_virtual_root = NULL;
-
-char *cgit_cache_root = "/var/cache/cgit";
-
-int cgit_nocache = 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;
-
-char *cgit_repo_name = NULL;
-char *cgit_repo_desc = NULL;
-char *cgit_repo_owner = NULL;
-
-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;
-char *cgit_query_sha1 = NULL;
-char *cgit_query_sha2 = NULL;
-char *cgit_query_path = NULL;
-int cgit_query_ofs = 0;
-
-int htmlfd = 0;
-
-void cgit_global_config_cb(const char *name, const char *value)
-{
- if (!strcmp(name, "root"))
- cgit_root = xstrdup(value);
- else if (!strcmp(name, "root-title"))
- cgit_root_title = xstrdup(value);
- else if (!strcmp(name, "css"))
- cgit_css = xstrdup(value);
- else if (!strcmp(name, "logo"))
- cgit_logo = xstrdup(value);
- else if (!strcmp(name, "logo-link"))
- cgit_logo_link = xstrdup(value);
- else if (!strcmp(name, "virtual-root"))
- cgit_virtual_root = xstrdup(value);
- else if (!strcmp(name, "nocache"))
- cgit_nocache = 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);
-}
-
-void cgit_repo_config_cb(const char *name, const char *value)
-{
- if (!strcmp(name, "name"))
- cgit_repo_name = xstrdup(value);
- else if (!strcmp(name, "desc"))
- cgit_repo_desc = xstrdup(value);
- else if (!strcmp(name, "owner"))
- cgit_repo_owner = xstrdup(value);
-}
-
-void cgit_querystring_cb(const char *name, const char *value)
-{
- if (!strcmp(name,"r")) {
- cgit_query_repo = xstrdup(value);
- } else if (!strcmp(name, "p")) {
- cgit_query_page = xstrdup(value);
- } else if (!strcmp(name, "q")) {
- cgit_query_search = xstrdup(value);
- } else if (!strcmp(name, "h")) {
- cgit_query_head = xstrdup(value);
- cgit_query_has_symref = 1;
- } else if (!strcmp(name, "id")) {
- cgit_query_sha1 = xstrdup(value);
- cgit_query_has_sha1 = 1;
- } else if (!strcmp(name, "id2")) {
- cgit_query_sha2 = xstrdup(value);
- cgit_query_has_sha1 = 1;
- } else if (!strcmp(name, "ofs")) {
- cgit_query_ofs = atoi(value);
- } else if (!strcmp(name, "path")) {
- cgit_query_path = xstrdup(value);
+struct cgit_repolist cgit_repolist;
+struct cgit_context ctx;
+int cgit_cmd;
+
+int chk_zero(int result, char *msg)
+{
+ if (result != 0)
+ die("%s: %s", msg, strerror(errno));
+ return result;
+}
+
+int chk_positive(int result, char *msg)
+{
+ if (result <= 0)
+ die("%s: %s", msg, strerror(errno));
+ return result;
+}
+
+int chk_non_negative(int result, char *msg)
+{
+ if (result < 0)
+ die("%s: %s",msg, strerror(errno));
+ return result;
+}
+
+struct cgit_repo *cgit_add_repo(const char *url)
+{
+ struct cgit_repo *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 cgit_repo));
+ }
+
+ ret = &cgit_repolist.repos[cgit_repolist.count-1];
+ memset(ret, 0, sizeof(struct cgit_repo));
+ ret->url = trim_end(url, '/');
+ ret->name = ret->url;
+ ret->path = NULL;
+ ret->desc = "[no description]";
+ ret->owner = NULL;
+ ret->section = ctx.cfg.section;
+ ret->defbranch = "master";
+ ret->snapshots = ctx.cfg.snapshots;
+ ret->enable_log_filecount = ctx.cfg.enable_log_filecount;
+ ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
+ ret->max_stats = ctx.cfg.max_stats;
+ ret->module_link = ctx.cfg.module_link;
+ ret->readme = NULL;
+ ret->mtime = -1;
+ ret->about_filter = ctx.cfg.about_filter;
+ ret->commit_filter = ctx.cfg.commit_filter;
+ ret->source_filter = ctx.cfg.source_filter;
+ return ret;
+}
+
+struct cgit_repo *cgit_get_repoinfo(const char *url)
+{
+ int i;
+ struct cgit_repo *repo;
+
+ for (i=0; i<cgit_repolist.count; i++) {
+ repo = &cgit_repolist.repos[i];
+ if (!strcmp(repo->url, url))
+ return repo;