From: Junio C Hamano Date: Tue, 13 Feb 2018 21:39:03 +0000 (-0800) Subject: Merge branch 'jh/fsck-promisors' X-Git-Tag: v2.17.0-rc0~133 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f3d618d2bf4099abe99babc8b56dcd483c5eec71;p=thirdparty%2Fgit.git Merge branch 'jh/fsck-promisors' In preparation for implementing narrow/partial clone, the machinery for checking object connectivity used by gc and fsck has been taught that a missing object is OK when it is referenced by a packfile specially marked as coming from trusted repository that promises to make them available on-demand and lazily. * jh/fsck-promisors: gc: do not repack promisor packfiles rev-list: support termination at promisor objects sha1_file: support lazily fetching missing objects introduce fetch-object: fetch one promisor object index-pack: refactor writing of .keep files fsck: support promisor objects as CLI argument fsck: support referenced promisor objects fsck: support refs pointing to promisor objects fsck: introduce partialclone extension extension.partialclone: introduce partial clone extension --- f3d618d2bf4099abe99babc8b56dcd483c5eec71 diff --cc Makefile index 37e02cec1b,795e0c7cb5..eb74e6cf3c --- a/Makefile +++ b/Makefile @@@ -802,9 -792,9 +802,10 @@@ LIB_OBJS += ewah/ewah_bitmap. LIB_OBJS += ewah/ewah_io.o LIB_OBJS += ewah/ewah_rlw.o LIB_OBJS += exec_cmd.o + LIB_OBJS += fetch-object.o LIB_OBJS += fetch-pack.o LIB_OBJS += fsck.o +LIB_OBJS += fsmonitor.o LIB_OBJS += gettext.o LIB_OBJS += gpg-interface.o LIB_OBJS += graph.o diff --cc builtin/index-pack.c index 4c51aec81f,a0a35e69c0..5ebd370c56 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@@ -1676,8 -1701,14 +1698,10 @@@ int cmd_index_pack(int argc, const cha verify = 1; show_stat = 1; stat_only = 1; - } else if (!strcmp(arg, "--keep")) { - keep_msg = ""; - } else if (starts_with(arg, "--keep=")) { - keep_msg = arg + 7; - } else if (!strcmp(arg, "--promisor")) { - promisor_msg = ""; - } else if (starts_with(arg, "--promisor=")) { - promisor_msg = arg + strlen("--promisor="); + } else if (skip_to_optional_arg(arg, "--keep", &keep_msg)) { + ; /* nothing to do */ ++ } else if (skip_to_optional_arg(arg, "--promisor", &promisor_msg)) { ++ ; /* already parsed */ } else if (starts_with(arg, "--threads=")) { char *end; nr_threads = strtoul(arg+10, &end, 0); diff --cc cache.h index d8b975a571,6980072132..23413fdcb7 --- a/cache.h +++ b/cache.h @@@ -918,8 -865,8 +919,9 @@@ extern char *repository_format_partial_ struct repository_format { int version; int precious_objects; + char *partial_clone; /* value of extensions.partialclone */ int is_bare; + int hash_algo; char *work_tree; struct string_list unknown_extensions; }; diff --cc revision.h index d7a35c8c9e,5f9a49ca66..3dee97bfb9 --- a/revision.h +++ b/revision.h @@@ -122,7 -122,9 +122,10 @@@ struct rev_info ancestry_path:1, first_parent_only:1, line_level_traverse:1, - tree_blobs_in_commit_order:1; ++ tree_blobs_in_commit_order:1, + + /* for internal use only */ + exclude_promisor_objects:1; /* Diff flags */ unsigned int diff:1, diff --cc setup.c index 8cc34186ce,58536bd6ee..c5d55dcee4 --- a/setup.c +++ b/setup.c @@@ -463,11 -466,12 +467,12 @@@ static int check_repository_format_gent die("%s", err.buf); } - repository_format_precious_objects = candidate.precious_objects; - repository_format_partial_clone = candidate.partial_clone; - string_list_clear(&candidate.unknown_extensions, 0); + repository_format_precious_objects = candidate->precious_objects; ++ repository_format_partial_clone = candidate->partial_clone; + string_list_clear(&candidate->unknown_extensions, 0); if (!has_common) { - if (candidate.is_bare != -1) { - is_bare_repository_cfg = candidate.is_bare; + if (candidate->is_bare != -1) { + is_bare_repository_cfg = candidate->is_bare; if (is_bare_repository_cfg == 1) inside_work_tree = -1; } diff --cc sha1_file.c index 3da70ac650,dd956e2bb6..2e58f5560a --- a/sha1_file.c +++ b/sha1_file.c @@@ -1221,10 -1155,8 +1224,11 @@@ int sha1_object_info_extended(const uns const unsigned char *real = (flags & OBJECT_INFO_LOOKUP_REPLACE) ? lookup_replace_object(sha1) : sha1; + int already_retried = 0; + if (is_null_sha1(real)) + return -1; + if (!oi) oi = &blank_oi;