From: Jeff Hostetler <g...@jeffhostetler.com>

Teach index-pack to optionally not complain when there are missing
blobs.  This is for use following a partial clone or fetch when
the server omitted certain blobs.

Signed-off-by: Jeff Hostetler <jeffh...@microsoft.com>
---
 builtin/index-pack.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index f4b87c6..8f99408 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -13,7 +13,7 @@
 #include "thread-utils.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] 
[--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] 
[--allow-partial] [--strict] (<pack-file> | --stdin [--fix-thin] 
[<pack-file>])";
 
 struct object_entry {
        struct pack_idx_entry idx;
@@ -81,6 +81,9 @@ static int show_resolving_progress;
 static int show_stat;
 static int check_self_contained_and_connected;
 
+static int allow_partial;
+static struct trace_key trace_partial = TRACE_KEY_INIT(PARTIAL);
+
 static struct progress *progress;
 
 /* We always read in 4kB chunks. */
@@ -220,9 +223,18 @@ static unsigned check_object(struct object *obj)
        if (!(obj->flags & FLAG_CHECKED)) {
                unsigned long size;
                int type = sha1_object_info(obj->oid.hash, &size);
-               if (type <= 0)
+               if (type <= 0) {
+                       if (allow_partial > 0 && obj->type == OBJ_BLOB) {
+                               /* Assume a previous partial clone/fetch 
omitted it. */
+                               trace_printf_key(
+                                       &trace_partial, "omitted blob '%s'\n",
+                                       oid_to_hex(&obj->oid));
+                               obj->flags |= FLAG_CHECKED;
+                               return 0;
+                       }
                        die(_("did not receive expected object %s"),
                              oid_to_hex(&obj->oid));
+               }
                if (type != obj->type)
                        die(_("object %s: expected type %s, found %s"),
                            oid_to_hex(&obj->oid),
@@ -1718,6 +1730,10 @@ int cmd_index_pack(int argc, const char **argv, const 
char *prefix)
                                        die(_("bad %s"), arg);
                        } else if (skip_prefix(arg, "--max-input-size=", &arg)) 
{
                                max_input_size = strtoumax(arg, NULL, 10);
+                       } else if (!strcmp(arg, "--allow-partial")) {
+                               allow_partial = 1;
+                       } else if (!strcmp(arg, "--no-allow-partial")) {
+                               allow_partial = 0;
                        } else
                                usage(index_pack_usage);
                        continue;
-- 
2.7.4

Reply via email to