aboutsummaryrefslogtreecommitdiff
path: root/blame.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-04-06 23:58:51 -0700
committerJunio C Hamano <junkio@cox.net>2006-04-07 01:59:51 -0700
commit5040f17eba15504bad66b14a645bddd9b015ebb7 (patch)
tree3c83b41a4d886cdd758578d57551b9b3cf4a75b1 /blame.c
parenta0fd31463b8b391ff940e97706ba064608feb1e1 (diff)
downloadgit-5040f17eba15504bad66b14a645bddd9b015ebb7.tar.gz
git-5040f17eba15504bad66b14a645bddd9b015ebb7.tar.xz
blame -S <ancestry-file>
This adds the -S <ancestry-file> option to blame, which is needed by the CVS server emulation. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'blame.c')
-rw-r--r--blame.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/blame.c b/blame.c
index 1ee0d323c..75cffd8a3 100644
--- a/blame.c
+++ b/blame.c
@@ -703,11 +703,30 @@ static void* topo_getter(struct commit* c)
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 @@ int main(int argc, const char **argv)
!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 @@ int main(int argc, const char **argv)
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 @@ int main(int argc, const char **argv)
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);