1
0
mirror of https://github.com/git/git.git synced 2024-10-01 00:12:47 +02:00

receive-pack: allow using --strict mode for unpacking objects

When a configuration variable receive.fsckobjects is set,
receive-pack runs unpack-objects with --strict mode to check all
received objects.

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Martin Koegler 2008-02-25 22:46:13 +01:00 committed by Junio C Hamano
parent f2898cfadc
commit 20dc0016ee
2 changed files with 29 additions and 13 deletions

@ -939,6 +939,12 @@ imap::
The configuration variables in the 'imap' section are described The configuration variables in the 'imap' section are described
in linkgit:git-imap-send[1]. in linkgit:git-imap-send[1].
receive.fsckObjects::
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
broken link. The result of an abort are only dangling objects.
Defaults to false.
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
limit then the objects will be unpacked into loose object limit then the objects will be unpacked into loose object

@ -10,6 +10,7 @@
static const char receive_pack_usage[] = "git-receive-pack <git-dir>"; static const char receive_pack_usage[] = "git-receive-pack <git-dir>";
static int deny_non_fast_forwards = 0; static int deny_non_fast_forwards = 0;
static int receive_fsck_objects;
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;
@ -35,6 +36,11 @@ static int receive_pack_config(const char *var, const char *value)
return 0; return 0;
} }
if (strcmp(var, "receive.fsckobjects") == 0) {
receive_fsck_objects = git_config_bool(var, value);
return 0;
}
return git_default_config(var, value); return git_default_config(var, value);
} }
@ -368,11 +374,13 @@ static const char *unpack(void)
ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries)); ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
if (ntohl(hdr.hdr_entries) < unpack_limit) { if (ntohl(hdr.hdr_entries) < unpack_limit) {
int code; int code, i = 0;
const char *unpacker[3]; const char *unpacker[4];
unpacker[0] = "unpack-objects"; unpacker[i++] = "unpack-objects";
unpacker[1] = hdr_arg; if (receive_fsck_objects)
unpacker[2] = NULL; unpacker[i++] = "--strict";
unpacker[i++] = hdr_arg;
unpacker[i++] = NULL;
code = run_command_v_opt(unpacker, RUN_GIT_CMD); code = run_command_v_opt(unpacker, RUN_GIT_CMD);
switch (code) { switch (code) {
case 0: case 0:
@ -393,8 +401,8 @@ static const char *unpack(void)
return "unpacker exited with error code"; return "unpacker exited with error code";
} }
} else { } else {
const char *keeper[6]; const char *keeper[7];
int s, status; int s, status, i = 0;
char keep_arg[256]; char keep_arg[256];
struct child_process ip; struct child_process ip;
@ -402,12 +410,14 @@ static const char *unpack(void)
if (gethostname(keep_arg + s, sizeof(keep_arg) - s)) if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
strcpy(keep_arg + s, "localhost"); strcpy(keep_arg + s, "localhost");
keeper[0] = "index-pack"; keeper[i++] = "index-pack";
keeper[1] = "--stdin"; keeper[i++] = "--stdin";
keeper[2] = "--fix-thin"; if (receive_fsck_objects)
keeper[3] = hdr_arg; keeper[i++] = "--strict";
keeper[4] = keep_arg; keeper[i++] = "--fix-thin";
keeper[5] = NULL; keeper[i++] = hdr_arg;
keeper[i++] = keep_arg;
keeper[i++] = NULL;
memset(&ip, 0, sizeof(ip)); memset(&ip, 0, sizeof(ip));
ip.argv = keeper; ip.argv = keeper;
ip.out = -1; ip.out = -1;