]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-objects: no fetch when allow-{any,promisor}
authorJonathan Tan <jonathantanmy@google.com>
Wed, 5 Aug 2020 23:06:51 +0000 (16:06 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Aug 2020 20:01:03 +0000 (13:01 -0700)
The options --missing=allow-{any,promisor} were introduced in caf3827e2f
("rev-list: add list-objects filtering support", 2017-11-22) with the
following note in the commit message:

    This patch introduces handling of missing objects to help
    debugging and development of the "partial clone" mechanism,
    and once the mechanism is implemented, for a power user to
    perform operations that are missing-object aware without
    incurring the cost of checking if a missing link is expected.

The idea that these options are missing-object aware (and thus do not
need to lazily fetch objects, unlike unaware commands that assume that
all objects are present) are assumed in later commits such as 07ef3c6604
("fetch test: use more robust test for filtered objects", 2020-01-15).

However, the current implementations of these options use
has_object_file(), which indeed lazily fetches missing objects. Teach
these implementations not to do so. Also, update the documentation of
these options to be clearer.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-pack-objects.txt
builtin/pack-objects.c

index eaa2f2a4041f2eed78aea08131b1120fb195aaf7..54d715ead1373d0feb4eee512fbe8ea8b446216c 100644 (file)
@@ -270,15 +270,18 @@ So does `git bundle` (see linkgit:git-bundle[1]) when it creates a bundle.
        This option specifies how missing objects are handled.
 +
 The form '--missing=error' requests that pack-objects stop with an error if
-a missing object is encountered.  This is the default action.
+a missing object is encountered.  If the repository is a partial clone, an
+attempt to fetch missing objects will be made before declaring them missing.
+This is the default action.
 +
 The form '--missing=allow-any' will allow object traversal to continue
-if a missing object is encountered.  Missing objects will silently be
-omitted from the results.
+if a missing object is encountered.  No fetch of a missing object will occur.
+Missing objects will silently be omitted from the results.
 +
 The form '--missing=allow-promisor' is like 'allow-any', but will only
 allow object traversal to continue for EXPECTED promisor missing objects.
-Unexpected missing object will raise an error.
+No fetch of a missing object will occur.  An unexpected missing object will
+raise an error.
 
 --exclude-promisor-objects::
        Omit objects that are known to be in the promisor remote.  (This
index ecef5cda44e3f4a3273ab57bf86a2381d409d56a..7d07014e7c6c3b4684d9e996f4d23158f747dce7 100644 (file)
@@ -3048,7 +3048,7 @@ static void show_object__ma_allow_any(struct object *obj, const char *name, void
         * Quietly ignore ALL missing objects.  This avoids problems with
         * staging them now and getting an odd error later.
         */
-       if (!has_object_file(&obj->oid))
+       if (!has_object(the_repository, &obj->oid, 0))
                return;
 
        show_object(obj, name, data);
@@ -3062,7 +3062,7 @@ static void show_object__ma_allow_promisor(struct object *obj, const char *name,
         * Quietly ignore EXPECTED missing objects.  This avoids problems with
         * staging them now and getting an odd error later.
         */
-       if (!has_object_file(&obj->oid) && is_promisor_object(&obj->oid))
+       if (!has_object(the_repository, &obj->oid, 0) && is_promisor_object(&obj->oid))
                return;
 
        show_object(obj, name, data);