diff options
Diffstat (limited to 'scan-tree.c')
-rw-r--r-- | scan-tree.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/scan-tree.c b/scan-tree.c index a83a78c..e987824 100644 --- a/scan-tree.c +++ b/scan-tree.c | |||
@@ -47,12 +47,20 @@ static int is_git_dir(const char *path) | |||
47 | 47 | ||
48 | struct cgit_repo *repo; | 48 | struct cgit_repo *repo; |
49 | repo_config_fn config_fn; | 49 | repo_config_fn config_fn; |
50 | char *owner; | ||
50 | 51 | ||
51 | static void repo_config(const char *name, const char *value) | 52 | static void repo_config(const char *name, const char *value) |
52 | { | 53 | { |
53 | config_fn(repo, name, value); | 54 | config_fn(repo, name, value); |
54 | } | 55 | } |
55 | 56 | ||
57 | static int git_owner_config(const char *key, const char *value, void *cb) | ||
58 | { | ||
59 | if (!strcmp(key, "gitweb.owner")) | ||
60 | owner = xstrdup(value); | ||
61 | return 0; | ||
62 | } | ||
63 | |||
56 | static void add_repo(const char *base, const char *path, repo_config_fn fn) | 64 | static void add_repo(const char *base, const char *path, repo_config_fn fn) |
57 | { | 65 | { |
58 | struct stat st; | 66 | struct stat st; |
@@ -67,11 +75,10 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn) | |||
67 | } | 75 | } |
68 | if (!stat(fmt("%s/noweb", path), &st)) | 76 | if (!stat(fmt("%s/noweb", path), &st)) |
69 | return; | 77 | return; |
70 | if ((pwd = getpwuid(st.st_uid)) == NULL) { | 78 | |
71 | fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", | 79 | owner = NULL; |
72 | path, strerror(errno), errno); | 80 | if (ctx.cfg.enable_gitweb_owner) |
73 | return; | 81 | git_config_from_file(git_owner_config, fmt("%s/config", path), NULL); |
74 | } | ||
75 | if (base == path) | 82 | if (base == path) |
76 | p = fmt("%s", path); | 83 | p = fmt("%s", path); |
77 | else | 84 | else |
@@ -86,10 +93,18 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn) | |||
86 | *p = '\0'; | 93 | *p = '\0'; |
87 | repo->name = repo->url; | 94 | repo->name = repo->url; |
88 | repo->path = xstrdup(path); | 95 | repo->path = xstrdup(path); |
89 | p = (pwd && pwd->pw_gecos) ? strchr(pwd->pw_gecos, ',') : NULL; | 96 | while (!owner) { |
90 | if (p) | 97 | if ((pwd = getpwuid(st.st_uid)) == NULL) { |
91 | *p = '\0'; | 98 | fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", |
92 | repo->owner = (pwd ? xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name) : ""); | 99 | path, strerror(errno), errno); |
100 | break; | ||
101 | } | ||
102 | if (pwd->pw_gecos) | ||
103 | if ((p = strchr(pwd->pw_gecos, ','))) | ||
104 | *p = '\0'; | ||
105 | owner = xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name); | ||
106 | } | ||
107 | repo->owner = owner; | ||
93 | 108 | ||
94 | p = fmt("%s/description", path); | 109 | p = fmt("%s/description", path); |
95 | if (!stat(p, &st)) | 110 | if (!stat(p, &st)) |