ui-log.c: improve handling of range-search argument

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2010-11-09 20:53:36 +01:00
parent 958a95b378
commit a3c3c04bdf

View File

@ -9,6 +9,7 @@
#include "cgit.h" #include "cgit.h"
#include "html.h" #include "html.h"
#include "ui-shared.h" #include "ui-shared.h"
#include "vector.h"
int files, add_lines, rem_lines; int files, add_lines, rem_lines;
@ -148,38 +149,86 @@ static const char *disambiguate_ref(const char *ref)
return ref; return ref;
} }
static char *next_token(char **src)
{
char *result;
if (!src || !*src)
return NULL;
while (isspace(**src))
(*src)++;
if (!**src)
return NULL;
result = *src;
while (**src) {
if (isspace(**src)) {
**src = '\0';
(*src)++;
break;
}
(*src)++;
}
return result;
}
void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern,
char *path, int pager) char *path, int pager)
{ {
struct rev_info rev; struct rev_info rev;
struct commit *commit; struct commit *commit;
const char *argv[] = {NULL, NULL, NULL, NULL, NULL}; struct vector vec = VECTOR_INIT(char *);
int argc = 2;
int i, columns = 3; int i, columns = 3;
char *arg;
/* First argv is NULL */
vector_push(&vec, NULL, 0);
if (!tip) if (!tip)
tip = ctx.qry.head; tip = ctx.qry.head;
tip = disambiguate_ref(tip);
argv[1] = disambiguate_ref(tip); vector_push(&vec, &tip, 0);
if (grep && pattern && *pattern) { if (grep && pattern && *pattern) {
pattern = xstrdup(pattern);
if (!strcmp(grep, "grep") || !strcmp(grep, "author") || if (!strcmp(grep, "grep") || !strcmp(grep, "author") ||
!strcmp(grep, "committer")) !strcmp(grep, "committer")) {
argv[argc++] = fmt("--%s=%s", grep, pattern); arg = fmt("--%s=%s", grep, pattern);
if (!strcmp(grep, "range")) vector_push(&vec, &arg, 0);
argv[1] = pattern; }
if (!strcmp(grep, "range")) {
/* Split the pattern at whitespace and add each token
* as a revision expression. Do not accept other
* rev-list options. Also, replace the previously
* pushed tip (it's no longer relevant).
*/
vec.count--;
while ((arg = next_token(&pattern))) {
if (*arg == '-') {
fprintf(stderr, "Bad range expr: %s\n",
arg);
break;
}
vector_push(&vec, &arg, 0);
}
}
} }
if (path) { if (path) {
argv[argc++] = "--"; arg = "--";
argv[argc++] = path; vector_push(&vec, &arg, 0);
vector_push(&vec, &path, 0);
} }
/* Make sure the vector is NULL-terminated */
vector_push(&vec, NULL, 0);
vec.count--;
init_revisions(&rev, NULL); init_revisions(&rev, NULL);
rev.abbrev = DEFAULT_ABBREV; rev.abbrev = DEFAULT_ABBREV;
rev.commit_format = CMIT_FMT_DEFAULT; rev.commit_format = CMIT_FMT_DEFAULT;
rev.verbose_header = 1; rev.verbose_header = 1;
rev.show_root_diff = 0; rev.show_root_diff = 0;
setup_revisions(argc, argv, &rev, NULL); setup_revisions(vec.count, vec.data, &rev, NULL);
load_ref_decorations(DECORATE_FULL_REFS); load_ref_decorations(DECORATE_FULL_REFS);
rev.show_decorations = 1; rev.show_decorations = 1;
rev.grep_filter.regflags |= REG_ICASE; rev.grep_filter.regflags |= REG_ICASE;