mirror of
https://github.com/git/git.git
synced 2024-10-31 14:27:54 +01:00
match-trees: use hashcpy to splice trees
When we splice trees together, we operate in place on the tree buffer. If we're using SHA-1 for the hash algorithm, we may not have a full GIT_MAX_RAWSZ (32) bytes to copy. Consequently, it doesn't logically make sense for us to use a struct object_id to represent this type, since it isn't a complete object. Represent this value as a unsigned char pointer instead and copy it when necessary. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
36775ab524
commit
f55ac4311a
1 changed files with 18 additions and 6 deletions
|
@ -179,7 +179,7 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
|
||||||
char *buf;
|
char *buf;
|
||||||
unsigned long sz;
|
unsigned long sz;
|
||||||
struct tree_desc desc;
|
struct tree_desc desc;
|
||||||
struct object_id *rewrite_here;
|
unsigned char *rewrite_here;
|
||||||
const struct object_id *rewrite_with;
|
const struct object_id *rewrite_with;
|
||||||
struct object_id subtree;
|
struct object_id subtree;
|
||||||
enum object_type type;
|
enum object_type type;
|
||||||
|
@ -206,9 +206,19 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
|
||||||
if (!S_ISDIR(mode))
|
if (!S_ISDIR(mode))
|
||||||
die("entry %s in tree %s is not a tree", name,
|
die("entry %s in tree %s is not a tree", name,
|
||||||
oid_to_hex(oid1));
|
oid_to_hex(oid1));
|
||||||
rewrite_here = (struct object_id *)(desc.entry.path +
|
|
||||||
strlen(desc.entry.path) +
|
/*
|
||||||
1);
|
* We cast here for two reasons:
|
||||||
|
*
|
||||||
|
* - to flip the "char *" (for the path) to "unsigned
|
||||||
|
* char *" (for the hash stored after it)
|
||||||
|
*
|
||||||
|
* - to discard the "const"; this is OK because we
|
||||||
|
* know it points into our non-const "buf"
|
||||||
|
*/
|
||||||
|
rewrite_here = (unsigned char *)(desc.entry.path +
|
||||||
|
strlen(desc.entry.path) +
|
||||||
|
1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
update_tree_entry(&desc);
|
update_tree_entry(&desc);
|
||||||
|
@ -217,14 +227,16 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
|
||||||
die("entry %.*s not found in tree %s", toplen, prefix,
|
die("entry %.*s not found in tree %s", toplen, prefix,
|
||||||
oid_to_hex(oid1));
|
oid_to_hex(oid1));
|
||||||
if (*subpath) {
|
if (*subpath) {
|
||||||
status = splice_tree(rewrite_here, subpath, oid2, &subtree);
|
struct object_id tree_oid;
|
||||||
|
hashcpy(tree_oid.hash, rewrite_here);
|
||||||
|
status = splice_tree(&tree_oid, subpath, oid2, &subtree);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
rewrite_with = &subtree;
|
rewrite_with = &subtree;
|
||||||
} else {
|
} else {
|
||||||
rewrite_with = oid2;
|
rewrite_with = oid2;
|
||||||
}
|
}
|
||||||
oidcpy(rewrite_here, rewrite_with);
|
hashcpy(rewrite_here, rewrite_with->hash);
|
||||||
status = write_object_file(buf, sz, tree_type, result);
|
status = write_object_file(buf, sz, tree_type, result);
|
||||||
free(buf);
|
free(buf);
|
||||||
return status;
|
return status;
|
||||||
|
|
Loading…
Reference in a new issue