mercurial/config.py
changeset 8265 52c5be55af82
parent 8263 41031699550a
child 8298 9542f4c3fa1b
equal deleted inserted replaced
8264:63ea850b3312 8265:52c5be55af82
    67         if section not in self:
    67         if section not in self:
    68             self._data[section] = sortdict()
    68             self._data[section] = sortdict()
    69         self._data[section][item] = value
    69         self._data[section][item] = value
    70         self._source[(section, item)] = source
    70         self._source[(section, item)] = source
    71 
    71 
    72     def read(self, path, fp=None, sections=None):
    72     def parse(self, src, data, sections=None, remap=None, include=None):
    73         sectionre = re.compile(r'\[([^\[]+)\]')
    73         sectionre = re.compile(r'\[([^\[]+)\]')
    74         itemre = re.compile(r'([^=\s][^=]*?)\s*=\s*(.*\S|)')
    74         itemre = re.compile(r'([^=\s][^=]*?)\s*=\s*(.*\S|)')
    75         contre = re.compile(r'\s+(\S.*\S)')
    75         contre = re.compile(r'\s+(\S.*\S)')
    76         emptyre = re.compile(r'(;|#|\s*$)')
    76         emptyre = re.compile(r'(;|#|\s*$)')
    77         unsetre = re.compile(r'%unset\s+(\S+)')
    77         unsetre = re.compile(r'%unset\s+(\S+)')
    79         section = ""
    79         section = ""
    80         item = None
    80         item = None
    81         line = 0
    81         line = 0
    82         cont = 0
    82         cont = 0
    83 
    83 
    84         if not fp:
    84         for l in data.splitlines(1):
    85             fp = open(path)
       
    86 
       
    87         for l in fp:
       
    88             line += 1
    85             line += 1
    89             if cont:
    86             if cont:
    90                 m = contre.match(l)
    87                 m = contre.match(l)
    91                 if m:
    88                 if m:
    92                     if sections and section not in sections:
    89                     if sections and section not in sections:
    93                         continue
    90                         continue
    94                     v = self.get(section, item) + "\n" + m.group(1)
    91                     v = self.get(section, item) + "\n" + m.group(1)
    95                     self.set(section, item, v, "%s:%d" % (path, line))
    92                     self.set(section, item, v, "%s:%d" % (src, line))
    96                     continue
    93                     continue
    97                 item = None
    94                 item = None
    98             m = includere.match(l)
    95             m = includere.match(l)
    99             if m:
    96             if m:
   100                 inc = m.group(1)
    97                 inc = m.group(1)
   101                 base = os.path.dirname(path)
    98                 base = os.path.dirname(src)
   102                 inc = os.path.normpath(os.path.join(base, inc))
    99                 inc = os.path.normpath(os.path.join(base, inc))
   103                 incfp = open(inc)
   100                 if include:
   104                 self.read(inc, incfp)
   101                     include(inc, remap=remap, sections=sections)
   105                 continue
   102                 continue
   106             if emptyre.match(l):
   103             if emptyre.match(l):
   107                 continue
   104                 continue
   108             m = sectionre.match(l)
   105             m = sectionre.match(l)
   109             if m:
   106             if m:
   115             if m:
   112             if m:
   116                 item = m.group(1)
   113                 item = m.group(1)
   117                 cont = 1
   114                 cont = 1
   118                 if sections and section not in sections:
   115                 if sections and section not in sections:
   119                     continue
   116                     continue
   120                 self.set(section, item, m.group(2), "%s:%d" % (path, line))
   117                 self.set(section, item, m.group(2), "%s:%d" % (src, line))
   121                 continue
   118                 continue
   122             m = unsetre.match(l)
   119             m = unsetre.match(l)
   123             if m:
   120             if m:
   124                 name = m.group(1)
   121                 name = m.group(1)
   125                 if sections and section not in sections:
   122                 if sections and section not in sections:
   127                 if self.get(section, name) != None:
   124                 if self.get(section, name) != None:
   128                     del self._data[section][name]
   125                     del self._data[section][name]
   129                 continue
   126                 continue
   130 
   127 
   131             raise error.ConfigError(_('config error at %s:%d: \'%s\'')
   128             raise error.ConfigError(_('config error at %s:%d: \'%s\'')
   132                                     % (path, line, l.rstrip()))
   129                                     % (src, line, l.rstrip()))
       
   130 
       
   131     def read(self, path, fp=None, sections=None, remap=None):
       
   132         if not fp:
       
   133             fp = open(path)
       
   134         self.parse(path, fp.read(), sections, remap, self.read)