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>maint
							parent
							
								
									f2898cfadc
								
							
						
					
					
						commit
						20dc0016ee
					
				|  | @ -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; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Martin Koegler
						Martin Koegler