[PATCH 1/3] diff_tree_sha1(): avoid rereading trees if possible
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Dec 9, 2006, 23:55 UTC
- Message-ID
- <Pine.LNX.4.63.0612100055160.28348@wbgn013.biozentrum.uni-wuerzburg.de>
- In-Reply-To
- <20061207101707.GA19139@spearce.org>
If the tree has already been read, no need to read it into memory again.
This also helps when this function is called on temporary trees; these no longer have to be written to disk.
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> --- tree-diff.c | 33 ++++++++++++++++++++++----------- 1 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/tree-diff.c b/tree-diff.c index 9d80dfb..54a6b44 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -195,23 +195,34 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, stru return 0; } +static int get_tree_desc_from_sha1(const unsigned char *sha1, + struct tree_desc *t) +{ + struct object *o; + + o = lookup_object(sha1); + if (o && o->type == OBJ_TREE && o->parsed) { + struct tree *tree = (struct tree *)o; + t->size = tree->size; + t->buf = xmalloc(t->size); + memcpy(t->buf, tree->buffer, t->size); + } else { + t->buf = read_object_with_reference(sha1, + tree_type, &t->size, NULL); + if (!t->buf) + die("unable to read source tree (%s)", + sha1_to_hex(sha1)); + } +} + int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const char *base, struct diff_options *opt) { - void *tree1, *tree2; struct tree_desc t1, t2; int retval; - tree1 = read_object_with_reference(old, tree_type, &t1.size, NULL); - if (!tree1) - die("unable to read source tree (%s)", sha1_to_hex(old)); - tree2 = read_object_with_reference(new, tree_type, &t2.size, NULL); - if (!tree2) - die("unable to read destination tree (%s)", sha1_to_hex(new)); - t1.buf = tree1; - t2.buf = tree2; + get_tree_desc_from_sha1(old, &t1); + get_tree_desc_from_sha1(new, &t2); retval = diff_tree(&t1, &t2, base, opt); - free(tree1); - free(tree2); return retval; }
-- 1.4.4.2.g0f32-dirty