Hi, On Sat, 17 Feb 2007, Junio C Hamano wrote: > Johannes Schindelin <Johannes.Schindelin@xxxxxx> writes: > > > If you want to know which revisions contained a certain version > > of a file, just say > > > > git name-rev --file <filename> > > > > which will read the file, and give you a list of revisions > > containing a file with the same contents. If <filename> is "-", > > it will read the contents from stdin. Of course, this is a really > > expensive operation. > > I expected this to take arbitrary object name and let the caller > to do 'hash-object', so that you could also find a certain tree, > not just blob. That was easier than I feared. Here's a patch on top of 2/2: -- [PATCH] name-rev --file: also accept SHA1 of blobs and trees This allows you to say git name-rev --file master:t/ to see in which revisions the whole directory "t" is identical to what it is in "master". The first hunk is a bugfix for a potential segv. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- builtin-name-rev.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/builtin-name-rev.c b/builtin-name-rev.c index f08b065..e4addc7 100644 --- a/builtin-name-rev.c +++ b/builtin-name-rev.c @@ -43,7 +43,7 @@ struct object_name { static struct object_name *name_file(struct tree *tree) { static struct object_name null_name = { 0, NULL }; - struct object_name *name; + struct object_name *name = NULL; struct tree_desc desc; struct name_entry entry; @@ -141,7 +141,8 @@ copy_data: return; if (file_sha1 && !(commit->object.flags & CONTAINS_FILE) && - (file_name = name_file(commit->tree))) { + ((file_name = name_file(commit->tree)) || + !hashcmp(commit->tree->object.sha1, file_sha1))) { commit->object.flags |= CONTAINS_FILE; add_object_array(&commit->object, NULL, &file_commits); } @@ -270,7 +271,8 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix) } else if (!strcmp(*argv, "--file")) { if (argc != 2) usage(name_rev_usage); - if (get_file(argv[1])) + if (get_file(argv[1]) && + get_sha1(argv[1], file_sha1)) die("Could not read '%s'", argv[1]); cutoff = 0; argc = 1; @@ -313,7 +315,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix) printf("%s", rev_name->tip_name); if (rev_name->generation) printf("^%d", rev_name->generation); - printf(":%s\n", obj_name->name); + printf(":%s\n", obj_name ? obj_name->name : ""); } return 0; } -- 1.5.0.2139.gdafc9-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html