Doc User-Manual: Patch cover letter, three dashes, and --notes
[gitweb.git] / vcs-svn / svndump.c
index ca63760fe2108e5df0b0c84c85a8cfce5878c78a..2b168aee75ddc299f22c738b26f07e12c285f9ae 100644 (file)
 #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, textLength, srcRev, type;
+       uint32_t action, srcRev, type;
+       off_t prop_length, text_length;
        struct strbuf src, dst;
        uint32_t text_delta, prop_delta;
 } node_ctx;
@@ -60,8 +60,8 @@ static void reset_node_ctx(char *fname)
 {
        node_ctx.type = 0;
        node_ctx.action = NODEACT_UNKNOWN;
-       node_ctx.propLength = LENGTH_UNKNOWN;
-       node_ctx.textLength = LENGTH_UNKNOWN;
+       node_ctx.prop_length = -1;
+       node_ctx.text_length = -1;
        strbuf_reset(&node_ctx.src);
        node_ctx.srcRev = 0;
        strbuf_reset(&node_ctx.dst);
@@ -174,7 +174,7 @@ static void read_props(void)
                int ch;
 
                if (!type || t[1] != ' ')
-                       die("invalid property line: %s\n", t);
+                       die("invalid property line: %s", t);
                len = atoi(&t[2]);
                strbuf_reset(&val);
                buffer_read_binary(&input, &val, len);
@@ -200,7 +200,7 @@ static void read_props(void)
                        strbuf_reset(&key);
                        continue;
                default:
-                       die("invalid property line: %s\n", t);
+                       die("invalid property line: %s", t);
                }
        }
 }
@@ -208,8 +208,8 @@ 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_text = node_ctx.textLength != 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:
         *  NULL        - directory or bug
@@ -272,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();
        }
 
@@ -291,12 +291,12 @@ static void handle_node(void)
        }
        if (!node_ctx.text_delta) {
                fast_export_modify(node_ctx.dst.buf, node_ctx.type, "inline");
-               fast_export_data(node_ctx.type, node_ctx.textLength, &input);
+               fast_export_data(node_ctx.type, node_ctx.text_length, &input);
                return;
        }
        fast_export_modify(node_ctx.dst.buf, node_ctx.type, "inline");
        fast_export_blob_delta(node_ctx.type, old_mode, old_data,
-                               node_ctx.textLength, &input);
+                               node_ctx.text_length, &input);
 }
 
 static void begin_revision(void)
@@ -360,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)
@@ -408,14 +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")) {
-                               node_ctx.textLength = atoi(val);
+                       if (constcmp(t, "Text") && constcmp(t, "Prop"))
+                               continue;
+                       if (constcmp(t + 4, "-content-length"))
+                               continue;
+                       {
+                               char *end;
+                               uintmax_t len;
+
+                               len = strtoumax(val, &end, 10);
+                               if (!isdigit(*val) || *end)
+                                       die("invalid dump: non-numeric length %s", val);
+                               if (len > maximum_signed_value_of_type(off_t))
+                                       die("unrepresentable length in dump: %s", val);
+
+                               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");
@@ -490,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);