2008-09-19 01:55:14 +04:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2008 Deskin Miller
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='git svn partial-rebuild tests'
|
revisions API: have release_revisions() release "cmdline"
Extend the the release_revisions() function so that it frees the
"cmdline" in the "struct rev_info". This in combination with a
preceding change to free "commits" and "mailmap" means that we can
whitelist another test under "TEST_PASSES_SANITIZE_LEAK=true".
There was a proposal in [1] to do away with xstrdup()-ing this
add_rev_cmdline(), perhaps that would be worthwhile, but for now let's
just free() it.
We could also make that a "char *" in "struct rev_cmdline_entry"
itself, but since we own it let's expose it as a constant to outside
callers. I proposed that in [2] but have since changed my mind. See
14d30cdfc04 (ref-filter: fix memory leak in `free_array_item()`,
2019-07-10), c514c62a4fd (checkout: fix leak of non-existent branch
names, 2020-08-14) and other log history hits for "free((char *)" for
prior art.
This includes the tests we had false-positive passes on before my
6798b08e848 (perl Git.pm: don't ignore signalled failure in
_cmd_close(), 2022-02-01), now they pass for real.
Since there are 66 tests matching t/t[0-9]*git-svn*.sh it's easier to
list those that don't pass than to touch most of those 66. So let's
introduce a "TEST_FAILS_SANITIZE_LEAK=true", which if set in the tests
won't cause lib-git-svn.sh to set "TEST_PASSES_SANITIZE_LEAK=true.
This change also marks all the tests that we removed
"TEST_FAILS_SANITIZE_LEAK=true" from in an earlier commit due to
removing the UNLEAK() from cmd_format_patch(), we can now assert that
its API use doesn't leak any "struct rev_info" memory.
This change also made commit "t5503-tagfollow.sh" pass on current
master, but that would regress when combined with
ps/fetch-atomic-fixup's de004e848a9 (t5503: simplify setup of test
which exercises failure of backfill, 2022-03-03) (through no fault of
that topic, that change started using "git clone" in the test, which
has an outstanding leak). Let's leave that test out for now to avoid
in-flight semantic conflicts.
1. https://lore.kernel.org/git/YUj%2FgFRh6pwrZalY@carlos-mbp.lan/
2. https://lore.kernel.org/git/87o88obkb1.fsf@evledraar.gmail.com/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-04-13 23:01:47 +03:00
|
|
|
|
2008-09-19 01:55:14 +04:00
|
|
|
. ./lib-git-svn.sh
|
|
|
|
|
|
|
|
test_expect_success 'initialize svnrepo' '
|
|
|
|
mkdir import &&
|
|
|
|
(
|
2010-09-06 22:39:54 +04:00
|
|
|
(cd import &&
|
2008-09-19 01:55:14 +04:00
|
|
|
mkdir trunk branches tags &&
|
2010-09-06 22:39:54 +04:00
|
|
|
(cd trunk &&
|
|
|
|
echo foo > foo
|
|
|
|
) &&
|
2009-05-08 12:06:16 +04:00
|
|
|
svn_cmd import -m "import for git-svn" . "$svnrepo" >/dev/null &&
|
|
|
|
svn_cmd copy "$svnrepo"/trunk "$svnrepo"/branches/a \
|
2010-09-06 22:39:54 +04:00
|
|
|
-m "created branch a"
|
|
|
|
) &&
|
2008-09-19 01:55:14 +04:00
|
|
|
rm -rf import &&
|
2009-05-08 12:06:16 +04:00
|
|
|
svn_cmd co "$svnrepo"/trunk trunk &&
|
2010-09-06 22:39:54 +04:00
|
|
|
(cd trunk &&
|
2008-09-19 01:55:14 +04:00
|
|
|
echo bar >> foo &&
|
2010-09-06 22:39:54 +04:00
|
|
|
svn_cmd ci -m "updated trunk"
|
|
|
|
) &&
|
2009-05-08 12:06:16 +04:00
|
|
|
svn_cmd co "$svnrepo"/branches/a a &&
|
2010-09-06 22:39:54 +04:00
|
|
|
(cd a &&
|
2008-09-19 01:55:14 +04:00
|
|
|
echo baz >> a &&
|
2009-05-08 12:06:16 +04:00
|
|
|
svn_cmd add a &&
|
2010-09-06 22:39:54 +04:00
|
|
|
svn_cmd ci -m "updated a"
|
|
|
|
) &&
|
2008-09-19 01:55:14 +04:00
|
|
|
git svn init --stdlayout "$svnrepo"
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'import an early SVN revision into git' '
|
|
|
|
git svn fetch -r1:2
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'make full git mirror of SVN' '
|
|
|
|
mkdir mirror &&
|
|
|
|
(
|
2010-09-06 22:39:54 +04:00
|
|
|
(cd mirror &&
|
2008-09-19 01:55:14 +04:00
|
|
|
git init &&
|
|
|
|
git svn init --stdlayout "$svnrepo" &&
|
2010-09-06 22:39:54 +04:00
|
|
|
git svn fetch
|
|
|
|
)
|
2008-09-19 01:55:14 +04:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
git-svn: do a partial rebuild if rev_map is out-of-date
Suppose you're using git-svn to work with a certain SVN repository.
Since you don't like 'git-svn fetch' to take forever, and you don't want
to accidentally interrupt it and end up corrupting your repository, you
set up a remote Git repository to mirror the SVN repository, which does
its own 'git-svn fetch' on a cronjob; now you can 'git-fetch' from the
Git mirror into your local repository, and still dcommit to SVN when you
have changes to push.
After you do this, though, git-svn will get very confused if you ever
try to do 'git-svn fetch' in your local repository again, since its
rev_map will differ from the branch's head, and it will be unable to
fetch new commits from SVN because of the metadata conflict. But all
the necessary metadata are there in the Git commit message; git-svn
already knows how to rebuild rev_map files that get blown away, by
using the metadata.
This patch teaches git-svn do a partial rebuild of the rev_map to
match the true state of the branch, if it ever is used to fetch again.
This will only work for projects not using either noMetadata or
useSvmProps configuration options; if you are using these options,
git-svn will fall back to the previous behaviour.
Signed-off-by: Deskin Miller <deskinm@umich.edu>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-09-16 05:12:58 +04:00
|
|
|
test_expect_success 'fetch from git mirror and partial-rebuild' '
|
2008-09-19 01:55:14 +04:00
|
|
|
git config --add remote.origin.url "file://$PWD/mirror/.git" &&
|
|
|
|
git config --add remote.origin.fetch refs/remotes/*:refs/remotes/* &&
|
|
|
|
git fetch origin &&
|
|
|
|
git svn fetch
|
|
|
|
'
|
|
|
|
|
|
|
|
test_done
|