summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cgit.h1
-rw-r--r--parsing.c2
-rw-r--r--shared.c24
3 files changed, 25 insertions, 2 deletions
diff --git a/cgit.h b/cgit.h
index 81c819d..ddb2fff 100644
--- a/cgit.h
+++ b/cgit.h
@@ -138,48 +138,49 @@ extern int cgit_query_has_sha1;
138 138
139extern char *cgit_querystring; 139extern char *cgit_querystring;
140extern char *cgit_query_repo; 140extern char *cgit_query_repo;
141extern char *cgit_query_page; 141extern char *cgit_query_page;
142extern char *cgit_query_search; 142extern char *cgit_query_search;
143extern char *cgit_query_head; 143extern char *cgit_query_head;
144extern char *cgit_query_sha1; 144extern char *cgit_query_sha1;
145extern char *cgit_query_sha2; 145extern char *cgit_query_sha2;
146extern char *cgit_query_path; 146extern char *cgit_query_path;
147extern char *cgit_query_name; 147extern char *cgit_query_name;
148extern int cgit_query_ofs; 148extern int cgit_query_ofs;
149 149
150extern int htmlfd; 150extern int htmlfd;
151 151
152extern int cgit_get_cmd_index(const char *cmd); 152extern int cgit_get_cmd_index(const char *cmd);
153extern struct repoinfo *cgit_get_repoinfo(const char *url); 153extern struct repoinfo *cgit_get_repoinfo(const char *url);
154extern void cgit_global_config_cb(const char *name, const char *value); 154extern void cgit_global_config_cb(const char *name, const char *value);
155extern void cgit_repo_config_cb(const char *name, const char *value); 155extern void cgit_repo_config_cb(const char *name, const char *value);
156extern void cgit_querystring_cb(const char *name, const char *value); 156extern void cgit_querystring_cb(const char *name, const char *value);
157 157
158extern int chk_zero(int result, char *msg); 158extern int chk_zero(int result, char *msg);
159extern int chk_positive(int result, char *msg); 159extern int chk_positive(int result, char *msg);
160 160
161extern int hextoint(char c); 161extern int hextoint(char c);
162extern char *trim_end(const char *str, char c);
162 163
163extern void *cgit_free_commitinfo(struct commitinfo *info); 164extern void *cgit_free_commitinfo(struct commitinfo *info);
164 165
165extern int cgit_diff_files(const unsigned char *old_sha1, 166extern int cgit_diff_files(const unsigned char *old_sha1,
166 const unsigned char *new_sha1, 167 const unsigned char *new_sha1,
167 linediff_fn fn); 168 linediff_fn fn);
168 169
169extern void cgit_diff_tree(const unsigned char *old_sha1, 170extern void cgit_diff_tree(const unsigned char *old_sha1,
170 const unsigned char *new_sha1, 171 const unsigned char *new_sha1,
171 filepair_fn fn); 172 filepair_fn fn);
172 173
173extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 174extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
174 175
175extern char *fmt(const char *format,...); 176extern char *fmt(const char *format,...);
176 177
177extern void html(const char *txt); 178extern void html(const char *txt);
178extern void htmlf(const char *format,...); 179extern void htmlf(const char *format,...);
179extern void html_txt(char *txt); 180extern void html_txt(char *txt);
180extern void html_ntxt(int len, char *txt); 181extern void html_ntxt(int len, char *txt);
181extern void html_attr(char *txt); 182extern void html_attr(char *txt);
182extern void html_hidden(char *name, char *value); 183extern void html_hidden(char *name, char *value);
183extern void html_link_open(char *url, char *title, char *class); 184extern void html_link_open(char *url, char *title, char *class);
184extern void html_link_close(void); 185extern void html_link_close(void);
185extern void html_filemode(unsigned short mode); 186extern void html_filemode(unsigned short mode);
diff --git a/parsing.c b/parsing.c
index 74a2484..2c05c09 100644
--- a/parsing.c
+++ b/parsing.c
@@ -147,49 +147,49 @@ void cgit_parse_url(const char *url)
147 if (!url || url[0] == '\0') 147 if (!url || url[0] == '\0')
148 return; 148 return;
149 149
150 cgit_repo = cgit_get_repoinfo(url); 150 cgit_repo = cgit_get_repoinfo(url);
151 if (cgit_repo) { 151 if (cgit_repo) {
152 cgit_query_repo = cgit_repo->url; 152 cgit_query_repo = cgit_repo->url;
153 return; 153 return;
154 } 154 }
155 155
156 cmd = strchr(url, '/'); 156 cmd = strchr(url, '/');
157 while (!cgit_repo && cmd) { 157 while (!cgit_repo && cmd) {
158 cmd[0] = '\0'; 158 cmd[0] = '\0';
159 cgit_repo = cgit_get_repoinfo(url); 159 cgit_repo = cgit_get_repoinfo(url);
160 if (cgit_repo == NULL) { 160 if (cgit_repo == NULL) {
161 cmd[0] = '/'; 161 cmd[0] = '/';
162 cmd = strchr(cmd + 1, '/'); 162 cmd = strchr(cmd + 1, '/');
163 continue; 163 continue;
164 } 164 }
165 165
166 cgit_query_repo = cgit_repo->url; 166 cgit_query_repo = cgit_repo->url;
167 p = strchr(cmd + 1, '/'); 167 p = strchr(cmd + 1, '/');
168 if (p) { 168 if (p) {
169 p[0] = '\0'; 169 p[0] = '\0';
170 if (p[1]) 170 if (p[1])
171 cgit_query_path = xstrdup(p + 1); 171 cgit_query_path = trim_end(p + 1, '/');
172 } 172 }
173 cgit_cmd = cgit_get_cmd_index(cmd + 1); 173 cgit_cmd = cgit_get_cmd_index(cmd + 1);
174 cgit_query_page = xstrdup(cmd + 1); 174 cgit_query_page = xstrdup(cmd + 1);
175 return; 175 return;
176 } 176 }
177} 177}
178 178
179char *substr(const char *head, const char *tail) 179char *substr(const char *head, const char *tail)
180{ 180{
181 char *buf; 181 char *buf;
182 182
183 buf = xmalloc(tail - head + 1); 183 buf = xmalloc(tail - head + 1);
184 strncpy(buf, head, tail - head); 184 strncpy(buf, head, tail - head);
185 buf[tail - head] = '\0'; 185 buf[tail - head] = '\0';
186 return buf; 186 return buf;
187} 187}
188 188
189struct commitinfo *cgit_parse_commit(struct commit *commit) 189struct commitinfo *cgit_parse_commit(struct commit *commit)
190{ 190{
191 struct commitinfo *ret; 191 struct commitinfo *ret;
192 char *p = commit->buffer, *t = commit->buffer; 192 char *p = commit->buffer, *t = commit->buffer;
193 193
194 ret = xmalloc(sizeof(*ret)); 194 ret = xmalloc(sizeof(*ret));
195 ret->commit = commit; 195 ret->commit = commit;
diff --git a/shared.c b/shared.c
index ab00bc9..45db735 100644
--- a/shared.c
+++ b/shared.c
@@ -207,77 +207,99 @@ void cgit_global_config_cb(const char *name, const char *value)
207void cgit_querystring_cb(const char *name, const char *value) 207void cgit_querystring_cb(const char *name, const char *value)
208{ 208{
209 if (!strcmp(name,"r")) { 209 if (!strcmp(name,"r")) {
210 cgit_query_repo = xstrdup(value); 210 cgit_query_repo = xstrdup(value);
211 cgit_repo = cgit_get_repoinfo(value); 211 cgit_repo = cgit_get_repoinfo(value);
212 } else if (!strcmp(name, "p")) { 212 } else if (!strcmp(name, "p")) {
213 cgit_query_page = xstrdup(value); 213 cgit_query_page = xstrdup(value);
214 cgit_cmd = cgit_get_cmd_index(value); 214 cgit_cmd = cgit_get_cmd_index(value);
215 } else if (!strcmp(name, "url")) { 215 } else if (!strcmp(name, "url")) {
216 cgit_parse_url(value); 216 cgit_parse_url(value);
217 } else if (!strcmp(name, "q")) { 217 } else if (!strcmp(name, "q")) {
218 cgit_query_search = xstrdup(value); 218 cgit_query_search = xstrdup(value);
219 } else if (!strcmp(name, "h")) { 219 } else if (!strcmp(name, "h")) {
220 cgit_query_head = xstrdup(value); 220 cgit_query_head = xstrdup(value);
221 cgit_query_has_symref = 1; 221 cgit_query_has_symref = 1;
222 } else if (!strcmp(name, "id")) { 222 } else if (!strcmp(name, "id")) {
223 cgit_query_sha1 = xstrdup(value); 223 cgit_query_sha1 = xstrdup(value);
224 cgit_query_has_sha1 = 1; 224 cgit_query_has_sha1 = 1;
225 } else if (!strcmp(name, "id2")) { 225 } else if (!strcmp(name, "id2")) {
226 cgit_query_sha2 = xstrdup(value); 226 cgit_query_sha2 = xstrdup(value);
227 cgit_query_has_sha1 = 1; 227 cgit_query_has_sha1 = 1;
228 } else if (!strcmp(name, "ofs")) { 228 } else if (!strcmp(name, "ofs")) {
229 cgit_query_ofs = atoi(value); 229 cgit_query_ofs = atoi(value);
230 } else if (!strcmp(name, "path")) { 230 } else if (!strcmp(name, "path")) {
231 cgit_query_path = xstrdup(value); 231 cgit_query_path = trim_end(value, '/');
232 } else if (!strcmp(name, "name")) { 232 } else if (!strcmp(name, "name")) {
233 cgit_query_name = xstrdup(value); 233 cgit_query_name = xstrdup(value);
234 } 234 }
235} 235}
236 236
237void *cgit_free_commitinfo(struct commitinfo *info) 237void *cgit_free_commitinfo(struct commitinfo *info)
238{ 238{
239 free(info->author); 239 free(info->author);
240 free(info->author_email); 240 free(info->author_email);
241 free(info->committer); 241 free(info->committer);
242 free(info->committer_email); 242 free(info->committer_email);
243 free(info->subject); 243 free(info->subject);
244 free(info); 244 free(info);
245 return NULL; 245 return NULL;
246} 246}
247 247
248int hextoint(char c) 248int hextoint(char c)
249{ 249{
250 if (c >= 'a' && c <= 'f') 250 if (c >= 'a' && c <= 'f')
251 return 10 + c - 'a'; 251 return 10 + c - 'a';
252 else if (c >= 'A' && c <= 'F') 252 else if (c >= 'A' && c <= 'F')
253 return 10 + c - 'A'; 253 return 10 + c - 'A';
254 else if (c >= '0' && c <= '9') 254 else if (c >= '0' && c <= '9')
255 return c - '0'; 255 return c - '0';
256 else 256 else
257 return -1; 257 return -1;
258} 258}
259 259
260char *trim_end(const char *str, char c)
261{
262 int len;
263 char *s, *t;
264
265 if (str == NULL)
266 return NULL;
267 t = (char *)str;
268 len = strlen(t);
269 while(len > 0 && t[len - 1] == c)
270 len--;
271
272 if (len == 0)
273 return NULL;
274
275 c = t[len];
276 t[len] = '\0';
277 s = xstrdup(t);
278 t[len] = c;
279 return s;
280}
281
260void cgit_diff_tree_cb(struct diff_queue_struct *q, 282void cgit_diff_tree_cb(struct diff_queue_struct *q,
261 struct diff_options *options, void *data) 283 struct diff_options *options, void *data)
262{ 284{
263 int i; 285 int i;
264 286
265 for (i = 0; i < q->nr; i++) { 287 for (i = 0; i < q->nr; i++) {
266 if (q->queue[i]->status == 'U') 288 if (q->queue[i]->status == 'U')
267 continue; 289 continue;
268 ((filepair_fn)data)(q->queue[i]); 290 ((filepair_fn)data)(q->queue[i]);
269 } 291 }
270} 292}
271 293
272static int load_mmfile(mmfile_t *file, const unsigned char *sha1) 294static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
273{ 295{
274 enum object_type type; 296 enum object_type type;
275 297
276 if (is_null_sha1(sha1)) { 298 if (is_null_sha1(sha1)) {
277 file->ptr = (char *)""; 299 file->ptr = (char *)"";
278 file->size = 0; 300 file->size = 0;
279 } else { 301 } else {
280 file->ptr = read_sha1_file(sha1, &type, &file->size); 302 file->ptr = read_sha1_file(sha1, &type, &file->size);
281 } 303 }
282 return 1; 304 return 1;
283} 305}