tree to the state before the operation. Conflicts raised during the
push operation have to be fixed and the 'resolved' command run.
-The 'push' command also notifies when the patch becomes empty after
-the merge operation (i.e. it was fully merged upstream)."""
+The command also notifies when the patch becomes empty (fully merged
+upstream) or is modified (three-way merged) by the 'push' operation."""
options = [make_option('-a', '--all',
help = 'push all the unapplied patches',
make_option('--reverse',
help = 'push the patches in reverse order',
action = 'store_true'),
+ make_option('-m', '--merged',
+ help = 'check for patches merged upstream',
+ action = 'store_true'),
make_option('--undo',
help = 'undo the last push operation',
action = 'store_true')]
+def is_patch_appliable(p):
+ """See if patch exists, or is already applied.
+ """
+ if p in applied:
+ raise CmdException, 'Patch "%s" is already applied' % p
+ if p not in unapplied:
+ raise CmdException, 'Patch "%s" does not exist' % p
+
def func(parser, options, args):
"""Pushes the given patch or all onto the series
"""
+ global applied, unapplied
+
# If --undo is passed, do the work and exit
if options.undo:
patch = crt_series.get_current()
print 'Undoing the "%s" push...' % patch,
sys.stdout.flush()
resolved_all()
- crt_series.undo_push()
- print 'done'
+ if crt_series.undo_push():
+ print 'done'
+ else:
+ print 'done (patch unchanged)'
print_crt_patch()
return
check_conflicts()
check_head_top_equal()
+ applied = crt_series.get_applied()
unapplied = crt_series.get_unapplied()
if not unapplied:
raise CmdException, 'No more patches to push'
if options.to:
boundaries = options.to.split(':')
if len(boundaries) == 1:
- if boundaries[0] not in unapplied:
- raise CmdException, 'Patch "%s" not unapplied' % boundaries[0]
+ is_patch_appliable(boundaries[0])
patches = unapplied[:unapplied.index(boundaries[0])+1]
elif len(boundaries) == 2:
- if boundaries[0] not in unapplied:
- raise CmdException, 'Patch "%s" not unapplied' % boundaries[0]
- if boundaries[1] not in unapplied:
- raise CmdException, 'Patch "%s" not unapplied' % boundaries[1]
+ is_patch_appliable(boundaries[0])
+ is_patch_appliable(boundaries[1])
lb = unapplied.index(boundaries[0])
hb = unapplied.index(boundaries[1])
if lb > hb:
elif len(args) == 0:
patches = [unapplied[0]]
elif len(args) == 1:
- patches = [args[0]]
+ patches = args
+ is_patch_appliable(patches[0])
else:
parser.error('incorrect number of arguments')
if options.reverse:
patches.reverse()
- for p in patches:
- print 'Pushing patch "%s"...' % p,
- sys.stdout.flush()
-
- crt_series.push_patch(p)
+ push_patches(patches, options.merged)
- if crt_series.empty_patch(p):
- print 'done (empty patch)'
- else:
- print 'done'
print_crt_patch()