rhg: desambiguate status without decompressing filelog if possible
When status is unsure based on `stat()` and the dirstate if a file is clean
or modified, we need to compare it against the filelog.
This comparison can skip looking at contents if the lengths differ.
This changeset optimize this further to deduce what we can about the length
if the filelog without decompressing it or resolving deltas.
Differential Revision: https://phab.mercurial-scm.org/D11965
from __future__ import absolute_import, print_function
import os
from mercurial import (
hg,
scmutil,
ui as uimod,
util,
)
chdir = os.chdir
mkdir = os.mkdir
pjoin = os.path.join
walkrepos = scmutil.walkrepos
checklink = util.checklink
u = uimod.ui.load()
sym = checklink(b'.')
hg.repository(u, b'top1', create=1)
mkdir(b'subdir')
chdir(b'subdir')
hg.repository(u, b'sub1', create=1)
mkdir(b'subsubdir')
chdir(b'subsubdir')
hg.repository(u, b'subsub1', create=1)
chdir(os.path.pardir)
if sym:
os.symlink(os.path.pardir, b'circle')
os.symlink(pjoin(b'subsubdir', b'subsub1'), b'subsub1')
def runtest():
reposet = frozenset(walkrepos(b'.', followsym=True))
if sym and (len(reposet) != 3):
print("reposet = %r" % (reposet,))
print(
(
"Found %d repositories when I should have found 3"
% (len(reposet),)
)
)
if (not sym) and (len(reposet) != 2):
print("reposet = %r" % (reposet,))
print(
(
"Found %d repositories when I should have found 2"
% (len(reposet),)
)
)
sub1set = frozenset(
(pjoin(b'.', b'sub1'), pjoin(b'.', b'circle', b'subdir', b'sub1'))
)
if len(sub1set & reposet) != 1:
print("sub1set = %r" % (sub1set,))
print("reposet = %r" % (reposet,))
print("sub1set and reposet should have exactly one path in common.")
sub2set = frozenset(
(pjoin(b'.', b'subsub1'), pjoin(b'.', b'subsubdir', b'subsub1'))
)
if len(sub2set & reposet) != 1:
print("sub2set = %r" % (sub2set,))
print("reposet = %r" % (reposet,))
print("sub2set and reposet should have exactly one path in common.")
sub3 = pjoin(b'.', b'circle', b'top1')
if sym and sub3 not in reposet:
print("reposet = %r" % (reposet,))
print("Symbolic links are supported and %s is not in reposet" % (sub3,))
runtest()
if sym:
# Simulate not having symlinks.
del os.path.samestat
sym = False
runtest()