fetch-pack: support more than one pack lockfile
Whenever a fetch results in a packfile being downloaded, a .keep file is generated, so that the packfile can be preserved (from, say, a running "git repack") until refs are written referring to the contents of the packfile. In a subsequent patch, a successful fetch using protocol v2 may result in more than one .keep file being generated. Therefore, teach fetch_pack() and the transport mechanism to support multiple .keep files. Implementation notes: - builtin/fetch-pack.c normally does not generate .keep files, and thus is unaffected by this or future changes. However, it has an undocumented "--lock-pack" feature, used by remote-curl.c when implementing the "fetch" remote helper command. In keeping with the remote helper protocol, only one "lock" line will ever be written; the rest will result in warnings to stderr. However, in practice, warnings will never be written because the remote-curl.c "fetch" is only used for protocol v0/v1 (which will not generate multiple .keep files). (Protocol v2 uses the "stateless-connect" command, not the "fetch" command.) - connected.c has an optimization in that connectivity checks on a ref need not be done if the target object is in a pack known to be self-contained and connected. If there are multiple packfiles, this optimization can no longer be done. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
acaaca7d70
commit
9da69a6539
@ -48,8 +48,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
|
||||
struct ref **sought = NULL;
|
||||
int nr_sought = 0, alloc_sought = 0;
|
||||
int fd[2];
|
||||
char *pack_lockfile = NULL;
|
||||
char **pack_lockfile_ptr = NULL;
|
||||
struct string_list pack_lockfiles = STRING_LIST_INIT_DUP;
|
||||
struct string_list *pack_lockfiles_ptr = NULL;
|
||||
struct child_process *conn;
|
||||
struct fetch_pack_args args;
|
||||
struct oid_array shallow = OID_ARRAY_INIT;
|
||||
@ -134,7 +134,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
if (!strcmp("--lock-pack", arg)) {
|
||||
args.lock_pack = 1;
|
||||
pack_lockfile_ptr = &pack_lockfile;
|
||||
pack_lockfiles_ptr = &pack_lockfiles;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp("--check-self-contained-and-connected", arg)) {
|
||||
@ -235,10 +235,15 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
ref = fetch_pack(&args, fd, ref, sought, nr_sought,
|
||||
&shallow, pack_lockfile_ptr, version);
|
||||
if (pack_lockfile) {
|
||||
printf("lock %s\n", pack_lockfile);
|
||||
&shallow, pack_lockfiles_ptr, version);
|
||||
if (pack_lockfiles.nr) {
|
||||
int i;
|
||||
|
||||
printf("lock %s\n", pack_lockfiles.items[0].string);
|
||||
fflush(stdout);
|
||||
for (i = 1; i < pack_lockfiles.nr; i++)
|
||||
warning(_("Lockfile created but not reported: %s"),
|
||||
pack_lockfiles.items[i].string);
|
||||
}
|
||||
if (args.check_self_contained_and_connected &&
|
||||
args.self_contained_and_connected) {
|
||||
|
||||
Reference in New Issue
Block a user