]> xenbits.xensource.com Git - people/larsk/xenproject-org-gitdm.git/commitdiff
Revert "Make ReadConfigLine an iterator"
authorJonathan Corbet <corbet@lwn.net>
Mon, 11 Jul 2011 19:54:56 +0000 (13:54 -0600)
committerJonathan Corbet <corbet@lwn.net>
Mon, 11 Jul 2011 19:54:56 +0000 (13:54 -0600)
This reverts commit 19b718ef41f87f348ac45a90a5c4096ccbd0f7db which breaks
the virtual employer mechanism.

ConfigFile.py

index b6981a4f175ad2bba89ccdcf87668d0a8426aab4..0a942f41c80d120a27206283cc8817738cc274fd 100644 (file)
 import sys, re, datetime, os.path
 import database
 
-class ReadConfigLine:
-    """
-        ReadConfigLine provides a iterator to extract line
-        from an config file without comments.
-
-        Typical use case:
-
-            fd = open(filename, 'r')
-            for line in ReadConfigLine(fd):
-                parse_line(line)
-            fd.close(fd)
-    """
-
-    def __init__(self, fd):
-        self.fd = fd
-        self.buffer = None
-        self.patch = []
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        line = self.fd.readline()
-        while line:
-            line = line.split('#')[0] # Get rid of any comments
-            line = line.strip()       # and extra white space
-            if len(line) == 0:       # we got rid of everything
-                line = self.fd.readline()
-            else:
-                break
-
-        if not line:
-            raise StopIteration
-
-        return line
-
+#
+# Read a line and strip out junk.
+#
+def ReadConfigLine (file):
+    line = file.readline ()
+    if not line:
+        return None
+    line = line.split('#')[0] # Get rid of any comments
+    line = line.strip () # and extra white space
+    if len (line) == 0: # we got rid of everything
+        return ReadConfigLine (file)
+    return line
 
 #
 # Give up and die.
@@ -62,19 +38,19 @@ def croak (message):
 #
 def ReadEmailAliases (name):
     try:
-        fd = open (name, 'r')
+        file = open (name, 'r')
     except IOError:
         croak ('Unable to open email alias file %s' % (name))
-
-    for line in ReadConfigLine (fd):
+    line = ReadConfigLine (file)
+    while line:
         m = re.match ('^("[^"]+"|\S+)\s+(.+)$', line)
         if not m or len (m.groups ()) != 2:
             croak ('Funky email alias line "%s"' % (line))
         if m and m.group (2).find ('@') <= 0:
             croak ('Non-addresses in email alias "%s"' % (line))
         database.AddEmailAlias (m.group (1).replace ('"', ''), m.group (2))
-    fd.close ()
+        line = ReadConfigLine (file)
+    file.close ()
 
 #
 # The Email/Employer map
@@ -83,11 +59,11 @@ EMMpat = re.compile (r'^([^\s]+)\s+([^<]+)\s*(<\s*(\d+-\d+-\d+)\s*)?$')
 
 def ReadEmailEmployers (name):
     try:
-        fd = open (name, 'r')
+        file = open (name, 'r')
     except IOError:
         croak ('Unable to open email/employer file %s' % (name))
-
-    for line in ReadConfigLine (fd):
+    line = ReadConfigLine (file)
+    while line:
         m = EMMpat.match (line)
         if not m:
             croak ('Funky email/employer line "%s"' % (line))
@@ -95,8 +71,8 @@ def ReadEmailEmployers (name):
         company = m.group (2).strip ()
         enddate = ParseDate (m.group (4))
         database.AddEmailEmployerMapping (email, company, enddate)
-    fd.close ()
+        line = ReadConfigLine (file)
+    file.close ()
 
 def ParseDate (cdate):
     if not cdate:
@@ -107,22 +83,22 @@ def ParseDate (cdate):
 
 def ReadGroupMap (fname, employer):
     try:
-        fd = open (fname, 'r')
+        file = open (fname, 'r')
     except IOError:
         croak ('Unable to open group map file %s' % (fname))
-
-    for line in ReadConfigLine (fd):
+    line = ReadConfigLine (file)
+    while line:
         database.AddEmailEmployerMapping (line, employer)
-
-    fd.close ()
+        line = ReadConfigLine (file)
+    file.close ()
 
 #
 # Read in a virtual employer description.
 #
-def ReadVirtual (fd, name):
+def ReadVirtual (file, name):
     ve = database.VirtualEmployer (name)
-
-    for line in ReadConfigLine (fd):
+    line = ReadConfigLine (file)
+    while line:
         sl = line.split (None, 1)
         first = sl[0]
         if first == 'end':
@@ -140,6 +116,7 @@ def ReadVirtual (fd, name):
         if not (0 < percent <= 100):
             croak ('Bad split value "%s" for virtual empl %s' % (first, name))
         ve.addsplit (' '.join (sl[1:]), percent/100.0)
+        line = ReadConfigLine (file)
     #
     # We should never get here
     #
@@ -150,20 +127,21 @@ def ReadVirtual (fd, name):
 #
 def ReadFileType (filename):
     try:
-        fd = open (filename, 'r')
+        file = open (filename, 'r')
     except IOError:
         croak ('Unable to open file type mapping file %s' % (filename))
     patterns = {}
     order = []
     regex_order = re.compile ('^order\s+(.*)$')
     regex_file_type = re.compile ('^filetype\s+(\S+)\s+(.+)$')
-
-    for line in ReadConfigLine (fd):
+    line = ReadConfigLine (file)
+    while line:
         o = regex_order.match (line)
         if o:
             # Consider only the first definition in the config file
             elements = o.group(1).replace (' ', '')
             order = order or elements.split(',')
+            line = ReadConfigLine (file)
             continue
 
         m = regex_file_type.match (line)
@@ -177,7 +155,8 @@ def ReadFileType (filename):
 
         patterns[m.group (1)].append (re.compile (m.group (2), re.IGNORECASE))
 
-    fd.close ()
+        line = ReadConfigLine (file)
+    file.close ()
     return patterns, order
 
 #
@@ -186,11 +165,11 @@ def ReadFileType (filename):
 
 def ConfigFile (name, confdir):
     try:
-        fd = open (name, 'r')
+        file = open (name, 'r')
     except IOError:
         croak ('Unable to open config file %s' % (name))
-
-    for line in ReadConfigLine (fd):
+    line = ReadConfigLine (file)
+    while line:
         sline = line.split (None, 2)
         if len (sline) < 2:
             croak ('Funky config line: "%s"' % (line))
@@ -209,15 +188,5 @@ def ConfigFile (name, confdir):
             database.FileTypes = database.FileType (patterns, order)
         else:
             croak ('Unrecognized config line: "%s"' % (line))
-
-
-if __name__ == '__main__':
-    '''Test the iterato for reading configuration files'''
-    try:
-        fd = open(sys.argv[1])
-    except:
-        croak('Usage: %s <config-file>' % sys.argv[0])
-    
-    for line in ReadConfigLine(fd):
-        print line
+        line = ReadConfigLine (file)