Don't test rebasing with unstaged changes
For safety, attempts to push a commit with unstaged or uncommitted changes in the worktree will be caught and an error reported, rather than leaving it up to ``git rebase`` to spot them. This addresses a situation where users enabling "rebase.autostash" would otherwise experience data loss when the test rebase is subsequently reset. Change-Id: Iabb8387c9db59a7d02ebfd43b688e7bb93d3159f Task: #38921
This commit is contained in:
parent
e8d5404320
commit
d83d99cadc
@ -862,6 +862,23 @@ def rebase_changes(branch, remote, interactive=True):
|
|||||||
return False
|
return False
|
||||||
_orig_head = output
|
_orig_head = output
|
||||||
|
|
||||||
|
# Avoid trying to do a test rebase if there are uncommitted changes.
|
||||||
|
# Either the rebase will fail with a similar message, or if the user
|
||||||
|
# has turned on rebase.autostash then the subsequent reset will
|
||||||
|
# silently discard those changes.
|
||||||
|
cmd = "git diff --quiet"
|
||||||
|
(status, output) = run_command_status(cmd)
|
||||||
|
if status != 0:
|
||||||
|
printwrap("You have unstaged changes. Please commit or stash them "
|
||||||
|
"first, and then try again.")
|
||||||
|
sys.exit(1)
|
||||||
|
cmd = "git diff --cached --quiet"
|
||||||
|
(status, output) = run_command_status(cmd)
|
||||||
|
if status != 0:
|
||||||
|
printwrap("You have uncommitted changes. Please commit or stash them "
|
||||||
|
"first, and then try again.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
cmd = "git show-ref --quiet --verify refs/%s" % remote_branch
|
cmd = "git show-ref --quiet --verify refs/%s" % remote_branch
|
||||||
(status, output) = run_command_status(cmd)
|
(status, output) = run_command_status(cmd)
|
||||||
if status != 0:
|
if status != 0:
|
||||||
|
@ -222,6 +222,26 @@ class GitReviewTestCase(tests.BaseGitReviewTestCase):
|
|||||||
|
|
||||||
self.assertEqual(set(['reviewer1', 'reviewer2']), reviewers)
|
self.assertEqual(set(['reviewer1', 'reviewer2']), reviewers)
|
||||||
|
|
||||||
|
def test_rebase_unstaged_changes_msg(self):
|
||||||
|
"""Test message displayed when unstaged changes are present."""
|
||||||
|
self._run_git_review('-s')
|
||||||
|
self._run_git('checkout', '-b', 'test_branch')
|
||||||
|
# By not passing a filename, we rely on an edit to a preprovisioned
|
||||||
|
# tracked default file, which will be unstaged
|
||||||
|
self._unstaged_change(change_text='simple message')
|
||||||
|
exc = self.assertRaises(Exception, self._run_git_review)
|
||||||
|
self.assertIn("You have unstaged changes. Please", exc.args[0])
|
||||||
|
|
||||||
|
def test_rebase_uncommitted_changes_msg(self):
|
||||||
|
"""Test message displayed when staged changes are present."""
|
||||||
|
self._run_git_review('-s')
|
||||||
|
self._run_git('checkout', '-b', 'test_branch')
|
||||||
|
# By passing a filename, we rely on an edit to a new tracked
|
||||||
|
# file, which will be staged
|
||||||
|
self._uncommitted_change(change_text='simple message')
|
||||||
|
exc = self.assertRaises(Exception, self._run_git_review)
|
||||||
|
self.assertIn("You have uncommitted changes. Please", exc.args[0])
|
||||||
|
|
||||||
def test_rebase_no_remote_branch_msg(self):
|
def test_rebase_no_remote_branch_msg(self):
|
||||||
"""Test message displayed where no remote branch exists."""
|
"""Test message displayed where no remote branch exists."""
|
||||||
self._run_git_review('-s')
|
self._run_git_review('-s')
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
For safety, attempts to push a commit with unstaged or uncommitted changes
|
||||||
|
in the worktree will be caught and an error reported, rather than leaving
|
||||||
|
it up to ``git rebase`` to spot them. This addresses a situation where
|
||||||
|
users enabling *rebase.autostash* would otherwise experience data loss when
|
||||||
|
the test rebase is subsequently reset.
|
Loading…
Reference in New Issue
Block a user