Download raw body.
[patch] filter log by author pattern
Hey, I had another idea that I could implement mostly by copy-pasting. Or pattern-matching if you will. Patch adds got log -a author-pattern to filter commits by author. By analogy with git log --author, hg log --user, rlog -w. (Feature is missing from fossil timeline, svn log.) Caveats vs. git: no matching -c for committer, no support for multiple instances of the option. Evan diff refs/remotes/origin/main refs/heads/main blob - 7825117a1854a2737ac5b841f83716ac3749d20a blob + b7db630ca8b7936bad98121bd820a684f96ae0fe --- got/got.1 +++ got/got.1 @@ -756,7 +756,7 @@ does not support negated ignore patterns prefixed with and gives no special significance to the location of path component separators, .Dq / , in a pattern. -.It Cm log Oo Fl b Oc Oo Fl c Ar commit Oc Oo Fl C Ar number Oc Oo Fl l Ar N Oc Oo Fl p Oc Oo Fl P Oc Oo Fl s Oc Oo Fl S Ar search-pattern Oc Oo Fl r Ar repository-path Oc Oo Fl R Oc Oo Fl x Ar commit Oc Op Ar path +.It Cm log Oo Fl a author-pattern Oc Oo Fl b Oc Oo Fl c Ar commit Oc Oo Fl C Ar number Oc Oo Fl l Ar N Oc Oo Fl p Oc Oo Fl P Oc Oo Fl s Oc Oo Fl S Ar search-pattern Oc Oo Fl r Ar repository-path Oc Oo Fl R Oc Oo Fl x Ar commit Oc Op Ar path Display history of a repository. If a .Ar path @@ -771,6 +771,9 @@ The options for .Cm got log are as follows: .Bl -tag -width Ds +.It Fl a Ar author-pattern +Display only commits where the author matches the extended regular expression +.Ar author-pattern . .It Fl b Display individual commits which were merged into the current branch from other branches. @@ -3067,7 +3070,8 @@ command must be used instead: .Xr tog 1 , .Xr git-repository 5 , .Xr got-worktree 5 , -.Xr got.conf 5 +.Xr got.conf 5 , +.Xr re_format 7 .Sh AUTHORS .An Stefan Sperling Aq Mt stsp@openbsd.org .An Martin Pieuchot Aq Mt mpi@openbsd.org blob - 28ba9a46f202c773426d431a909c5dec6304d3ca blob + c7cafd21175485151825a8b992ca560411e03649 --- got/got.c +++ got/got.c @@ -4011,14 +4011,16 @@ done: static const struct got_error * print_commits(struct got_object_id *root_id, struct got_object_id *end_id, struct got_repository *repo, const char *path, int show_changed_paths, - int show_patch, const char *search_pattern, int diff_context, int limit, - int log_branches, int reverse_display_order, + int show_patch, const char *search_pattern, const char *author_pattern, + int diff_context, int limit, int log_branches, int reverse_display_order, struct got_reflist_object_id_map *refs_idmap, int one_line, FILE *tmpfile) { const struct got_error *err; struct got_commit_graph *graph; - regex_t regex; + regex_t author_regex; + const char *author; + regex_t search_regex; int have_match; struct got_object_id_queue reversed_commits; struct got_object_qid *qid; @@ -4029,10 +4031,14 @@ print_commits(struct got_object_id *root_id, struct go STAILQ_INIT(&reversed_commits); TAILQ_INIT(&changed_paths); - if (search_pattern && regcomp(®ex, search_pattern, + if (search_pattern && regcomp(&search_regex, search_pattern, REG_EXTENDED | REG_NOSUB | REG_NEWLINE)) return got_error_msg(GOT_ERR_REGEX, search_pattern); + if (author_pattern && regcomp(&author_regex, author_pattern, + REG_EXTENDED | REG_NOSUB | REG_NEWLINE)) + return got_error_msg(GOT_ERR_REGEX, author_pattern); + err = got_commit_graph_open(&graph, path, !log_branches); if (err) return err; @@ -4060,6 +4066,13 @@ print_commits(struct got_object_id *root_id, struct go if (err) break; + if (author_pattern) { + author = got_object_commit_get_author(commit); + + if (regexec(&author_regex, author, 0, NULL, 0) != 0) + continue; + } + if (show_changed_paths && !reverse_display_order) { err = get_changed_paths(&changed_paths, commit, repo); if (err) @@ -4067,17 +4080,17 @@ print_commits(struct got_object_id *root_id, struct go } if (search_pattern) { - err = match_logmsg(&have_match, id, commit, ®ex); + err = match_logmsg(&have_match, id, commit, &search_regex); if (err) { got_object_commit_close(commit); break; } if (have_match == 0 && show_changed_paths) match_changed_paths(&have_match, - &changed_paths, ®ex); + &changed_paths, &search_regex); if (have_match == 0 && show_patch) { err = match_patch(&have_match, commit, id, - path, diff_context, repo, ®ex, + path, diff_context, repo, &search_regex, tmpfile); if (err) break; @@ -4160,7 +4173,9 @@ done: } got_pathlist_free(&changed_paths); if (search_pattern) - regfree(®ex); + regfree(&search_regex); + if (author_pattern) + regfree(&author_regex); got_commit_graph_close(graph); return err; } @@ -4168,9 +4183,10 @@ done: __dead static void usage_log(void) { - fprintf(stderr, "usage: %s log [-b] [-p] [-P] [-s] [-c commit] " - "[-C number] [ -l N ] [-x commit] [-S search-pattern] " - "[-r repository-path] [-R] [path]\n", getprogname()); + fprintf(stderr, "usage: %s log [-a author-pattern] [-b] [-p] [-P] " + "[-s] [-c commit] [-C number] [ -l N ] [-x commit] " + "[-S search-pattern] [-r repository-path] [-R] [path]\n", + getprogname()); exit(1); } @@ -4199,7 +4215,7 @@ cmd_log(int argc, char *argv[]) struct got_object_id *start_id = NULL, *end_id = NULL; char *repo_path = NULL, *path = NULL, *cwd = NULL, *in_repo_path = NULL; const char *start_commit = NULL, *end_commit = NULL; - const char *search_pattern = NULL; + const char *search_pattern = NULL, *author_pattern = NULL; int diff_context = -1, ch; int show_changed_paths = 0, show_patch = 0, limit = 0, log_branches = 0; int reverse_display_order = 0, one_line = 0; @@ -4219,7 +4235,7 @@ cmd_log(int argc, char *argv[]) limit = get_default_log_limit(); - while ((ch = getopt(argc, argv, "bpPc:C:l:r:RsS:x:")) != -1) { + while ((ch = getopt(argc, argv, "a:bpPc:C:l:r:RsS:x:")) != -1) { switch (ch) { case 'p': show_patch = 1; @@ -4262,6 +4278,9 @@ cmd_log(int argc, char *argv[]) case 'S': search_pattern = optarg; break; + case 'a': + author_pattern = optarg; + break; case 'x': end_commit = optarg; break; @@ -4407,9 +4426,9 @@ cmd_log(int argc, char *argv[]) } error = print_commits(start_id, end_id, repo, path ? path : "", - show_changed_paths, show_patch, search_pattern, diff_context, - limit, log_branches, reverse_display_order, refs_idmap, one_line, - tmpfile); + show_changed_paths, show_patch, search_pattern, author_pattern, + diff_context, limit, log_branches, reverse_display_order, + refs_idmap, one_line, tmpfile); done: free(path); free(repo_path);
[patch] filter log by author pattern