From: Junio C Hamano Date: Fri, 7 Apr 2006 09:12:48 +0000 (-0700) Subject: Merge branch 'jc/blame' into next X-Git-Tag: v1.3.0-rc4~33 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/dd4bca39eccd01d93fe7916df3b8cb6f68629211?ds=inline;hp=-c Merge branch 'jc/blame' into next * jc/blame: blame -S Match ofs/cnt types in diff interface. --- dd4bca39eccd01d93fe7916df3b8cb6f68629211 diff --combined blame.c index a5964107cb,75cffd8a3f..6730b10b11 --- a/blame.c +++ b/blame.c @@@ -703,11 -703,30 +703,30 @@@ static void* topo_getter(struct commit return util->topo_data; } + static int read_ancestry(const char *graft_file, + unsigned char **start_sha1) + { + FILE *fp = fopen(graft_file, "r"); + char buf[1024]; + if (!fp) + return -1; + while (fgets(buf, sizeof(buf), fp)) { + /* The format is just "Commit Parent1 Parent2 ...\n" */ + int len = strlen(buf); + struct commit_graft *graft = read_graft_line(buf, len); + register_commit_graft(graft, 0); + if (!*start_sha1) + *start_sha1 = graft->sha1; + } + fclose(fp); + return 0; + } + int main(int argc, const char **argv) { int i; struct commit *initial = NULL; - unsigned char sha1[20]; + unsigned char sha1[20], *sha1_p = NULL; const char *filename = NULL, *commit = NULL; char filename_buf[256]; @@@ -741,6 -760,14 +760,14 @@@ !strcmp(argv[i], "--compability")) { compability = 1; continue; + } else if(!strcmp(argv[i], "-S")) { + if (i + 1 < argc && + !read_ancestry(argv[i + 1], &sha1_p)) { + compability = 1; + i++; + continue; + } + usage(blame_usage); } else if(!strcmp(argv[i], "--")) { options = 0; continue; @@@ -762,7 -789,9 +789,9 @@@ if(!filename) usage(blame_usage); - if(!commit) + if (commit && sha1_p) + usage(blame_usage); + else if(!commit) commit = "HEAD"; if(prefix) @@@ -771,9 -800,12 +800,12 @@@ strcpy(filename_buf, filename); filename = filename_buf; - if (get_sha1(commit, sha1)) - die("get_sha1 failed, commit '%s' not found", commit); - start_commit = lookup_commit_reference(sha1); + if (!sha1_p) { + if (get_sha1(commit, sha1)) + die("get_sha1 failed, commit '%s' not found", commit); + sha1_p = sha1; + } + start_commit = lookup_commit_reference(sha1_p); get_util(start_commit)->pathname = filename; if (fill_util_info(start_commit)) { printf("%s not found in %s\n", filename, commit); @@@ -787,7 -819,6 +819,7 @@@ rev.prune_fn = simplify_commit; rev.topo_setter = topo_setter; rev.topo_getter = topo_getter; + rev.parents = 1; rev.limited = 1; commit_list_insert(start_commit, &rev.commits);