Merge branch 'jc/fetch-pack-fsck-objects'

* jc/fetch-pack-fsck-objects:
  test: fetch/receive with fsckobjects
  transfer.fsckobjects: unify fetch/receive.fsckobjects
  fetch.fsckobjects: verify downloaded objects

Conflicts:
	Documentation/config.txt
	builtin/fetch-pack.c
This commit is contained in:
Junio C Hamano 2011-10-05 12:36:20 -07:00
commit ca0c9764bf
4 changed files with 151 additions and 5 deletions

View file

@ -857,6 +857,13 @@ fetch.recurseSubmodules::
when its superproject retrieves a commit that updates the submodule's when its superproject retrieves a commit that updates the submodule's
reference. reference.
fetch.fsckObjects::
If it is set to true, git-fetch-pack will check all fetched
objects. It will abort in the case of a malformed object or a
broken link. The result of an abort are only dangling objects.
Defaults to false. If not set, the value of `transfer.fsckObjects`
is used instead.
fetch.unpackLimit:: fetch.unpackLimit::
If the number of objects fetched over the git native If the number of objects fetched over the git native
transfer is below this transfer is below this
@ -1595,7 +1602,8 @@ receive.fsckObjects::
If it is set to true, git-receive-pack will check all received If it is set to true, git-receive-pack will check all received
objects. It will abort in the case of a malformed object or a objects. It will abort in the case of a malformed object or a
broken link. The result of an abort are only dangling objects. broken link. The result of an abort are only dangling objects.
Defaults to false. Defaults to false. If not set, the value of `transfer.fsckObjects`
is used instead.
receive.unpackLimit:: receive.unpackLimit::
If the number of objects received in a push is below this If the number of objects received in a push is below this
@ -1830,6 +1838,11 @@ tar.umask::
archiving user's umask will be used instead. See umask(2) and archiving user's umask will be used instead. See umask(2) and
linkgit:git-archive[1]. linkgit:git-archive[1].
transfer.fsckObjects::
When `fetch.fsckObjects` or `receive.fsckObjects` are
not set, the value of this variable is used instead.
Defaults to false.
transfer.unpackLimit:: transfer.unpackLimit::
When `fetch.unpackLimit` or `receive.unpackLimit` are When `fetch.unpackLimit` or `receive.unpackLimit` are
not set, the value of this variable is used instead. not set, the value of this variable is used instead.

View file

@ -15,7 +15,9 @@ static int transfer_unpack_limit = -1;
static int fetch_unpack_limit = -1; static int fetch_unpack_limit = -1;
static int unpack_limit = 100; static int unpack_limit = 100;
static int prefer_ofs_delta = 1; static int prefer_ofs_delta = 1;
static int no_done = 0; static int no_done;
static int fetch_fsck_objects = -1;
static int transfer_fsck_objects = -1;
static struct fetch_pack_args args = { static struct fetch_pack_args args = {
/* .uploadpack = */ "git-upload-pack", /* .uploadpack = */ "git-upload-pack",
}; };
@ -734,6 +736,12 @@ static int get_pack(int xd[2], char **pack_lockfile)
} }
if (*hdr_arg) if (*hdr_arg)
*av++ = hdr_arg; *av++ = hdr_arg;
if (fetch_fsck_objects >= 0
? fetch_fsck_objects
: transfer_fsck_objects >= 0
? transfer_fsck_objects
: 0)
*av++ = "--strict";
*av++ = NULL; *av++ = NULL;
cmd.in = demux.out; cmd.in = demux.out;
@ -853,6 +861,16 @@ static int fetch_pack_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }
if (!strcmp(var, "fetch.fsckobjects")) {
fetch_fsck_objects = git_config_bool(var, value);
return 0;
}
if (!strcmp(var, "transfer.fsckobjects")) {
transfer_fsck_objects = git_config_bool(var, value);
return 0;
}
return git_default_config(var, value, cb); return git_default_config(var, value, cb);
} }

View file

