Re: [PATCH 2/2] Teach name-rev to identify revisions containing a certain blob

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]