#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";
+static const char *marksfilename;
static int cmd_capabilities(const char *line);
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;
+ }
+ /* setup marks file import/export */
+ printf("feature import-marks-if-exists=%s\n"
+ "feature export-marks=%s\n", marksfilename, marksfilename);
svndump_init_fd(dumpin_fd, STDIN_FILENO);
svndump_read(url, private_ref);
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;
}
int main(int argc, const char **argv)
{
struct strbuf buf = STRBUF_INIT, url_sb = STRBUF_INIT,
- private_ref_sb = STRBUF_INIT;
+ private_ref_sb = STRBUF_INIT, marksfilename_sb = STRBUF_INIT;
static struct remote *remote;
const char *url_in;
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;
+ strbuf_addf(&marksfilename_sb, "%s/info/fast-import/remote-svn/%s.marks",
+ get_git_dir(), remote->name);
+ marksfilename = marksfilename_sb.buf;
+
while (1) {
if (strbuf_getline(&buf, stdin, '\n') == EOF) {
if (ferror(stdin))
strbuf_release(&buf);
strbuf_release(&url_sb);
strbuf_release(&private_ref_sb);
+ strbuf_release(&marksfilename_sb);
return 0;
}