sapling/eden/scm/tests/test-ui-config.py
Durham Goode ed7b192f9a configs: pin --configfile configs
Summary:
Previously, only --config configs were pinned in the uiconfig. "pinned"
means that no matter what values were loaded underneath, those pinned values
would not be changed. This allows CLI specified configs to take precendence
regardless of what and when config files are loaded. --configfile configs were
not pinned in the same way, despite it seeming like they should be pinned. In
fact, during clone we "reload" the config, which causes the --configfile value
to be lost.

Let's make --configfile pin all of it's configs as well.

This has a bit of an unfortunate side effect. When we do clone via hg-clone we
pass --configfile /etc/mercurial/repo-specific/$REPO.rc so the clone has the
right configuration. This diff means that those values are now loaded in a
pinned state, so dynamicconfig cannot overwrite them and the values cannot be
deny-listed.

The longterm solution to this would be to stop using --configfile during clone,
and instead use --config remotefilelog.reponame=$REPO and allow dynamicconfig to
generate the rest. But for now it's probably fine to let them be pinned.

Reviewed By: quark-zju

Differential Revision: D26677599

fbshipit-source-id: 2837a5b5d14bb42b49eaf9d1d0019f2ea0620a9e
2021-03-11 10:13:36 -08:00

130 lines
4.6 KiB
Python

from __future__ import absolute_import, print_function
from edenscm.mercurial import dispatch, error, ui as uimod
from hghave import require
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("devel", "warn-config-unknown", False, "test")
testui.setconfig("devel", "all-warnings", False, "test")
parsed = dispatch._parseconfig(
testui,
{
"config": [
"values.string=string value",
"values.bool1=true",
"values.bool2=false",
"values.boolinvalid=foo",
"values.int1=42",
"values.int2=-42",
"values.intinvalid=foo",
"lists.list1=foo",
"lists.list2=foo bar baz",
"lists.list3=alice, bob",
"lists.list4=foo bar baz alice, bob",
'lists.list5=abc d"ef"g "hij def"',
'lists.list6="hello world", "how are you?"',
'lists.list7=Do"Not"Separate',
'lists.list8="Do"Separate',
'lists.list9="Do\\"NotSeparate"',
'lists.list10=string "with extraneous" quotation mark"',
"lists.list11=x, y",
'lists.list12="x", "y"',
'lists.list13=""" key = "x", "y" """',
"lists.list14=,,,, ",
'lists.list15=" just with starting quotation',
'lists.list16="longer quotation" with "no ending quotation',
'lists.list17=this is \\" "not a quotation mark"',
"lists.list18=\n \n\nding\ndong",
"date.epoch=0 0",
"date.birth=2005-04-19T00:00:00",
"date.invalid=invalid",
],
"configfile": [],
},
)
print(repr(testui.configitems("values")))
print(repr(testui.configitems("lists")))
print("---")
print(repr(testui.config("values", "string")))
print(repr(testui.config("values", "bool1")))
print(repr(testui.config("values", "bool2")))
print(repr(testui.config("values", "unknown")))
print("---")
try:
print(repr(testui.configbool("values", "string")))
except error.ConfigError as inst:
print(inst)
print(repr(testui.configbool("values", "bool1")))
print(repr(testui.configbool("values", "bool2")))
print(repr(testui.configbool("values", "bool2", True)))
print(repr(testui.configbool("values", "unknown")))
print(repr(testui.configbool("values", "unknown", True)))
print("---")
print(repr(testui.configint("values", "int1")))
print(repr(testui.configint("values", "int2")))
print("---")
print(repr(testui.configlist("lists", "list1")))
print(repr(testui.configlist("lists", "list2")))
print(repr(testui.configlist("lists", "list3")))
print(repr(testui.configlist("lists", "list4")))
print(repr(testui.configlist("lists", "list4", ["foo"])))
print(repr(testui.configlist("lists", "list5")))
print(repr(testui.configlist("lists", "list6")))
print(repr(testui.configlist("lists", "list7")))
print(repr(testui.configlist("lists", "list8")))
print(repr(testui.configlist("lists", "list9")))
print(repr(testui.configlist("lists", "list10")))
print(repr(testui.configlist("lists", "list11")))
print(repr(testui.configlist("lists", "list12")))
print(repr(testui.configlist("lists", "list13")))
print(repr(testui.configlist("lists", "list14")))
print(repr(testui.configlist("lists", "list15")))
print(repr(testui.configlist("lists", "list16")))
print(repr(testui.configlist("lists", "list17")))
print(repr(testui.configlist("lists", "list18")))
print(repr(testui.configlist("lists", "unknown")))
print(repr(testui.configlist("lists", "unknown", "")))
print(repr(testui.configlist("lists", "unknown", "foo")))
print(repr(testui.configlist("lists", "unknown", ["foo"])))
print(repr(testui.configlist("lists", "unknown", "foo bar")))
print(repr(testui.configlist("lists", "unknown", "foo, bar")))
print(repr(testui.configlist("lists", "unknown", ["foo bar"])))
print(repr(testui.configlist("lists", "unknown", ["foo", "bar"])))
print("---")
print(repr(testui.configdate("date", "epoch")))
print(repr(testui.configdate("date", "birth")))
print(repr(testui.config("values", "String")))
def function():
pass
# values that aren't strings should work
testui.setconfig("hook", "commit", function)
print(function == testui.config("hook", "commit"))
# invalid values
try:
testui.configbool("values", "boolinvalid")
except error.ConfigError:
print("boolinvalid")
try:
testui.configint("values", "intinvalid")
except error.ConfigError:
print("intinvalid")
try:
testui.configdate("date", "invalid")
except error.ConfigError:
print("dateinvalid")