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'))
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