Sync with 1.7.4.3
[gitweb.git] / vcs-svn / fast_export.c
index 256a0522b2b8484fa27d8730addee0591ea09195..99ed70b88a5aaacbb48a9463f19ec198d7bedf84 100644 (file)
@@ -25,32 +25,36 @@ void fast_export_modify(uint32_t depth, uint32_t *path, uint32_t mode,
                        uint32_t mark)
 {
        /* Mode must be 100644, 100755, 120000, or 160000. */
-       printf("M %06o :%d ", mode, mark);
+       printf("M %06"PRIo32" :%"PRIu32" ", mode, mark);
        pool_print_seq(depth, path, '/', stdout);
        putchar('\n');
 }
 
 static char gitsvnline[MAX_GITSVN_LINE_LEN];
-void fast_export_commit(uint32_t revision, uint32_t author, char *log,
-                       uint32_t uuid, uint32_t url,
+void fast_export_commit(uint32_t revision, const char *author,
+                       const struct strbuf *log,
+                       const char *uuid, const char *url,
                        unsigned long timestamp)
 {
+       static const struct strbuf empty = STRBUF_INIT;
        if (!log)
-               log = "";
-       if (~uuid && ~url) {
-               snprintf(gitsvnline, MAX_GITSVN_LINE_LEN, "\n\ngit-svn-id: %s@%d %s\n",
-                                pool_fetch(url), revision, pool_fetch(uuid));
+               log = ∅
+       if (*uuid && *url) {
+               snprintf(gitsvnline, MAX_GITSVN_LINE_LEN,
+                               "\n\ngit-svn-id: %s@%"PRIu32" %s\n",
+                                url, revision, uuid);
        } else {
                *gitsvnline = '\0';
        }
        printf("commit refs/heads/master\n");
        printf("committer %s <%s@%s> %ld +0000\n",
-                  ~author ? pool_fetch(author) : "nobody",
-                  ~author ? pool_fetch(author) : "nobody",
-                  ~uuid ? pool_fetch(uuid) : "local", timestamp);
-       printf("data %"PRIu32"\n%s%s\n",
-                  (uint32_t) (strlen(log) + strlen(gitsvnline)),
-                  log, gitsvnline);
+                  *author ? author : "nobody",
+                  *author ? author : "nobody",
+                  *uuid ? uuid : "local", timestamp);
+       printf("data %"PRIuMAX"\n",
+               (uintmax_t) (log->len + strlen(gitsvnline)));
+       fwrite(log->buf, log->len, 1, stdout);
+       printf("%s\n", gitsvnline);
        if (!first_commit_done) {
                if (revision > 1)
                        printf("from refs/heads/master^0\n");
@@ -59,17 +63,26 @@ void fast_export_commit(uint32_t revision, uint32_t author, char *log,
        repo_diff(revision - 1, revision);
        fputc('\n', stdout);
 
-       printf("progress Imported commit %d.\n\n", revision);
+       printf("progress Imported commit %"PRIu32".\n\n", revision);
 }
 
-void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len)
+static void die_short_read(struct line_buffer *input)
+{
+       if (buffer_ferror(input))
+               die_errno("error reading dump file");
+       die("invalid dump: unexpected end of file");
+}
+
+void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len, struct line_buffer *input)
 {
        if (mode == REPO_MODE_LNK) {
                /* svn symlink blobs start with "link " */
-               buffer_skip_bytes(5);
                len -= 5;
+               if (buffer_skip_bytes(input, 5) != 5)
+                       die_short_read(input);
        }
-       printf("blob\nmark :%d\ndata %d\n", mark, len);
-       buffer_copy_bytes(len);
+       printf("blob\nmark :%"PRIu32"\ndata %"PRIu32"\n", mark, len);
+       if (buffer_copy_bytes(input, len) != len)
+               die_short_read(input);
        fputc('\n', stdout);
 }