equal
deleted
inserted
replaced
61 references a changeset existing before the rewrite call. |
61 references a changeset existing before the rewrite call. |
62 """ |
62 """ |
63 if len(old.parents()) > 1: #XXX remove this unecessary limitation. |
63 if len(old.parents()) > 1: #XXX remove this unecessary limitation. |
64 raise error.Abort(_('cannot amend merge changesets')) |
64 raise error.Abort(_('cannot amend merge changesets')) |
65 base = old.p1() |
65 base = old.p1() |
66 bm = bookmarks.readcurrent(repo) |
66 updatebookmarks = _bookmarksupdater(repo, old.node()) |
67 |
67 |
68 wlock = repo.wlock() |
68 wlock = repo.wlock() |
69 try: |
69 try: |
70 |
70 |
71 # commit a new version of the old changeset, including the update |
71 # commit a new version of the old changeset, including the update |
132 revcount = len(repo) |
132 revcount = len(repo) |
133 newid = repo.commitctx(new) |
133 newid = repo.commitctx(new) |
134 new = repo[newid] |
134 new = repo[newid] |
135 created = len(repo) != revcount |
135 created = len(repo) != revcount |
136 if created: |
136 if created: |
137 # update the bookmark |
137 updatebookmarks(newid) |
138 if bm: |
|
139 repo._bookmarks[bm] = newid |
|
140 bookmarks.write(repo) |
|
141 |
|
142 # add evolution metadata |
138 # add evolution metadata |
143 collapsed = set([u.node() for u in updates] + [old.node()]) |
139 collapsed = set([u.node() for u in updates] + [old.node()]) |
144 repo.addcollapsedobsolete(collapsed, new.node()) |
140 repo.addcollapsedobsolete(collapsed, new.node()) |
145 oldbookmarks = repo.nodebookmarks(old.node()) |
|
146 for book in oldbookmarks: |
|
147 repo._bookmarks[book] = new.node() |
|
148 if oldbookmarks: |
|
149 bookmarks.write(repo) |
|
150 else: |
141 else: |
151 # newid is an existing revision. It could make sense to |
142 # newid is an existing revision. It could make sense to |
152 # replace revisions with existing ones but probably not by |
143 # replace revisions with existing ones but probably not by |
153 # default. |
144 # default. |
154 pass |
145 pass |
214 ctx.rev())) |
205 ctx.rev())) |
215 if unstables: |
206 if unstables: |
216 return unstables[0] |
207 return unstables[0] |
217 return None |
208 return None |
218 |
209 |
|
210 def _bookmarksupdater(repo, oldid): |
|
211 """Return a callable update(newid) updating the current bookmark |
|
212 and bookmarks bound to oldid to newid. |
|
213 """ |
|
214 bm = bookmarks.readcurrent(repo) |
|
215 def updatebookmarks(newid): |
|
216 dirty = False |
|
217 if bm: |
|
218 repo._bookmarks[bm] = newid |
|
219 dirty = True |
|
220 oldbookmarks = repo.nodebookmarks(oldid) |
|
221 if oldbookmarks: |
|
222 for b in oldbookmarks: |
|
223 repo._bookmarks[b] = newid |
|
224 dirty = True |
|
225 if dirty: |
|
226 bookmarks.write(repo) |
|
227 return updatebookmarks |
|
228 |
219 ### new command |
229 ### new command |
220 ############################# |
230 ############################# |
221 cmdtable = {} |
231 cmdtable = {} |
222 command = cmdutil.command(cmdtable) |
232 command = cmdutil.command(cmdtable) |
223 |
233 |
582 if old.phase() == phases.public: |
592 if old.phase() == phases.public: |
583 raise util.Abort(_("cannot rewrite immutable changeset")) |
593 raise util.Abort(_("cannot rewrite immutable changeset")) |
584 if len(old.parents()) > 1: |
594 if len(old.parents()) > 1: |
585 raise util.Abort(_("cannot uncommit merge changeset")) |
595 raise util.Abort(_("cannot uncommit merge changeset")) |
586 oldphase = old.phase() |
596 oldphase = old.phase() |
|
597 updatebookmarks = _bookmarksupdater(repo, old.node()) |
587 # Recommit the filtered changeset |
598 # Recommit the filtered changeset |
588 newid = None |
599 newid = None |
589 if pats or opts.get('include') or opts.get('exclude'): |
600 if pats or opts.get('include') or opts.get('exclude'): |
590 match = scmutil.match(old, pats, opts) |
601 match = scmutil.match(old, pats, opts) |
591 newid = _commitfiltered(repo, old, match) |
602 newid = _commitfiltered(repo, old, match) |
594 # Move local changes on filtered changeset |
605 # Move local changes on filtered changeset |
595 repo.addobsolete(newid, old.node()) |
606 repo.addobsolete(newid, old.node()) |
596 phases.retractboundary(repo, oldphase, [newid]) |
607 phases.retractboundary(repo, oldphase, [newid]) |
597 repo.dirstate.setparents(newid, node.nullid) |
608 repo.dirstate.setparents(newid, node.nullid) |
598 _uncommitdirstate(repo, old, match) |
609 _uncommitdirstate(repo, old, match) |
|
610 updatebookmarks(newid) |
599 finally: |
611 finally: |
600 wlock.release() |
612 wlock.release() |
601 finally: |
613 finally: |
602 lock.release() |
614 lock.release() |
603 |
615 |