- raise CmdException, ('Commit %s does not have exactly one parent'
- % commit_id)
- author_name, author_email, author_date = name_email_date(
- commit.get_author())
- crt_series.new_patch(patchname,
- can_edit = False, before_existing = True,
- top = commit_id, bottom = parent,
- message = commit.get_log(),
- author_name = author_name,
- author_email = author_email,
- author_date = author_date)
- write_string(base_file, parent)
-
- print 'done'
+ raise common.CmdException(
+ 'Trying to uncommit %s, which does not have exactly one parent'
+ % c.sha1)
+ return next
+
+ commits = []
+ next_commit = stack.base
+ if patch_nr:
+ out.start('Uncommitting %d patches' % patch_nr)
+ for i in xrange(patch_nr):
+ commits.append(next_commit)
+ next_commit = get_parent(next_commit)
+ else:
+ if options.exclusive:
+ out.start('Uncommitting to %s (exclusive)' % to_commit)
+ else:
+ out.start('Uncommitting to %s' % to_commit)
+ while True:
+ if next_commit == to_commit:
+ if not options.exclusive:
+ commits.append(next_commit)
+ break
+ commits.append(next_commit)
+ next_commit = get_parent(next_commit)
+ patch_nr = len(commits)
+
+ taken_names = set(stack.patchorder.all)
+ if patchnames:
+ for pn in patchnames:
+ if pn in taken_names:
+ raise common.CmdException('Patch name "%s" already taken' % pn)
+ taken_names.add(pn)
+ else:
+ patchnames = []
+ for c in reversed(commits):
+ pn = utils.make_patch_name(c.data.message,
+ lambda pn: pn in taken_names)
+ patchnames.append(pn)
+ taken_names.add(pn)
+ patchnames.reverse()
+
+ trans = transaction.StackTransaction(stack, 'uncommit',
+ allow_conflicts = True)
+ for commit, pn in zip(commits, patchnames):
+ trans.patches[pn] = commit
+ trans.applied = list(reversed(patchnames)) + trans.applied
+ trans.run()
+ out.done()