From: Yann Dirson <ydirson@xxxxxxxxxx> Check first whether the operation can complete, instead of bombing out halfway. --- stgit/commands/branch.py | 5 +++ stgit/stack.py | 7 ++++- t/t1000-branch-create.sh | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/stgit/commands/branch.py b/stgit/commands/branch.py index c4b5945..c95e529 100644 --- a/stgit/commands/branch.py +++ b/stgit/commands/branch.py @@ -122,12 +122,15 @@ def func(parser, options, args): check_conflicts() check_head_top_equal() + if git.branch_exists(args[0]): + raise CmdException, 'Branch "%s" already exists' % args[0] + tree_id = None if len(args) == 2: tree_id = git_id(args[1]) - git.create_branch(args[0], tree_id) stack.Series(args[0]).init() + git.create_branch(args[0], tree_id) print 'Branch "%s" created.' % args[0] return diff --git a/stgit/stack.py b/stgit/stack.py index 92407e7..236e67f 100644 --- a/stgit/stack.py +++ b/stgit/stack.py @@ -431,8 +431,13 @@ class Series: """ bases_dir = os.path.join(self.__base_dir, 'refs', 'bases') - if self.is_initialised(): + if os.path.exists(self.__patch_dir): raise StackException, self.__patch_dir + ' already exists' + if os.path.exists(self.__refs_dir): + raise StackException, self.__refs_dir + ' already exists' + if os.path.exists(self.__base_file): + raise StackException, self.__base_file + ' already exists' + os.makedirs(self.__patch_dir) if not os.path.isdir(bases_dir): diff --git a/t/t1000-branch-create.sh b/t/t1000-branch-create.sh new file mode 100755 index 0000000..bee0b1c --- /dev/null +++ b/t/t1000-branch-create.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# +# Copyright (c) 2006 Yann Dirson +# + +test_description='Branch operations. + +Exercises the "stg branch" commands. +' + +. ./test-lib.sh + +test_stg_init + +test_expect_failure \ + 'Try to create an stgit branch with a spurious refs/patches/ entry' \ + 'find .git -name foo | xargs rm -rf && + touch .git/refs/patches/foo && + stg branch -c foo +' + +test_expect_success \ + 'Check no part of the branch was created' \ + 'test "`find .git -name foo | tee /dev/stderr`" = ".git/refs/patches/foo" +' + + +test_expect_failure \ + 'Try to create an stgit branch with a spurious patches/ entry' \ + 'find .git -name foo | xargs rm -rf && + touch .git/patches/foo && + stg branch -c foo +' + +test_expect_success \ + 'Check no part of the branch was created' \ + 'test "`find .git -name foo | tee /dev/stderr`" = ".git/patches/foo" +' + + +test_expect_failure \ + 'Try to create an stgit branch with a spurious refs/bases/ entry' \ + 'find .git -name foo | xargs rm -rf && + touch .git/refs/bases/foo && + stg branch -c foo +' + +test_expect_success \ + 'Check no part of the branch was created' \ + 'test "`find .git -name foo | tee /dev/stderr`" = ".git/refs/bases/foo" +' + + +# test_expect_failure \ +# 'Try to create an stgit branch with a spurious refs/heads/ entry' \ +# 'find .git -name foo | xargs rm -rf && +# touch .git/refs/heads/foo && +# stg branch -c foo +# ' + +# test_expect_success \ +# 'Check no part of the branch was created' \ +# 'test "`find .git -name foo | tee /dev/stderr`" = ".git/refs/heads/foo" +# ' + +test_done - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html