##// END OF EJS Templates
copies: no longer cache the ChangedFiles during copy tracing...
copies: no longer cache the ChangedFiles during copy tracing Now that the copies information for both parents are processed all at once, we no longer needs to cache this information, so we simplify the code. The simpler code is also a (tiny) bit faster overall. Repo Case Source-Rev Dest-Rev # of revisions old time new time Difference Factor time per rev --------------------------------------------------------------------------------------------------------------------------------------------------------------- mercurial x_revs_x_added_0_copies ad6b123de1c7 39cfcef4f463 : 1 revs, 0.000041 s, 0.000041 s, +0.000000 s, × 1.0000, 41 µs/rev mercurial x_revs_x_added_x_copies 2b1c78674230 0c1d10351869 : 6 revs, 0.000102 s, 0.000096 s, -0.000006 s, × 0.9412, 16 µs/rev mercurial x000_revs_x000_added_x_copies 81f8ff2a9bf2 dd3267698d84 : 1032 revs, 0.004254 s, 0.004039 s, -0.000215 s, × 0.9495, 3 µs/rev pypy x_revs_x_added_0_copies aed021ee8ae8 099ed31b181b : 9 revs, 0.000282 s, 0.000189 s, -0.000093 s, × 0.6702, 21 µs/rev pypy x_revs_x000_added_0_copies 4aa4e1f8e19a 359343b9ac0e : 1 revs, 0.000048 s, 0.000047 s, -0.000001 s, × 0.9792, 47 µs/rev pypy x_revs_x_added_x_copies ac52eb7bbbb0 72e022663155 : 7 revs, 0.000211 s, 0.000103 s, -0.000108 s, × 0.4882, 14 µs/rev pypy x_revs_x00_added_x_copies c3b14617fbd7 ace7255d9a26 : 1 revs, 0.000375 s, 0.000286 s, -0.000089 s, × 0.7627, 286 µs/rev pypy x_revs_x000_added_x000_copies df6f7a526b60 a83dc6a2d56f : 6 revs, 0.010574 s, 0.010436 s, -0.000138 s, × 0.9869, 1739 µs/rev pypy x000_revs_xx00_added_0_copies 89a76aede314 2f22446ff07e : 4785 revs, 0.049974 s, 0.047465 s, -0.002509 s, × 0.9498, 9 µs/rev pypy x000_revs_x000_added_x_copies 8a3b5bfd266e 2c68e87c3efe : 6780 revs, 0.084300 s, 0.082351 s, -0.001949 s, × 0.9769, 12 µs/rev pypy x000_revs_x000_added_x000_copies 89a76aede314 7b3dda341c84 : 5441 revs, 0.060128 s, 0.058757 s, -0.001371 s, × 0.9772, 10 µs/rev pypy x0000_revs_x_added_0_copies d1defd0dc478 c9cb1334cc78 : 43645 revs, 0.686542 s, 0.674129 s, -0.012413 s, × 0.9819, 15 µs/rev pypy x0000_revs_xx000_added_0_copies bf2c629d0071 4ffed77c095c : 2 revs, 0.009277 s, 0.009434 s, +0.000157 s, × 1.0169, 4717 µs/rev pypy x0000_revs_xx000_added_x000_copies 08ea3258278e d9fa043f30c0 : 11316 revs, 0.114733 s, 0.111935 s, -0.002798 s, × 0.9756, 9 µs/rev netbeans x_revs_x_added_0_copies fb0955ffcbcd a01e9239f9e7 : 2 revs, 0.000081 s, 0.000078 s, -0.000003 s, × 0.9630, 39 µs/rev netbeans x_revs_x000_added_0_copies 6f360122949f 20eb231cc7d0 : 2 revs, 0.000107 s, 0.000106 s, -0.000001 s, × 0.9907, 53 µs/rev netbeans x_revs_x_added_x_copies 1ada3faf6fb6 5a39d12eecf4 : 3 revs, 0.000173 s, 0.000162 s, -0.000011 s, × 0.9364, 54 µs/rev netbeans x_revs_x00_added_x_copies 35be93ba1e2c 9eec5e90c05f : 9 revs, 0.000698 s, 0.000695 s, -0.000003 s, × 0.9957, 77 µs/rev netbeans x000_revs_xx00_added_0_copies eac3045b4fdd 51d4ae7f1290 : 1421 revs, 0.009248 s, 0.008901 s, -0.000347 s, × 0.9625, 6 µs/rev netbeans x000_revs_x000_added_x_copies e2063d266acd 6081d72689dc : 1533 revs, 0.015446 s, 0.014333 s, -0.001113 s, × 0.9279, 9 µs/rev netbeans x000_revs_x000_added_x000_copies ff453e9fee32 411350406ec2 : 5750 revs, 0.074373 s, 0.071998 s, -0.002375 s, × 0.9681, 12 µs/rev netbeans x0000_revs_xx000_added_x000_copies 588c2d1ced70 1aad62e59ddd : 66949 revs, 0.639870 s, 0.615346 s, -0.024524 s, × 0.9617, 9 µs/rev mozilla-central x_revs_x_added_0_copies 3697f962bb7b 7015fcdd43a2 : 2 revs, 0.000088 s, 0.000085 s, -0.000003 s, × 0.9659, 42 µs/rev mozilla-central x_revs_x000_added_0_copies dd390860c6c9 40d0c5bed75d : 8 revs, 0.000199 s, 0.000199 s, +0.000000 s, × 1.0000, 24 µs/rev mozilla-central x_revs_x_added_x_copies 8d198483ae3b 14207ffc2b2f : 9 revs, 0.000171 s, 0.000169 s, -0.000002 s, × 0.9883, 18 µs/rev mozilla-central x_revs_x00_added_x_copies 98cbc58cc6bc 446a150332c3 : 7 revs, 0.000592 s, 0.000590 s, -0.000002 s, × 0.9966, 84 µs/rev mozilla-central x_revs_x000_added_x000_copies 3c684b4b8f68 0a5e72d1b479 : 3 revs, 0.003151 s, 0.003122 s, -0.000029 s, × 0.9908, 1040 µs/rev mozilla-central x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 6 revs, 0.061612 s, 0.061192 s, -0.000420 s, × 0.9932, 10198 µs/rev mozilla-central x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 1593 revs, 0.005381 s, 0.005137 s, -0.000244 s, × 0.9547, 3 µs/rev mozilla-central x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 41 revs, 0.003742 s, 0.003585 s, -0.000157 s, × 0.9580, 87 µs/rev mozilla-central x000_revs_x000_added_x000_copies 7c97034feb78 4407bd0c6330 : 7839 revs, 0.061983 s, 0.060592 s, -0.001391 s, × 0.9776, 7 µs/rev mozilla-central x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 615 revs, 0.019861 s, 0.019596 s, -0.000265 s, × 0.9867, 31 µs/rev mozilla-central x0000_revs_xx000_added_x000_copies f78c615a656c 96a38b690156 : 30263 revs, 0.188101 s, 0.183558 s, -0.004543 s, × 0.9758, 6 µs/rev mozilla-central x00000_revs_x0000_added_x0000_copies 6832ae71433c 4c222a1d9a00 : 153721 revs, 1.806696 s, 1.758083 s, -0.048613 s, × 0.9731, 11 µs/rev mozilla-central x00000_revs_x00000_added_x000_copies 76caed42cf7c 1daa622bbe42 : 204976 revs, 2.682987 s, 2.592955 s, -0.090032 s, × 0.9664, 12 µs/rev mozilla-try x_revs_x_added_0_copies aaf6dde0deb8 9790f499805a : 2 revs, 0.000852 s, 0.000844 s, -0.000008 s, × 0.9906, 422 µs/rev mozilla-try x_revs_x000_added_0_copies d8d0222927b4 5bb8ce8c7450 : 2 revs, 0.000859 s, 0.000861 s, +0.000002 s, × 1.0023, 430 µs/rev mozilla-try x_revs_x_added_x_copies 092fcca11bdb 936255a0384a : 4 revs, 0.000150 s, 0.000150 s, +0.000000 s, × 1.0000, 37 µs/rev mozilla-try x_revs_x00_added_x_copies b53d2fadbdb5 017afae788ec : 2 revs, 0.001158 s, 0.001166 s, +0.000008 s, × 1.0069, 583 µs/rev mozilla-try x_revs_x000_added_x000_copies 20408ad61ce5 6f0ee96e21ad : 1 revs, 0.027240 s, 0.027359 s, +0.000119 s, × 1.0044, 27359 µs/rev mozilla-try x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 6 revs, 0.062824 s, 0.061848 s, -0.000976 s, × 0.9845, 10308 µs/rev mozilla-try x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 1593 revs, 0.005463 s, 0.005110 s, -0.000353 s, × 0.9354, 3 µs/rev mozilla-try x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 41 revs, 0.004238 s, 0.004168 s, -0.000070 s, × 0.9835, 101 µs/rev mozilla-try x000_revs_x000_added_x000_copies 1346fd0130e4 4c65cbdabc1f : 6657 revs, 0.064113 s, 0.063414 s, -0.000699 s, × 0.9891, 9 µs/rev mozilla-try x0000_revs_x_added_0_copies 63519bfd42ee a36a2a865d92 : 40314 revs, 0.294063 s, 0.288301 s, -0.005762 s, × 0.9804, 7 µs/rev mozilla-try x0000_revs_x_added_x_copies 9fe69ff0762d bcabf2a78927 : 38690 revs, 0.281493 s, 0.275798 s, -0.005695 s, × 0.9798, 7 µs/rev mozilla-try x0000_revs_xx000_added_x_copies 156f6e2674f2 4d0f2c178e66 : 8598 revs, 0.076323 s, 0.074640 s, -0.001683 s, × 0.9779, 8 µs/rev mozilla-try x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 615 revs, 0.020390 s, 0.020327 s, -0.000063 s, × 0.9969, 33 µs/rev mozilla-try x0000_revs_xx000_added_x000_copies 89294cd501d9 7ccb2fc7ccb5 : 97052 revs, 3.023879 s, 2.970385 s, -0.053494 s, × 0.9823, 30 µs/rev mozilla-try x0000_revs_x0000_added_x0000_copies e928c65095ed e951f4ad123a : 52031 revs, 0.735549 s, 0.719432 s, -0.016117 s, × 0.9781, 13 µs/rev mozilla-try x00000_revs_x_added_0_copies 6a320851d377 1ebb79acd503 : 363753 revs, 18.568900 s, 18.165143 s, -0.403757 s, × 0.9783, 49 µs/rev mozilla-try x00000_revs_x00000_added_0_copies dc8a3ca7010e d16fde900c9c : 34414 revs, 0.502584 s, 0.486769 s, -0.015815 s, × 0.9685, 14 µs/rev mozilla-try x00000_revs_x_added_x_copies 5173c4b6f97c 95d83ee7242d : 362229 revs, 18.356645 s, 17.913924 s, -0.442721 s, × 0.9759, 49 µs/rev mozilla-try x00000_revs_x000_added_x_copies 9126823d0e9c ca82787bb23c : 359344 revs, 18.250393 s, 17.660113 s, -0.590280 s, × 0.9677, 49 µs/rev mozilla-try x00000_revs_x0000_added_x0000_copies 8d3fafa80d4b eb884023b810 : 192665 revs, 2.792459 s, 2.709446 s, -0.083013 s, × 0.9703, 14 µs/rev mozilla-try x00000_revs_x00000_added_x0000_copies 1b661134e2ca 1ae03d022d6d : 228985 revs, 107.697264 s, 107.796891 s, +0.099627 s, × 1.0009, 470 µs/rev mozilla-try x00000_revs_x00000_added_x000_copies 9b2a99adc05e 8e29777b48e6 : 382065 revs, 63.961040 s, 63.575217 s, -0.385823 s, × 0.9940, 166 µs/rev Differential Revision: https://phab.mercurial-scm.org/D9423

