|
diff --git a/cgitrc b/cgitrc index 019781e..e7e731c 100644 --- a/ cgitrc+++ b/ cgitrc |
|
@@ -18,76 +18,79 @@ |
18 | ## |
18 | ## |
19 | ## instead of |
19 | ## instead of |
20 | ## |
20 | ## |
21 | ## http://localhost/cgit/cgit.cgi?r=repo&p=log&id=master |
21 | ## http://localhost/cgit/cgit.cgi?r=repo&p=log&id=master |
22 | ## |
22 | ## |
23 | ## For this to work with apache, rewrite rules must be added to httpd.conf, |
23 | ## For this to work with apache, rewrite rules must be added to httpd.conf, |
24 | ## possibly looking something like this: |
24 | ## possibly looking something like this: |
25 | ## |
25 | ## |
26 | ## RewriteRule ^/git/$ /cgit/cgit.cgi [L,QSA] |
26 | ## RewriteRule ^/git/$ /cgit/cgit.cgi [L,QSA] |
27 | ## RewriteRule ^/git/([^/]+)/$ /cgit/cgit.cgi?r=$1 [L,QSA] |
27 | ## RewriteRule ^/git/([^/]+)/$ /cgit/cgit.cgi?r=$1 [L,QSA] |
28 | ## RewriteRule ^/git/([^/]+)/([^/]+)/$ /cgit/cgit.cgi?r=$1&p=$2 [L,QSA] |
28 | ## RewriteRule ^/git/([^/]+)/([^/]+)/$ /cgit/cgit.cgi?r=$1&p=$2 [L,QSA] |
29 | ## |
29 | ## |
30 | ## This setting is disabled by default. |
30 | ## This setting is disabled by default. |
31 | #virtual-root=/git |
31 | #virtual-root=/git |
32 | |
32 | |
33 | |
33 | |
34 | ## Set the title printed on the root page |
34 | ## Set the title printed on the root page |
35 | #root-title=Git repository browser |
35 | #root-title=Git repository browser |
36 | |
36 | |
37 | |
37 | |
38 | ## Link to css file |
38 | ## Link to css file |
39 | #css=/cgit/cgit.css |
39 | #css=/cgit/cgit.css |
40 | |
40 | |
41 | |
41 | |
42 | ## Link to logo file |
42 | ## Link to logo file |
43 | #logo=/cgit/git-logo.png |
43 | #logo=/cgit/git-logo.png |
44 | |
44 | |
45 | |
45 | |
46 | ## Url loaded when clicking the logo |
46 | ## Url loaded when clicking the logo |
47 | #logo-link=http://www.kernel.org/pub/software/scm/git/docs/ |
47 | #logo-link=http://www.kernel.org/pub/software/scm/git/docs/ |
48 | |
48 | |
49 | |
49 | |
50 | ## Url loaded when clicking a submodule link |
50 | ## Url loaded when clicking a submodule link |
51 | #module-link=./?repo=%s&page=commit&id=%s |
51 | #module-link=./?repo=%s&page=commit&id=%s |
52 | |
52 | |
53 | |
53 | |
54 | ## Number of chars shown of commit subject message (in log view) |
54 | ## Number of chars shown of commit subject message (in log view) |
55 | #max-message-length=60 |
55 | #max-message-length=60 |
56 | |
56 | |
57 | |
57 | |
58 | ## Number of commits per page in log view |
58 | ## Number of commits per page in log view |
59 | #max-commit-count=50 |
59 | #max-commit-count=50 |
60 | |
60 | |
61 | |
61 | |
62 | ## Root of cached output |
62 | ## Root of cached output |
63 | #cache-root=/var/cache/cgit |
63 | #cache-root=/var/cache/cgit |
64 | |
64 | |
65 | |
65 | |
| |
66 | ## Include another config-file |
| |
67 | #include=/var/cgit/repolist |
| |
68 | |
66 | ## |
69 | ## |
67 | ## Time-To-Live settings: specifies how long (in minutes) different pages |
70 | ## Time-To-Live settings: specifies how long (in minutes) different pages |
68 | ## should be cached (0 for instant expiration, -1 for immortal pages) |
71 | ## should be cached (0 for instant expiration, -1 for immortal pages) |
69 | ## |
72 | ## |
70 | |
73 | |
71 | ## ttl for root page |
74 | ## ttl for root page |
72 | #cache-root-ttl=5 |
75 | #cache-root-ttl=5 |
73 | |
76 | |
74 | ## ttl for repo summary page |
77 | ## ttl for repo summary page |
75 | #cache-repo-ttl=5 |
78 | #cache-repo-ttl=5 |
76 | |
79 | |
77 | ## ttl for other dynamic pages |
80 | ## ttl for other dynamic pages |
78 | #cache-dynamic-ttl=5 |
81 | #cache-dynamic-ttl=5 |
79 | |
82 | |
80 | ## ttl for static pages (addressed by SHA-1) |
83 | ## ttl for static pages (addressed by SHA-1) |
81 | #cache-static-ttl=-1 |
84 | #cache-static-ttl=-1 |
82 | |
85 | |
83 | |
86 | |
84 | |
87 | |
85 | ## Example repository entry. Required values are repo.url and repo.path (each |
88 | ## Example repository entry. Required values are repo.url and repo.path (each |
86 | ## repository section must start with repo.url). |
89 | ## repository section must start with repo.url). |
87 | #repo.url=cgit |
90 | #repo.url=cgit |
88 | #repo.name=cgit |
91 | #repo.name=cgit |
89 | #repo.desc=the caching cgi for git |
92 | #repo.desc=the caching cgi for git |
90 | #repo.path=/pub/git/cgit |
93 | #repo.path=/pub/git/cgit |
91 | #repo.owner=Lars Hjemli |
94 | #repo.owner=Lars Hjemli |
92 | #repo.snapshots=1 # override a sitewide snapshot-setting |
95 | #repo.snapshots=1 # override a sitewide snapshot-setting |
93 | #repo.module-link=/git/%s/commit/?id=%s # override the standard module-link |
96 | #repo.module-link=/git/%s/commit/?id=%s # override the standard module-link |
|
|
diff --git a/parsing.c b/parsing.c index 332d61c..8e15e5a 100644 --- a/ parsing.c+++ b/ parsing.c |
|
@@ -19,109 +19,111 @@ int next_char(FILE *f) |
19 | } |
19 | } |
20 | } |
20 | } |
21 | return c; |
21 | return c; |
22 | } |
22 | } |
23 | |
23 | |
24 | void skip_line(FILE *f) |
24 | void skip_line(FILE *f) |
25 | { |
25 | { |
26 | int c; |
26 | int c; |
27 | |
27 | |
28 | while((c=next_char(f)) && c!='\n' && c!=EOF) |
28 | while((c=next_char(f)) && c!='\n' && c!=EOF) |
29 | ; |
29 | ; |
30 | } |
30 | } |
31 | |
31 | |
32 | int read_config_line(FILE *f, char *line, const char **value, int bufsize) |
32 | int read_config_line(FILE *f, char *line, const char **value, int bufsize) |
33 | { |
33 | { |
34 | int i = 0, isname = 0; |
34 | int i = 0, isname = 0; |
35 | |
35 | |
36 | *value = NULL; |
36 | *value = NULL; |
37 | while(i<bufsize-1) { |
37 | while(i<bufsize-1) { |
38 | int c = next_char(f); |
38 | int c = next_char(f); |
39 | if (!isname && (c=='#' || c==';')) { |
39 | if (!isname && (c=='#' || c==';')) { |
40 | skip_line(f); |
40 | skip_line(f); |
41 | continue; |
41 | continue; |
42 | } |
42 | } |
43 | if (!isname && isspace(c)) |
43 | if (!isname && isspace(c)) |
44 | continue; |
44 | continue; |
45 | |
45 | |
46 | if (c=='=' && !*value) { |
46 | if (c=='=' && !*value) { |
47 | line[i] = 0; |
47 | line[i] = 0; |
48 | *value = &line[i+1]; |
48 | *value = &line[i+1]; |
49 | } else if (c=='\n' && !isname) { |
49 | } else if (c=='\n' && !isname) { |
50 | i = 0; |
50 | i = 0; |
51 | continue; |
51 | continue; |
52 | } else if (c=='\n' || c==EOF) { |
52 | } else if (c=='\n' || c==EOF) { |
53 | line[i] = 0; |
53 | line[i] = 0; |
54 | break; |
54 | break; |
55 | } else { |
55 | } else { |
56 | line[i]=c; |
56 | line[i]=c; |
57 | } |
57 | } |
58 | isname = 1; |
58 | isname = 1; |
59 | i++; |
59 | i++; |
60 | } |
60 | } |
61 | line[i+1] = 0; |
61 | line[i+1] = 0; |
62 | return i; |
62 | return i; |
63 | } |
63 | } |
64 | |
64 | |
65 | int cgit_read_config(const char *filename, configfn fn) |
65 | int cgit_read_config(const char *filename, configfn fn) |
66 | { |
66 | { |
67 | int ret = 0, len; |
67 | static int nesting; |
| |
68 | int len; |
68 | char line[256]; |
69 | char line[256]; |
69 | const char *value; |
70 | const char *value; |
70 | FILE *f = fopen(filename, "r"); |
71 | FILE *f; |
71 | |
72 | |
72 | if (!f) |
73 | /* cancel the reading of yet another configfile after 16 invocations */ |
| |
74 | if (nesting++ > 16) |
| |
75 | return -1; |
| |
76 | if (!(f = fopen(filename, "r"))) |
73 | return -1; |
77 | return -1; |
74 | |
| |
75 | while((len = read_config_line(f, line, &value, sizeof(line))) > 0) |
78 | while((len = read_config_line(f, line, &value, sizeof(line))) > 0) |
76 | (*fn)(line, value); |
79 | (*fn)(line, value); |
77 | |
| |
78 | fclose(f); |
80 | fclose(f); |
79 | return ret; |
81 | return 0; |
80 | } |
82 | } |
81 | |
83 | |
82 | char *convert_query_hexchar(char *txt) |
84 | char *convert_query_hexchar(char *txt) |
83 | { |
85 | { |
84 | int d1, d2; |
86 | int d1, d2; |
85 | if (strlen(txt) < 3) { |
87 | if (strlen(txt) < 3) { |
86 | *txt = '\0'; |
88 | *txt = '\0'; |
87 | return txt-1; |
89 | return txt-1; |
88 | } |
90 | } |
89 | d1 = hextoint(*(txt+1)); |
91 | d1 = hextoint(*(txt+1)); |
90 | d2 = hextoint(*(txt+2)); |
92 | d2 = hextoint(*(txt+2)); |
91 | if (d1<0 || d2<0) { |
93 | if (d1<0 || d2<0) { |
92 | strcpy(txt, txt+3); |
94 | strcpy(txt, txt+3); |
93 | return txt-1; |
95 | return txt-1; |
94 | } else { |
96 | } else { |
95 | *txt = d1 * 16 + d2; |
97 | *txt = d1 * 16 + d2; |
96 | strcpy(txt+1, txt+3); |
98 | strcpy(txt+1, txt+3); |
97 | return txt; |
99 | return txt; |
98 | } |
100 | } |
99 | } |
101 | } |
100 | |
102 | |
101 | int cgit_parse_query(char *txt, configfn fn) |
103 | int cgit_parse_query(char *txt, configfn fn) |
102 | { |
104 | { |
103 | char *t, *value = NULL, c; |
105 | char *t, *value = NULL, c; |
104 | |
106 | |
105 | if (!txt) |
107 | if (!txt) |
106 | return 0; |
108 | return 0; |
107 | |
109 | |
108 | t = txt = xstrdup(txt); |
110 | t = txt = xstrdup(txt); |
109 | |
111 | |
110 | while((c=*t) != '\0') { |
112 | while((c=*t) != '\0') { |
111 | if (c=='=') { |
113 | if (c=='=') { |
112 | *t = '\0'; |
114 | *t = '\0'; |
113 | value = t+1; |
115 | value = t+1; |
114 | } else if (c=='+') { |
116 | } else if (c=='+') { |
115 | *t = ' '; |
117 | *t = ' '; |
116 | } else if (c=='%') { |
118 | } else if (c=='%') { |
117 | t = convert_query_hexchar(t); |
119 | t = convert_query_hexchar(t); |
118 | } else if (c=='&') { |
120 | } else if (c=='&') { |
119 | *t = '\0'; |
121 | *t = '\0'; |
120 | (*fn)(txt, value); |
122 | (*fn)(txt, value); |
121 | txt = t+1; |
123 | txt = t+1; |
122 | value = NULL; |
124 | value = NULL; |
123 | } |
125 | } |
124 | t++; |
126 | t++; |
125 | } |
127 | } |
126 | if (t!=txt) |
128 | if (t!=txt) |
127 | (*fn)(txt, value); |
129 | (*fn)(txt, value); |
|
|
diff --git a/shared.c b/shared.c index ffecac8..072bb6d 100644 --- a/ shared.c+++ b/ shared.c |
|
@@ -92,96 +92,98 @@ struct repoinfo *add_repo(const char *url) |
92 | } |
92 | } |
93 | |
93 | |
94 | void cgit_global_config_cb(const char *name, const char *value) |
94 | void cgit_global_config_cb(const char *name, const char *value) |
95 | { |
95 | { |
96 | if (!strcmp(name, "root-title")) |
96 | if (!strcmp(name, "root-title")) |
97 | cgit_root_title = xstrdup(value); |
97 | cgit_root_title = xstrdup(value); |
98 | else if (!strcmp(name, "css")) |
98 | else if (!strcmp(name, "css")) |
99 | cgit_css = xstrdup(value); |
99 | cgit_css = xstrdup(value); |
100 | else if (!strcmp(name, "logo")) |
100 | else if (!strcmp(name, "logo")) |
101 | cgit_logo = xstrdup(value); |
101 | cgit_logo = xstrdup(value); |
102 | else if (!strcmp(name, "logo-link")) |
102 | else if (!strcmp(name, "logo-link")) |
103 | cgit_logo_link = xstrdup(value); |
103 | cgit_logo_link = xstrdup(value); |
104 | else if (!strcmp(name, "module-link")) |
104 | else if (!strcmp(name, "module-link")) |
105 | cgit_module_link = xstrdup(value); |
105 | cgit_module_link = xstrdup(value); |
106 | else if (!strcmp(name, "virtual-root")) |
106 | else if (!strcmp(name, "virtual-root")) |
107 | cgit_virtual_root = xstrdup(value); |
107 | cgit_virtual_root = xstrdup(value); |
108 | else if (!strcmp(name, "nocache")) |
108 | else if (!strcmp(name, "nocache")) |
109 | cgit_nocache = atoi(value); |
109 | cgit_nocache = atoi(value); |
110 | else if (!strcmp(name, "snapshots")) |
110 | else if (!strcmp(name, "snapshots")) |
111 | cgit_snapshots = atoi(value); |
111 | cgit_snapshots = atoi(value); |
112 | else if (!strcmp(name, "cache-root")) |
112 | else if (!strcmp(name, "cache-root")) |
113 | cgit_cache_root = xstrdup(value); |
113 | cgit_cache_root = xstrdup(value); |
114 | else if (!strcmp(name, "cache-root-ttl")) |
114 | else if (!strcmp(name, "cache-root-ttl")) |
115 | cgit_cache_root_ttl = atoi(value); |
115 | cgit_cache_root_ttl = atoi(value); |
116 | else if (!strcmp(name, "cache-repo-ttl")) |
116 | else if (!strcmp(name, "cache-repo-ttl")) |
117 | cgit_cache_repo_ttl = atoi(value); |
117 | cgit_cache_repo_ttl = atoi(value); |
118 | else if (!strcmp(name, "cache-static-ttl")) |
118 | else if (!strcmp(name, "cache-static-ttl")) |
119 | cgit_cache_static_ttl = atoi(value); |
119 | cgit_cache_static_ttl = atoi(value); |
120 | else if (!strcmp(name, "cache-dynamic-ttl")) |
120 | else if (!strcmp(name, "cache-dynamic-ttl")) |
121 | cgit_cache_dynamic_ttl = atoi(value); |
121 | cgit_cache_dynamic_ttl = atoi(value); |
122 | else if (!strcmp(name, "max-message-length")) |
122 | else if (!strcmp(name, "max-message-length")) |
123 | cgit_max_msg_len = atoi(value); |
123 | cgit_max_msg_len = atoi(value); |
124 | else if (!strcmp(name, "max-commit-count")) |
124 | else if (!strcmp(name, "max-commit-count")) |
125 | cgit_max_commit_count = atoi(value); |
125 | cgit_max_commit_count = atoi(value); |
126 | else if (!strcmp(name, "repo.url")) |
126 | else if (!strcmp(name, "repo.url")) |
127 | cgit_repo = add_repo(value); |
127 | cgit_repo = add_repo(value); |
128 | else if (!strcmp(name, "repo.name")) |
128 | else if (!strcmp(name, "repo.name")) |
129 | cgit_repo->name = xstrdup(value); |
129 | cgit_repo->name = xstrdup(value); |
130 | else if (cgit_repo && !strcmp(name, "repo.path")) |
130 | else if (cgit_repo && !strcmp(name, "repo.path")) |
131 | cgit_repo->path = xstrdup(value); |
131 | cgit_repo->path = xstrdup(value); |
132 | else if (cgit_repo && !strcmp(name, "repo.desc")) |
132 | else if (cgit_repo && !strcmp(name, "repo.desc")) |
133 | cgit_repo->desc = xstrdup(value); |
133 | cgit_repo->desc = xstrdup(value); |
134 | else if (cgit_repo && !strcmp(name, "repo.owner")) |
134 | else if (cgit_repo && !strcmp(name, "repo.owner")) |
135 | cgit_repo->owner = xstrdup(value); |
135 | cgit_repo->owner = xstrdup(value); |
136 | else if (cgit_repo && !strcmp(name, "repo.snapshots")) |
136 | else if (cgit_repo && !strcmp(name, "repo.snapshots")) |
137 | cgit_repo->snapshots = atoi(value); |
137 | cgit_repo->snapshots = atoi(value); |
138 | else if (cgit_repo && !strcmp(name, "repo.module-link")) |
138 | else if (cgit_repo && !strcmp(name, "repo.module-link")) |
139 | cgit_repo->module_link= xstrdup(value); |
139 | cgit_repo->module_link= xstrdup(value); |
| |
140 | else if (!strcmp(name, "include")) |
| |
141 | cgit_read_config(value, cgit_global_config_cb); |
140 | } |
142 | } |
141 | |
143 | |
142 | void cgit_repo_config_cb(const char *name, const char *value) |
144 | void cgit_repo_config_cb(const char *name, const char *value) |
143 | { |
145 | { |
144 | if (!strcmp(name, "name")) |
146 | if (!strcmp(name, "name")) |
145 | cgit_repo_name = xstrdup(value); |
147 | cgit_repo_name = xstrdup(value); |
146 | else if (!strcmp(name, "desc")) |
148 | else if (!strcmp(name, "desc")) |
147 | cgit_repo_desc = xstrdup(value); |
149 | cgit_repo_desc = xstrdup(value); |
148 | else if (!strcmp(name, "owner")) |
150 | else if (!strcmp(name, "owner")) |
149 | cgit_repo_owner = xstrdup(value); |
151 | cgit_repo_owner = xstrdup(value); |
150 | } |
152 | } |
151 | |
153 | |
152 | void cgit_querystring_cb(const char *name, const char *value) |
154 | void cgit_querystring_cb(const char *name, const char *value) |
153 | { |
155 | { |
154 | if (!strcmp(name,"r")) { |
156 | if (!strcmp(name,"r")) { |
155 | cgit_query_repo = xstrdup(value); |
157 | cgit_query_repo = xstrdup(value); |
156 | } else if (!strcmp(name, "p")) { |
158 | } else if (!strcmp(name, "p")) { |
157 | cgit_query_page = xstrdup(value); |
159 | cgit_query_page = xstrdup(value); |
158 | } else if (!strcmp(name, "q")) { |
160 | } else if (!strcmp(name, "q")) { |
159 | cgit_query_search = xstrdup(value); |
161 | cgit_query_search = xstrdup(value); |
160 | } else if (!strcmp(name, "h")) { |
162 | } else if (!strcmp(name, "h")) { |
161 | cgit_query_head = xstrdup(value); |
163 | cgit_query_head = xstrdup(value); |
162 | cgit_query_has_symref = 1; |
164 | cgit_query_has_symref = 1; |
163 | } else if (!strcmp(name, "id")) { |
165 | } else if (!strcmp(name, "id")) { |
164 | cgit_query_sha1 = xstrdup(value); |
166 | cgit_query_sha1 = xstrdup(value); |
165 | cgit_query_has_sha1 = 1; |
167 | cgit_query_has_sha1 = 1; |
166 | } else if (!strcmp(name, "id2")) { |
168 | } else if (!strcmp(name, "id2")) { |
167 | cgit_query_sha2 = xstrdup(value); |
169 | cgit_query_sha2 = xstrdup(value); |
168 | cgit_query_has_sha1 = 1; |
170 | cgit_query_has_sha1 = 1; |
169 | } else if (!strcmp(name, "ofs")) { |
171 | } else if (!strcmp(name, "ofs")) { |
170 | cgit_query_ofs = atoi(value); |
172 | cgit_query_ofs = atoi(value); |
171 | } else if (!strcmp(name, "path")) { |
173 | } else if (!strcmp(name, "path")) { |
172 | cgit_query_path = xstrdup(value); |
174 | cgit_query_path = xstrdup(value); |
173 | } else if (!strcmp(name, "name")) { |
175 | } else if (!strcmp(name, "name")) { |
174 | cgit_query_name = xstrdup(value); |
176 | cgit_query_name = xstrdup(value); |
175 | } |
177 | } |
176 | } |
178 | } |
177 | |
179 | |
178 | void *cgit_free_commitinfo(struct commitinfo *info) |
180 | void *cgit_free_commitinfo(struct commitinfo *info) |
179 | { |
181 | { |
180 | free(info->author); |
182 | free(info->author); |
181 | free(info->author_email); |
183 | free(info->author_email); |
182 | free(info->committer); |
184 | free(info->committer); |
183 | free(info->committer_email); |
185 | free(info->committer_email); |
184 | free(info->subject); |
186 | free(info->subject); |
185 | free(info); |
187 | free(info); |
186 | return NULL; |
188 | return NULL; |
187 | } |
189 | } |
|