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:
parent
96a60a8709
commit
e32b79cb32
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user