We used to check it in the run() method, but that's sometimes too
late: for example, it causes stg coalesce to ask for a commit message
_before_ the check, resulting in a lost commit message if the check
fails.
As before, the check can be disabled for the few commands that need
it.
Signed-off-by: Karl Hasselström <kha@treskal.com>
raise common.CmdException('Bad number of undos to redo')
state = log.undo_state(stack, -options.number)
trans = transaction.StackTransaction(stack, 'redo %d' % options.number,
raise common.CmdException('Bad number of undos to redo')
state = log.undo_state(stack, -options.number)
trans = transaction.StackTransaction(stack, 'redo %d' % options.number,
- discard_changes = options.hard)
+ discard_changes = options.hard,
+ allow_bad_head = True)
try:
log.reset_stack(trans, stack.repository.default_iw, state)
except transaction.TransactionHalted:
try:
log.reset_stack(trans, stack.repository.default_iw, state)
except transaction.TransactionHalted:
else:
raise common.CmdException('Wrong number of arguments')
trans = transaction.StackTransaction(stack, 'reset',
else:
raise common.CmdException('Wrong number of arguments')
trans = transaction.StackTransaction(stack, 'reset',
- discard_changes = options.hard)
+ discard_changes = options.hard,
+ allow_bad_head = True)
try:
if patches:
log.reset_stack_partially(trans, stack.repository.default_iw,
try:
if patches:
log.reset_stack_partially(trans, stack.repository.default_iw,
patchnames.reverse()
trans = transaction.StackTransaction(stack, 'uncommit',
patchnames.reverse()
trans = transaction.StackTransaction(stack, 'uncommit',
- allow_conflicts = True)
+ allow_conflicts = True,
+ allow_bad_head = True)
for commit, pn in zip(commits, patchnames):
trans.patches[pn] = commit
trans.applied = list(reversed(patchnames)) + trans.applied
for commit, pn in zip(commits, patchnames):
trans.patches[pn] = commit
trans.applied = list(reversed(patchnames)) + trans.applied
raise common.CmdException('Bad number of commands to undo')
state = log.undo_state(stack, options.number)
trans = transaction.StackTransaction(stack, 'undo %d' % options.number,
raise common.CmdException('Bad number of commands to undo')
state = log.undo_state(stack, options.number)
trans = transaction.StackTransaction(stack, 'undo %d' % options.number,
- discard_changes = options.hard)
+ discard_changes = options.hard,
+ allow_bad_head = True)
try:
log.reset_stack(trans, stack.repository.default_iw, state)
except transaction.TransactionHalted:
try:
log.reset_stack(trans, stack.repository.default_iw, state)
except transaction.TransactionHalted:
your refs and index+worktree, or fail without having done
anything."""
def __init__(self, stack, msg, discard_changes = False,
your refs and index+worktree, or fail without having done
anything."""
def __init__(self, stack, msg, discard_changes = False,
- allow_conflicts = False):
+ allow_conflicts = False, allow_bad_head = False):
"""Create a new L{StackTransaction}.
@param discard_changes: Discard any changes in index+worktree
"""Create a new L{StackTransaction}.
@param discard_changes: Discard any changes in index+worktree
else:
self.__allow_conflicts = allow_conflicts
self.__temp_index = self.temp_index_tree = None
else:
self.__allow_conflicts = allow_conflicts
self.__temp_index = self.temp_index_tree = None
+ if not allow_bad_head:
+ self.__assert_head_top_equal()
stack = property(lambda self: self.__stack)
patches = property(lambda self: self.__patches)
def __set_applied(self, val):
stack = property(lambda self: self.__stack)
patches = property(lambda self: self.__patches)
def __set_applied(self, val):
def __set_head(self, val):
self.__bad_head = val
head = property(__get_head, __set_head)
def __set_head(self, val):
self.__bad_head = val
head = property(__get_head, __set_head)
- def __checkout(self, tree, iw, allow_bad_head):
- if not (allow_bad_head or self.__stack.head_top_equal()):
+ def __assert_head_top_equal(self):
+ if not self.__stack.head_top_equal():
out.error(
'HEAD and top are not the same.',
'This can happen if you modify a branch with git.',
'"stg repair --help" explains more about what to do next.')
self.__abort()
out.error(
'HEAD and top are not the same.',
'This can happen if you modify a branch with git.',
'"stg repair --help" explains more about what to do next.')
self.__abort()
+ def __checkout(self, tree, iw, allow_bad_head):
+ if not allow_bad_head:
+ self.__assert_head_top_equal()
if self.__current_tree == tree and not self.__discard_changes:
# No tree change, but we still want to make sure that
# there are no unresolved conflicts. Conflicts
if self.__current_tree == tree and not self.__discard_changes:
# No tree change, but we still want to make sure that
# there are no unresolved conflicts. Conflicts
echo "Editor was invoked" | tee editor-invoked
EOF
chmod a+x editor
echo "Editor was invoked" | tee editor-invoked
EOF
chmod a+x editor
-test_expect_failure 'Coalesce with top != head' '
+test_expect_success 'Coalesce with top != head' '
echo blahonga >> foo.txt &&
git commit -a -m "a new commit" &&
EDITOR=./editor command_error stg coalesce --name=r0 p0 q1 &&
echo blahonga >> foo.txt &&
git commit -a -m "a new commit" &&
EDITOR=./editor command_error stg coalesce --name=r0 p0 q1 &&