@ -25,7 +25,8 @@ static int deny_deletes;
static int deny_non_fast_forwards; static int deny_non_fast_forwards;
static enum deny_action deny_current_branch = DENY_UNCONFIGURED; static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
static enum deny_action deny_delete_current = DENY_UNCONFIGURED; static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
static int receive_fsck_objects; static int receive_fsck_objects = -1;
static int transfer_fsck_objects = -1;
static int receive_unpack_limit = -1; static int receive_unpack_limit = -1;
static int transfer_unpack_limit = -1; static int transfer_unpack_limit = -1;
static int unpack_limit = 100; static int unpack_limit = 100;
@ -79,6 +80,11 @@ static int receive_pack_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }
if (strcmp(var, "transfer.fsckobjects") == 0) {
transfer_fsck_objects = git_config_bool(var, value);
return 0;
}
if (!strcmp(var, "receive.denycurrentbranch")) { if (!strcmp(var, "receive.denycurrentbranch")) {
deny_current_branch = parse_deny_action(var, value); deny_current_branch = parse_deny_action(var, value);
return 0; return 0;
@ -674,6 +680,11 @@ static const char *unpack(void)
struct pack_header hdr; struct pack_header hdr;
const char *hdr_err; const char *hdr_err;
char hdr_arg[38]; char hdr_arg[38];
int fsck_objects = (receive_fsck_objects >= 0
? receive_fsck_objects
: transfer_fsck_objects >= 0
? transfer_fsck_objects
: 0);
hdr_err = parse_pack_header(&hdr); hdr_err = parse_pack_header(&hdr);
if (hdr_err) if (hdr_err)
@ -686,7 +697,7 @@ static const char *unpack(void)
int code, i = 0; int code, i = 0;
const char *unpacker[4]; const char *unpacker[4];
unpacker[i++] = "unpack-objects"; unpacker[i++] = "unpack-objects";
if (receive_fsck_objects) if (fsck_objects)
unpacker[i++] = "--strict"; unpacker[i++] = "--strict";
unpacker[i++] = hdr_arg; unpacker[i++] = hdr_arg;
unpacker[i++] = NULL; unpacker[i++] = NULL;
@ -706,7 +717,7 @@ static const char *unpack(void)
keeper[i++] = "index-pack"; keeper[i++] = "index-pack";
keeper[i++] = "--stdin"; keeper[i++] = "--stdin";
if (receive_fsck_objects) if (fsck_objects)
keeper[i++] = "--strict"; keeper[i++] = "--strict";
keeper[i++] = "--fix-thin"; keeper[i++] = "--fix-thin";
keeper[i++] = hdr_arg; keeper[i++] = hdr_arg;

104
t/t5504-fetch-receive-strict.sh Executable file
View file

@ -0,0 +1,104 @@
#!/bin/sh
test_description='fetch/receive strict mode'
. ./test-lib.sh
test_expect_success setup '
echo hello >greetings &&
git add greetings &&
git commit -m greetings &&
S=$(git rev-parse :greetings | sed -e "s|^..|&/|") &&
X=$(echo bye | git hash-object -w --stdin | sed -e "s|^..|&/|") &&
mv -f .git/objects/$X .git/objects/$S &&
test_must_fail git fsck
'
test_expect_success 'fetch without strict' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config fetch.fsckobjects false &&
git config transfer.fsckobjects false &&
git fetch ../.git master
)
'
test_expect_success 'fetch with !fetch.fsckobjects' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config fetch.fsckobjects false &&
git config transfer.fsckobjects true &&
git fetch ../.git master
)
'
test_expect_success 'fetch with fetch.fsckobjects' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config fetch.fsckobjects true &&
git config transfer.fsckobjects false &&
test_must_fail git fetch ../.git master
)
'
test_expect_success 'fetch with transfer.fsckobjects' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config transfer.fsckobjects true &&
test_must_fail git fetch ../.git master
)
'
test_expect_success 'push without strict' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config fetch.fsckobjects false &&
git config transfer.fsckobjects false
) &&
git push dst master:refs/heads/test
'
test_expect_success 'push with !receive.fsckobjects' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config receive.fsckobjects false &&
git config transfer.fsckobjects true
) &&
git push dst master:refs/heads/test
'
test_expect_success 'push with receive.fsckobjects' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config receive.fsckobjects true &&
git config transfer.fsckobjects false
) &&
test_must_fail git push dst master:refs/heads/test
'
test_expect_success 'push with transfer.fsckobjects' '
rm -rf dst &&
git init dst &&
(
cd dst &&
git config transfer.fsckobjects true
) &&
test_must_fail git push dst master:refs/heads/test
'
test_done