Re: speeding up cg-log -u
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:41:57
quoted
quoted
quoted
quoted
"ZB" == Zack Brown [off-list ref] writes:
ZB> Would it be faster to handle this on the git side, telling git to only ZB> retrieve the logs that match the specified query? If feasible, this might ZB> speed up various web interfaces into git repositories. Here are two places you can add a simple hook. Implementation of author_match() function is left as an exercise for you ;-). Let us know if you get speed improvements, please. Signed-off-by: Junio C Hamano <redacted> --- $ jit-diff # - 9: (Anonymous snapshot) # + (working tree)
--- a/cache.h
+++ b/cache.h@@ -178,6 +178,7 @@ extern void *read_object_with_reference( const char *show_date(unsigned long time, int timezone); void parse_date(char *date, char *buf, int bufsize); void datestamp(char *buf, int bufsize); +int author_match(struct commit *, const char *); static inline void *xmalloc(int size) { --- a/rev-list.c +++ b/rev-list.c
@@ -11,6 +11,7 @@ int main(int argc, char **argv) unsigned long max_age = -1; unsigned long min_age = -1; int max_count = -1; + const char *author = NULL; for (i = 1 ; i < argc; i++) { char *arg = argv[i];
@@ -21,6 +22,8 @@ int main(int argc, char **argv) max_age = atoi(arg + 10); } else if (!strncmp(arg, "--min-age=", 10)) { min_age = atoi(arg + 10); + } else if (!strncmp(arg, "--author=", 9)) { + author = arg + 9; } else { commit_arg = arg; }
@@ -28,6 +31,7 @@ int main(int argc, char **argv) if (!commit_arg || get_sha1(commit_arg, sha1)) usage("usage: rev-list [OPTION] commit-id\n" + " --author=author\n" " --max-count=nr\n" " --max-age=epoch\n" " --min-age=epoch\n");
@@ -44,6 +48,8 @@ int main(int argc, char **argv) continue; if (max_age != -1 && (commit->date < max_age)) break; + if (!author_match(commit, author)) + continue; if (max_count != -1 && !max_count--) break; printf("%s\n", sha1_to_hex(commit->object.sha1)); --- a/rev-tree.c +++ b/rev-tree.c
@@ -64,7 +64,7 @@ void process_commit(unsigned char *sha1) } /* - * Usage: rev-tree [--edges] [--cache <cache-file>] <commit-id> [<commit-id2>] + * Usage: rev-tree [--edges] [--author <author>] [--cache <cache-file>] <commit-id> [<commit-id2>] * * The cache-file can be quite important for big trees. This is an * expensive operation if you have to walk the whole chain of
@@ -75,6 +75,7 @@ int main(int argc, char **argv) int i; int nr = 0; unsigned char sha1[MAX_COMMITS][20]; + const char *author = NULL; /* * First - pick up all the revisions we can (both from
@@ -83,6 +84,11 @@ int main(int argc, char **argv) for (i = 1; i < argc ; i++) { char *arg = argv[i]; + if (!strcmp(arg, "--author")) { + author = argv[++i]; + continue; + } + if (!strcmp(arg, "--cache")) { read_cache_file(argv[++i]); continue;
@@ -98,7 +104,7 @@ int main(int argc, char **argv) basemask |= 1<<nr; } if (nr >= MAX_COMMITS || get_sha1(arg, sha1[nr])) - usage("rev-tree [--edges] [--cache <cache-file>] <commit-id> [<commit-id>]"); + usage("rev-tree [--edges] [--author <author>] [--cache <cache-file>] <commit-id> [<commit-id>]"); process_commit(sha1[nr]); nr++; }
@@ -125,6 +131,9 @@ int main(int argc, char **argv) if (!interesting(commit)) continue; + if (!author_match(commit, author)) + continue; + printf("%lu %s:%d", commit->date, sha1_to_hex(obj->sha1), obj->flags); p = commit->parents;