Author: Lars Hjemli <hjemli@gmail.com>
Add basic log filtering This enables case-insensitive grep on logentris using the new search box Signed-off-by: Lars Hjemli <hjemli@gmail.com>
cgit.c | 7 ++++- cgit.h | 2 git.h | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui-log.c | 13 ++++++++--
diff --git a/cgit.c b/cgit.c index 277b849465044815e9c023faa4dbc093861b1d1f..fba97d7277ffc881136152c2a009533ecede07a1 100644 --- a/cgit.c +++ b/cgit.c @@ -24,12 +24,15 @@ return; } setenv("GIT_DIR", fmt("%s/%s", cgit_root, cgit_query_repo), 1); char *title = fmt("%s - %s", cgit_repo_name, cgit_repo_desc); + int show_search = 0; + if (cgit_query_page && !strcmp(cgit_query_page, "log")) + show_search = 1; cgit_print_docstart(title, item); - cgit_print_pageheader(title, 0); + cgit_print_pageheader(title, show_search); if (!cgit_query_page) { cgit_print_summary(); } else if (!strcmp(cgit_query_page, "log")) { - cgit_print_log(cgit_query_head, cgit_query_ofs, 100); + cgit_print_log(cgit_query_head, cgit_query_ofs, 100, cgit_query_search); } else if (!strcmp(cgit_query_page, "tree")) { cgit_print_tree(cgit_query_sha1); } else if (!strcmp(cgit_query_page, "commit")) { diff --git a/cgit.h b/cgit.h index e114a50d6d569ad0303ecd33628c3ccdd85368ce..249650e087a91c4cc8d1f8a9452b10bcebfcbb21 100644 --- a/cgit.h +++ b/cgit.h @@ -104,7 +104,7 @@ extern void cgit_print_pageheader(char *title, int show_search); extern void cgit_print_repolist(struct cacheitem *item); extern void cgit_print_summary(); -extern void cgit_print_log(const char *tip, int ofs, int cnt); +extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep); extern void cgit_print_view(const char *hex); extern void cgit_print_tree(const char *hex); extern void cgit_print_commit(const char *hex); diff --git a/git.h b/git.h index 922a16754a7e70ff5e07a76bfdaca0335a18010f..b1e482822788526220567f4d2f82ddb7a898d52c 100644 --- a/git.h +++ b/git.h @@ -31,7 +31,7 @@ #include#include <sys/types.h> #include <dirent.h> #include <time.h> - +#include <regex.h> /* On most systems <limits.h> would have given us this, but * not on some systems (e.g. GNU/Hurd). @@ -156,6 +156,72 @@ memset(hash, 0, 20); } +/* + * from git:grep.h + */ + +enum grep_pat_token { + GREP_PATTERN, + GREP_PATTERN_HEAD, + GREP_PATTERN_BODY, + GREP_AND, + GREP_OPEN_PAREN, + GREP_CLOSE_PAREN, + GREP_NOT, + GREP_OR, +}; + +enum grep_context { + GREP_CONTEXT_HEAD, + GREP_CONTEXT_BODY, +}; + +struct grep_pat { + struct grep_pat *next; + const char *origin; + int no; + enum grep_pat_token token; + const char *pattern; + regex_t regexp; +}; + +enum grep_expr_node { + GREP_NODE_ATOM, + GREP_NODE_NOT, + GREP_NODE_AND, + GREP_NODE_OR, +}; + +struct grep_opt { + struct grep_pat *pattern_list; + struct grep_pat **pattern_tail; + struct grep_expr *pattern_expression; + int prefix_length; + regex_t regexp; + unsigned linenum:1; + unsigned invert:1; + unsigned status_only:1; + unsigned name_only:1; + unsigned unmatch_name_only:1; + unsigned count:1; + unsigned word_regexp:1; + unsigned fixed:1; + unsigned all_match:1; +#define GREP_BINARY_DEFAULT 0 +#define GREP_BINARY_NOMATCH 1 +#define GREP_BINARY_TEXT 2 + unsigned binary:2; + unsigned extended:1; + unsigned relative:1; + unsigned pathname:1; + int regflags; + unsigned pre_context; + unsigned post_context; +}; + + +extern void compile_grep_patterns(struct grep_opt *opt); +extern void free_grep_patterns(struct grep_opt *opt); /* diff --git a/ui-log.c b/ui-log.c index f3b16e71e3a764ffc9a8c6e0485baa209b79d82d..c353b2ae6e82587bb535f836cea850a6c00306c8 100644 --- a/ui-log.c +++ b/ui-log.c @@ -32,19 +32,26 @@ cgit_free_commitinfo(info); } -void cgit_print_log(const char *tip, int ofs, int cnt) +void cgit_print_log(const char *tip, int ofs, int cnt, char *grep) { struct rev_info rev; struct commit *commit; - const char *argv[2] = {NULL, tip}; + const char *argv[3] = {NULL, tip, NULL}; + int argc = 2; int i; + if (grep) + argv[argc++] = fmt("--grep=%s", grep); init_revisions(&rev, NULL); rev.abbrev = DEFAULT_ABBREV; rev.commit_format = CMIT_FMT_DEFAULT; rev.verbose_header = 1; rev.show_root_diff = 0; - setup_revisions(2, argv, &rev, NULL); + setup_revisions(argc, argv, &rev, NULL); + if (rev.grep_filter) { + rev.grep_filter->regflags |= REG_ICASE; + compile_grep_patterns(rev.grep_filter); + } prepare_revision_walk(&rev); html("<h2>Log</h2>");