mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
Make the replay_opts_release() function added in the preceding commit non-static, and use it for freeing the "struct replay_opts" constructed for "rebase" and "revert". To safely call our new replay_opts_release() we'll need to stop calling it in sequencer_remove_state(), and instead call it where we allocate the "struct replay_opts" itself. This is because in e.g. do_interactive_rebase() we construct a "struct replay_opts" with "get_replay_opts()", and then call "complete_action()". If we get far enough in that function without encountering errors we'll call "pick_commits()" which (indirectly) calls sequencer_remove_state() at the end. But if we encounter errors anywhere along the way we'd punt out early, and not free() the memory we allocated. Remembering whether we previously called sequencer_remove_state() would be a hassle. Using a FREE_AND_NULL() pattern would also work, as it would be safe to call replay_opts_release() repeatedly. But let's fix this properly instead, by having the owner of the data free() it. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
108 lines
2.6 KiB
Bash
Executable file
108 lines
2.6 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2006 Eric Wong
|
|
test_description='git svn commit-diff clobber'
|
|
|
|
. ./lib-git-svn.sh
|
|
|
|
test_expect_success 'initialize repo' '
|
|
mkdir import &&
|
|
(
|
|
cd import &&
|
|
echo initial >file &&
|
|
svn_cmd import -m "initial" . "$svnrepo"
|
|
) &&
|
|
echo initial > file &&
|
|
git update-index --add file &&
|
|
git commit -a -m "initial"
|
|
'
|
|
test_expect_success 'commit change from svn side' '
|
|
svn_cmd co "$svnrepo" t.svn &&
|
|
(
|
|
cd t.svn &&
|
|
echo second line from svn >>file &&
|
|
poke file &&
|
|
svn_cmd commit -m "second line from svn"
|
|
) &&
|
|
rm -rf t.svn
|
|
'
|
|
|
|
test_expect_success 'commit conflicting change from git' '
|
|
echo second line from git >> file &&
|
|
git commit -a -m "second line from git" &&
|
|
test_must_fail git svn commit-diff -r1 HEAD~1 HEAD "$svnrepo"
|
|
'
|
|
|
|
test_expect_success 'commit complementing change from git' '
|
|
git reset --hard HEAD~1 &&
|
|
echo second line from svn >> file &&
|
|
git commit -a -m "second line from svn" &&
|
|
echo third line from git >> file &&
|
|
git commit -a -m "third line from git" &&
|
|
git svn commit-diff -r2 HEAD~1 HEAD "$svnrepo"
|
|
'
|
|
|
|
test_expect_success 'dcommit fails to commit because of conflict' '
|
|
git svn init "$svnrepo" &&
|
|
git svn fetch &&
|
|
git reset --hard refs/remotes/git-svn &&
|
|
svn_cmd co "$svnrepo" t.svn &&
|
|
(
|
|
cd t.svn &&
|
|
echo fourth line from svn >>file &&
|
|
poke file &&
|
|
svn_cmd commit -m "fourth line from svn"
|
|
) &&
|
|
rm -rf t.svn &&
|
|
echo "fourth line from git" >> file &&
|
|
git commit -a -m "fourth line from git" &&
|
|
test_must_fail git svn dcommit
|
|
'
|
|
|
|
test_expect_success 'dcommit does the svn equivalent of an index merge' "
|
|
git reset --hard refs/remotes/git-svn &&
|
|
echo 'index merge' > file2 &&
|
|
git update-index --add file2 &&
|
|
git commit -a -m 'index merge' &&
|
|
echo 'more changes' >> file2 &&
|
|
git update-index file2 &&
|
|
git commit -a -m 'more changes' &&
|
|
git svn dcommit
|
|
"
|
|
|
|
test_expect_success 'commit another change from svn side' '
|
|
svn_cmd co "$svnrepo" t.svn &&
|
|
(
|
|
cd t.svn &&
|
|
echo third line from svn >>file &&
|
|
poke file &&
|
|
svn_cmd commit -m "third line from svn"
|
|
) &&
|
|
rm -rf t.svn
|
|
'
|
|
|
|
test_expect_success 'multiple dcommit from git svn will not clobber svn' "
|
|
git reset --hard refs/remotes/git-svn &&
|
|
echo new file >> new-file &&
|
|
git update-index --add new-file &&
|
|
git commit -a -m 'new file' &&
|
|
echo clobber > file &&
|
|
git commit -a -m 'clobber' &&
|
|
test_must_fail git svn dcommit
|
|
"
|
|
|
|
|
|
test_expect_success 'check that rebase really failed' '
|
|
git status >output &&
|
|
grep currently.rebasing output
|
|
'
|
|
|
|
test_expect_success 'resolve, continue the rebase and dcommit' "
|
|
echo clobber and I really mean it > file &&
|
|
git update-index file &&
|
|
git rebase --continue &&
|
|
git svn dcommit
|
|
"
|
|
|
|
test_done
|