From: Dmitry Ivankov <divanorama@gmail.com>
To: git@vger.kernel.org
Cc: Jonathan Nieder <jrnieder@gmail.com>,
David Barr <davidbarr@google.com>,
Ramkumar Ramachandra <artagnon@gmail.com>,
Dmitry Ivankov <divanorama@gmail.com>
Subject: [PATCH v2 10/11] vcs-svn,svn-fe: add --incremental option
Date: Wed, 13 Jul 2011 18:21:12 +0600 [thread overview]
Message-ID: <1310559673-5026-11-git-send-email-divanorama@gmail.com> (raw)
In-Reply-To: <1310559673-5026-1-git-send-email-divanorama@gmail.com>
This option is to make svn-fe write commits on top of the existing ref
instead of overwriting it. More precise, the first commit's parent is
set to be :(first_revision_in_current_dump - 1) mark.
Prerequisite is to (re)use import marks (from previous imports). It is
safe to use this option on a svn dump that starts with r0/r1. The svn
dump itself should be incremental too.
Signed-off-by: Dmitry Ivankov <divanorama@gmail.com>
---
contrib/svn-fe/svn-fe.c | 3 +++
contrib/svn-fe/svn-fe.txt | 5 +++++
t/t9010-svn-fe.sh | 34 +++++++++++++++++++++++++++++-----
test-svn-fe.c | 3 +++
vcs-svn/svndump.c | 13 +++++++++----
vcs-svn/svndump.h | 2 +-
6 files changed, 50 insertions(+), 10 deletions(-)
diff --git a/contrib/svn-fe/svn-fe.c b/contrib/svn-fe/svn-fe.c
index a388750..211dc4d 100644
--- a/contrib/svn-fe/svn-fe.c
+++ b/contrib/svn-fe/svn-fe.c
@@ -18,6 +18,9 @@ static struct option svn_fe_options[] = {
{ OPTION_BIT, 0, "progress", &args.progress,
NULL, "don't write a progress line after each commit",
PARSE_OPT_NOARG | PARSE_OPT_NEGHELP, NULL, 1 },
+ OPT_BIT(0, "incremental", &args.incremental,
+ "resume export, requires marks and incremental dump",
+ 1),
OPT_STRING(0, "git-svn-id-url", &args.url, "url",
"append git-svn metadata line to commit messages"),
OPT_STRING(0, "ref", &args.ref, "dst_ref",
diff --git a/contrib/svn-fe/svn-fe.txt b/contrib/svn-fe/svn-fe.txt
index f1a459e..0b6c29e 100644
--- a/contrib/svn-fe/svn-fe.txt
+++ b/contrib/svn-fe/svn-fe.txt
@@ -42,6 +42,11 @@ OPTIONS
--[no-]progress::
Write 'progress' lines to fast-import stream. These
can be displayed by fast-import.
+--incremental::
+ If the first revision in dump has number greater than
+ 1, make :(revision - 1) it's parent. For this to work
+ fast-import must be supplied with import-marks file
+ and the dump must be incremental.
INPUT FORMAT
------------
diff --git a/t/t9010-svn-fe.sh b/t/t9010-svn-fe.sh
index 6dcad94..e5b78a9 100755
--- a/t/t9010-svn-fe.sh
+++ b/t/t9010-svn-fe.sh
@@ -19,7 +19,8 @@ reinit_git () {
try_dump_ext () {
args=$1 &&
fd=${2:-3} &&
- shift 2 &&
+ fi_args=${3:-} &&
+ shift 3 &&
input=$1 &&
maybe_fail_svnfe=${2:+test_$2} &&
maybe_fail_fi=${3:+test_$3} &&
@@ -27,12 +28,12 @@ try_dump_ext () {
{
eval "$maybe_fail_svnfe test-svn-fe $args "$input" >stream $fd<backflow" &
} &&
- $maybe_fail_fi git fast-import --cat-blob-fd=3 <stream 3>backflow &&
+ eval "$maybe_fail_fi git fast-import $fi_args --cat-blob-fd=3 <stream 3>backflow" &&
wait $!
}
try_dump () {
- try_dump_ext "" "" $@
+ try_dump_ext "" "" "" $@
}
properties () {
@@ -76,6 +77,15 @@ Content-length: 10
PROPS-END
EOF
+cat >moreempty.dump <<-EOF &&
+SVN-fs-dump-format-version: 3
+
+Revision-number: 3
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+EOF
test_expect_success 'setup: have pipes?' '
rm -f frob &&
@@ -1121,7 +1131,7 @@ test_expect_success SVNREPO,PIPE 't9135/svn.dump' '
test_expect_success PIPE 'import to notmaster ref' '
reinit_git &&
- try_dump_ext "--ref=refs/heads/notmaster" 3 emptyprop.dump &&
+ try_dump_ext "--ref=refs/heads/notmaster" 3 "" emptyprop.dump &&
git rev-parse --verify notmaster &&
test_must_fail git rev-parse --verify master
@@ -1170,10 +1180,24 @@ test_expect_success PIPE 'use different backflow fd' '
Node-copyfrom-path: directory/somefile
EOF
} >directory.dump &&
- try_dump_ext "--read-blob-fd=7" 7 directory.dump &&
+ try_dump_ext "--read-blob-fd=7" 7 "" directory.dump &&
git checkout HEAD otherfile &&
test_cmp hi otherfile
'
+test_expect_success PIPE 'incremental import' '
+ reinit_git &&
+ >./marks &&
+
+ try_dump_ext "--incremental" "" "--export-marks=./marks" emptyprop.dump &&
+ test_line_count = 2 ./marks &&
+
+ try_dump_ext "--incremental" "" "--import-marks=./marks --export-marks=./marks" moreempty.dump &&
+ test_line_count = 3 ./marks &&
+
+ git log --format=oneline >history &&
+ test_line_count = 3 ./history
+'
+
test_done
diff --git a/test-svn-fe.c b/test-svn-fe.c
index f2711e6..8d3cc99 100644
--- a/test-svn-fe.c
+++ b/test-svn-fe.c
@@ -22,6 +22,9 @@ static struct option test_svnfe_options[] = {
OPT_SET_INT('d', NULL, &d, "test apply_delta", 1),
OPT_STRING(0, "ref", &args.ref, "dst_ref",
"write to dst_ref instead of refs/heads/master"),
+ OPT_BIT(0, "incremental", &args.incremental,
+ "resume export, requires marks and incremental dump",
+ 1),
OPT_INTEGER(0, "read-blob-fd", &args.backflow_fd,
"read blobs and trees from this fd instead of 3"),
OPT_END()
diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c
index 6ad9f63..2b11f96 100644
--- a/vcs-svn/svndump.c
+++ b/vcs-svn/svndump.c
@@ -58,6 +58,7 @@ static struct {
struct strbuf uuid, url;
int first_commit_done;
struct strbuf ref_name;
+ int incremental;
} dump_ctx;
static void reset_node_ctx(char *fname)
@@ -83,7 +84,7 @@ static void reset_rev_ctx(uint32_t revision)
strbuf_reset(&rev_ctx.author);
}
-static void reset_dump_ctx(const char *url, const char *dst_ref)
+static void reset_dump_ctx(const char *url, const char *dst_ref, int incremental)
{
strbuf_reset(&dump_ctx.url);
if (url)
@@ -93,6 +94,7 @@ static void reset_dump_ctx(const char *url, const char *dst_ref)
dump_ctx.first_commit_done = 0;
strbuf_reset(&dump_ctx.ref_name);
strbuf_addstr(&dump_ctx.ref_name, dst_ref);
+ dump_ctx.incremental = incremental;
}
static void handle_property(const struct strbuf *key_buf,
@@ -321,7 +323,10 @@ static void begin_revision(void)
} else {
*gitsvnline = 0;
}
- from_mark = dump_ctx.first_commit_done ? rev_ctx.revision - 1 : 0;
+ if (dump_ctx.incremental)
+ from_mark = rev_ctx.revision - 1;
+ else
+ from_mark = dump_ctx.first_commit_done ? rev_ctx.revision - 1 : 0;
author = *rev_ctx.author.buf ? rev_ctx.author.buf : "nobody";
domain = *dump_ctx.uuid.buf ? dump_ctx.uuid.buf : "local";
@@ -493,7 +498,7 @@ int svndump_init(const struct svndump_args *args)
strbuf_init(&rev_ctx.author, 4096);
strbuf_init(&node_ctx.src, 4096);
strbuf_init(&node_ctx.dst, 4096);
- reset_dump_ctx(args->url, args->ref);
+ reset_dump_ctx(args->url, args->ref, args->incremental);
reset_rev_ctx(0);
reset_node_ctx(NULL);
return 0;
@@ -502,7 +507,7 @@ int svndump_init(const struct svndump_args *args)
void svndump_deinit(void)
{
fast_export_deinit();
- reset_dump_ctx(NULL, "");
+ reset_dump_ctx(NULL, "", 0);
reset_rev_ctx(0);
reset_node_ctx(NULL);
strbuf_release(&rev_ctx.log);
diff --git a/vcs-svn/svndump.h b/vcs-svn/svndump.h
index af63edb..f2bb58c 100644
--- a/vcs-svn/svndump.h
+++ b/vcs-svn/svndump.h
@@ -5,7 +5,7 @@ struct svndump_args {
const char *filename, *url;
const char *ref;
int backflow_fd;
- int progress;
+ int progress, incremental;
};
int svndump_init(const struct svndump_args *args);
--
1.7.3.4
next prev parent reply other threads:[~2011-07-13 12:21 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-13 12:21 [PATCH v2 00/11] vcs-svn,svn-fe add a couple of options Dmitry Ivankov
2011-07-13 12:21 ` [PATCH v2 01/11] svn-fe: add man target to Makefile Dmitry Ivankov
2011-07-24 12:52 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 02/11] test-svn-fe: use parse-options Dmitry Ivankov
2011-07-24 13:04 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 03/11] svn-fe: add EXTLIBS needed for parse-options Dmitry Ivankov
2011-07-24 13:14 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 04/11] svn-fe: add usage and unpositional arguments versions Dmitry Ivankov
2011-07-24 13:25 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 05/11] vcs-svn: move url parameter from _read to _init Dmitry Ivankov
2011-07-24 13:40 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 06/11] vcs-svn: move commit parameters logic to svndump.c Dmitry Ivankov
2011-07-24 13:58 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 07/11] vcs-svn,svn-fe: allow to specify dump destination ref Dmitry Ivankov
2011-07-25 8:57 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 08/11] vcs-svn,svn-fe: convert REPORT_FILENO to an option Dmitry Ivankov
2011-07-25 21:26 ` Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 09/11] vcs-svn,svn-fe: allow to disable 'progress' lines Dmitry Ivankov
2011-07-13 12:21 ` Dmitry Ivankov [this message]
2011-07-25 21:35 ` [PATCH v2 10/11] vcs-svn,svn-fe: add --incremental option Jonathan Nieder
2011-07-13 12:21 ` [PATCH v2 11/11] vcs-svn,svn-fe: add an option to write svnrev notes Dmitry Ivankov
2011-07-25 21:39 ` Jonathan Nieder
2011-07-28 6:03 ` Dmitry Ivankov
2011-07-28 10:27 ` Jonathan Nieder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1310559673-5026-11-git-send-email-divanorama@gmail.com \
--to=divanorama@gmail.com \
--cc=artagnon@gmail.com \
--cc=davidbarr@google.com \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).