hgext3rd/evolve/cmdrewrite.py
changeset 4638 7978db1dda3e
parent 4613 30a544904238
child 4639 c4cab1dd31b7
equal deleted inserted replaced
4637:4a22dac48b42 4638:7978db1dda3e
  1346     """create successors identical to their predecessors but the changeset ID
  1346     """create successors identical to their predecessors but the changeset ID
  1347 
  1347 
  1348     This is used to "resurrect" changesets
  1348     This is used to "resurrect" changesets
  1349     """
  1349     """
  1350     _checknotesize(ui, opts)
  1350     _checknotesize(ui, opts)
  1351     duplicate = opts['duplicate']
       
  1352     allowdivergence = opts['allowdivergence']
       
  1353     revs = list(revs)
  1351     revs = list(revs)
  1354     revs.extend(opts['rev'])
  1352     revs.extend(opts['rev'])
  1355     if not revs:
  1353     if not revs:
  1356         revs = ['.']
  1354         revs = ['.']
  1357     revs = scmutil.revrange(repo, revs)
  1355     revs = scmutil.revrange(repo, revs)
  1358     if not revs:
  1356     if not revs:
  1359         ui.write_err('no revision to touch\n')
  1357         ui.write_err('no revision to touch\n')
  1360         return 1
  1358         return 1
       
  1359 
       
  1360     duplicate = opts['duplicate']
  1361     if not duplicate:
  1361     if not duplicate:
  1362         rewriteutil.precheck(repo, revs, 'touch')
  1362         rewriteutil.precheck(repo, revs, 'touch')
  1363     tmpl = utility.shorttemplate
  1363     tmpl = utility.shorttemplate
  1364     displayer = compat.changesetdisplayer(ui, repo, {'template': tmpl})
  1364     displayer = compat.changesetdisplayer(ui, repo, {'template': tmpl})
  1365     wlock = lock = tr = None
  1365     wlock = lock = tr = None
  1366     try:
  1366     try:
  1367         wlock = repo.wlock()
  1367         wlock = repo.wlock()
  1368         lock = repo.lock()
  1368         lock = repo.lock()
  1369         tr = repo.transaction('touch')
  1369         tr = repo.transaction('touch')
  1370         revs.sort() # ensure parent are run first
  1370         touchnodes(ui, repo, revs, displayer, **opts)
  1371         newmapping = {}
       
  1372         for r in revs:
       
  1373             ctx = repo[r]
       
  1374             extra = ctx.extra().copy()
       
  1375             extra['__touch-noise__'] = random.randint(0, 0xffffffff)
       
  1376             # search for touched parent
       
  1377             p1 = ctx.p1().node()
       
  1378             p2 = ctx.p2().node()
       
  1379             p1 = newmapping.get(p1, p1)
       
  1380             p2 = newmapping.get(p2, p2)
       
  1381 
       
  1382             if not (duplicate or allowdivergence):
       
  1383                 # The user hasn't yet decided what to do with the revived
       
  1384                 # cset, let's ask
       
  1385                 sset = obsutil.successorssets(repo, ctx.node())
       
  1386                 nodivergencerisk = (len(sset) == 0
       
  1387                                     or (len(sset) == 1
       
  1388                                         and len(sset[0]) == 1
       
  1389                                         and repo[sset[0][0]].rev() == ctx.rev()
       
  1390                                     ))
       
  1391                 if nodivergencerisk:
       
  1392                     duplicate = False
       
  1393                 else:
       
  1394                     displayer.show(ctx)
       
  1395                     index = ui.promptchoice(
       
  1396                         _("reviving this changeset will create divergence"
       
  1397                           " unless you make a duplicate.\n(a)llow divergence or"
       
  1398                           " (d)uplicate the changeset? $$ &Allowdivergence $$ "
       
  1399                           "&Duplicate"), 0)
       
  1400                     choice = ['allowdivergence', 'duplicate'][index]
       
  1401                     if choice == 'allowdivergence':
       
  1402                         duplicate = False
       
  1403                     else:
       
  1404                         duplicate = True
       
  1405 
       
  1406             extradict = {'extra': extra}
       
  1407             new, unusedvariable = rewriteutil.rewrite(repo, ctx, [], ctx,
       
  1408                                                       [p1, p2],
       
  1409                                                       commitopts=extradict)
       
  1410             # store touched version to help potential children
       
  1411             newmapping[ctx.node()] = new
       
  1412 
       
  1413             if not duplicate:
       
  1414                 metadata = {}
       
  1415                 if opts.get('note'):
       
  1416                     metadata['note'] = opts['note']
       
  1417                 obsolete.createmarkers(repo, [(ctx, (repo[new],))],
       
  1418                                        metadata=metadata, operation="touch")
       
  1419             phases.retractboundary(repo, tr, ctx.phase(), [new])
       
  1420             if ctx in repo[None].parents():
       
  1421                 with repo.dirstate.parentchange():
       
  1422                     repo.dirstate.setparents(new, node.nullid)
       
  1423         tr.close()
  1371         tr.close()
  1424     finally:
  1372     finally:
  1425         lockmod.release(tr, lock, wlock)
  1373         lockmod.release(tr, lock, wlock)
       
  1374 
       
  1375 def touchnodes(ui, repo, revs, displayer, **opts):
       
  1376     duplicate = opts['duplicate']
       
  1377     allowdivergence = opts['allowdivergence']
       
  1378     revs.sort() # ensure parent are run first
       
  1379     newmapping = {}
       
  1380     for r in revs:
       
  1381         ctx = repo[r]
       
  1382         extra = ctx.extra().copy()
       
  1383         extra['__touch-noise__'] = random.randint(0, 0xffffffff)
       
  1384         # search for touched parent
       
  1385         p1 = ctx.p1().node()
       
  1386         p2 = ctx.p2().node()
       
  1387         p1 = newmapping.get(p1, p1)
       
  1388         p2 = newmapping.get(p2, p2)
       
  1389 
       
  1390         if not (duplicate or allowdivergence):
       
  1391             # The user hasn't yet decided what to do with the revived
       
  1392             # cset, let's ask
       
  1393             sset = obsutil.successorssets(repo, ctx.node())
       
  1394             nodivergencerisk = (len(sset) == 0
       
  1395                                 or (len(sset) == 1
       
  1396                                     and len(sset[0]) == 1
       
  1397                                     and repo[sset[0][0]].rev() == ctx.rev()
       
  1398                                 ))
       
  1399             if nodivergencerisk:
       
  1400                 duplicate = False
       
  1401             else:
       
  1402                 displayer.show(ctx)
       
  1403                 index = ui.promptchoice(
       
  1404                     _("reviving this changeset will create divergence"
       
  1405                       " unless you make a duplicate.\n(a)llow divergence or"
       
  1406                       " (d)uplicate the changeset? $$ &Allowdivergence $$ "
       
  1407                       "&Duplicate"), 0)
       
  1408                 choice = ['allowdivergence', 'duplicate'][index]
       
  1409                 if choice == 'allowdivergence':
       
  1410                     duplicate = False
       
  1411                 else:
       
  1412                     duplicate = True
       
  1413 
       
  1414         extradict = {'extra': extra}
       
  1415         new, unusedvariable = rewriteutil.rewrite(repo, ctx, [], ctx,
       
  1416                                                   [p1, p2],
       
  1417                                                   commitopts=extradict)
       
  1418         # store touched version to help potential children
       
  1419         newmapping[ctx.node()] = new
       
  1420 
       
  1421         if not duplicate:
       
  1422             metadata = {}
       
  1423             if opts.get('note'):
       
  1424                 metadata['note'] = opts['note']
       
  1425             obsolete.createmarkers(repo, [(ctx, (repo[new],))],
       
  1426                                    metadata=metadata, operation="touch")
       
  1427         tr = repo.currenttransaction()
       
  1428         phases.retractboundary(repo, tr, ctx.phase(), [new])
       
  1429         if ctx in repo[None].parents():
       
  1430             with repo.dirstate.parentchange():
       
  1431                 repo.dirstate.setparents(new, node.nullid)
  1426 
  1432 
  1427 @eh.command(
  1433 @eh.command(
  1428     'pick|grab',
  1434     'pick|grab',
  1429     [('r', 'rev', '', _('revision to pick'), _('REV')),
  1435     [('r', 'rev', '', _('revision to pick'), _('REV')),
  1430      ('c', 'continue', False, 'continue interrupted pick'),
  1436      ('c', 'continue', False, 'continue interrupted pick'),