Skip to content

Commit

Permalink
Allow reading svn dumps from files via file:// urls
Browse files Browse the repository at this point in the history
For testing as well as for importing large, already available dumps,
it's useful to bypass svnrdump and replay the svndump from a file
directly.

Add support for file:// urls in the remote url, e.g.

  svn::file:///path/to/dump

When the remote helper finds an url starting with file:// it tries to
open that file instead of invoking svnrdump.

Signed-off-by: Florian Achleitner <[email protected]>
Acked-by: David Michael Barr <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
flyingflo authored and gitster committed Oct 7, 2012
1 parent 271fd1f commit f6529de
Showing 1 changed file with 33 additions and 19 deletions.
52 changes: 33 additions & 19 deletions remote-testsvn.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "argv-array.h"

static const char *url;
static int dump_from_file;
static const char *private_ref;
static const char *remote_ref = "refs/heads/master";

Expand Down Expand Up @@ -54,29 +55,36 @@ static int cmd_import(const char *line)
struct argv_array svndump_argv = ARGV_ARRAY_INIT;
struct child_process svndump_proc;

memset(&svndump_proc, 0, sizeof(struct child_process));
svndump_proc.out = -1;
argv_array_push(&svndump_argv, "svnrdump");
argv_array_push(&svndump_argv, "dump");
argv_array_push(&svndump_argv, url);
argv_array_pushf(&svndump_argv, "-r%u:HEAD", startrev);
svndump_proc.argv = svndump_argv.argv;

code = start_command(&svndump_proc);
if (code)
die("Unable to start %s, code %d", svndump_proc.argv[0], code);
dumpin_fd = svndump_proc.out;

if (dump_from_file) {
dumpin_fd = open(url, O_RDONLY);
if(dumpin_fd < 0)
die_errno("Couldn't open svn dump file %s.", url);
} else {
memset(&svndump_proc, 0, sizeof(struct child_process));
svndump_proc.out = -1;
argv_array_push(&svndump_argv, "svnrdump");
argv_array_push(&svndump_argv, "dump");
argv_array_push(&svndump_argv, url);
argv_array_pushf(&svndump_argv, "-r%u:HEAD", startrev);
svndump_proc.argv = svndump_argv.argv;

code = start_command(&svndump_proc);
if (code)
die("Unable to start %s, code %d", svndump_proc.argv[0], code);
dumpin_fd = svndump_proc.out;
}
svndump_init_fd(dumpin_fd, STDIN_FILENO);
svndump_read(url, private_ref);
svndump_deinit();
svndump_reset();

close(dumpin_fd);
code = finish_command(&svndump_proc);
if (code)
warning("%s, returned %d", svndump_proc.argv[0], code);
argv_array_clear(&svndump_argv);
if (!dump_from_file) {
code = finish_command(&svndump_proc);
if (code)
warning("%s, returned %d", svndump_proc.argv[0], code);
argv_array_clear(&svndump_argv);
}

return 0;
}
Expand Down Expand Up @@ -151,8 +159,14 @@ int main(int argc, const char **argv)
remote = remote_get(argv[1]);
url_in = (argc == 3) ? argv[2] : remote->url[0];

end_url_with_slash(&url_sb, url_in);
url = url_sb.buf;
if (!prefixcmp(url_in, "file://")) {
dump_from_file = 1;
url = url_decode(url_in + sizeof("file://")-1);
} else {
dump_from_file = 0;
end_url_with_slash(&url_sb, url_in);
url = url_sb.buf;
}

strbuf_addf(&private_ref_sb, "refs/svn/%s/master", remote->name);
private_ref = private_ref_sb.buf;
Expand Down

0 comments on commit f6529de

Please sign in to comment.