|
diff --git a/ui-log.c b/ui-log.c index b9771fa..27f5a1a 100644 --- a/ ui-log.c+++ b/ ui-log.c |
|
@@ -11,2 +11,3 @@ |
11 | #include "ui-shared.h" |
11 | #include "ui-shared.h" |
| |
12 | #include "vector.h" |
12 | |
13 | |
@@ -150,2 +151,24 @@ static const char *disambiguate_ref(const char *ref) |
150 | |
151 | |
| |
152 | static 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 | |
151 | void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, |
174 | void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, |
@@ -155,5 +178,8 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern |
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 | |
@@ -161,11 +187,28 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern |
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 | } |
@@ -173,5 +216,11 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern |
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); |
@@ -181,3 +230,3 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern |
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); |
|