(fixed) [PATCH 1/4] Accept commit in some places when tree is needed.

2005-04-20 Thread Junio C Hamano
cover-paragraph
_BLUSH_  

The 1/4 in the series was a buggy one I sent by mistake.  Please
replace it with this fixed one.  The other three are OK.

BTW, do you have a preferred patch-mail convention to mark the
cover paragraph like this to be excluded from the commit log,
like the three-dash one you mentioned to exclude the tail of
the message?
/cover-paragraph

Similar to diff-cache which was introduced recently, when the
intent is obvious we should accept commit ID when tree ID is
required.  This patch lifts the tree-from-tree-or-commit logic
from diff-cache.c and moves it to sha1_file.c, which is a common
library source for the SHA1 storage part.

Signed-off-by: Junio C Hamano [EMAIL PROTECTED]
---

 cache.h  |1 +
 diff-cache.c |   19 ++-
 sha1_file.c  |   29 +
 3 files changed, 32 insertions(+), 17 deletions(-)

--- a/cache.h
+++ b/cache.h
@@ -124,5 +124,6 @@ extern void die(const char *err, ...);
 extern int error(const char *err, ...);
 
 extern int cache_name_compare(const char *name1, int len1, const char *name2, 
int len2);
+extern void *tree_from_tree_or_commit(const unsigned char *sha1, char *type, 
unsigned long *size);
 
 #endif /* CACHE_H */
--- a/diff-cache.c
+++ b/diff-cache.c
@@ -245,23 +245,8 @@ int main(int argc, char **argv)
if (argc != 2 || get_sha1_hex(argv[1], tree_sha1))
usage(diff-cache [-r] [-z] tree sha1);
 
-   tree = read_sha1_file(tree_sha1, type, size);
+   tree = tree_from_tree_or_commit(tree_sha1, type, size);
if (!tree)
-   die(bad tree object %s, argv[1]);
-
-   /* We allow people to feed us a commit object, just because we're nice 
*/
-   if (!strcmp(type, commit)) {
-   /* tree sha1 is always at offset 5 (tree ) */
-   if (get_sha1_hex(tree + 5, tree_sha1))
-   die(bad commit object %s, argv[1]);
-   free(tree);
-   tree = read_sha1_file(tree_sha1, type, size);   
-   if (!tree)
-   die(unable to read tree object %s, 
sha1_to_hex(tree_sha1));
-   }
-
-   if (strcmp(type, tree))
-   die(bad tree object %s (%s), sha1_to_hex(tree_sha1), type);
-
+   die(cannot get tree object from %s, argv[1]);
return diff_cache(tree, size, active_cache, active_nr, );
 }
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -245,3 +245,32 @@ int write_sha1_buffer(const unsigned cha
close(fd);
return 0;
 }
+
+void *tree_from_tree_or_commit(const unsigned char *sha1, char *type,
+  unsigned long *size)
+{
+   void *tree = read_sha1_file(sha1, type, size);
+   if (!tree)
+   return tree;
+
+   /* We allow people to feed us a commit object,
+* just because we're nice.
+*/
+   if (!strcmp(type, commit)) {
+   /* tree sha1 is always at offset 5 (tree ) */
+   char tree_sha1[20];
+   if (get_sha1_hex(tree + 5, tree_sha1)) {
+   free(tree);
+   return NULL;
+   }
+   free(tree);
+   tree = read_sha1_file(tree_sha1, type, size);
+   if (!tree)
+   return NULL;
+   }
+   if (strcmp(type , tree)) {
+   free(tree);
+   return NULL;
+   }
+   return tree;
+}

-
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/4] Accept commit in some places when tree is needed.

2005-04-20 Thread Linus Torvalds


On Tue, 19 Apr 2005, Junio C Hamano wrote:
 
 This patch lifts the tree-from-tree-or-commit logic from
 diff-cache.c and moves it to sha1_file.c, which is a common
 library source for the SHA1 storage part.

I don't think that's a good interface. It changes the sha1 passed into it: 
that may actually be nice, since you may want to know what it changed to, 
but I think you'd want to have that as an (optional) separate 
sha1_result parameter. 

Also, the type or size things make no sense to have as a parameter 
at all.

IOW, it was fine when it was an internal hacky thing in diff-cache, but 
once it's promoted to be a real library function it should definitely be 
cleaned up to have sane interfaces that make sense in general, and not 
just within the original context.

Linus
-
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html