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-8 LWN.net
8
# Copyright 2007-8 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
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
        sline = line.split ()
47
        if len (sline) != 2:
48
            croak ('Funky email alias line "%s"' % (line))
49
        if sline[0].find ('@') <= 0 or sline[1].find ('@') <= 0:
50
            croak ('Non-addresses in email alias "%s"' % (line))
51
        database.AddEmailAlias (sline[0], sline[1])
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
def ConfigFile (name):
99
    try:
100
        file = open (name, 'r')
101
    except IOError:
102
        croak ('Unable to open config file %s' % (name))
103
    line = ReadConfigLine (file)
104
    while line:
105
        sline = line.split ()
106
        if len (sline) < 2:
107
            croak ('Funky config line: "%s"' % (line))
108
        if sline[0] == 'EmailAliases':
109
            ReadEmailAliases (sline[1])
110
        elif sline[0] == 'EmailMap':
111
            ReadEmailEmployers (sline[1])
112
        elif sline[0] == 'GroupMap':
113
            if len (sline) != 3:
114
                croak ('Funky group map line "%s"' % (line))
115
            ReadGroupMap (sline[1], sline[2])
116
        else:
117
            croak ('Unrecognized config line: "%s"' % (line))
118
        line = ReadConfigLine (file)
119