Skip to content

Commit

Permalink
Merge branch 'jn/vcs-svn'
Browse files Browse the repository at this point in the history
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 clarity
  • Loading branch information
gitster committed Jul 13, 2012
2 parents 2763aa2 + e32b79c commit fde1cc1
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 43 deletions.
1 change: 0 additions & 1 deletion test-line-buffer.c
Expand Up @@ -87,6 +87,5 @@ int main(int argc, char *argv[])
die("input error");
if (ferror(stdout))
die("output error");
buffer_reset(&stdin_buf);
return 0;
}
2 changes: 0 additions & 2 deletions test-svn-fe.c
Expand Up @@ -31,9 +31,7 @@ static int apply_delta(int argc, char *argv[])
die_errno("cannot close preimage");
if (buffer_deinit(&delta))
die_errno("cannot close delta");
buffer_reset(&preimage);
strbuf_release(&preimage_view.buf);
buffer_reset(&delta);
return 0;
}

Expand Down
11 changes: 3 additions & 8 deletions vcs-svn/fast_export.c
Expand Up @@ -42,11 +42,6 @@ void fast_export_deinit(void)
die_errno("error closing fast-import feedback stream");
}

void fast_export_reset(void)
{
buffer_reset(&report_buffer);
}

void fast_export_delete(const char *path)
{
putchar('D');
Expand Down Expand Up @@ -163,7 +158,7 @@ static int parse_cat_response_line(const char *header, off_t *len)

if (ends_with(header, headerlen, " missing"))
return error("cat-blob reports missing blob: %s", header);
type = memmem(header, headerlen, " blob ", strlen(" blob "));
type = strstr(header, " blob ");
if (!type)
return error("cat-blob header has wrong object type: %s", header);
n = strtoumax(type + strlen(" blob "), (char **) &end, 10);
Expand Down Expand Up @@ -259,7 +254,7 @@ static int parse_ls_response(const char *response, uint32_t *mode,
}

/* Mode. */
if (response_end - response < strlen("100644") ||
if (response_end - response < (signed) strlen("100644") ||
response[strlen("100644")] != ' ')
die("invalid ls response: missing mode: %s", response);
*mode = 0;
Expand All @@ -272,7 +267,7 @@ static int parse_ls_response(const char *response, uint32_t *mode,
}

/* ' blob ' or ' tree ' */
if (response_end - response < strlen(" blob ") ||
if (response_end - response < (signed) strlen(" blob ") ||
(response[1] != 'b' && response[1] != 't'))
die("unexpected ls response: not a tree or blob: %s", response);
response += strlen(" blob ");
Expand Down
1 change: 0 additions & 1 deletion vcs-svn/fast_export.h
Expand Up @@ -6,7 +6,6 @@ struct line_buffer;

void fast_export_init(int fd);
void fast_export_deinit(void);
void fast_export_reset(void);

void fast_export_delete(const char *path);
void fast_export_modify(const char *path, uint32_t mode, const char *dataref);
Expand Down
4 changes: 0 additions & 4 deletions vcs-svn/line_buffer.c
Expand Up @@ -124,7 +124,3 @@ off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes)
}
return done;
}

void buffer_reset(struct line_buffer *buf)
{
}
1 change: 0 additions & 1 deletion vcs-svn/line_buffer.h
Expand Up @@ -14,7 +14,6 @@ struct line_buffer {
int buffer_init(struct line_buffer *buf, const char *filename);
int buffer_fdinit(struct line_buffer *buf, int fd);
int buffer_deinit(struct line_buffer *buf);
void buffer_reset(struct line_buffer *buf);

int buffer_tmpfile_init(struct line_buffer *buf);
FILE *buffer_tmpfile_rewind(struct line_buffer *buf); /* prepare to write. */
Expand Down
2 changes: 1 addition & 1 deletion vcs-svn/sliding_window.c
Expand Up @@ -54,7 +54,7 @@ int move_window(struct sliding_view *view, off_t off, size_t width)
return -1;
if (off < view->off || off + width < view->off + view->width)
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");

file_offset = view->off + view->buf.len;
Expand Down
15 changes: 8 additions & 7 deletions vcs-svn/svndiff.c
Expand Up @@ -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,
struct strbuf *buf, size_t len)
{
assert(*delta_len >= 0);
strbuf_reset(buf);
if (len > *delta_len ||
if (len > (uintmax_t) *delta_len ||
buffer_read_binary(delta, buf, len) != len)
return error_short_read(delta);
*delta_len -= buf->len;
Expand Down Expand Up @@ -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,
struct sliding_view *preimage, FILE *out)
{
int rv = -1;
struct window ctx = WINDOW_INIT(preimage);
size_t out_len;
size_t instructions_len;
Expand All @@ -275,27 +277,26 @@ static int apply_one_window(struct line_buffer *delta, off_t *delta_len,
if (apply_window_in_core(&ctx))
goto error_out;
if (ctx.out.len != out_len) {
error("invalid delta: incorrect postimage length");
rv = error("invalid delta: incorrect postimage length");
goto error_out;
}
if (write_strbuf(&ctx.out, out))
goto error_out;
window_release(&ctx);
return 0;
rv = 0;
error_out:
window_release(&ctx);
return -1;
return rv;
}

int svndiff0_apply(struct line_buffer *delta, off_t delta_len,
struct sliding_view *preimage, FILE *postimage)
{
assert(delta && preimage && postimage);
assert(delta && preimage && postimage && delta_len >= 0);

if (read_magic(delta, &delta_len))
return -1;
while (delta_len) { /* For each window: */
off_t pre_off = pre_off; /* stupid GCC... */
off_t pre_off = -1;
size_t pre_len;

if (read_offset(delta, &pre_off, &delta_len) ||
Expand Down
37 changes: 19 additions & 18 deletions vcs-svn/svndump.c
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -361,7 +360,7 @@ void svndump_read(const char *url)
reset_rev_ctx(atoi(val));
break;
case sizeof("Node-path"):
if (prefixcmp(t, "Node-"))
if (constcmp(t, "Node-"))
continue;
if (!constcmp(t + strlen("Node-"), "path")) {
if (active_ctx == NODE_CTX)
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -499,8 +502,6 @@ void svndump_deinit(void)

void svndump_reset(void)
{
fast_export_reset();
buffer_reset(&input);
strbuf_release(&dump_ctx.uuid);
strbuf_release(&dump_ctx.url);
strbuf_release(&rev_ctx.log);
Expand Down

0 comments on commit fde1cc1

Please sign in to comment.