vcs-svn: allow 64-bit Prop-Content-Length
Currently the vcs-svn/ library only pays attention to the presence of the Prop-Content-Length field and doesn't care about its value, but some day we might care about the value. Parse it as an off_t instead of arbitrarily limiting to 32 bits for intuitiveness. So now you can import from a dump with more than 2 GiB of properties for a node. In practice that isn't likely to happen often, and this is mostly meant as a cleanup. Based-on-patch-by: David Barr <davidbarr@google.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
This commit is contained in:
		| @ -34,14 +34,13 @@ | ||||
| #define NODE_CTX 2	/* node metadata */ | ||||
| #define INTERNODE_CTX 3	/* between nodes */ | ||||
|  | ||||
| #define LENGTH_UNKNOWN (~0) | ||||
| #define DATE_RFC2822_LEN 31 | ||||
|  | ||||
| static struct line_buffer input = LINE_BUFFER_INIT; | ||||
|  | ||||
| static struct { | ||||
| 	uint32_t action, propLength, srcRev, type; | ||||
| 	off_t text_length; | ||||
| 	uint32_t action, srcRev, type; | ||||
| 	off_t prop_length, text_length; | ||||
| 	struct strbuf src, dst; | ||||
| 	uint32_t text_delta, prop_delta; | ||||
| } node_ctx; | ||||
| @ -61,7 +60,7 @@ static void reset_node_ctx(char *fname) | ||||
| { | ||||
| 	node_ctx.type = 0; | ||||
| 	node_ctx.action = NODEACT_UNKNOWN; | ||||
| 	node_ctx.propLength = LENGTH_UNKNOWN; | ||||
| 	node_ctx.prop_length = -1; | ||||
| 	node_ctx.text_length = -1; | ||||
| 	strbuf_reset(&node_ctx.src); | ||||
| 	node_ctx.srcRev = 0; | ||||
| @ -209,7 +208,7 @@ static void read_props(void) | ||||
| static void handle_node(void) | ||||
| { | ||||
| 	const uint32_t type = node_ctx.type; | ||||
| 	const int have_props = node_ctx.propLength != LENGTH_UNKNOWN; | ||||
| 	const int have_props = node_ctx.prop_length != -1; | ||||
| 	const int have_text = node_ctx.text_length != -1; | ||||
| 	/* | ||||
| 	 * Old text for this node: | ||||
| @ -273,7 +272,7 @@ static void handle_node(void) | ||||
| 	if (have_props) { | ||||
| 		if (!node_ctx.prop_delta) | ||||
| 			node_ctx.type = type; | ||||
| 		if (node_ctx.propLength) | ||||
| 		if (node_ctx.prop_length) | ||||
| 			read_props(); | ||||
| 	} | ||||
|  | ||||
| @ -409,22 +408,26 @@ void svndump_read(const char *url) | ||||
| 			node_ctx.srcRev = atoi(val); | ||||
| 			break; | ||||
| 		case sizeof("Text-content-length"): | ||||
| 			if (!constcmp(t, "Text-content-length")) { | ||||
| 			if (constcmp(t, "Text") && constcmp(t, "Prop")) | ||||
| 				continue; | ||||
| 			if (constcmp(t + 4, "-content-length")) | ||||
| 				continue; | ||||
| 			{ | ||||
| 				char *end; | ||||
| 				uintmax_t textlen; | ||||
| 				uintmax_t len; | ||||
|  | ||||
| 				textlen = strtoumax(val, &end, 10); | ||||
| 				len = strtoumax(val, &end, 10); | ||||
| 				if (!isdigit(*val) || *end) | ||||
| 					die("invalid dump: non-numeric length %s", val); | ||||
| 				if (textlen > maximum_signed_value_of_type(off_t)) | ||||
| 				if (len > maximum_signed_value_of_type(off_t)) | ||||
| 					die("unrepresentable length in dump: %s", val); | ||||
| 				node_ctx.text_length = (off_t) textlen; | ||||
|  | ||||
| 				if (*t == 'T') | ||||
| 					node_ctx.text_length = (off_t) len; | ||||
| 				else | ||||
| 					node_ctx.prop_length = (off_t) len; | ||||
| 				break; | ||||
| 			} | ||||
| 			if (constcmp(t, "Prop-content-length")) | ||||
| 				continue; | ||||
| 			node_ctx.propLength = atoi(val); | ||||
| 			break; | ||||
| 		case sizeof("Text-delta"): | ||||
| 			if (!constcmp(t, "Text-delta")) { | ||||
| 				node_ctx.text_delta = !strcmp(val, "true"); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Jonathan Nieder
					Jonathan Nieder