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'), |