Update copyright notices
[mining-tools:gitdm.git] / ConfigFile.py
1 #
2 # Stuff for dealing with configuration files.
3 #
4 #
5 # This code is part of the LWN git data miner.
6 #
7 # Copyright 2007-11 Eklektix, Inc.
8 # Copyright 2007-11 Jonathan Corbet <corbet@lwn.net>
9 #
10 # This file may be distributed under the terms of the GNU General
11 # Public License, version 2.
12 #
13 import sys, re, datetime, os.path
14 import database
15
16 #
17 # Read a line and strip out junk.
18 #
19 def ReadConfigLine (file):
20     line = file.readline ()
21     if not line:
22         return None
23     line = line.split('#')[0] # Get rid of any comments
24     line = line.strip () # and extra white space
25     if len (line) == 0: # we got rid of everything
26         return ReadConfigLine (file)
27     return line
28
29 #
30 # Give up and die.
31 #
32 def croak (message):
33     sys.stderr.write (message + '\n')
34     sys.exit (1)
35
36 #
37 # Read a list of email aliases.
38 #
39 def ReadEmailAliases (name):
40     try:
41         file = open (name, 'r')
42     except IOError:
43         croak ('Unable to open email alias file %s' % (name))
44     line = ReadConfigLine (file)
45     while line:
46         m = re.match ('^("[^"]+"|\S+)\s+(.+)$', line)
47         if not m or len (m.groups ()) != 2:
48             croak ('Funky email alias line "%s"' % (line))
49         if m and m.group (2).find ('@') <= 0:
50             croak ('Non-addresses in email alias "%s"' % (line))
51         database.AddEmailAlias (m.group (1).replace ('"', ''), m.group (2))
52         line = ReadConfigLine (file)
53     file.close ()
54
55 #
56 # The Email/Employer map
57 #
58 EMMpat = re.compile (r'^([^\s]+)\s+([^<]+)\s*(<\s*(\d+-\d+-\d+)\s*)?$')
59
60 def ReadEmailEmployers (name):
61     try:
62         file = open (name, 'r')
63     except IOError:
64         croak ('Unable to open email/employer file %s' % (name))
65     line = ReadConfigLine (file)
66     while line:
67         m = EMMpat.match (line)
68         if not m:
69             croak ('Funky email/employer line "%s"' % (line))
70         email = m.group (1)
71         company = m.group (2).strip ()
72         enddate = ParseDate (m.group (4))
73         database.AddEmailEmployerMapping (email, company, enddate)
74         line = ReadConfigLine (file)
75     file.close ()
76
77 def ParseDate (cdate):
78     if not cdate:
79         return None
80     sdate = cdate.split ('-')
81     return datetime.date (int (sdate[0]), int (sdate[1]), int (sdate[2]))
82
83
84 def ReadGroupMap (fname, employer):
85     try:
86         file = open (fname, 'r')
87     except IOError:
88         croak ('Unable to open group map file %s' % (fname))
89     line = ReadConfigLine (file)
90     while line:
91         database.AddEmailEmployerMapping (line, employer)
92         line = ReadConfigLine (file)
93     file.close ()
94
95 #
96 # Read an overall config file.
97 #
98
99 def ConfigFile (name, confdir):
100     try:
101         file = open (name, 'r')
102     except IOError:
103         croak ('Unable to open config file %s' % (name))
104     line = ReadConfigLine (file)
105     while line:
106         sline = line.split (None, 2)
107         if len (sline) < 2:
108             croak ('Funky config line: "%s"' % (line))
109         if sline[0] == 'EmailAliases':
110             ReadEmailAliases (os.path.join (confdir, sline[1]))
111         elif sline[0] == 'EmailMap':
112             ReadEmailEmployers (os.path.join (confdir, sline[1]))
113         elif sline[0] == 'GroupMap':
114             if len (sline) != 3:
115                 croak ('Funky group map line "%s"' % (line))
116             ReadGroupMap (os.path.join (confdir, sline[1]), sline[2])
117         else:
118             croak ('Unrecognized config line: "%s"' % (line))
119         line = ReadConfigLine (file)
120