118 # add evolution metadata |
118 # add evolution metadata |
119 repo.addobsolete(new.node(), old.node()) |
119 repo.addobsolete(new.node(), old.node()) |
120 for u in updates: |
120 for u in updates: |
121 repo.addobsolete(u.node(), old.node()) |
121 repo.addobsolete(u.node(), old.node()) |
122 repo.addobsolete(new.node(), u.node()) |
122 repo.addobsolete(new.node(), u.node()) |
|
123 oldbookmarks = repo.nodebookmarks(old.node()) |
|
124 for book in oldbookmarks: |
|
125 repo._bookmarks[book] = new.node() |
|
126 if oldbookmarks: |
|
127 bookmarks.write(repo) |
123 |
128 |
124 finally: |
129 finally: |
125 wlock.release() |
130 wlock.release() |
126 |
131 |
127 return newid |
132 return newid |
128 |
133 |
129 def relocate(repo, rev, dest): |
134 def relocate(repo, orig, dest): |
130 """rewrite <rev> on dest""" |
135 """rewrite <rev> on dest""" |
131 try: |
136 try: |
132 rebase = extensions.find('rebase') |
137 rebase = extensions.find('rebase') |
133 # dummy state to trick rebase node |
138 # dummy state to trick rebase node |
134 assert repo[rev].p2().rev() == node.nullrev, 'no support yet' |
139 assert orig.p2().rev() == node.nullrev, 'no support yet' |
135 cmdutil.duplicatecopies(repo, rev, repo[dest].node(), |
140 destbookmarks = repo.nodebookmarks(dest.node()) |
136 repo[rev].p2().node()) |
141 cmdutil.duplicatecopies(repo, orig.node(), dest.node()) |
137 rebase.rebasenode(repo, rev, dest, {node.nullrev: node.nullrev}) |
142 rebase.rebasenode(repo, orig.node(), dest.node(), {node.nullrev: node.nullrev}) |
138 nodenew = rebase.concludenode(repo, rev, dest, node.nullid) |
143 nodenew = rebase.concludenode(repo, orig.node(), dest.node(), node.nullid) |
139 nodesrc = repo.changelog.node(rev) |
144 nodesrc = orig.node() |
140 repo.addobsolete(nodenew, nodesrc) |
145 repo.addobsolete(nodenew, nodesrc) |
141 phases.retractboundary(repo, repo[nodesrc].phase(), [nodenew]) |
146 phases.retractboundary(repo, repo[nodesrc].phase(), [nodenew]) |
142 oldbookmarks = repo.nodebookmarks(nodesrc) |
147 oldbookmarks = repo.nodebookmarks(nodesrc) |
143 for book in oldbookmarks: |
148 for book in oldbookmarks: |
144 repo._bookmarks[book] = nodenew |
149 repo._bookmarks[book] = nodenew |
145 if oldbookmarks: |
150 for book in destbookmarks: # restore bookmark that rebase move |
|
151 repo._bookmarks[book] = dest.node() |
|
152 if oldbookmarks or destbookmarks: |
146 bookmarks.write(repo) |
153 bookmarks.write(repo) |
147 except util.Abort: |
154 except util.Abort: |
148 # Invalidate the previous setparents |
155 # Invalidate the previous setparents |
149 repo.dirstate.invalidate() |
156 repo.dirstate.invalidate() |
150 raise |
157 raise |
155 ############################# |
162 ############################# |
156 cmdtable = {} |
163 cmdtable = {} |
157 command = cmdutil.command(cmdtable) |
164 command = cmdutil.command(cmdtable) |
158 |
165 |
159 @command('^stabilize', |
166 @command('^stabilize', |
160 [], |
167 [ |
|
168 ('n', 'dry-run', False, 'Do nothing but printing what should be done') |
|
169 ], |
161 '') |
170 '') |
162 def stabilize(ui, repo): |
171 def stabilize(ui, repo, **opts): |
163 """suggest the next evolution step""" |
172 """move changeset out of they unstable state""" |
164 obsolete = extensions.find('obsolete') |
173 obsolete = extensions.find('obsolete') |
165 unstable = repo.revs('unstable()') |
174 unstable = list(repo.set('unstable()')) |
166 if not unstable: |
175 if not unstable: |
167 ui.write_err(_('no unstable changeset\n')) |
176 ui.write_err(_('no unstable changeset\n')) |
168 return 1 |
177 return 1 |
169 next = unstable[0] |
178 node = unstable[0] |
170 obs = repo[next].parents()[0] |
179 obs = node.parents()[0] |
171 if not obs.obsolete(): |
180 if not obs.obsolete(): |
172 obs = next.parents()[1] |
181 obs = node.parents()[1] |
173 assert obs.obsolete() |
182 assert obs.obsolete() |
174 newer = obsolete.newerversion(repo, obs.node()) |
183 newer = obsolete.newerversion(repo, obs.node()) |
175 if len(newer) > 1: |
184 if len(newer) > 1: |
176 ui.write_err(_("conflict rewriting. can't choose destination\n")) |
185 ui.write_err(_("conflict rewriting. can't choose destination\n")) |
177 return 2 |
186 return 2 |
181 return 2 |
190 return 2 |
182 if len(targets) > 1: |
191 if len(targets) > 1: |
183 ui.write_err(_("does not handle splitted parent yet\n")) |
192 ui.write_err(_("does not handle splitted parent yet\n")) |
184 return 2 |
193 return 2 |
185 target = targets[0] |
194 target = targets[0] |
186 repo.ui.status('hg rebase -Dr %s -d %s\n' % (repo[next], repo[target])) |
195 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate}) |
|
196 target = repo[target] |
|
197 repo.ui.status(_('move:')) |
|
198 displayer.show(node) |
|
199 repo.ui.status(_('atop:')) |
|
200 displayer.show(target) |
|
201 todo= 'hg rebase -Dr %s -d %s\n' % (node, target) |
|
202 if opts['dry_run']: |
|
203 repo.ui.status(todo) |
|
204 else: |
|
205 repo.ui.note(todo) |
|
206 lock = repo.lock() |
|
207 try: |
|
208 relocate(repo, node, target) |
|
209 finally: |
|
210 lock.release() |
187 |
211 |
188 shorttemplate = '[{rev}] {desc|firstline}\n' |
212 shorttemplate = '[{rev}] {desc|firstline}\n' |
189 |
213 |
190 @command('^gdown', |
214 @command('^gdown', |
191 [], |
215 [], |