X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/d711de55280c3c9c10cfda4e24c8f3b3015217b2..61d4147ea2d58c9d129a084be13ccec6ae18b4d5:/scan-tree.c diff --git a/scan-tree.c b/scan-tree.c index a429a9f..6d1941e 100644 --- a/scan-tree.c +++ b/scan-tree.c @@ -1,7 +1,7 @@ /* scan-tree.c * * Copyright (C) 2008-2009 Lars Hjemli - * Copyright (C) 2010 Jason A. Donenfeld + * Copyright (C) 2010, 2012 Jason A. Donenfeld * * Licensed under GNU General Public License v2 * (see COPYING for full license text) @@ -48,19 +48,27 @@ static int is_git_dir(const char *path) struct cgit_repo *repo; repo_config_fn config_fn; char *owner; +char *desc; +char *section; static void repo_config(const char *name, const char *value) { config_fn(repo, name, value); } -static int git_owner_config(const char *key, const char *value, void *cb) +static int gitweb_config(const char *key, const char *value, void *cb) { - if (!strcmp(key, "gitweb.owner")) + if (ctx.cfg.enable_gitweb_owner && !strcmp(key, "gitweb.owner")) owner = xstrdup(value); + else if (ctx.cfg.enable_gitweb_desc && !strcmp(key, "gitweb.description")) + desc = xstrdup(value); + else if (ctx.cfg.enable_gitweb_section && !strcmp(key, "gitweb.category")) + section = xstrdup(value); return 0; } + + static char *xstrrchr(char *s, char *from, int c) { while (from >= s && *from != c) @@ -68,39 +76,6 @@ static char *xstrrchr(char *s, char *from, int c) return from < s ? NULL : from; } -static char *guess_defbranch(const char *repo_path) -{ - int fd, len; - char buffer[256]; - char *ref_start; - char *head; - - head = fmt("%s/HEAD", repo_path); - fd = open(head, O_RDONLY); - if (fd == -1) - return xstrdup("master"); - - memset(buffer, 0, sizeof(buffer)); - len = read_in_full(fd, buffer, sizeof(buffer)-1); - close(fd); - - if(!memcmp(buffer, "ref: refs/heads/", 16)) - return xstrndup(buffer+16, len-17); - - if(strlen(buffer) == 41) { - /* probably contains a SHA1 sum */ - memset(buffer, 0, sizeof(buffer)); - if(readlink(head, buffer, sizeof(buffer)-1)) { - ref_start = memmem(buffer, sizeof(buffer)-1, "refs/heads/", 11); - if(ref_start) - return xstrdup(ref_start+11); - } - } - - return xstrdup("master"); -} - - static void add_repo(const char *base, const char *path, repo_config_fn fn) { struct stat st; @@ -122,8 +97,10 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn) return; owner = NULL; - if (ctx.cfg.enable_gitweb_owner) - git_config_from_file(git_owner_config, fmt("%s/config", path), NULL); + desc = NULL; + section = NULL; + git_config_from_file(gitweb_config, fmt("%s/config", path), NULL); + if (base == path) rel = xstrdup(fmt("%s", path)); else @@ -138,9 +115,6 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn) *p = '\0'; repo->name = repo->url; repo->path = xstrdup(path); - - repo->defbranch = guess_defbranch(repo->path); - while (!owner) { if ((pwd = getpwuid(st.st_uid)) == NULL) { fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", @@ -154,15 +128,21 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn) } repo->owner = owner; - p = fmt("%s/description", path); - if (!stat(p, &st)) - readfile(p, &repo->desc, &size); + if (desc) + repo->desc = desc; + else { + p = fmt("%s/description", path); + if (!stat(p, &st)) + readfile(p, &repo->desc, &size); + } if (!repo->readme) { p = fmt("%s/README.html", path); if (!stat(p, &st)) repo->readme = "README.html"; } + if (section) + repo->section = section; if (ctx.cfg.section_from_path) { n = ctx.cfg.section_from_path; if (n > 0) {