# HG changeset patch # User Alexis S. L. Carvalho # Date 1161023933 10800 # Node ID ec6f400cff4d6ba65f076cc43edfaf2468697109 # Parent 9b1c126b74cd76c2c7aebf823220ca3c5e85821c Use a case-sensitive version of SafeConfigParser everywhere This change has the potential to break existing setups, but the current behaviour (the keys in configuration files are always lower-cased) can bite us in a few places: - no way to use a Command in [defaults] - hgext.Extension doesn't work in [extensions] - you can't use an Upper/case/PATH in the [paths] section of hgweb.config - you can't (easily) protect paths with upper-case letters with the acl extension - you can't specify a /Path/TO/a/rEPO in the [reposubs] section for the notify extension diff -r 9b1c126b74cd -r ec6f400cff4d mercurial/hgweb/hgwebdir_mod.py --- a/mercurial/hgweb/hgwebdir_mod.py Mon Oct 16 11:36:57 2006 -0700 +++ b/mercurial/hgweb/hgwebdir_mod.py Mon Oct 16 15:38:53 2006 -0300 @@ -8,7 +8,7 @@ import os from mercurial.demandload import demandload -demandload(globals(), "ConfigParser mimetools cStringIO") +demandload(globals(), "mimetools cStringIO") demandload(globals(), "mercurial:ui,hg,util,templater") demandload(globals(), "mercurial.hgweb.hgweb_mod:hgweb") demandload(globals(), "mercurial.hgweb.common:get_mtime,staticfile,style_map") @@ -30,7 +30,7 @@ self.repos = cleannames(config.items()) self.repos.sort() else: - cp = ConfigParser.SafeConfigParser() + cp = util.configparser() cp.read(config) self.repos = [] if cp.has_section('web'): diff -r 9b1c126b74cd -r ec6f400cff4d mercurial/ui.py --- a/mercurial/ui.py Mon Oct 16 11:36:57 2006 -0700 +++ b/mercurial/ui.py Mon Oct 16 15:38:53 2006 -0300 @@ -11,7 +11,7 @@ demandload(globals(), "ConfigParser traceback util") def dupconfig(orig): - new = ConfigParser.SafeConfigParser(orig.defaults()) + new = util.configparser(orig.defaults()) updateconfig(orig, new) return new @@ -37,7 +37,7 @@ self.debugflag = debug self.interactive = interactive self.traceback = traceback - self.cdata = ConfigParser.SafeConfigParser() + self.cdata = util.configparser() self.readconfig(util.rcpath()) self.updateopts(verbose, debug, quiet, interactive) else: @@ -126,7 +126,7 @@ def setconfig(self, section, name, value): if not self.overlay: - self.overlay = ConfigParser.SafeConfigParser() + self.overlay = util.configparser() for cdata in (self.overlay, self.cdata): if not cdata.has_section(section): cdata.add_section(section) diff -r 9b1c126b74cd -r ec6f400cff4d mercurial/util.py --- a/mercurial/util.py Mon Oct 16 11:36:57 2006 -0700 +++ b/mercurial/util.py Mon Oct 16 15:38:53 2006 -0300 @@ -15,7 +15,7 @@ from i18n import gettext as _ from demandload import * demandload(globals(), "cStringIO errno getpass popen2 re shutil sys tempfile") -demandload(globals(), "os threading time calendar") +demandload(globals(), "os threading time calendar ConfigParser") # used by parsedate defaultdateformats = ('%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', @@ -24,6 +24,11 @@ class SignalInterrupt(Exception): """Exception raised on SIGTERM and SIGHUP.""" +# like SafeConfigParser but with case-sensitive keys +class configparser(ConfigParser.SafeConfigParser): + def optionxform(self, optionstr): + return optionstr + def cachefunc(func): '''cache the result of function calls''' # XXX doesn't handle keywords args diff -r 9b1c126b74cd -r ec6f400cff4d tests/test-config-case --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-config-case Mon Oct 16 15:38:53 2006 -0300 @@ -0,0 +1,7 @@ +#!/bin/sh + +echo '[Section]' >> $HGRCPATH +echo 'KeY = Case Sensitive' >> $HGRCPATH +echo 'key = lower case' >> $HGRCPATH + +hg showconfig diff -r 9b1c126b74cd -r ec6f400cff4d tests/test-config-case.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-config-case.out Mon Oct 16 15:38:53 2006 -0300 @@ -0,0 +1,2 @@ +Section.KeY=Case Sensitive +Section.key=lower case