mirror of
https://github.com/git/git.git
synced 2026-01-08 09:13:48 +00:00
object: apply skip_hash and discard_tree optimizations to unknown blobs too
parse_object_with_flags() has an optimization to skip parsing blobs if
PARSE_OBJECT_SKIP_HASH_CHECK is set and the object hasn't been seen
before or might be a blob but hasn't been parsed yet. The latter can
happen, for example, if add_tree_entries() walks a path that references
a blob object that hasn't been seen before: lookup_blob() marks the
referenced oid as being a blob, but does not provide any additional
information about it until it is parsed.
It's possible for an object to be created without even a type, such as
when prepare_revision_walk() uses mark_uninteresting() to mark all
promisor objects as uninteresting. These objects have obj->parsed ==
false and obj->type == OBJ_NONE.
The skip_hash optimization does not consider this kind of object, so
parse_object_with_flags() proceeds to fully parse the object to
determine its type.
Improve the optimization by applying it to OBJ_NONE objects as well as
OBJ_BLOB ones. Apply a similar fix for trees.
Fixes: 8db2dad7a0 ("parse_object(): check on-disk type of suspected blob")
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
f0ef5b6d9b
commit
3c7c41d6b7
4
object.c
4
object.c
@@ -328,7 +328,7 @@ struct object *parse_object_with_flags(struct repository *r,
|
|||||||
return &commit->object;
|
return &commit->object;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!obj || obj->type == OBJ_BLOB) &&
|
if ((!obj || obj->type == OBJ_NONE || obj->type == OBJ_BLOB) &&
|
||||||
odb_read_object_info(r->objects, oid, NULL) == OBJ_BLOB) {
|
odb_read_object_info(r->objects, oid, NULL) == OBJ_BLOB) {
|
||||||
if (!skip_hash && stream_object_signature(r, repl) < 0) {
|
if (!skip_hash && stream_object_signature(r, repl) < 0) {
|
||||||
error(_("hash mismatch %s"), oid_to_hex(oid));
|
error(_("hash mismatch %s"), oid_to_hex(oid));
|
||||||
@@ -344,7 +344,7 @@ struct object *parse_object_with_flags(struct repository *r,
|
|||||||
* have the on-disk object with the correct type.
|
* have the on-disk object with the correct type.
|
||||||
*/
|
*/
|
||||||
if (skip_hash && discard_tree &&
|
if (skip_hash && discard_tree &&
|
||||||
(!obj || obj->type == OBJ_TREE) &&
|
(!obj || obj->type == OBJ_NONE || obj->type == OBJ_TREE) &&
|
||||||
odb_read_object_info(r->objects, oid, NULL) == OBJ_TREE) {
|
odb_read_object_info(r->objects, oid, NULL) == OBJ_TREE) {
|
||||||
return &lookup_tree(r, oid)->object;
|
return &lookup_tree(r, oid)->object;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user