|
9 | 9 | #include "argv-array.h"
|
10 | 10 |
|
11 | 11 | static const char *url;
|
| 12 | +static int dump_from_file; |
12 | 13 | static const char *private_ref;
|
13 | 14 | static const char *remote_ref = "refs/heads/master";
|
14 | 15 |
|
@@ -54,29 +55,36 @@ static int cmd_import(const char *line)
|
54 | 55 | struct argv_array svndump_argv = ARGV_ARRAY_INIT;
|
55 | 56 | struct child_process svndump_proc;
|
56 | 57 |
|
57 |
| - memset(&svndump_proc, 0, sizeof(struct child_process)); |
58 |
| - svndump_proc.out = -1; |
59 |
| - argv_array_push(&svndump_argv, "svnrdump"); |
60 |
| - argv_array_push(&svndump_argv, "dump"); |
61 |
| - argv_array_push(&svndump_argv, url); |
62 |
| - argv_array_pushf(&svndump_argv, "-r%u:HEAD", startrev); |
63 |
| - svndump_proc.argv = svndump_argv.argv; |
64 |
| - |
65 |
| - code = start_command(&svndump_proc); |
66 |
| - if (code) |
67 |
| - die("Unable to start %s, code %d", svndump_proc.argv[0], code); |
68 |
| - dumpin_fd = svndump_proc.out; |
69 |
| - |
| 58 | + if (dump_from_file) { |
| 59 | + dumpin_fd = open(url, O_RDONLY); |
| 60 | + if(dumpin_fd < 0) |
| 61 | + die_errno("Couldn't open svn dump file %s.", url); |
| 62 | + } else { |
| 63 | + memset(&svndump_proc, 0, sizeof(struct child_process)); |
| 64 | + svndump_proc.out = -1; |
| 65 | + argv_array_push(&svndump_argv, "svnrdump"); |
| 66 | + argv_array_push(&svndump_argv, "dump"); |
| 67 | + argv_array_push(&svndump_argv, url); |
| 68 | + argv_array_pushf(&svndump_argv, "-r%u:HEAD", startrev); |
| 69 | + svndump_proc.argv = svndump_argv.argv; |
| 70 | + |
| 71 | + code = start_command(&svndump_proc); |
| 72 | + if (code) |
| 73 | + die("Unable to start %s, code %d", svndump_proc.argv[0], code); |
| 74 | + dumpin_fd = svndump_proc.out; |
| 75 | + } |
70 | 76 | svndump_init_fd(dumpin_fd, STDIN_FILENO);
|
71 | 77 | svndump_read(url, private_ref);
|
72 | 78 | svndump_deinit();
|
73 | 79 | svndump_reset();
|
74 | 80 |
|
75 | 81 | close(dumpin_fd);
|
76 |
| - code = finish_command(&svndump_proc); |
77 |
| - if (code) |
78 |
| - warning("%s, returned %d", svndump_proc.argv[0], code); |
79 |
| - argv_array_clear(&svndump_argv); |
| 82 | + if (!dump_from_file) { |
| 83 | + code = finish_command(&svndump_proc); |
| 84 | + if (code) |
| 85 | + warning("%s, returned %d", svndump_proc.argv[0], code); |
| 86 | + argv_array_clear(&svndump_argv); |
| 87 | + } |
80 | 88 |
|
81 | 89 | return 0;
|
82 | 90 | }
|
@@ -151,8 +159,14 @@ int main(int argc, const char **argv)
|
151 | 159 | remote = remote_get(argv[1]);
|
152 | 160 | url_in = (argc == 3) ? argv[2] : remote->url[0];
|
153 | 161 |
|
154 |
| - end_url_with_slash(&url_sb, url_in); |
155 |
| - url = url_sb.buf; |
| 162 | + if (!prefixcmp(url_in, "file://")) { |
| 163 | + dump_from_file = 1; |
| 164 | + url = url_decode(url_in + sizeof("file://")-1); |
| 165 | + } else { |
| 166 | + dump_from_file = 0; |
| 167 | + end_url_with_slash(&url_sb, url_in); |
| 168 | + url = url_sb.buf; |
| 169 | + } |
156 | 170 |
|
157 | 171 | strbuf_addf(&private_ref_sb, "refs/svn/%s/master", remote->name);
|
158 | 172 | private_ref = private_ref_sb.buf;
|
|
0 commit comments