summaryrefslogtreecommitdiffabout
path: root/ui-log.c
authorLars Hjemli <hjemli@gmail.com>2010-11-09 19:53:36 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-11-09 23:22:41 (UTC)
commita3c3c04bdf8245b662f9e91502e8b6bd51682da3 (patch) (unidiff)
treec134652fc10f1ea5297130c5a6b56c80696308a0 /ui-log.c
parent958a95b37891098133369e835a2ab687e0dfa9dc (diff)
downloadcgit-a3c3c04bdf8245b662f9e91502e8b6bd51682da3.zip
cgit-a3c3c04bdf8245b662f9e91502e8b6bd51682da3.tar.gz
cgit-a3c3c04bdf8245b662f9e91502e8b6bd51682da3.tar.bz2
ui-log.c: improve handling of range-search argument
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'ui-log.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-log.c71
1 files changed, 60 insertions, 11 deletions
diff --git a/ui-log.c b/ui-log.c
index b9771fa..27f5a1a 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -1,23 +1,24 @@
1/* ui-log.c: functions for log output 1/* ui-log.c: functions for log output
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h" 11#include "ui-shared.h"
12#include "vector.h"
12 13
13int files, add_lines, rem_lines; 14int files, add_lines, rem_lines;
14 15
15void count_lines(char *line, int size) 16void count_lines(char *line, int size)
16{ 17{
17 if (size <= 0) 18 if (size <= 0)
18 return; 19 return;
19 20
20 if (line[0] == '+') 21 if (line[0] == '+')
21 add_lines++; 22 add_lines++;
22 23
23 else if (line[0] == '-') 24 else if (line[0] == '-')
@@ -139,56 +140,104 @@ void print_commit(struct commit *commit)
139static const char *disambiguate_ref(const char *ref) 140static const char *disambiguate_ref(const char *ref)
140{ 141{
141 unsigned char sha1[20]; 142 unsigned char sha1[20];
142 const char *longref; 143 const char *longref;
143 144
144 longref = fmt("refs/heads/%s", ref); 145 longref = fmt("refs/heads/%s", ref);
145 if (get_sha1(longref, sha1) == 0) 146 if (get_sha1(longref, sha1) == 0)
146 return longref; 147 return longref;
147 148
148 return ref; 149 return ref;
149} 150}
150 151
152static char *next_token(char **src)
153{
154 char *result;
155
156 if (!src || !*src)
157 return NULL;
158 while (isspace(**src))
159 (*src)++;
160 if (!**src)
161 return NULL;
162 result = *src;
163 while (**src) {
164 if (isspace(**src)) {
165 **src = '\0';
166 (*src)++;
167 break;
168 }
169 (*src)++;
170 }
171 return result;
172}
173
151void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, 174void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern,
152 char *path, int pager) 175 char *path, int pager)
153{ 176{
154 struct rev_info rev; 177 struct rev_info rev;
155 struct commit *commit; 178 struct commit *commit;
156 const char *argv[] = {NULL, NULL, NULL, NULL, NULL}; 179 struct vector vec = VECTOR_INIT(char *);
157 int argc = 2;
158 int i, columns = 3; 180 int i, columns = 3;
181 char *arg;
182
183 /* First argv is NULL */
184 vector_push(&vec, NULL, 0);
159 185
160 if (!tip) 186 if (!tip)
161 tip = ctx.qry.head; 187 tip = ctx.qry.head;
162 188 tip = disambiguate_ref(tip);
163 argv[1] = disambiguate_ref(tip); 189 vector_push(&vec, &tip, 0);
164 190
165 if (grep && pattern && *pattern) { 191 if (grep && pattern && *pattern) {
192 pattern = xstrdup(pattern);
166 if (!strcmp(grep, "grep") || !strcmp(grep, "author") || 193 if (!strcmp(grep, "grep") || !strcmp(grep, "author") ||
167 !strcmp(grep, "committer")) 194 !strcmp(grep, "committer")) {
168 argv[argc++] = fmt("--%s=%s", grep, pattern); 195 arg = fmt("--%s=%s", grep, pattern);
169 if (!strcmp(grep, "range")) 196 vector_push(&vec, &arg, 0);
170 argv[1] = pattern; 197 }
198 if (!strcmp(grep, "range")) {
199 /* Split the pattern at whitespace and add each token
200 * as a revision expression. Do not accept other
201 * rev-list options. Also, replace the previously
202 * pushed tip (it's no longer relevant).
203 */
204 vec.count--;
205 while ((arg = next_token(&pattern))) {
206 if (*arg == '-') {
207 fprintf(stderr, "Bad range expr: %s\n",
208 arg);
209 break;
210 }
211 vector_push(&vec, &arg, 0);
212 }
213 }
171 } 214 }
172 215
173 if (path) { 216 if (path) {
174 argv[argc++] = "--"; 217 arg = "--";
175 argv[argc++] = path; 218 vector_push(&vec, &arg, 0);
219 vector_push(&vec, &path, 0);
176 } 220 }
221
222 /* Make sure the vector is NULL-terminated */
223 vector_push(&vec, NULL, 0);
224 vec.count--;
225
177 init_revisions(&rev, NULL); 226 init_revisions(&rev, NULL);
178 rev.abbrev = DEFAULT_ABBREV; 227 rev.abbrev = DEFAULT_ABBREV;
179 rev.commit_format = CMIT_FMT_DEFAULT; 228 rev.commit_format = CMIT_FMT_DEFAULT;
180 rev.verbose_header = 1; 229 rev.verbose_header = 1;
181 rev.show_root_diff = 0; 230 rev.show_root_diff = 0;
182 setup_revisions(argc, argv, &rev, NULL); 231 setup_revisions(vec.count, vec.data, &rev, NULL);
183 load_ref_decorations(DECORATE_FULL_REFS); 232 load_ref_decorations(DECORATE_FULL_REFS);
184 rev.show_decorations = 1; 233 rev.show_decorations = 1;
185 rev.grep_filter.regflags |= REG_ICASE; 234 rev.grep_filter.regflags |= REG_ICASE;
186 compile_grep_patterns(&rev.grep_filter); 235 compile_grep_patterns(&rev.grep_filter);
187 prepare_revision_walk(&rev); 236 prepare_revision_walk(&rev);
188 237
189 if (pager) 238 if (pager)
190 html("<table class='list nowrap'>"); 239 html("<table class='list nowrap'>");
191 240
192 html("<tr class='nohover'><th class='left'>Age</th>" 241 html("<tr class='nohover'><th class='left'>Age</th>"
193 "<th class='left'>Commit message"); 242 "<th class='left'>Commit message");
194 if (pager) { 243 if (pager) {