diff options
| -rw-r--r-- | cgit.c | 7 | ||||
| -rw-r--r-- | cgit.h | 2 | ||||
| -rw-r--r-- | git.h | 68 | ||||
| -rw-r--r-- | ui-log.c | 13 | 
4 files changed, 83 insertions, 7 deletions
| @@ -24,12 +24,15 @@ static void cgit_print_repo_page(struct cacheitem *item)  	}  	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")) { @@ -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); @@ -31,7 +31,7 @@  #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 @@ static inline void hashclr(unsigned char *hash)  } +/* + * 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);  /* @@ -32,19 +32,26 @@ void print_commit(struct commit *commit)  } -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>"); | 
