diff options
Diffstat (limited to 'receive-pack.c')
| -rw-r--r-- | receive-pack.c | 42 | 
1 files changed, 26 insertions, 16 deletions
| diff --git a/receive-pack.c b/receive-pack.c index f83ae87e15..b26f2e3a41 100644 --- a/receive-pack.c +++ b/receive-pack.c @@ -10,6 +10,7 @@  static const char receive_pack_usage[] = "git-receive-pack <git-dir>";  static int deny_non_fast_forwards = 0; +static int receive_fsck_objects;  static int receive_unpack_limit = -1;  static int transfer_unpack_limit = -1;  static int unpack_limit = 100; @@ -18,7 +19,7 @@ static int report_status;  static char capabilities[] = " report-status delete-refs ";  static int capabilities_sent; -static int receive_pack_config(const char *var, const char *value) +static int receive_pack_config(const char *var, const char *value, void *cb)  {  	if (strcmp(var, "receive.denynonfastforwards") == 0) {  		deny_non_fast_forwards = git_config_bool(var, value); @@ -35,7 +36,12 @@ static int receive_pack_config(const char *var, const char *value)  		return 0;  	} -	return git_default_config(var, value); +	if (strcmp(var, "receive.fsckobjects") == 0) { +		receive_fsck_objects = git_config_bool(var, value); +		return 0; +	} + +	return git_default_config(var, value, cb);  }  static int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data) @@ -368,11 +374,13 @@ static const char *unpack(void)  			ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));  	if (ntohl(hdr.hdr_entries) < unpack_limit) { -		int code; -		const char *unpacker[3]; -		unpacker[0] = "unpack-objects"; -		unpacker[1] = hdr_arg; -		unpacker[2] = NULL; +		int code, i = 0; +		const char *unpacker[4]; +		unpacker[i++] = "unpack-objects"; +		if (receive_fsck_objects) +			unpacker[i++] = "--strict"; +		unpacker[i++] = hdr_arg; +		unpacker[i++] = NULL;  		code = run_command_v_opt(unpacker, RUN_GIT_CMD);  		switch (code) {  		case 0: @@ -393,8 +401,8 @@ static const char *unpack(void)  			return "unpacker exited with error code";  		}  	} else { -		const char *keeper[6]; -		int s, status; +		const char *keeper[7]; +		int s, status, i = 0;  		char keep_arg[256];  		struct child_process ip; @@ -402,12 +410,14 @@ static const char *unpack(void)  		if (gethostname(keep_arg + s, sizeof(keep_arg) - s))  			strcpy(keep_arg + s, "localhost"); -		keeper[0] = "index-pack"; -		keeper[1] = "--stdin"; -		keeper[2] = "--fix-thin"; -		keeper[3] = hdr_arg; -		keeper[4] = keep_arg; -		keeper[5] = NULL; +		keeper[i++] = "index-pack"; +		keeper[i++] = "--stdin"; +		if (receive_fsck_objects) +			keeper[i++] = "--strict"; +		keeper[i++] = "--fix-thin"; +		keeper[i++] = hdr_arg; +		keeper[i++] = keep_arg; +		keeper[i++] = NULL;  		memset(&ip, 0, sizeof(ip));  		ip.argv = keeper;  		ip.out = -1; @@ -479,7 +489,7 @@ int main(int argc, char **argv)  	if (is_repository_shallow())  		die("attempt to push into a shallow repository"); -	git_config(receive_pack_config); +	git_config(receive_pack_config, NULL);  	if (0 <= transfer_unpack_limit)  		unpack_limit = transfer_unpack_limit; | 
