Index: tests/gclient_scm_test.py |
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py |
index 163cc07457858af1a7c420e9cf2daf410f9370ce..a14ae35ca0e440982701f2cfa38eaf148849ded0 100755 |
--- a/tests/gclient_scm_test.py |
+++ b/tests/gclient_scm_test.py |
@@ -919,6 +919,14 @@ from :3 |
return return_value |
return AskForData |
+ def getCurrentBranch(self): |
+ # Returns name of current branch or HEAD for detached HEAD |
+ branch = gclient_scm.scm.GIT.Capture(['rev-parse', '--abbrev-ref', 'HEAD'], |
+ cwd=self.base_path) |
+ if branch == 'HEAD': |
+ return None |
+ return branch |
+ |
def setUp(self): |
TestCaseUtils.setUp(self) |
unittest.TestCase.setUp(self) |
@@ -1200,12 +1208,44 @@ class ManagedGitWrapperTestCase(BaseGitWrapperTestCase): |
'Fix the conflict and run gclient again.\n' |
'See \'man git-rebase\' for details.\n') |
self.assertRaisesError(exception, scm.update, options, (), []) |
+ # The merge conflict creates a detached head with local changes, so another |
+ # scm.update attempt should fail (in a different way) because of that (a |
+ # rather roundabout way to test that condition). |
exception = ('\n____ . at refs/remotes/origin/master\n' |
'\tYou have unstaged changes.\n' |
'\tPlease commit, stash, or reset.\n') |
self.assertRaisesError(exception, scm.update, options, (), []) |
sys.stdout.close() |
+ def testUpdateDetachedConflict(self): |
+ # Detached head mode should refuse to update when there are local changes |
+ # (staged or unstaged). |
+ if not self.enabled: |
+ return |
+ options = self.Options() |
+ scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
+ relpath=self.relpath) |
+ scm._Run(['checkout', '-q', 'a7142dc9f0009350b96a11f372b6ea658592aa95'], |
+ options) |
+ # Make sure it checked out a detached HEAD |
+ self.assertEquals(self.getCurrentBranch(), None) |
+ file_path = join(self.base_path, 'b') |
+ open(file_path, 'w').writelines('conflict\n') |
+ # Unstaged |
+ # TODO(all): Ick. Gclient should really have exception subclasses or |
+ # something, so we can avoid this fragile exception message matching. |
+ exception = ('\n____ . at refs/remotes/origin/master\n' |
+ '\tYou have unstaged changes.\n' |
+ '\tPlease commit, stash, or reset.\n') |
+ self.assertRaisesError(exception, scm.update, options, (), []) |
+ # Staged |
+ scm._Run(['add', 'b'], options) |
+ exception = ('\n____ . at refs/remotes/origin/master\n' |
+ '\tYour index contains uncommitted changes\n' |
+ '\tPlease commit, stash, or reset.\n') |
+ self.assertRaisesError(exception, scm.update, options, (), []) |
+ sys.stdout.close() |
+ |
def testRevinfo(self): |
if not self.enabled: |
return |
@@ -1429,14 +1469,6 @@ class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase): |
# pylint: disable=E1101 |
self.assertNotIn(expected, value) |
- def getCurrentBranch(self): |
- # Returns name of current branch or HEAD for detached HEAD |
- branch = gclient_scm.scm.GIT.Capture(['rev-parse', '--abbrev-ref', 'HEAD'], |
- cwd=self.base_path) |
- if branch == 'HEAD': |
- return None |
- return branch |
- |
def testUpdateClone(self): |
if not self.enabled: |
return |