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 | ||||
| 	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:: | ||||
| 	If the number of objects received in a push is below this | ||||
| 	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 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; | ||||
|  | @ -35,6 +36,11 @@ static int receive_pack_config(const char *var, const char *value) | |||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (strcmp(var, "receive.fsckobjects") == 0) { | ||||
| 		receive_fsck_objects = git_config_bool(var, value); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	return git_default_config(var, value); | ||||
| } | ||||
|  | ||||
|  | @ -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; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Martin Koegler
						Martin Koegler