commit 82f6abb8b1a22fe62d2a8a8d0cdbb73c9d85fcda from: Stefan Sperling date: Wed Aug 14 21:37:07 2019 UTC make 'got blame' show committer names commit - 7ef28ff8dd61cbf38f88784ea8c11e373757985f commit + 82f6abb8b1a22fe62d2a8a8d0cdbb73c9d85fcda blob - 6aaab256399b6996c57b843dcf33ab27058b640b blob + 0a9f0472c3328f4c1e873ed61b40c7ea7ef1144a --- got/got.c +++ got/got.c @@ -2157,6 +2157,7 @@ usage_blame(void) struct blame_line { int annotated; char *id_str; + char *committer; }; struct blame_cb_args { @@ -2166,6 +2167,7 @@ struct blame_cb_args { int lineno_cur; off_t *line_offsets; FILE *f; + struct got_repository *repo; }; static const struct got_error * @@ -2174,8 +2176,9 @@ blame_cb(void *arg, int nlines, int lineno, struct got const struct got_error *err = NULL; struct blame_cb_args *a = arg; struct blame_line *bline; - char *line = NULL, *nl; + char *line = NULL; size_t linesize = 0; + struct got_commit_object *commit = NULL; off_t offset; if (nlines != a->nlines || @@ -2192,34 +2195,62 @@ blame_cb(void *arg, int nlines, int lineno, struct got err = got_object_id_str(&bline->id_str, id); if (err) return err; + + err = got_object_open_as_commit(&commit, a->repo, id); + if (err) + goto done; + + bline->committer = strdup(got_object_commit_get_committer(commit)); + if (bline->committer == NULL) { + err = got_error_from_errno("strdup"); + goto done; + } bline->annotated = 1; /* Print lines annotated so far. */ bline = &a->lines[a->lineno_cur - 1]; if (!bline->annotated) - return NULL; + goto done; offset = a->line_offsets[a->lineno_cur - 1]; - if (fseeko(a->f, offset, SEEK_SET) == -1) - return got_error_from_errno("fseeko"); + if (fseeko(a->f, offset, SEEK_SET) == -1) { + err = got_error_from_errno("fseeko"); + goto done; + } while (bline->annotated) { + char *smallerthan, *at, *nl, *committer; + size_t len; + if (getline(&line, &linesize, a->f) == (ssize_t)-1) { if (ferror(a->f)) err = got_error_from_errno("getline"); break; } + + committer = bline->committer; + smallerthan = strchr(committer, '<'); + if (smallerthan && smallerthan[1] != '\0') + committer = smallerthan + 1; + at = strchr(committer, '@'); + if (at) + *at = '\0'; + len = strlen(committer); + if (len >= 9) + committer[8] = '\0'; nl = strchr(line, '\n'); if (nl) *nl = '\0'; - printf("%.*d) %.8s %s\n", a->nlines_prec, a->lineno_cur, - bline->id_str, line); + printf("%.*d) %.8s %-8s %s\n", a->nlines_prec, a->lineno_cur, + bline->id_str, committer, line); a->lineno_cur++; bline = &a->lines[a->lineno_cur - 1]; } - +done: + if (commit) + got_object_commit_close(commit); free(line); return err; } @@ -2373,15 +2404,14 @@ cmd_blame(int argc, char *argv[]) error = got_error_from_errno("calloc"); goto done; } - bca.lineno_cur = 1; - bca.nlines_prec = 0; i = bca.nlines; while (i > 0) { i /= 10; bca.nlines_prec++; } + bca.repo = repo; error = got_blame_incremental(in_repo_path, commit_id, repo, blame_cb, &bca); @@ -2406,6 +2436,7 @@ done: for (i = 0; i < bca.nlines; i++) { struct blame_line *bline = &bca.lines[i]; free(bline->id_str); + free(bline->committer); } free(bca.lines); free(bca.line_offsets); blob - b3f34a68bb9a7524660dc7ba0f73911918e96c8b blob + ffd945039f1cf941bca4283e1957f71c3439a34a --- regress/cmdline/blame.sh +++ regress/cmdline/blame.sh @@ -44,9 +44,9 @@ function test_blame_basic { local short_commit2=`trim_obj_id 32 $commit2` local short_commit3=`trim_obj_id 32 $commit3` - echo "1) $short_commit1 1" > $testroot/stdout.expected - echo "2) $short_commit2 2" >> $testroot/stdout.expected - echo "3) $short_commit3 3" >> $testroot/stdout.expected + echo "1) $short_commit1 $GOT_AUTHOR_8 1" > $testroot/stdout.expected + echo "2) $short_commit2 $GOT_AUTHOR_8 2" >> $testroot/stdout.expected + echo "3) $short_commit3 $GOT_AUTHOR_8 3" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret="$?" @@ -86,8 +86,8 @@ function test_blame_tag { local short_commit1=`trim_obj_id 32 $commit1` local short_commit2=`trim_obj_id 32 $commit2` - echo "1) $short_commit1 1" > $testroot/stdout.expected - echo "2) $short_commit2 2" >> $testroot/stdout.expected + echo "1) $short_commit1 $GOT_AUTHOR_8 1" > $testroot/stdout.expected + echo "2) $short_commit2 $GOT_AUTHOR_8 2" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret="$?" @@ -115,7 +115,7 @@ function test_blame_file_single_line { local short_commit1=`trim_obj_id 32 $commit1` - echo "1) $short_commit1 1" > $testroot/stdout.expected + echo "1) $short_commit1 $GOT_AUTHOR_8 1" > $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret="$?" @@ -143,7 +143,7 @@ function test_blame_file_single_line_no_newline { local short_commit1=`trim_obj_id 32 $commit1` - echo "1) $short_commit1 1" > $testroot/stdout.expected + echo "1) $short_commit1 $GOT_AUTHOR_8 1" > $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret="$?" blob - 75546009c46e4564fdad73f3d119abc3af74af62 blob + 296735a35356574b58457b3b21280f4faf2bf2ab --- regress/cmdline/common.sh +++ regress/cmdline/common.sh @@ -15,6 +15,7 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. export GOT_AUTHOR="Flan Hacker " +export GOT_AUTHOR_8="flan_hac" export GOT_LOG_DEFAULT_LIMIT=0 export MALLOC_OPTIONS=S