diff --git a/tests/trychange_unittest.py b/tests/trychange_unittest.py index 3e8887e0b..8d102eac7 100755 --- a/tests/trychange_unittest.py +++ b/tests/trychange_unittest.py @@ -22,6 +22,7 @@ class TryChangeTestsBase(SuperMoxTestBase): def setUp(self): SuperMoxTestBase.setUp(self) self.mox.StubOutWithMock(subprocess2, 'communicate') + self.mox.StubOutWithMock(trychange, 'RunGit') self.mox.StubOutWithMock(trychange.scm.GIT, 'Capture') self.mox.StubOutWithMock(trychange.scm.GIT, 'GenerateDiff') self.mox.StubOutWithMock(trychange.scm.GIT, 'GetCheckoutRoot') @@ -46,14 +47,12 @@ class TryChangeUnittest(TryChangeTestsBase): """General trychange.py tests.""" def testMembersChanged(self): members = [ - 'EPILOG', 'Escape', 'GIT', 'GuessVCS', 'GetMungedDiff', 'HELP_STRING', - 'InvalidScript', 'NoTryServerAccess', 'PrintSuccess', 'SCM', 'SVN', - 'TryChange', 'USAGE', - 'breakpad', 'datetime', 'errno', 'fix_encoding', 'gcl', 'gclient_utils', - 'getpass', 'gen_parser', - 'json', 'logging', 'optparse', 'os', 'posixpath', 're', 'scm', 'shutil', - 'subprocess2', 'sys', 'tempfile', 'urllib', - ] + 'DieWithError', 'EPILOG', 'Escape', 'GIT', 'GetMungedDiff', 'GuessVCS', + 'HELP_STRING', 'InvalidScript', 'NoTryServerAccess', 'PrintSuccess', + 'RunCommand', 'RunGit', 'SCM', 'SVN', 'TryChange', 'USAGE', 'breakpad', + 'datetime', 'errno', 'fix_encoding', 'gcl', 'gclient_utils', 'gen_parser', + 'getpass', 'json', 'logging', 'optparse', 'os', 'posixpath', 're', 'scm', + 'shutil', 'subprocess2', 'sys', 'tempfile', 'urllib'] # If this test fails, you should add the relevant test. self.compareMembers(trychange, members) @@ -138,6 +137,7 @@ class GITUnittest(TryChangeTestsBase): trychange.os.path.abspath(self.fake_root).AndReturn(self.fake_root) trychange.scm.GIT.GetCheckoutRoot(self.fake_root).AndReturn(self.fake_root) trychange.scm.GIT.GetUpstreamBranch(self.fake_root).AndReturn('somewhere') + trychange.RunGit(['diff-index', 'HEAD']) trychange.scm.GIT.GenerateDiff(self.fake_root, full_move=True, files=['foo.txt', 'bar.txt'], diff --git a/trychange.py b/trychange.py index ceeeecea9..042b9391c 100755 --- a/trychange.py +++ b/trychange.py @@ -65,6 +65,28 @@ Examples: -f include/b.h """ + +def DieWithError(message): + print >> sys.stderr, message + sys.exit(1) + + +def RunCommand(args, error_ok=False, error_message=None, **kwargs): + try: + return subprocess2.check_output(args, shell=False, **kwargs) + except subprocess2.CalledProcessError, e: + if not error_ok: + DieWithError( + 'Command "%s" failed.\n%s' % ( + ' '.join(args), error_message or e.stdout or '')) + return e.stdout + + +def RunGit(args, **kwargs): + """Returns stdout.""" + return RunCommand(['git'] + args, **kwargs) + + class InvalidScript(Exception): def __str__(self): return self.args[0] + '\n' + HELP_STRING @@ -272,6 +294,9 @@ class GIT(SCM): self.diff_against) def GenerateDiff(self): + if RunGit(['diff-index', 'HEAD']): + print 'Cannot try with a dirty tree. You must commit locally first.' + return None return scm.GIT.GenerateDiff( self.checkout_root, files=self.files, @@ -750,7 +775,10 @@ def TryChange(argv, root = checkouts[0].checkout_root diffs = [] for checkout in checkouts: - diff = checkout.GenerateDiff().splitlines(True) + raw_diff = checkout.GenerateDiff() + if not raw_diff: + return 1 + diff = raw_diff.splitlines(True) path_diff = gclient_utils.PathDifference(root, checkout.checkout_root) # Munge it. diffs.extend(GetMungedDiff(path_diff, diff)[0])