hgext/evolve.py
changeset 139 9b9500175ae5
parent 137 bbc653876876
child 140 462d52ae7fb7
equal deleted inserted replaced
138:605ed785268a 139:9b9500175ae5
   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     [],