Merge branch 'jn/vcs-svn'
vcs-svn updates to clean-up compilation, lift 32-bit limitations, etc. * jn/vcs-svn: vcs-svn: allow 64-bit Prop-Content-Length vcs-svn: suppress a signed/unsigned comparison warning vcs-svn: suppress a signed/unsigned comparison warning vcs-svn: suppress signed/unsigned comparison warnings vcs-svn: use strstr instead of memmem vcs-svn: use constcmp instead of prefixcmp vcs-svn: simplify cleanup in apply_one_window vcs-svn: avoid self-assignment in dummy initialization of pre_off vcs-svn: drop no-op reset methods vcs-svn: suppress -Wtype-limits warning vcs-svn: allow import of > 4GiB files vcs-svn: rename check_overflow and its arguments for claritymaint
						commit
						fde1cc1dc2
					
				|  | @ -87,6 +87,5 @@ int main(int argc, char *argv[]) | ||||||
| 		die("input error"); | 		die("input error"); | ||||||
| 	if (ferror(stdout)) | 	if (ferror(stdout)) | ||||||
| 		die("output error"); | 		die("output error"); | ||||||
| 	buffer_reset(&stdin_buf); |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -31,9 +31,7 @@ static int apply_delta(int argc, char *argv[]) | ||||||
| 		die_errno("cannot close preimage"); | 		die_errno("cannot close preimage"); | ||||||
| 	if (buffer_deinit(&delta)) | 	if (buffer_deinit(&delta)) | ||||||
| 		die_errno("cannot close delta"); | 		die_errno("cannot close delta"); | ||||||
| 	buffer_reset(&preimage); |  | ||||||
| 	strbuf_release(&preimage_view.buf); | 	strbuf_release(&preimage_view.buf); | ||||||
| 	buffer_reset(&delta); |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -42,11 +42,6 @@ void fast_export_deinit(void) | ||||||
| 		die_errno("error closing fast-import feedback stream"); | 		die_errno("error closing fast-import feedback stream"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void fast_export_reset(void) |  | ||||||
| { |  | ||||||
| 	buffer_reset(&report_buffer); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void fast_export_delete(const char *path) | void fast_export_delete(const char *path) | ||||||
| { | { | ||||||
| 	putchar('D'); | 	putchar('D'); | ||||||
|  | @ -163,7 +158,7 @@ static int parse_cat_response_line(const char *header, off_t *len) | ||||||
|  |  | ||||||
| 	if (ends_with(header, headerlen, " missing")) | 	if (ends_with(header, headerlen, " missing")) | ||||||
| 		return error("cat-blob reports missing blob: %s", header); | 		return error("cat-blob reports missing blob: %s", header); | ||||||
| 	type = memmem(header, headerlen, " blob ", strlen(" blob ")); | 	type = strstr(header, " blob "); | ||||||
| 	if (!type) | 	if (!type) | ||||||
| 		return error("cat-blob header has wrong object type: %s", header); | 		return error("cat-blob header has wrong object type: %s", header); | ||||||
| 	n = strtoumax(type + strlen(" blob "), (char **) &end, 10); | 	n = strtoumax(type + strlen(" blob "), (char **) &end, 10); | ||||||
|  | @ -259,7 +254,7 @@ static int parse_ls_response(const char *response, uint32_t *mode, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Mode. */ | 	/* Mode. */ | ||||||
| 	if (response_end - response < strlen("100644") || | 	if (response_end - response < (signed) strlen("100644") || | ||||||
| 	    response[strlen("100644")] != ' ') | 	    response[strlen("100644")] != ' ') | ||||||
| 		die("invalid ls response: missing mode: %s", response); | 		die("invalid ls response: missing mode: %s", response); | ||||||
| 	*mode = 0; | 	*mode = 0; | ||||||
|  | @ -272,7 +267,7 @@ static int parse_ls_response(const char *response, uint32_t *mode, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* ' blob ' or ' tree ' */ | 	/* ' blob ' or ' tree ' */ | ||||||
| 	if (response_end - response < strlen(" blob ") || | 	if (response_end - response < (signed) strlen(" blob ") || | ||||||
| 	    (response[1] != 'b' && response[1] != 't')) | 	    (response[1] != 'b' && response[1] != 't')) | ||||||
| 		die("unexpected ls response: not a tree or blob: %s", response); | 		die("unexpected ls response: not a tree or blob: %s", response); | ||||||
| 	response += strlen(" blob "); | 	response += strlen(" blob "); | ||||||
|  |  | ||||||
|  | @ -6,7 +6,6 @@ struct line_buffer; | ||||||
|  |  | ||||||
| void fast_export_init(int fd); | void fast_export_init(int fd); | ||||||
| void fast_export_deinit(void); | void fast_export_deinit(void); | ||||||
| void fast_export_reset(void); |  | ||||||
|  |  | ||||||
| void fast_export_delete(const char *path); | void fast_export_delete(const char *path); | ||||||
| void fast_export_modify(const char *path, uint32_t mode, const char *dataref); | void fast_export_modify(const char *path, uint32_t mode, const char *dataref); | ||||||
|  |  | ||||||
|  | @ -124,7 +124,3 @@ off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes) | ||||||
| 	} | 	} | ||||||
| 	return done; | 	return done; | ||||||
| } | } | ||||||
|  |  | ||||||
| void buffer_reset(struct line_buffer *buf) |  | ||||||
| { |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -14,7 +14,6 @@ struct line_buffer { | ||||||
| int buffer_init(struct line_buffer *buf, const char *filename); | int buffer_init(struct line_buffer *buf, const char *filename); | ||||||
| int buffer_fdinit(struct line_buffer *buf, int fd); | int buffer_fdinit(struct line_buffer *buf, int fd); | ||||||
| int buffer_deinit(struct line_buffer *buf); | int buffer_deinit(struct line_buffer *buf); | ||||||
| void buffer_reset(struct line_buffer *buf); |  | ||||||
|  |  | ||||||
| int buffer_tmpfile_init(struct line_buffer *buf); | int buffer_tmpfile_init(struct line_buffer *buf); | ||||||
| FILE *buffer_tmpfile_rewind(struct line_buffer *buf);	/* prepare to write. */ | FILE *buffer_tmpfile_rewind(struct line_buffer *buf);	/* prepare to write. */ | ||||||
|  |  | ||||||
|  | @ -54,7 +54,7 @@ int move_window(struct sliding_view *view, off_t off, size_t width) | ||||||
| 		return -1; | 		return -1; | ||||||
| 	if (off < view->off || off + width < view->off + view->width) | 	if (off < view->off || off + width < view->off + view->width) | ||||||
| 		return error("invalid delta: window slides left"); | 		return error("invalid delta: window slides left"); | ||||||
| 	if (view->max_off >= 0 && view->max_off < off + width) | 	if (view->max_off >= 0 && view->max_off < off + (off_t) width) | ||||||
| 		return error("delta preimage ends early"); | 		return error("delta preimage ends early"); | ||||||
|  |  | ||||||
| 	file_offset = view->off + view->buf.len; | 	file_offset = view->off + view->buf.len; | ||||||
|  |  | ||||||
|  | @ -77,8 +77,9 @@ static int error_short_read(struct line_buffer *input) | ||||||
| static int read_chunk(struct line_buffer *delta, off_t *delta_len, | static int read_chunk(struct line_buffer *delta, off_t *delta_len, | ||||||
| 		      struct strbuf *buf, size_t len) | 		      struct strbuf *buf, size_t len) | ||||||
| { | { | ||||||
|  | 	assert(*delta_len >= 0); | ||||||
| 	strbuf_reset(buf); | 	strbuf_reset(buf); | ||||||
| 	if (len > *delta_len || | 	if (len > (uintmax_t) *delta_len || | ||||||
| 	    buffer_read_binary(delta, buf, len) != len) | 	    buffer_read_binary(delta, buf, len) != len) | ||||||
| 		return error_short_read(delta); | 		return error_short_read(delta); | ||||||
| 	*delta_len -= buf->len; | 	*delta_len -= buf->len; | ||||||
|  | @ -258,6 +259,7 @@ static int apply_window_in_core(struct window *ctx) | ||||||
| static int apply_one_window(struct line_buffer *delta, off_t *delta_len, | static int apply_one_window(struct line_buffer *delta, off_t *delta_len, | ||||||
| 			    struct sliding_view *preimage, FILE *out) | 			    struct sliding_view *preimage, FILE *out) | ||||||
| { | { | ||||||
|  | 	int rv = -1; | ||||||
| 	struct window ctx = WINDOW_INIT(preimage); | 	struct window ctx = WINDOW_INIT(preimage); | ||||||
| 	size_t out_len; | 	size_t out_len; | ||||||
| 	size_t instructions_len; | 	size_t instructions_len; | ||||||
|  | @ -275,27 +277,26 @@ static int apply_one_window(struct line_buffer *delta, off_t *delta_len, | ||||||
| 	if (apply_window_in_core(&ctx)) | 	if (apply_window_in_core(&ctx)) | ||||||
| 		goto error_out; | 		goto error_out; | ||||||
| 	if (ctx.out.len != out_len) { | 	if (ctx.out.len != out_len) { | ||||||
| 		error("invalid delta: incorrect postimage length"); | 		rv = error("invalid delta: incorrect postimage length"); | ||||||
| 		goto error_out; | 		goto error_out; | ||||||
| 	} | 	} | ||||||
| 	if (write_strbuf(&ctx.out, out)) | 	if (write_strbuf(&ctx.out, out)) | ||||||
| 		goto error_out; | 		goto error_out; | ||||||
| 	window_release(&ctx); | 	rv = 0; | ||||||
| 	return 0; |  | ||||||
| error_out: | error_out: | ||||||
| 	window_release(&ctx); | 	window_release(&ctx); | ||||||
| 	return -1; | 	return rv; | ||||||
| } | } | ||||||
|  |  | ||||||
| int svndiff0_apply(struct line_buffer *delta, off_t delta_len, | int svndiff0_apply(struct line_buffer *delta, off_t delta_len, | ||||||
| 			struct sliding_view *preimage, FILE *postimage) | 			struct sliding_view *preimage, FILE *postimage) | ||||||
| { | { | ||||||
| 	assert(delta && preimage && postimage); | 	assert(delta && preimage && postimage && delta_len >= 0); | ||||||
|  |  | ||||||
| 	if (read_magic(delta, &delta_len)) | 	if (read_magic(delta, &delta_len)) | ||||||
| 		return -1; | 		return -1; | ||||||
| 	while (delta_len) {	/* For each window: */ | 	while (delta_len) {	/* For each window: */ | ||||||
| 		off_t pre_off = pre_off; /* stupid GCC... */ | 		off_t pre_off = -1; | ||||||
| 		size_t pre_len; | 		size_t pre_len; | ||||||
|  |  | ||||||
| 		if (read_offset(delta, &pre_off, &delta_len) || | 		if (read_offset(delta, &pre_off, &delta_len) || | ||||||
|  |  | ||||||
|  | @ -34,14 +34,13 @@ | ||||||
| #define NODE_CTX 2	/* node metadata */ | #define NODE_CTX 2	/* node metadata */ | ||||||
| #define INTERNODE_CTX 3	/* between nodes */ | #define INTERNODE_CTX 3	/* between nodes */ | ||||||
|  |  | ||||||
| #define LENGTH_UNKNOWN (~0) |  | ||||||
| #define DATE_RFC2822_LEN 31 | #define DATE_RFC2822_LEN 31 | ||||||
|  |  | ||||||
| static struct line_buffer input = LINE_BUFFER_INIT; | static struct line_buffer input = LINE_BUFFER_INIT; | ||||||
|  |  | ||||||
| static struct { | static struct { | ||||||
| 	uint32_t action, propLength, srcRev, type; | 	uint32_t action, srcRev, type; | ||||||
| 	off_t text_length; | 	off_t prop_length, text_length; | ||||||
| 	struct strbuf src, dst; | 	struct strbuf src, dst; | ||||||
| 	uint32_t text_delta, prop_delta; | 	uint32_t text_delta, prop_delta; | ||||||
| } node_ctx; | } node_ctx; | ||||||
|  | @ -61,7 +60,7 @@ static void reset_node_ctx(char *fname) | ||||||
| { | { | ||||||
| 	node_ctx.type = 0; | 	node_ctx.type = 0; | ||||||
| 	node_ctx.action = NODEACT_UNKNOWN; | 	node_ctx.action = NODEACT_UNKNOWN; | ||||||
| 	node_ctx.propLength = LENGTH_UNKNOWN; | 	node_ctx.prop_length = -1; | ||||||
| 	node_ctx.text_length = -1; | 	node_ctx.text_length = -1; | ||||||
| 	strbuf_reset(&node_ctx.src); | 	strbuf_reset(&node_ctx.src); | ||||||
| 	node_ctx.srcRev = 0; | 	node_ctx.srcRev = 0; | ||||||
|  | @ -209,7 +208,7 @@ static void read_props(void) | ||||||
| static void handle_node(void) | static void handle_node(void) | ||||||
| { | { | ||||||
| 	const uint32_t type = node_ctx.type; | 	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; | 	const int have_text = node_ctx.text_length != -1; | ||||||
| 	/* | 	/* | ||||||
| 	 * Old text for this node: | 	 * Old text for this node: | ||||||
|  | @ -273,7 +272,7 @@ static void handle_node(void) | ||||||
| 	if (have_props) { | 	if (have_props) { | ||||||
| 		if (!node_ctx.prop_delta) | 		if (!node_ctx.prop_delta) | ||||||
| 			node_ctx.type = type; | 			node_ctx.type = type; | ||||||
| 		if (node_ctx.propLength) | 		if (node_ctx.prop_length) | ||||||
| 			read_props(); | 			read_props(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -361,7 +360,7 @@ void svndump_read(const char *url) | ||||||
| 			reset_rev_ctx(atoi(val)); | 			reset_rev_ctx(atoi(val)); | ||||||
| 			break; | 			break; | ||||||
| 		case sizeof("Node-path"): | 		case sizeof("Node-path"): | ||||||
| 			if (prefixcmp(t, "Node-")) | 			if (constcmp(t, "Node-")) | ||||||
| 				continue; | 				continue; | ||||||
| 			if (!constcmp(t + strlen("Node-"), "path")) { | 			if (!constcmp(t + strlen("Node-"), "path")) { | ||||||
| 				if (active_ctx == NODE_CTX) | 				if (active_ctx == NODE_CTX) | ||||||
|  | @ -409,22 +408,26 @@ void svndump_read(const char *url) | ||||||
| 			node_ctx.srcRev = atoi(val); | 			node_ctx.srcRev = atoi(val); | ||||||
| 			break; | 			break; | ||||||
| 		case sizeof("Text-content-length"): | 		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; | 				char *end; | ||||||
| 				uintmax_t textlen; | 				uintmax_t len; | ||||||
|  |  | ||||||
| 				textlen = strtoumax(val, &end, 10); | 				len = strtoumax(val, &end, 10); | ||||||
| 				if (!isdigit(*val) || *end) | 				if (!isdigit(*val) || *end) | ||||||
| 					die("invalid dump: non-numeric length %s", val); | 					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); | 					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; | 				break; | ||||||
| 			} | 			} | ||||||
| 			if (constcmp(t, "Prop-content-length")) |  | ||||||
| 				continue; |  | ||||||
| 			node_ctx.propLength = atoi(val); |  | ||||||
| 			break; |  | ||||||
| 		case sizeof("Text-delta"): | 		case sizeof("Text-delta"): | ||||||
| 			if (!constcmp(t, "Text-delta")) { | 			if (!constcmp(t, "Text-delta")) { | ||||||
| 				node_ctx.text_delta = !strcmp(val, "true"); | 				node_ctx.text_delta = !strcmp(val, "true"); | ||||||
|  | @ -499,8 +502,6 @@ void svndump_deinit(void) | ||||||
|  |  | ||||||
| void svndump_reset(void) | void svndump_reset(void) | ||||||
| { | { | ||||||
| 	fast_export_reset(); |  | ||||||
| 	buffer_reset(&input); |  | ||||||
| 	strbuf_release(&dump_ctx.uuid); | 	strbuf_release(&dump_ctx.uuid); | ||||||
| 	strbuf_release(&dump_ctx.url); | 	strbuf_release(&dump_ctx.url); | ||||||
| 	strbuf_release(&rev_ctx.log); | 	strbuf_release(&rev_ctx.log); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano