Index: tests/git_drover_test.py |
diff --git a/tests/git_drover_test.py b/tests/git_drover_test.py |
index c9f1f8fe28cb5fdb72c01dfc0f6f0f0ee81edcc2..98f9352ede1da63b01b8a2d0e660c4d96484c194 100755 |
--- a/tests/git_drover_test.py |
+++ b/tests/git_drover_test.py |
@@ -30,8 +30,8 @@ class GitDroverTest(auto_stub.TestCase): |
with open(os.path.join(self._parent_repo, '.git', 'HEAD'), 'w') as f: |
f.write('HEAD') |
os.mkdir(os.path.join(self._parent_repo, '.git', 'info')) |
- with open(os.path.join(self._parent_repo, '.git', 'info', 'refs'), |
- 'w') as f: |
+ with open( |
+ os.path.join(self._parent_repo, '.git', 'info', 'refs'), 'w') as f: |
f.write('refs') |
self.mock(tempfile, 'mkdtemp', self._mkdtemp) |
self.mock(__builtins__, 'raw_input', self._get_input) |
@@ -40,9 +40,6 @@ class GitDroverTest(auto_stub.TestCase): |
self._commands = [] |
self._input = [] |
self._fail_on_command = None |
- self._has_os_symlink = hasattr(os, 'symlink') |
- if not self._has_os_symlink: |
- os.symlink = lambda source, dest: None |
self.REPO_CHECK_COMMANDS = [ |
(['git', '--help'], self._parent_repo), |
@@ -59,22 +56,34 @@ class GitDroverTest(auto_stub.TestCase): |
(['git', 'checkout', '-b', 'drover_branch_123', |
'refs/remotes/branch-heads/branch'], self._target_repo), |
(['git', 'cherry-pick', '-x', 'cl'], self._target_repo), |
+ ] |
+ self.UPLOAD_COMMANDS = [ |
(['git', 'reset', '--hard'], self._target_repo), |
+ (['git', 'cl', 'upload'], self._target_repo), |
] |
- self.UPLOAD_COMMAND = [(['git', 'cl', 'upload'], self._target_repo)] |
self.LAND_COMMAND = [ |
(['git', 'cl', 'land', '--bypass-hooks'], self._target_repo), |
] |
- self.BRANCH_CLEANUP_COMMANDS = [ |
- (['git', 'cherry-pick', '--abort'], self._target_repo), |
- (['git', 'checkout', '--detach'], self._target_repo), |
- (['git', 'branch', '-D', 'drover_branch_123'], self._target_repo), |
+ if os.name == 'nt': |
+ self.BRANCH_CLEANUP_COMMANDS = [ |
+ (['rmdir', '/s', '/q', self._target_repo], None), |
+ (['git', 'branch', '-D', 'drover_branch_123'], self._parent_repo), |
+ ] |
+ else: |
+ self.BRANCH_CLEANUP_COMMANDS = [ |
+ (['git', 'branch', '-D', 'drover_branch_123'], self._parent_repo), |
+ ] |
+ self.MANUAL_RESOLVE_PREPARATION_COMMANDS = [ |
+ (['git', 'status', '--porcelain'], self._target_repo), |
+ (['git', 'update-index', '--skip-worktree', '--', 'foo', 'bar'], |
+ self._target_repo), |
+ ] |
+ self.FINISH_MANUAL_RESOLVE_COMMANDS = [ |
+ (['git', 'commit', '--no-edit'], self._target_repo), |
] |
def tearDown(self): |
shutil.rmtree(self._temp_directory) |
- if not self._has_os_symlink: |
- del os.symlink |
super(GitDroverTest, self).tearDown() |
def _mkdtemp(self, prefix='tmp'): |
@@ -89,20 +98,27 @@ class GitDroverTest(auto_stub.TestCase): |
return result |
def _check_call(self, args, stderr=None, stdout=None, shell='', cwd=None): |
- self.assertFalse(shell) |
+ if args[0] == 'rmdir': |
+ subprocess.call(args, shell=shell) |
+ else: |
+ self.assertFalse(shell) |
self._commands.append((args, cwd)) |
if (self._fail_on_command is not None and |
self._fail_on_command == len(self._commands)): |
+ self._fail_on_command = None |
raise subprocess.CalledProcessError(1, args[0]) |
if args == ['git', 'rev-parse', '--git-dir']: |
return os.path.join(self._parent_repo, '.git') |
+ if args == ['git', 'status', '--porcelain']: |
+ return ' D foo\nUU baz\n D bar\n' |
+ return '' |
def testSuccess(self): |
self._input = ['y', 'y'] |
git_drover.cherry_pick_change('branch', 'cl', self._parent_repo, False) |
self.assertEqual( |
self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
- self.UPLOAD_COMMAND + self.LAND_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
+ self.UPLOAD_COMMANDS + self.LAND_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
@@ -110,9 +126,8 @@ class GitDroverTest(auto_stub.TestCase): |
def testDryRun(self): |
self._input = ['y'] |
git_drover.cherry_pick_change('branch', 'cl', self._parent_repo, True) |
- self.assertEqual( |
- self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
- self.BRANCH_CLEANUP_COMMANDS, self._commands) |
+ self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
+ self.BRANCH_CLEANUP_COMMANDS, self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
@@ -134,7 +149,7 @@ class GitDroverTest(auto_stub.TestCase): |
self._input = ['y', 'n'] |
git_drover.cherry_pick_change('branch', 'cl', self._parent_repo, False) |
self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
- self.UPLOAD_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
+ self.UPLOAD_COMMANDS + self.BRANCH_CLEANUP_COMMANDS, |
self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
@@ -153,29 +168,105 @@ class GitDroverTest(auto_stub.TestCase): |
self._fail_on_command = 8 |
self.assertRaises(git_drover.Error, git_drover.cherry_pick_change, 'branch', |
'cl', self._parent_repo, False) |
- self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:2], |
- self._commands) |
+ self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:2] + |
+ self.BRANCH_CLEANUP_COMMANDS[:-1], self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
- def testFailDuringCherryPick(self): |
+ def testFailDuringCherryPickAndAbort(self): |
self._input = ['y'] |
self._fail_on_command = 10 |
self.assertRaises(git_drover.Error, git_drover.cherry_pick_change, 'branch', |
'cl', self._parent_repo, False) |
+ self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:4] + |
+ self.MANUAL_RESOLVE_PREPARATION_COMMANDS, self._commands) |
+ self.assertTrue(os.path.exists(self._target_repo)) |
+ self.assertFalse(self._input) |
+ self._commands = [] |
+ git_drover.abort_cherry_pick(self._target_repo) |
+ self.assertEqual(self.BRANCH_CLEANUP_COMMANDS, self._commands) |
+ self.assertFalse(os.path.exists(self._target_repo)) |
+ |
+ def testFailDuringCherryPickAndContinue(self): |
+ self._input = ['y'] |
+ self._fail_on_command = 10 |
+ self.assertRaises(git_drover.PatchError, git_drover.cherry_pick_change, |
+ 'branch', 'cl', self._parent_repo, False) |
+ self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:4] + |
+ self.MANUAL_RESOLVE_PREPARATION_COMMANDS, self._commands) |
+ self.assertTrue(os.path.exists(self._target_repo)) |
+ self.assertFalse(self._input) |
+ |
+ self._commands = [] |
+ self._input = ['n'] |
+ git_drover.continue_cherry_pick(self._target_repo) |
+ self.assertEqual(self.UPLOAD_COMMANDS, self._commands) |
+ self.assertTrue(os.path.exists(self._target_repo)) |
+ self.assertFalse(self._input) |
+ |
+ self._commands = [] |
+ self._input = ['y'] |
+ git_drover.continue_cherry_pick(self._target_repo) |
self.assertEqual( |
- self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:4] + |
- self.BRANCH_CLEANUP_COMMANDS, self._commands) |
+ self.UPLOAD_COMMANDS + self.LAND_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
+ self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
+ def testFailDuringCherryPickAndContinueWithoutCommitting(self): |
+ self._input = ['y'] |
+ self._fail_on_command = 10 |
+ self.assertRaises(git_drover.PatchError, git_drover.cherry_pick_change, |
+ 'branch', 'cl', self._parent_repo, False) |
+ self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:4] + |
+ self.MANUAL_RESOLVE_PREPARATION_COMMANDS, self._commands) |
+ self.assertTrue(os.path.exists(self._target_repo)) |
+ self.assertFalse(self._input) |
+ self._commands = [] |
+ with open(os.path.join(self._target_repo, '.git', 'CHERRY_PICK_HEAD'), 'w'): |
+ pass |
+ |
+ self._commands = [] |
+ self._input = ['y'] |
+ git_drover.continue_cherry_pick(self._target_repo) |
+ self.assertEqual(self.FINISH_MANUAL_RESOLVE_COMMANDS + self.UPLOAD_COMMANDS |
+ + self.LAND_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
+ self._commands) |
+ self.assertFalse(os.path.exists(self._target_repo)) |
+ self.assertFalse(self._input) |
+ |
+ def testFailDuringCherryPickAndContinueWithoutResolving(self): |
+ self._input = ['y'] |
+ self._fail_on_command = 10 |
+ self.assertRaises(git_drover.PatchError, git_drover.cherry_pick_change, |
+ 'branch', 'cl', self._parent_repo, False) |
+ self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS[:4] + |
+ self.MANUAL_RESOLVE_PREPARATION_COMMANDS, self._commands) |
+ self.assertTrue(os.path.exists(self._target_repo)) |
+ self.assertFalse(self._input) |
+ self._commands = [] |
+ self._fail_on_command = 1 |
+ with open(os.path.join(self._target_repo, '.git', 'CHERRY_PICK_HEAD'), 'w'): |
+ pass |
+ self.assertRaisesRegexp(git_drover.Error, |
+ 'All conflicts must be resolved before continuing', |
+ git_drover.continue_cherry_pick, self._target_repo) |
+ self.assertEqual(self.FINISH_MANUAL_RESOLVE_COMMANDS, self._commands) |
+ self.assertTrue(os.path.exists(self._target_repo)) |
+ |
+ self._commands = [] |
+ git_drover.abort_cherry_pick(self._target_repo) |
+ self.assertEqual(self.BRANCH_CLEANUP_COMMANDS, self._commands) |
+ self.assertFalse(os.path.exists(self._target_repo)) |
+ |
def testFailAfterCherryPick(self): |
self._input = ['y'] |
self._fail_on_command = 11 |
self.assertRaises(git_drover.Error, git_drover.cherry_pick_change, 'branch', |
'cl', self._parent_repo, False) |
self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
- self.BRANCH_CLEANUP_COMMANDS, self._commands) |
+ self.UPLOAD_COMMANDS[:1] + self.BRANCH_CLEANUP_COMMANDS, |
+ self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
@@ -185,19 +276,26 @@ class GitDroverTest(auto_stub.TestCase): |
self.assertRaises(git_drover.Error, git_drover.cherry_pick_change, 'branch', |
'cl', self._parent_repo, False) |
self.assertEqual(self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
- self.UPLOAD_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
+ self.UPLOAD_COMMANDS + self.BRANCH_CLEANUP_COMMANDS, |
self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
def testInvalidParentRepoDirectory(self): |
- self.assertRaises( |
- git_drover.Error, git_drover.cherry_pick_change, 'branch', 'cl', |
- os.path.join(self._parent_repo, 'fake'), False) |
+ self.assertRaises(git_drover.Error, git_drover.cherry_pick_change, 'branch', |
+ 'cl', os.path.join(self._parent_repo, 'fake'), False) |
self.assertFalse(self._commands) |
self.assertFalse(os.path.exists(self._target_repo)) |
self.assertFalse(self._input) |
+ def testContinueInvalidWorkdir(self): |
+ self.assertRaises(git_drover.Error, git_drover.continue_cherry_pick, |
+ self._parent_repo) |
+ |
+ def testAbortInvalidWorkdir(self): |
+ self.assertRaises(git_drover.Error, git_drover.abort_cherry_pick, |
+ self._parent_repo) |
+ |
if __name__ == '__main__': |
unittest.main() |