mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 15:27:13 +03:00
add 'debugrebuildstate' to rebuild the dirstate from a given revision
- added and removed files will be lost while recreating the dirstate - modifications are not lost
This commit is contained in:
parent
8cab067a5d
commit
aa994e6598
@ -985,6 +985,18 @@ def debugancestor(ui, index, rev1, rev2):
|
|||||||
a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
|
a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
|
||||||
ui.write("%d:%s\n" % (r.rev(a), hex(a)))
|
ui.write("%d:%s\n" % (r.rev(a), hex(a)))
|
||||||
|
|
||||||
|
def debugrebuildstate(ui, repo, rev=None):
|
||||||
|
"""rebuild the dirstate as it would look like for the given revision"""
|
||||||
|
if not rev:
|
||||||
|
rev = repo.changelog.tip()
|
||||||
|
else:
|
||||||
|
rev = repo.lookup(rev)
|
||||||
|
change = repo.changelog.read(rev)
|
||||||
|
n = change[0]
|
||||||
|
files = repo.manifest.readflags(n)
|
||||||
|
wlock = self.repo.wlock()
|
||||||
|
repo.dirstate.rebuild(rev, files.iteritems())
|
||||||
|
|
||||||
def debugcheckstate(ui, repo):
|
def debugcheckstate(ui, repo):
|
||||||
"""validate the correctness of the current dirstate"""
|
"""validate the correctness of the current dirstate"""
|
||||||
parent1, parent2 = repo.dirstate.parents()
|
parent1, parent2 = repo.dirstate.parents()
|
||||||
@ -2359,6 +2371,10 @@ table = {
|
|||||||
_('forcibly copy over an existing managed file'))],
|
_('forcibly copy over an existing managed file'))],
|
||||||
_('hg copy [OPTION]... [SOURCE]... DEST')),
|
_('hg copy [OPTION]... [SOURCE]... DEST')),
|
||||||
"debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
|
"debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
|
||||||
|
"debugrebuildstate":
|
||||||
|
(debugrebuildstate,
|
||||||
|
[('r', 'rev', "", _("revision to rebuild to"))],
|
||||||
|
_('debugrebuildstate [-r REV] [REV]')),
|
||||||
"debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
|
"debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
|
||||||
"debugconfig": (debugconfig, [], _('debugconfig')),
|
"debugconfig": (debugconfig, [], _('debugconfig')),
|
||||||
"debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
|
"debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
|
||||||
|
@ -197,6 +197,19 @@ class dirstate(object):
|
|||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self.map = {}
|
self.map = {}
|
||||||
|
self.copies = {}
|
||||||
|
self.markdirty()
|
||||||
|
|
||||||
|
def rebuild(self, parent, files):
|
||||||
|
self.clear()
|
||||||
|
umask = os.umask(0)
|
||||||
|
os.umask(umask)
|
||||||
|
for f, mode in files:
|
||||||
|
if mode:
|
||||||
|
self.map[f] = ('n', ~umask, -1, 0)
|
||||||
|
else:
|
||||||
|
self.map[f] = ('n', ~umask & 0666, -1, 0)
|
||||||
|
self.pl = (parent, nullid)
|
||||||
self.markdirty()
|
self.markdirty()
|
||||||
|
|
||||||
def write(self):
|
def write(self):
|
||||||
@ -406,7 +419,8 @@ class dirstate(object):
|
|||||||
if type_ == 'n':
|
if type_ == 'n':
|
||||||
if not st:
|
if not st:
|
||||||
st = os.stat(fn)
|
st = os.stat(fn)
|
||||||
if size != st.st_size or (mode ^ st.st_mode) & 0100:
|
if size >= 0 and (size != st.st_size
|
||||||
|
or (mode ^ st.st_mode) & 0100):
|
||||||
modified.append(fn)
|
modified.append(fn)
|
||||||
elif time != st.st_mtime:
|
elif time != st.st_mtime:
|
||||||
lookup.append(fn)
|
lookup.append(fn)
|
||||||
|
Loading…
Reference in New Issue
Block a user