+ current = crt_series.get_current()
+ if not current:
+ raise CmdException('No patch applied')
+ patches = [current]
+
+ before_patches = after_patches = []
+
+ # pop necessary patches
+ if oldapplied:
+ if options.to:
+ pop_idx = oldapplied.index(options.to)
+ else:
+ pop_idx = 0
+ after_patches = [p for p in oldapplied[pop_idx:] if p not in patches]
+
+ # find the deepest patch to pop
+ sink_applied = [p for p in oldapplied if p in patches]
+ if sink_applied:
+ sinked_idx = oldapplied.index(sink_applied[0])
+ if sinked_idx < pop_idx:
+ # this is the case where sink brings patches forward
+ before_patches = [p for p in oldapplied[sinked_idx:pop_idx]
+ if p not in patches]
+ pop_idx = sinked_idx
+
+ crt_series.pop_patch(oldapplied[pop_idx])
+
+ push_patches(crt_series, before_patches)