File last commit:

r46729:59fa3890 default
r46765:a132aa59 default
Show More
shelve.py
1178 lines | 38.3 KiB | text/x-python | PythonLexer
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # shelve.py - save/restore working directory state
#
# Copyright 2013 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""save and restore changes to the working directory
The "hg shelve" command saves changes made to the working directory
and reverts those changes, resetting the working directory to a clean
state.
Later on, the "hg unshelve" command restores the changes saved by "hg
shelve". Changes can be restored even after updating to a different
parent, in which case Mercurial's merge machinery will resolve any
conflicts if necessary.
You can have more than one shelved change outstanding at a time; each
shelved change has a distinct name. For details, see the help for "hg
shelve".
"""
from __future__ import absolute_import
import collections
import errno
import itertools
import stat
from .i18n import _
Gregory Szorc
py3: manually import pycompat.open into files that need it...
r43355 from .pycompat import open
Joerg Sonnenberger
node: import symbols explicitly...
r46729 from .node import (
bin,
hex,
nullid,
nullrev,
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 from . import (
bookmarks,
bundle2,
bundlerepo,
changegroup,
cmdutil,
discovery,
error,
exchange,
hg,
lock as lockmod,
mdiff,
merge,
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 mergestate as mergestatemod,
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 patch,
phases,
pycompat,
repair,
scmutil,
templatefilters,
util,
vfs as vfsmod,
)
from .utils import (
dateutil,
stringutil,
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 backupdir = b'shelve-backup'
shelvedir = b'shelved'
shelvefileextensions = [b'hg', b'patch', b'shelve']
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # universal extension is present in all types of shelves
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 patchextension = b'patch'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
# we never need the user, so we use a
# generic user for all shelve operations
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelveuser = b'shelve@localhost'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 class shelvedfile(object):
"""Helper for the file storing a single shelve
Handles common functions on shelve files (.hg/.patch) using
the vfs layer"""
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def __init__(self, repo, name, filetype=None):
self.repo = repo
self.name = name
self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
self.ui = self.repo.ui
if filetype:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self.fname = name + b'.' + filetype
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 else:
self.fname = name
def exists(self):
return self.vfs.exists(self.fname)
def filename(self):
return self.vfs.join(self.fname)
def backupfilename(self):
def gennames(base):
yield base
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 base, ext = base.rsplit(b'.', 1)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for i in itertools.count(1):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 yield b'%s-%d.%s' % (base, i, ext)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
name = self.backupvfs.join(self.fname)
for n in gennames(name):
if not self.backupvfs.exists(n):
return n
def movetobackup(self):
if not self.backupvfs.isdir():
self.backupvfs.makedir()
util.rename(self.filename(), self.backupfilename())
def stat(self):
return self.vfs.stat(self.fname)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 def opener(self, mode=b'rb'):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 try:
return self.vfs(self.fname, mode)
except IOError as err:
if err.errno != errno.ENOENT:
raise
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"shelved change '%s' not found") % self.name)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
def applybundle(self, tr):
fp = self.opener()
try:
targetphase = phases.internal
if not phases.supportinternal(self.repo):
targetphase = phases.secret
gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pretip = self.repo[b'tip']
Augie Fackler
formatting: blacken the codebase...
r43346 bundle2.applybundle(
self.repo,
gen,
tr,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 source=b'unshelve',
url=b'bundle:' + self.vfs.join(self.fname),
Augie Fackler
formatting: blacken the codebase...
r43346 targetphase=targetphase,
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelvectx = self.repo[b'tip']
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if pretip == shelvectx:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelverev = tr.changes[b'revduplicates'][-1]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 shelvectx = self.repo[shelverev]
return shelvectx
finally:
fp.close()
def bundlerepo(self):
path = self.vfs.join(self.fname)
Augie Fackler
formatting: blacken the codebase...
r43346 return bundlerepo.instance(
Matt Harbison
shelve: add the missing `create` parameter to the bundlerepo constructor...
r44124 self.repo.baseui, b'bundle://%s+%s' % (self.repo.root, path), False
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
def writebundle(self, bases, node):
cgversion = changegroup.safeversion(self.repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if cgversion == b'01':
btype = b'HG10BZ'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 compression = None
else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 btype = b'HG20'
compression = b'BZ'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
repo = self.repo.unfiltered()
Augie Fackler
formatting: blacken the codebase...
r43346 outgoing = discovery.outgoing(
Manuel Jacob
discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`...
r45704 repo, missingroots=bases, ancestorsof=[node]
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cg = changegroup.makechangegroup(repo, outgoing, cgversion, b'shelve')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346 bundle2.writebundle(
self.ui, cg, self.fname, btype, self.vfs, compression=compression
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
def writeinfo(self, info):
scmutil.simplekeyvaluefile(self.vfs, self.fname).write(info)
def readinfo(self):
return scmutil.simplekeyvaluefile(self.vfs, self.fname).read()
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 class shelvedstate(object):
"""Handle persistence during unshelving operations.
Handles saving and restoring a shelved state. Ensures that different
versions of a shelved state are possible and handles them appropriately.
"""
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 _version = 2
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _filename = b'shelvedstate'
_keep = b'keep'
_nokeep = b'nokeep'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # colon is essential to differentiate from a real bookmark name
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _noactivebook = b':no-active-bookmark'
_interactive = b'interactive'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
@classmethod
def _verifyandtransform(cls, d):
"""Some basic shelvestate syntactic verification and transformation"""
try:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 d[b'originalwctx'] = bin(d[b'originalwctx'])
d[b'pendingctx'] = bin(d[b'pendingctx'])
d[b'parents'] = [bin(h) for h in d[b'parents'].split(b' ')]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 d[b'nodestoremove'] = [
Joerg Sonnenberger
node: import symbols explicitly...
r46729 bin(h) for h in d[b'nodestoremove'].split(b' ')
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 except (ValueError, TypeError, KeyError) as err:
raise error.CorruptedState(pycompat.bytestr(err))
@classmethod
def _getversion(cls, repo):
"""Read version information from shelvestate file"""
fp = repo.vfs(cls._filename)
try:
version = int(fp.readline().strip())
except ValueError as err:
raise error.CorruptedState(pycompat.bytestr(err))
finally:
fp.close()
return version
@classmethod
def _readold(cls, repo):
"""Read the old position-based version of a shelvestate file"""
# Order is important, because old shelvestate file uses it
# to detemine values of fields (i.g. name is on the second line,
# originalwctx is on the third and so forth). Please do not change.
Augie Fackler
formatting: blacken the codebase...
r43346 keys = [
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'version',
b'name',
b'originalwctx',
b'pendingctx',
b'parents',
b'nodestoremove',
b'branchtorestore',
b'keep',
b'activebook',
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # this is executed only seldomly, so it is not a big deal
# that we open this file twice
fp = repo.vfs(cls._filename)
d = {}
try:
for key in keys:
d[key] = fp.readline().strip()
finally:
fp.close()
return d
@classmethod
def load(cls, repo):
version = cls._getversion(repo)
if version < cls._version:
d = cls._readold(repo)
elif version == cls._version:
Augie Fackler
formatting: blacken the codebase...
r43346 d = scmutil.simplekeyvaluefile(repo.vfs, cls._filename).read(
firstlinenonkeyval=True
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 else:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'this version of shelve is incompatible '
b'with the version used in this repo'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
cls._verifyandtransform(d)
try:
obj = cls()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 obj.name = d[b'name']
obj.wctx = repo[d[b'originalwctx']]
obj.pendingctx = repo[d[b'pendingctx']]
obj.parents = d[b'parents']
obj.nodestoremove = d[b'nodestoremove']
obj.branchtorestore = d.get(b'branchtorestore', b'')
obj.keep = d.get(b'keep') == cls._keep
obj.activebookmark = b''
if d.get(b'activebook', b'') != cls._noactivebook:
obj.activebookmark = d.get(b'activebook', b'')
obj.interactive = d.get(b'interactive') == cls._interactive
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 except (error.RepoLookupError, KeyError) as err:
raise error.CorruptedState(pycompat.bytestr(err))
return obj
@classmethod
Augie Fackler
formatting: blacken the codebase...
r43346 def save(
cls,
repo,
name,
originalwctx,
pendingctx,
nodestoremove,
branchtorestore,
keep=False,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 activebook=b'',
Augie Fackler
formatting: blacken the codebase...
r43346 interactive=False,
):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 info = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"name": name,
Joerg Sonnenberger
node: import symbols explicitly...
r46729 b"originalwctx": hex(originalwctx.node()),
b"pendingctx": hex(pendingctx.node()),
b"parents": b' '.join([hex(p) for p in repo.dirstate.parents()]),
b"nodestoremove": b' '.join([hex(n) for n in nodestoremove]),
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"branchtorestore": branchtorestore,
b"keep": cls._keep if keep else cls._nokeep,
b"activebook": activebook or cls._noactivebook,
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 }
Navaneeth Suresh
unshelve: store information about interactive mode in shelvedstate...
r42889 if interactive:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 info[b'interactive'] = cls._interactive
Augie Fackler
formatting: blacken the codebase...
r43346 scmutil.simplekeyvaluefile(repo.vfs, cls._filename).write(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 info, firstline=(b"%d" % cls._version)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
@classmethod
def clear(cls, repo):
repo.vfs.unlinkpath(cls._filename, ignoremissing=True)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def cleanupoldbackups(repo):
vfs = vfsmod.vfs(repo.vfs.join(backupdir))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 maxbackups = repo.ui.configint(b'shelve', b'maxbackups')
hgfiles = [f for f in vfs.listdir() if f.endswith(b'.' + patchextension)]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 hgfiles = sorted([(vfs.stat(f)[stat.ST_MTIME], f) for f in hgfiles])
if maxbackups > 0 and maxbackups < len(hgfiles):
bordermtime = hgfiles[-maxbackups][0]
else:
bordermtime = None
Augie Fackler
formatting: blacken the codebase...
r43346 for mtime, f in hgfiles[: len(hgfiles) - maxbackups]:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if mtime == bordermtime:
# keep it, because timestamp can't decide exact order of backups
continue
Augie Fackler
formatting: blacken the codebase...
r43346 base = f[: -(1 + len(patchextension))]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for ext in shelvefileextensions:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 vfs.tryunlink(base + b'.' + ext)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _backupactivebookmark(repo):
activebookmark = repo._activebookmark
if activebookmark:
bookmarks.deactivate(repo)
return activebookmark
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _restoreactivebookmark(repo, mark):
if mark:
bookmarks.activate(repo, mark)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _aborttransaction(repo, tr):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Abort current transaction for shelve/unshelve, but keep dirstate"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 dirstatebackupname = b'dirstate.shelve'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 repo.dirstate.savebackup(tr, dirstatebackupname)
tr.abort()
repo.dirstate.restorebackup(None, dirstatebackupname)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def getshelvename(repo, parent, opts):
"""Decide on the name this shelve is going to have"""
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def gennames():
yield label
for i in itertools.count(1):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 yield b'%s-%02d' % (label, i)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = opts.get(b'name')
label = repo._activebookmark or parent.branch() or b'default'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # slashes aren't allowed in filenames, therefore we rename it
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 label = label.replace(b'/', b'_')
label = label.replace(b'\\', b'_')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # filenames must not start with '.' as it should not be hidden
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if label.startswith(b'.'):
label = label.replace(b'.', b'_', 1)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
if name:
if shelvedfile(repo, name, patchextension).exists():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 e = _(b"a shelved change named '%s' already exists") % name
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 raise error.Abort(e)
# ensure we are not creating a subdirectory or a hidden file
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'/' in name or b'\\' in name:
raise error.Abort(
_(b'shelved change names can not contain slashes')
)
if name.startswith(b'.'):
raise error.Abort(_(b"shelved change names can not start with '.'"))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
else:
for n in gennames():
if not shelvedfile(repo, n, patchextension).exists():
name = n
break
return name
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def mutableancestors(ctx):
"""return all mutable ancestors for ctx (included)
Much faster than the revset ancestors(ctx) & draft()"""
Joerg Sonnenberger
node: import symbols explicitly...
r46729 seen = {nullrev}
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 visit = collections.deque()
visit.append(ctx)
while visit:
ctx = visit.popleft()
yield ctx.node()
for parent in ctx.parents():
rev = parent.rev()
if rev not in seen:
seen.add(rev)
if parent.mutable():
visit.append(parent)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def getcommitfunc(extra, interactive, editor=False):
def commitfunc(ui, repo, message, match, opts):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 hasmq = util.safehasattr(repo, b'mq')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if hasmq:
saved, repo.mq.checkapplied = repo.mq.checkapplied, False
targetphase = phases.internal
if not phases.supportinternal(repo):
targetphase = phases.secret
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 overrides = {(b'phases', b'new-commit'): targetphase}
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 try:
editor_ = False
if editor:
Augie Fackler
formatting: blacken the codebase...
r43346 editor_ = cmdutil.getcommiteditor(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 editform=b'shelve.shelve', **pycompat.strkwargs(opts)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 with repo.ui.configoverride(overrides):
Augie Fackler
formatting: blacken the codebase...
r43346 return repo.commit(
message,
shelveuser,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 opts.get(b'date'),
Augie Fackler
formatting: blacken the codebase...
r43346 match,
editor=editor_,
extra=extra,
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 finally:
if hasmq:
repo.mq.checkapplied = saved
def interactivecommitfunc(ui, repo, *pats, **opts):
opts = pycompat.byteskwargs(opts)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 match = scmutil.match(repo[b'.'], pats, {})
message = opts[b'message']
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 return commitfunc(ui, repo, message, match, opts)
return interactivecommitfunc if interactive else commitfunc
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _nothingtoshelvemessaging(ui, repo, pats, opts):
stat = repo.status(match=scmutil.match(repo[None], pats, opts))
if stat.deleted:
Augie Fackler
formatting: blacken the codebase...
r43346 ui.status(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b"nothing changed (%d missing files, see 'hg status')\n")
Augie Fackler
formatting: blacken the codebase...
r43346 % len(stat.deleted)
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b"nothing changed\n"))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _shelvecreatedcommit(repo, node, name, match):
Joerg Sonnenberger
node: import symbols explicitly...
r46729 info = {b'node': hex(node)}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelvedfile(repo, name, b'shelve').writeinfo(info)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 bases = list(mutableancestors(repo[node]))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelvedfile(repo, name, b'hg').writebundle(bases, node)
with shelvedfile(repo, name, patchextension).opener(b'wb') as fp:
Augie Fackler
formatting: blacken the codebase...
r43346 cmdutil.exportfile(
repo, [node], fp, opts=mdiff.diffopts(git=True), match=match
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
def _includeunknownfiles(repo, pats, opts, extra):
Augie Fackler
formatting: blacken the codebase...
r43346 s = repo.status(match=scmutil.match(repo[None], pats, opts), unknown=True)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if s.unknown:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 extra[b'shelve_unknown'] = b'\0'.join(s.unknown)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 repo[None].add(s.unknown)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _finishshelve(repo, tr):
if phases.supportinternal(repo):
tr.close()
else:
_aborttransaction(repo, tr)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def createcmd(ui, repo, pats, opts):
"""subcommand that creates a new shelve"""
with repo.wlock():
cmdutil.checkunfinished(repo)
return _docreatecmd(ui, repo, pats, opts)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _docreatecmd(ui, repo, pats, opts):
wctx = repo[None]
parents = wctx.parents()
parent = parents[0]
origbranch = wctx.branch()
Joerg Sonnenberger
node: import symbols explicitly...
r46729 if parent.node() != nullid:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 desc = b"changes to: %s" % parent.description().split(b'\n', 1)[0]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 desc = b'(changes in empty repository)'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if not opts.get(b'message'):
opts[b'message'] = desc
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
lock = tr = activebookmark = None
try:
lock = repo.lock()
# use an uncommitted transaction to generate the bundle to avoid
# pull races. ensure we don't print the abort message to stderr.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tr = repo.transaction(b'shelve', report=lambda x: None)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 interactive = opts.get(b'interactive', False)
includeunknown = opts.get(b'unknown', False) and not opts.get(
b'addremove', False
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
name = getshelvename(repo, parent, opts)
activebookmark = _backupactivebookmark(repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 extra = {b'internal': b'shelve'}
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if includeunknown:
_includeunknownfiles(repo, pats, opts, extra)
if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts):
# In non-bare shelve we don't store newly created branch
# at bundled commit
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 repo.dirstate.setbranch(repo[b'.'].branch())
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
commitfunc = getcommitfunc(extra, interactive, editor=True)
if not interactive:
node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
else:
Augie Fackler
formatting: blacken the codebase...
r43346 node = cmdutil.dorecord(
ui,
repo,
commitfunc,
None,
False,
cmdutil.recordfilter,
*pats,
**pycompat.strkwargs(opts)
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if not node:
_nothingtoshelvemessaging(ui, repo, pats, opts)
return 1
# Create a matcher so that prefetch doesn't attempt to fetch
# the entire repository pointlessly, and as an optimisation
# for movedirstate, if needed.
match = scmutil.matchfiles(repo, repo[node].files())
_shelvecreatedcommit(repo, node, name, match)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'shelved as %s\n') % name)
if opts[b'keep']:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 with repo.dirstate.parentchange():
scmutil.movedirstate(repo, parent, match)
else:
hg.update(repo, parent.node())
Martin von Zweigbergk
shelve: clear merge state after partial shelve...
r46464 ms = mergestatemod.mergestate.read(repo)
if not ms.unresolvedcount():
ms.reset()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if origbranch != repo[b'.'].branch() and not _isbareshelve(pats, opts):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 repo.dirstate.setbranch(origbranch)
_finishshelve(repo, tr)
finally:
_restoreactivebookmark(repo, activebookmark)
lockmod.release(tr, lock)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _isbareshelve(pats, opts):
Augie Fackler
formatting: blacken the codebase...
r43346 return (
not pats
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 and not opts.get(b'interactive', False)
and not opts.get(b'include', False)
and not opts.get(b'exclude', False)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
def _iswctxonnewbranch(repo):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return repo[None].branch() != repo[b'.'].branch()
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def cleanupcmd(ui, repo):
"""subcommand that deletes all shelves"""
with repo.wlock():
for (name, _type) in repo.vfs.readdir(shelvedir):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 suffix = name.rsplit(b'.', 1)[-1]
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if suffix in shelvefileextensions:
shelvedfile(repo, name).movetobackup()
cleanupoldbackups(repo)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def deletecmd(ui, repo, pats):
"""subcommand that deletes a specific shelve"""
if not pats:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'no shelved changes specified!'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 with repo.wlock():
Matt Harbison
shelve: fix a missing variable in the exception handler for delete...
r44123 for name in pats:
try:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for suffix in shelvefileextensions:
shfile = shelvedfile(repo, name, suffix)
# patch file is necessary, as it should
# be present for any kind of shelve,
# but the .hg file is optional as in future we
# will add obsolete shelve with does not create a
# bundle
if shfile.exists() or suffix == patchextension:
shfile.movetobackup()
Matt Harbison
shelve: fix a missing variable in the exception handler for delete...
r44123 except OSError as err:
if err.errno != errno.ENOENT:
raise
raise error.Abort(_(b"shelved change '%s' not found") % name)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 cleanupoldbackups(repo)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def listshelves(repo):
"""return all shelves in repo as list of (time, filename)"""
try:
names = repo.vfs.readdir(shelvedir)
except OSError as err:
if err.errno != errno.ENOENT:
raise
return []
info = []
for (name, _type) in names:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pfx, sfx = name.rsplit(b'.', 1)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if not pfx or sfx != patchextension:
continue
st = shelvedfile(repo, name).stat()
info.append((st[stat.ST_MTIME], shelvedfile(repo, pfx).filename()))
return sorted(info, reverse=True)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def listcmd(ui, repo, pats, opts):
"""subcommand that displays the list of shelves"""
pats = set(pats)
width = 80
if not ui.plain():
width = ui.termwidth()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 namelabel = b'shelve.newest'
ui.pager(b'shelve')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for mtime, name in listshelves(repo):
sname = util.split(name)[1]
if pats and sname not in pats:
continue
ui.write(sname, label=namelabel)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 namelabel = b'shelve.name'
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if ui.quiet:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 continue
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' ' * (16 - len(sname)))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 used = 16
date = dateutil.makedate(mtime)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 age = b'(%s)' % templatefilters.age(date, abbrev=True)
ui.write(age, label=b'shelve.age')
ui.write(b' ' * (12 - len(age)))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 used += 12
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with open(name + b'.' + patchextension, b'rb') as fp:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 while True:
line = fp.readline()
if not line:
break
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if not line.startswith(b'#'):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 desc = line.rstrip()
if ui.formatted():
desc = stringutil.ellipsis(desc, width - used)
ui.write(desc)
break
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
if not (opts[b'patch'] or opts[b'stat']):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 continue
difflines = fp.readlines()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts[b'patch']:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for chunk, label in patch.difflabel(iter, difflines):
ui.write(chunk, label=label)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts[b'stat']:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for chunk, label in patch.diffstatui(difflines, width=width):
ui.write(chunk, label=label)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def patchcmds(ui, repo, pats, opts):
"""subcommand that displays shelves"""
if len(pats) == 0:
shelves = listshelves(repo)
if not shelves:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"there are no shelves to show"))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 mtime, name = shelves[0]
sname = util.split(name)[1]
pats = [sname]
for shelfname in pats:
if not shelvedfile(repo, shelfname, patchextension).exists():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"cannot find shelf %s") % shelfname)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
listcmd(ui, repo, pats, opts)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def checkparents(repo, state):
"""check parent while resuming an unshelve"""
if state.parents != repo.dirstate.parents():
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b'working directory parents do not match unshelve state')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Taapas Agrawal
abort: added support for unshelve...
r42802 def _loadshelvedstate(ui, repo, opts):
try:
state = shelvedstate.load(repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts.get(b'keep') is None:
opts[b'keep'] = state.keep
Taapas Agrawal
abort: added support for unshelve...
r42802 except IOError as err:
if err.errno != errno.ENOENT:
raise
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cmdutil.wrongtooltocontinue(repo, _(b'unshelve'))
Taapas Agrawal
abort: added support for unshelve...
r42802 except error.CorruptedState as err:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.debug(pycompat.bytestr(err) + b'\n')
if opts.get(b'continue'):
msg = _(b'corrupted shelved state file')
Augie Fackler
formatting: blacken the codebase...
r43346 hint = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'please run hg unshelve --abort to abort unshelve '
b'operation'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Taapas Agrawal
abort: added support for unshelve...
r42802 raise error.Abort(msg, hint=hint)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif opts.get(b'abort'):
Taapas Agrawal
abort: added support for unshelve...
r42802 shelvedstate.clear(repo)
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'could not read shelved state file, your '
b'working copy may be in an unexpected state\n'
b'please update to some commit\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Taapas Agrawal
abort: added support for unshelve...
r42802 return state
Augie Fackler
formatting: blacken the codebase...
r43346
Taapas Agrawal
abort: added support for unshelve...
r42802 def unshelveabort(ui, repo, state):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 """subcommand that abort an in-progress unshelve"""
with repo.lock():
try:
checkparents(repo, state)
Martin von Zweigbergk
merge: introduce a clean_update() for that use-case...
r44743 merge.clean_update(state.pendingctx)
Augie Fackler
formatting: blacken the codebase...
r43346 if state.activebookmark and state.activebookmark in repo._bookmarks:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 bookmarks.activate(repo, state.activebookmark)
mergefiles(ui, repo, state.wctx, state.pendingctx)
if not phases.supportinternal(repo):
Augie Fackler
formatting: blacken the codebase...
r43346 repair.strip(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 finally:
shelvedstate.clear(repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.warn(_(b"unshelve of '%s' aborted\n") % state.name)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Taapas Agrawal
abort: added support for unshelve...
r42802 def hgabortunshelve(ui, repo):
"""logic to abort unshelve using 'hg abort"""
with repo.wlock():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 state = _loadshelvedstate(ui, repo, {b'abort': True})
Taapas Agrawal
abort: added support for unshelve...
r42802 return unshelveabort(ui, repo, state)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def mergefiles(ui, repo, wctx, shelvectx):
"""updates to wctx and merges the changes from shelvectx into the
dirstate."""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with ui.configoverride({(b'ui', b'quiet'): True}):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 hg.update(repo, wctx.node())
ui.pushbuffer(True)
Martin von Zweigbergk
revert: remove dangerous `parents` argument from `cmdutil.revert()`...
r45935 cmdutil.revert(ui, repo, shelvectx)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 ui.popbuffer()
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def restorebranch(ui, repo, branchtorestore):
if branchtorestore and branchtorestore != repo.dirstate.branch():
repo.dirstate.setbranch(branchtorestore)
Augie Fackler
formatting: blacken the codebase...
r43346 ui.status(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'marked working directory as branch %s\n') % branchtorestore
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
def unshelvecleanup(ui, repo, name, opts):
"""remove related files after an unshelve"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if not opts.get(b'keep'):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 for filetype in shelvefileextensions:
shfile = shelvedfile(repo, name, filetype)
if shfile.exists():
shfile.movetobackup()
cleanupoldbackups(repo)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
unshelve: store information about interactive mode in shelvedstate...
r42889 def unshelvecontinue(ui, repo, state, opts):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 """subcommand to continue an in-progress unshelve"""
# We're finishing off a merge. First parent is our original
# parent, second is the temporary "fake" commit we're unshelving.
Navaneeth Suresh
unshelve: store information about interactive mode in shelvedstate...
r42889 interactive = state.interactive
basename = state.name
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 with repo.lock():
checkparents(repo, state)
Augie Fackler
mergestate: split out merge state handling code from main merge module...
r45383 ms = mergestatemod.mergestate.read(repo)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if list(ms.unresolved()):
raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b"unresolved conflicts, can't continue"),
hint=_(b"see 'hg resolve', then 'hg unshelve --continue'"),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
shelvectx = repo[state.parents[1]]
pendingctx = state.pendingctx
with repo.dirstate.parentchange():
Joerg Sonnenberger
node: import symbols explicitly...
r46729 repo.setparents(state.pendingctx.node(), nullid)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 repo.dirstate.write(repo.currenttransaction())
targetphase = phases.internal
if not phases.supportinternal(repo):
targetphase = phases.secret
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 overrides = {(b'phases', b'new-commit'): targetphase}
with repo.ui.configoverride(overrides, b'unshelve'):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 with repo.dirstate.parentchange():
Joerg Sonnenberger
node: import symbols explicitly...
r46729 repo.setparents(state.parents[0], nullid)
Augie Fackler
formatting: blacken the codebase...
r43346 newnode, ispartialunshelve = _createunshelvectx(
ui, repo, shelvectx, basename, interactive, opts
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
if newnode is None:
shelvectx = state.pendingctx
Augie Fackler
formatting: blacken the codebase...
r43346 msg = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'note: unshelved changes already existed '
b'in the working copy\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 ui.status(msg)
else:
# only strip the shelvectx if we produced one
state.nodestoremove.append(newnode)
shelvectx = repo[newnode]
Martin von Zweigbergk
merge: replace calls to hg.updaterepo() by merge.update()...
r46151 merge.update(pendingctx)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 mergefiles(ui, repo, state.wctx, shelvectx)
restorebranch(ui, repo, state.branchtorestore)
Navaneeth Suresh
unshelve: handle stripping changesets on interactive mode...
r42930 if not phases.supportinternal(repo):
Augie Fackler
formatting: blacken the codebase...
r43346 repair.strip(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
unshelve: delete shelvedstate after a successful unshelve --continue...
r42931 shelvedstate.clear(repo)
Navaneeth Suresh
unshelve: add interactive mode...
r42835 if not ispartialunshelve:
unshelvecleanup(ui, repo, state.name, opts)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 _restoreactivebookmark(repo, state.activebookmark)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b"unshelve of '%s' complete\n") % state.name)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Taapas Agrawal
continue: added support for unshelve...
r42833 def hgcontinueunshelve(ui, repo):
"""logic to resume unshelve using 'hg continue'"""
with repo.wlock():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 state = _loadshelvedstate(ui, repo, {b'continue': True})
return unshelvecontinue(ui, repo, state, {b'keep': state.keep})
Augie Fackler
formatting: blacken the codebase...
r43346
Taapas Agrawal
continue: added support for unshelve...
r42833
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
"""Temporarily commit working copy changes before moving unshelve commit"""
# Store pending changes in a commit and remember added in case a shelve
# contains unknown files that are part of the pending change
s = repo.status()
addedbefore = frozenset(s.added)
if not (s.modified or s.added or s.removed):
return tmpwctx, addedbefore
Augie Fackler
formatting: blacken the codebase...
r43346 ui.status(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"temporarily committing pending changes "
b"(restore with 'hg unshelve --abort')\n"
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 extra = {b'internal': b'shelve'}
Augie Fackler
formatting: blacken the codebase...
r43346 commitfunc = getcommitfunc(extra=extra, interactive=False, editor=False)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 tempopts = {}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tempopts[b'message'] = b"pending changes temporary commit"
tempopts[b'date'] = opts.get(b'date')
with ui.configoverride({(b'ui', b'quiet'): True}):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
tmpwctx = repo[node]
return tmpwctx, addedbefore
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _unshelverestorecommit(ui, repo, tr, basename):
"""Recreate commit in the repository during the unshelve"""
repo = repo.unfiltered()
node = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if shelvedfile(repo, basename, b'shelve').exists():
node = shelvedfile(repo, basename, b'shelve').readinfo()[b'node']
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if node is None or node not in repo:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with ui.configoverride({(b'ui', b'quiet'): True}):
shelvectx = shelvedfile(repo, basename, b'hg').applybundle(tr)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 # We might not strip the unbundled changeset, so we should keep track of
# the unshelve node in case we need to reuse it (eg: unshelve --keep)
if node is None:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 info = {b'node': hex(shelvectx.node())}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelvedfile(repo, basename, b'shelve').writeinfo(info)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 else:
shelvectx = repo[node]
return repo, shelvectx
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
unshelve: unify logic around creating an unshelve changeset...
r42886 def _createunshelvectx(ui, repo, shelvectx, basename, interactive, opts):
"""Handles the creation of unshelve commit and updates the shelve if it
was partially unshelved.
If interactive is:
* False: Commits all the changes in the working directory.
* True: Prompts the user to select changes to unshelve and commit them.
Update the shelve with remaining changes.
Returns the node of the new commit formed and a bool indicating whether
the shelve was partially unshelved.Creates a commit ctx to unshelve
interactively or non-interactively.
The user might want to unshelve certain changes only from the stored
shelve in interactive. So, we would create two commits. One with requested
changes to unshelve at that time and the latter is shelved for future.
Here, we return both the newnode which is created interactively and a
bool to know whether the shelve is partly done or completely done.
Navaneeth Suresh
unshelve: add interactive mode...
r42835 """
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 opts[b'message'] = shelvectx.description()
opts[b'interactive-unshelve'] = True
Navaneeth Suresh
unshelve: add interactive mode...
r42835 pats = []
Navaneeth Suresh
unshelve: unify logic around creating an unshelve changeset...
r42886 if not interactive:
Augie Fackler
formatting: blacken the codebase...
r43346 newnode = repo.commit(
text=shelvectx.description(),
extra=shelvectx.extra(),
user=shelvectx.user(),
date=shelvectx.date(),
)
Navaneeth Suresh
unshelve: unify logic around creating an unshelve changeset...
r42886 return newnode, False
Augie Fackler
formatting: blacken the codebase...
r43346 commitfunc = getcommitfunc(shelvectx.extra(), interactive=True, editor=True)
newnode = cmdutil.dorecord(
ui,
repo,
commitfunc,
None,
False,
cmdutil.recordfilter,
*pats,
**pycompat.strkwargs(opts)
)
snode = repo.commit(
text=shelvectx.description(),
extra=shelvectx.extra(),
user=shelvectx.user(),
)
Navaneeth Suresh
unshelve: add interactive mode...
r42835 if snode:
Navaneeth Suresh
unshelve: create a matcher only if required on creating unshelve ctx...
r42888 m = scmutil.matchfiles(repo, repo[snode].files())
Navaneeth Suresh
unshelve: add interactive mode...
r42835 _shelvecreatedcommit(repo, snode, basename, m)
return newnode, bool(snode)
Augie Fackler
formatting: blacken the codebase...
r43346
def _rebaserestoredcommit(
ui,
repo,
opts,
tr,
oldtiprev,
basename,
pctx,
tmpwctx,
shelvectx,
branchtorestore,
activebookmark,
):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 """Rebase restored commit from its original location to a destination"""
# If the shelve is not immediately on top of the commit
# we'll be merging with, rebase it to be on top.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 interactive = opts.get(b'interactive')
Navaneeth Suresh
unshelve: add interactive mode...
r42835 if tmpwctx.node() == shelvectx.p1().node() and not interactive:
# We won't skip on interactive mode because, the user might want to
# unshelve certain changes only.
return shelvectx, False
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
overrides = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 (b'ui', b'forcemerge'): opts.get(b'tool', b''),
(b'phases', b'new-commit'): phases.secret,
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 }
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with repo.ui.configoverride(overrides, b'unshelve'):
ui.status(_(b'rebasing shelved changes\n'))
Augie Fackler
formatting: blacken the codebase...
r43346 stats = merge.graft(
repo,
shelvectx,
Kyle Lippincott
shelve: fix ordering of merge labels...
r44856 labels=[b'working-copy', b'shelve'],
Augie Fackler
formatting: blacken the codebase...
r43346 keepconflictparent=True,
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if stats.unresolvedcount:
tr.close()
Augie Fackler
formatting: blacken the codebase...
r43346 nodestoremove = [
repo.changelog.node(rev)
for rev in pycompat.xrange(oldtiprev, len(repo))
]
shelvedstate.save(
repo,
basename,
pctx,
tmpwctx,
nodestoremove,
branchtorestore,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 opts.get(b'keep'),
Augie Fackler
formatting: blacken the codebase...
r43346 activebookmark,
interactive,
)
Daniel Ploch
error: normalize "unresolved conflicts" error messages with a custom class...
r45711 raise error.ConflictResolutionRequired(b'unshelve')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
with repo.dirstate.parentchange():
Joerg Sonnenberger
node: import symbols explicitly...
r46729 repo.setparents(tmpwctx.node(), nullid)
Augie Fackler
formatting: blacken the codebase...
r43346 newnode, ispartialunshelve = _createunshelvectx(
ui, repo, shelvectx, basename, interactive, opts
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
if newnode is None:
shelvectx = tmpwctx
Augie Fackler
formatting: blacken the codebase...
r43346 msg = _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'note: unshelved changes already existed '
b'in the working copy\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 ui.status(msg)
else:
shelvectx = repo[newnode]
Martin von Zweigbergk
merge: replace calls to hg.updaterepo() by merge.update()...
r46151 merge.update(tmpwctx)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Navaneeth Suresh
unshelve: add interactive mode...
r42835 return shelvectx, ispartialunshelve
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _forgetunknownfiles(repo, shelvectx, addedbefore):
# Forget any files that were unknown before the shelve, unknown before
# unshelve started, but are now added.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelveunknown = shelvectx.extra().get(b'shelve_unknown')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if not shelveunknown:
return
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 shelveunknown = frozenset(shelveunknown.split(b'\0'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 addedafter = frozenset(repo.status().added)
toforget = (addedafter & shelveunknown) - addedbefore
repo[None].forget(toforget)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _finishunshelve(repo, oldtiprev, tr, activebookmark):
_restoreactivebookmark(repo, activebookmark)
# The transaction aborting will strip all the commits for us,
# but it doesn't update the inmemory structures, so addchangegroup
# hooks still fire and try to operate on the missing commits.
# Clean up manually to prevent this.
repo.unfiltered().changelog.strip(oldtiprev, tr)
_aborttransaction(repo, tr)
Augie Fackler
formatting: blacken the codebase...
r43346
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 def _checkunshelveuntrackedproblems(ui, repo, shelvectx):
"""Check potential problems which may result from working
copy having untracked changes."""
wcdeleted = set(repo.status().deleted)
shelvetouched = set(shelvectx.files())
intersection = wcdeleted.intersection(shelvetouched)
if intersection:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 m = _(b"shelved change touches missing files")
hint = _(b"run hg status to see which files are missing")
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 raise error.Abort(m, hint=hint)
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
shelve: split up dounshelve() in unshelvecmd() and _dounshelve()...
r45086 def unshelvecmd(ui, repo, *shelved, **opts):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 opts = pycompat.byteskwargs(opts)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 abortf = opts.get(b'abort')
continuef = opts.get(b'continue')
interactive = opts.get(b'interactive')
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if not abortf and not continuef:
cmdutil.checkunfinished(repo)
shelved = list(shelved)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts.get(b"name"):
shelved.append(opts[b"name"])
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if interactive and opts.get(b'keep'):
raise error.Abort(_(b'--keep on --interactive is not yet supported'))
Navaneeth Suresh
unshelve: store information about interactive mode in shelvedstate...
r42889 if abortf or continuef:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if abortf and continuef:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'cannot use both abort and continue'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if shelved:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'cannot combine abort/continue with '
b'naming a shelved change'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if abortf and opts.get(b'tool', False):
ui.warn(_(b'tool option will be ignored\n'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Taapas Agrawal
abort: added support for unshelve...
r42802 state = _loadshelvedstate(ui, repo, opts)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if abortf:
Taapas Agrawal
abort: added support for unshelve...
r42802 return unshelveabort(ui, repo, state)
Navaneeth Suresh
unshelve: add abort on using continue and interactive together...
r42893 elif continuef and interactive:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'cannot use both continue and interactive'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 elif continuef:
return unshelvecontinue(ui, repo, state, opts)
elif len(shelved) > 1:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'can only unshelve one change at a time'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 elif not shelved:
shelved = listshelves(repo)
if not shelved:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'no shelved changes to apply!'))
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 basename = util.split(shelved[0][1])[1]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b"unshelving change '%s'\n") % basename)
Navaneeth Suresh
unshelve: store information about interactive mode in shelvedstate...
r42889 else:
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 basename = shelved[0]
if not shelvedfile(repo, basename, patchextension).exists():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"shelved change '%s' not found") % basename)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744
Martin von Zweigbergk
shelve: split up dounshelve() in unshelvecmd() and _dounshelve()...
r45086 return _dounshelve(ui, repo, basename, opts)
def _dounshelve(ui, repo, basename, opts):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 repo = repo.unfiltered()
lock = tr = None
try:
lock = repo.lock()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tr = repo.transaction(b'unshelve', report=lambda x: None)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 oldtiprev = len(repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pctx = repo[b'.']
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 tmpwctx = pctx
# The goal is to have a commit structure like so:
# ...-> pctx -> tmpwctx -> shelvectx
# where tmpwctx is an optional commit with the user's pending changes
# and shelvectx is the unshelved changes. Then we merge it all down
# to the original pctx.
activebookmark = _backupactivebookmark(repo)
Augie Fackler
formatting: blacken the codebase...
r43346 tmpwctx, addedbefore = _commitworkingcopychanges(
ui, repo, opts, tmpwctx
)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 repo, shelvectx = _unshelverestorecommit(ui, repo, tr, basename)
_checkunshelveuntrackedproblems(ui, repo, shelvectx)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 branchtorestore = b''
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 if shelvectx.branch() != shelvectx.p1().branch():
branchtorestore = shelvectx.branch()
Augie Fackler
formatting: blacken the codebase...
r43346 shelvectx, ispartialunshelve = _rebaserestoredcommit(
ui,
repo,
opts,
tr,
oldtiprev,
basename,
pctx,
tmpwctx,
shelvectx,
branchtorestore,
activebookmark,
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
with ui.configoverride(overrides, b'unshelve'):
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 mergefiles(ui, repo, pctx, shelvectx)
restorebranch(ui, repo, branchtorestore)
Navaneeth Suresh
unshelve: clear shelvedstate and _finishunshelve() on partial unshelve...
r42932 shelvedstate.clear(repo)
_finishunshelve(repo, oldtiprev, tr, activebookmark)
Navaneeth Suresh
unshelve: forget unknown files after a partial unshelve...
r42961 _forgetunknownfiles(repo, shelvectx, addedbefore)
Navaneeth Suresh
unshelve: add interactive mode...
r42835 if not ispartialunshelve:
unshelvecleanup(ui, repo, basename, opts)
Navaneeth Suresh
shelve: move shelve extension to core...
r42744 finally:
if tr:
tr.release()
lockmod.release(lock)