##// END OF EJS Templates
revisions: allow "x123" to refer to nodeid prefix "123"...
revisions: allow "x123" to refer to nodeid prefix "123" When resolving "123" to a revision, we try to interpret it as revnum before we try to interpret it as a nodeid hex prefix. This can lead to the shortest valid prefix being longer than necessary. This patch lets us write such nodeids in a shorter form by prefixing them with "x" instead of adding more hex digits until they're longer than the longest decimal revnum. On my hg repo with almost 69k revisions, turning this feature on saves on average 0.4% on the average nodeid length. That clearly doesn't justify this patch. However, it becomes more usefule when combined with the earlier patches in this series that let you disambiguate nodeid prefixes within a configured revset. Note that we attempt to resolve symbols as nodeid prefixes after we've exhausted all other posibilities, so this is a backwards compatible change (only queries that would previously fail may now succeed). I've still hidden this feature behind an experiemntal config option so we can roll it back if needed. Differential Revision: https://phab.mercurial-scm.org/D4041

File last commit:

r36799:ffa3026d default
r38891:7848f284 default
Show More
test-atomictempfile.py
125 lines | 4.2 KiB | text/x-python | PythonLexer
/ tests / test-atomictempfile.py
Pulkit Goyal
py3: make tests/test-atomictempfile.py use absolute_import
r29194 from __future__ import absolute_import
import glob
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007 import os
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 import shutil
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 import stat
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 import tempfile
Idan Kamara
test-atomictempfile: convert to unit test
r18666 import unittest
Pulkit Goyal
py3: make tests/test-atomictempfile.py use absolute_import
r29194 from mercurial import (
Pulkit Goyal
py3: use range instead on xrange on py3 in tests/test-atomictempfile.py...
r36299 pycompat,
Pulkit Goyal
py3: make tests/test-atomictempfile.py use absolute_import
r29194 util,
)
atomictempfile = util.atomictempfile
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
Pulkit Goyal
py3: use range instead on xrange on py3 in tests/test-atomictempfile.py...
r36299 if pycompat.ispy3:
xrange = range
Idan Kamara
test-atomictempfile: convert to unit test
r18666 class testatomictempfile(unittest.TestCase):
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 def setUp(self):
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 self._testdir = tempfile.mkdtemp(b'atomictempfiletest')
self._filename = os.path.join(self._testdir, b'testfilename')
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391
def tearDown(self):
shutil.rmtree(self._testdir, True)
Martijn Pieters
atomictempfile: remove test ordering...
r29392 def testsimple(self):
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 file = atomictempfile(self._filename)
self.assertFalse(os.path.isfile(self._filename))
tempfilename = file._tempname
self.assertTrue(tempfilename in glob.glob(
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 os.path.join(self._testdir, b'.testfilename-*')))
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
timeless
tests: mark test-atomictempfile.py write as binary
r29188 file.write(b'argh\n')
Idan Kamara
test-atomictempfile: convert to unit test
r18666 file.close()
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 self.assertTrue(os.path.isfile(self._filename))
self.assertTrue(tempfilename not in glob.glob(
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 os.path.join(self._testdir, b'.testfilename-*')))
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
Idan Kamara
test-atomictempfile: convert to unit test
r18666 # discard() removes the temp file without making the write permanent
Martijn Pieters
atomictempfile: remove test ordering...
r29392 def testdiscard(self):
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 file = atomictempfile(self._filename)
Idan Kamara
test-atomictempfile: convert to unit test
r18666 (dir, basename) = os.path.split(file._tempname)
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
timeless
tests: mark test-atomictempfile.py write as binary
r29188 file.write(b'yo\n')
Idan Kamara
test-atomictempfile: convert to unit test
r18666 file.discard()
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 self.assertFalse(os.path.isfile(self._filename))
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 self.assertTrue(basename not in os.listdir(b'.'))
Idan Kamara
test-atomictempfile: convert to unit test
r18666
# if a programmer screws up and passes bad args to atomictempfile, they
# get a plain ordinary TypeError, not infinite recursion
Martijn Pieters
atomictempfile: remove test ordering...
r29392 def testoops(self):
Gregory Szorc
tests: use context manager form of assertRaises...
r32279 with self.assertRaises(TypeError):
atomictempfile()
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 # checkambig=True avoids ambiguity of timestamp
Martijn Pieters
atomictempfile: remove test ordering...
r29392 def testcheckambig(self):
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 def atomicwrite(checkambig):
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 f = atomictempfile(self._filename, checkambig=checkambig)
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 f.write(b'FOO')
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 f.close()
# try some times, because reproduction of ambiguity depends on
# "filesystem time"
for i in xrange(5):
atomicwrite(False)
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 oldstat = os.stat(self._filename)
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 if oldstat[stat.ST_CTIME] != oldstat[stat.ST_MTIME]:
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 # subsequent changing never causes ambiguity
continue
repetition = 3
# repeat atomic write with checkambig=True, to examine
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # whether st_mtime is advanced multiple times as expected
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 for j in xrange(repetition):
atomicwrite(True)
Martijn Pieters
atomictempfile: use a tempdir to keep the test environment clean...
r29391 newstat = os.stat(self._filename)
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 if oldstat[stat.ST_CTIME] != newstat[stat.ST_CTIME]:
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 # timestamp ambiguity was naturally avoided while repetition
continue
# st_mtime should be advanced "repetition" times, because
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # all atomicwrite() occurred at same time (in sec)
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 oldtime = (oldstat[stat.ST_MTIME] + repetition) & 0x7fffffff
self.assertTrue(newstat[stat.ST_MTIME] == oldtime)
FUJIWARA Katsunori
util: make atomictempfile avoid ambiguity of file stat if needed...
r29201 # no more examination is needed, if assumption above is true
break
else:
# This platform seems too slow to examine anti-ambiguity
# of file timestamp (or test happened to be executed at
# bad timing). Exit silently in this case, because running
# on other faster platforms can detect problems
pass
Martijn Pieters
atomictempfile: add read to the supported file operations
r29393 def testread(self):
with open(self._filename, 'wb') as f:
f.write(b'foobar\n')
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 file = atomictempfile(self._filename, mode=b'rb')
Martijn Pieters
atomictempfile: add read to the supported file operations
r29393 self.assertTrue(file.read(), b'foobar\n')
file.discard()
Martijn Pieters
atomictempfile: add context manager support...
r29394 def testcontextmanagersuccess(self):
"""When the context closes, the file is closed"""
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 with atomictempfile(b'foo') as f:
self.assertFalse(os.path.isfile(b'foo'))
Martijn Pieters
atomictempfile: add context manager support...
r29394 f.write(b'argh\n')
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 self.assertTrue(os.path.isfile(b'foo'))
Martijn Pieters
atomictempfile: add context manager support...
r29394
def testcontextmanagerfailure(self):
"""On exception, the file is discarded"""
try:
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 with atomictempfile(b'foo') as f:
self.assertFalse(os.path.isfile(b'foo'))
Martijn Pieters
atomictempfile: add context manager support...
r29394 f.write(b'argh\n')
raise ValueError
except ValueError:
pass
Augie Fackler
tests: add missing b prefixes in test-atomictempfile.py...
r36634 self.assertFalse(os.path.isfile(b'foo'))
Martijn Pieters
atomictempfile: add context manager support...
r29394
Greg Ward
atomictempfile: avoid infinite recursion in __del__()....
r14007 if __name__ == '__main__':
Pulkit Goyal
py3: make tests/test-atomictempfile.py use absolute_import
r29194 import silenttestrunner
Idan Kamara
test-atomictempfile: convert to unit test
r18666 silenttestrunner.main(__name__)