From: Catalin Marinas Date: Tue, 4 Dec 2007 21:46:14 +0000 (+0000) Subject: Clean-up if the branch creation fails (bug #10015) X-Git-Tag: v0.14~16 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/stgit/commitdiff_plain/91413512c5afe7c69aabf4367a9ff8ed1df21efb Clean-up if the branch creation fails (bug #10015) If the tree switching fails during the branch creation, the new head will be reverted and the new branch deleted. Signed-off-by: Catalin Marinas --- diff --git a/stgit/git.py b/stgit/git.py index 6744be0..4cc35c9 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -366,13 +366,20 @@ def create_branch(new_branch, tree_id = None): if branch_exists(new_branch): raise GitException, 'Branch "%s" already exists' % new_branch + current_head_file = get_head_file() current_head = get_head() set_head_file(new_branch) __set_head(current_head) # a checkout isn't needed if new branch points to the current head if tree_id: - switch(tree_id) + try: + switch(tree_id) + except GitException: + # Tree switching failed. Revert the head file + set_head_file(current_head_file) + delete_branch(new_branch) + raise if os.path.isfile(os.path.join(basedir.get(), 'MERGE_HEAD')): os.remove(os.path.join(basedir.get(), 'MERGE_HEAD')) diff --git a/t/t1000-branch-create.sh b/t/t1000-branch-create.sh index 848686c..bc796b4 100755 --- a/t/t1000-branch-create.sh +++ b/t/t1000-branch-create.sh @@ -49,7 +49,30 @@ test_expect_success \ test_expect_success \ 'Create an invalid refs/heads/ entry' ' find .git -name foo | xargs rm -rf && - touch .git/refs/heads/foo + touch .git/refs/heads/foo && + ! stg branch -c foo +' + +test_expect_success \ + 'Setup two commits including removal of generated files' ' + git init && + touch a.c a.o && + git add a.c a.o && + git commit -m 1 && + git rm a.c a.o && + git commit -m 2 && + touch a.o +' + +test_expect_failure \ + 'Create branch down the stack, behind the conflict caused by the generated file' ' + stg branch --create bar master^ +' + +test_expect_success \ + 'Check the branch was not created' ' + test ! -r .git/refs/heads/bar && + test ! -r a.c ' test_done