path: root/vcs-svn/fast_export.c
diff options
authorDavid Barr <>2011-03-05 02:30:23 (GMT)
committerJonathan Nieder <>2011-03-07 07:43:57 (GMT)
commit41529bbce407fbf1a925cfbc7c1aa30064f66ae7 (patch)
tree5a6d8500d360c55d0e32d7c85c78fd17e5c5e678 /vcs-svn/fast_export.c
parentefc749b48f729992d838484d652ba24f5291ee28 (diff)
vcs-svn: set up channel to read fast-import cat-blob response
Set up some plumbing: teach the svndump lib to pass a file descriptor number to the fast_export lib, representing where cat-blob/ls responses can be read from, and add a get_response_line helper function to the fast_export lib to read a line from that file. Unfortunately this means that svn-fe needs file descriptor 3 to be redirected from somewhere (preferrably the cat-blob stream of a fast-import backend); otherwise it will fail: $ svndump <path> | svn-fe fatal: cannot read from file descriptor 3: Bad file descriptor For the moment, "svn-fe 3</dev/null" works as a workaround but it will not work for very long. A fast-import backend that can retrieve old commits is needed in order to be able to fulfill svn "Node-copyfrom-rev" requests that refer to revs from a previous run. [jn: with new change description] Based-on-patch-by: Jonathan Nieder <> Signed-off-by: David Barr <> Signed-off-by: Jonathan Nieder <>
Diffstat (limited to 'vcs-svn/fast_export.c')
1 files changed, 28 insertions, 0 deletions
diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c
index 260cf50..70bd959 100644
--- a/vcs-svn/fast_export.c
+++ b/vcs-svn/fast_export.c
@@ -12,6 +12,24 @@
#define MAX_GITSVN_LINE_LEN 4096
static uint32_t first_commit_done;
+static struct line_buffer report_buffer = LINE_BUFFER_INIT;
+void fast_export_init(int fd)
+ if (buffer_fdinit(&report_buffer, fd))
+ die_errno("cannot read from file descriptor %d", fd);
+void fast_export_deinit(void)
+ if (buffer_deinit(&report_buffer))
+ die_errno("error closing fast-import feedback stream");
+void fast_export_reset(void)
+ buffer_reset(&report_buffer);
void fast_export_delete(uint32_t depth, uint32_t *path)
@@ -63,6 +81,16 @@ void fast_export_commit(uint32_t revision, uint32_t author, char *log,
printf("progress Imported commit %"PRIu32".\n\n", revision);
+static const char *get_response_line(void)
+ const char *line = buffer_read_line(&report_buffer);
+ if (line)
+ return line;
+ if (buffer_ferror(&report_buffer))
+ die_errno("error reading from fast-import");
+ die("unexpected end of fast-import feedback");
void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len, struct line_buffer *input)
if (mode == REPO_MODE_LNK) {