phases: invalidate the phases set less often on retract boundary
We already have the information to update the phase set, so we do so directly
instead of invalidating the cache.
This show a sizeable speedup in our `perf::unbundle` benchmark on the
many-draft mozilla-try repository.
### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.perf-unbundle
# bin-env-vars.hg.flavor = no-rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.
issue6528 = disabled
# benchmark.variants.revs = last-10
before: 2.055259 seconds
after: 1.887064 seconds (-8.18%)
# benchmark.variants.revs = last-100
before: 2.409239 seconds
after: 2.222429 seconds (-7.75%)
# benchmark.variants.revs = last-1000
before: 3.945648 seconds
after: 3.762480 seconds (-4.64%)
from mercurial import (
dispatch,
error,
pycompat,
ui as uimod,
)
from mercurial.utils import stringutil
testui = uimod.ui.load()
# disable the configuration registration warning
#
# the purpose of this test is to check the old behavior, not to validate the
# behavior from registered item. so we silent warning related to unregisted
# config.
testui.setconfig(b'devel', b'warn-config-unknown', False, b'test')
testui.setconfig(b'devel', b'all-warnings', False, b'test')
parsed = dispatch._parseconfig(
testui,
[
b'values.string=string value',
b'values.bool1=true',
b'values.bool2=false',
b'values.boolinvalid=foo',
b'values.int1=42',
b'values.int2=-42',
b'values.intinvalid=foo',
b'lists.list1=foo',
b'lists.list2=foo bar baz',
b'lists.list3=alice, bob',
b'lists.list4=foo bar baz alice, bob',
b'lists.list5=abc d"ef"g "hij def"',
b'lists.list6="hello world", "how are you?"',
b'lists.list7=Do"Not"Separate',
b'lists.list8="Do"Separate',
b'lists.list9="Do\\"NotSeparate"',
b'lists.list10=string "with extraneous" quotation mark"',
b'lists.list11=x, y',
b'lists.list12="x", "y"',
b'lists.list13=""" key = "x", "y" """',
b'lists.list14=,,,, ',
b'lists.list15=" just with starting quotation',
b'lists.list16="longer quotation" with "no ending quotation',
b'lists.list17=this is \\" "not a quotation mark"',
b'lists.list18=\n \n\nding\ndong',
b'date.epoch=0 0',
b'date.birth=2005-04-19T00:00:00',
b'date.invalid=0',
],
)
def pprint(obj):
return stringutil.pprint(obj).decode('ascii')
print(pprint(testui.configitems(b'values')))
print(pprint(testui.configitems(b'lists')))
print("---")
print(pprint(testui.config(b'values', b'string')))
print(pprint(testui.config(b'values', b'bool1')))
print(pprint(testui.config(b'values', b'bool2')))
print(pprint(testui.config(b'values', b'unknown')))
print("---")
try:
print(pprint(testui.configbool(b'values', b'string')))
except error.ConfigError as inst:
print(pprint(pycompat.bytestr(inst)))
print(pprint(testui.configbool(b'values', b'bool1')))
print(pprint(testui.configbool(b'values', b'bool2')))
print(pprint(testui.configbool(b'values', b'bool2', True)))
print(pprint(testui.configbool(b'values', b'unknown')))
print(pprint(testui.configbool(b'values', b'unknown', True)))
print("---")
print(pprint(testui.configint(b'values', b'int1')))
print(pprint(testui.configint(b'values', b'int2')))
print("---")
print(pprint(testui.configlist(b'lists', b'list1')))
print(pprint(testui.configlist(b'lists', b'list2')))
print(pprint(testui.configlist(b'lists', b'list3')))
print(pprint(testui.configlist(b'lists', b'list4')))
print(pprint(testui.configlist(b'lists', b'list4', [b'foo'])))
print(pprint(testui.configlist(b'lists', b'list5')))
print(pprint(testui.configlist(b'lists', b'list6')))
print(pprint(testui.configlist(b'lists', b'list7')))
print(pprint(testui.configlist(b'lists', b'list8')))
print(pprint(testui.configlist(b'lists', b'list9')))
print(pprint(testui.configlist(b'lists', b'list10')))
print(pprint(testui.configlist(b'lists', b'list11')))
print(pprint(testui.configlist(b'lists', b'list12')))
print(pprint(testui.configlist(b'lists', b'list13')))
print(pprint(testui.configlist(b'lists', b'list14')))
print(pprint(testui.configlist(b'lists', b'list15')))
print(pprint(testui.configlist(b'lists', b'list16')))
print(pprint(testui.configlist(b'lists', b'list17')))
print(pprint(testui.configlist(b'lists', b'list18')))
print(pprint(testui.configlist(b'lists', b'unknown')))
print(pprint(testui.configlist(b'lists', b'unknown', b'')))
print(pprint(testui.configlist(b'lists', b'unknown', b'foo')))
print(pprint(testui.configlist(b'lists', b'unknown', [b'foo'])))
print(pprint(testui.configlist(b'lists', b'unknown', b'foo bar')))
print(pprint(testui.configlist(b'lists', b'unknown', b'foo, bar')))
print(pprint(testui.configlist(b'lists', b'unknown', [b'foo bar'])))
print(pprint(testui.configlist(b'lists', b'unknown', [b'foo', b'bar'])))
print("---")
print(pprint(testui.configdate(b'date', b'epoch')))
print(pprint(testui.configdate(b'date', b'birth')))
print(pprint(testui.config(b'values', b'String')))
def function():
pass
# values that aren't strings should work
testui.setconfig(b'hook', b'commit', function)
print(function == testui.config(b'hook', b'commit'))
# invalid values
try:
testui.configbool(b'values', b'boolinvalid')
except error.ConfigError:
print('boolinvalid')
try:
testui.configint(b'values', b'intinvalid')
except error.ConfigError:
print('intinvalid')
try:
testui.configdate(b'date', b'invalid')
except error.ConfigError:
print('dateinvalid')