4 # This code is part of the LWN git data miner.
6 # Copyright 2007-8 LWN.net
7 # Copyright 2007-8 Jonathan Corbet <corbet@lwn.net>
9 # This file may be distributed under the terms of the GNU General
10 # Public License, version 2.
16 def __init__ (self
, name
, id, elist
, email
):
19 self
.employer
= [ elist
]
20 self
.email
= [ email
]
21 self
.added
= self
.removed
= 0
27 self
.testcred
= self
.repcred
= 0
29 def addemail (self
, email
, elist
):
30 self
.email
.append (email
)
31 self
.employer
.append (elist
)
32 HackersByEmail
[email
] = self
34 def emailemployer (self
, email
, date
):
35 for i
in range (0, len (self
.email
)):
36 if self
.email
[i
] == email
:
37 for edate
, empl
in self
.employer
[i
]:
40 print 'OOPS. ', self
.name
, self
.employer
, self
.email
, email
, date
41 return None # Should not happen
43 def addpatch (self
, patch
):
44 self
.added
+= patch
.added
45 self
.removed
+= patch
.removed
46 self
.patches
.append (patch
)
49 # There's got to be a better way.
51 def addsob (self
, patch
):
52 self
.signoffs
.append (patch
)
53 def addreview (self
, patch
):
54 self
.reviews
.append (patch
)
55 def addtested (self
, patch
):
56 self
.tested
.append (patch
)
57 def addreport (self
, patch
):
58 self
.reports
.append (patch
)
60 def reportcredit (self
, patch
):
62 def testcredit (self
, patch
):
70 def StoreHacker (name
, elist
, email
):
75 h
= Hacker (name
, id, elist
, email
)
76 HackersByName
[name
] = h
77 HackersByEmail
[email
] = h
81 def LookupEmail (addr
):
83 return HackersByEmail
[addr
]
87 def LookupName (name
):
89 return HackersByName
[name
]
95 return HackersByID
[id]
100 return HackersByID
.values ()
101 # return [h for h in HackersByID.values ()] # if (h.added + h.removed) > 0]
104 out
= open ('database.dump', 'w')
105 names
= HackersByName
.keys ()
108 h
= HackersByName
[name
]
109 out
.write ('%4d %s %d p (+%d -%d) sob: %d\n' % (h
.id, h
.name
,
113 for i
in range (0, len (h
.email
)):
114 out
.write ('\t%s -> \n' % (h
.email
[i
]))
115 for date
, empl
in h
.employer
[i
]:
116 out
.write ('\t\t %d-%d-%d %s\n' % (date
.year
, date
.month
, date
.day
,
123 def __init__ (self
, name
):
125 self
.added
= self
.removed
= self
.count
= self
.changed
= 0
129 def AddCSet (self
, patch
):
130 self
.added
+= patch
.added
131 self
.removed
+= patch
.removed
132 self
.changed
+= max(patch
.added
, patch
.removed
)
134 if patch
.author
not in self
.hackers
:
135 self
.hackers
.append (patch
.author
)
142 def GetEmployer (name
):
144 return Employers
[name
]
151 return Employers
.values ()
158 def AddEmailAlias (variant
, canonical
):
159 if EmailAliases
.has_key (variant
):
160 sys
.stderr
.write ('Duplicate email alias for %s\n' % (variant
))
161 EmailAliases
[variant
] = canonical
163 def RemapEmail (email
):
164 email
= email
.lower ()
166 return EmailAliases
[email
]
171 # Email-to-employer mapping.
173 EmailToEmployer
= { }
174 nextyear
= datetime
.date
.today () + datetime
.timedelta (days
= 365)
176 def AddEmailEmployerMapping (email
, employer
, end
= nextyear
):
179 email
= email
.lower ()
180 empl
= GetEmployer (employer
)
182 l
= EmailToEmployer
[email
]
183 for i
in range (0, len(l
)):
185 if date
== end
: # probably both nextyear
186 print 'WARNING: duplicate email/empl for %s' % (email
)
188 l
.insert (i
, (end
, empl
))
190 l
.append ((end
, empl
))
192 EmailToEmployer
[email
] = [(end
, empl
)]
194 def MapToEmployer (email
, unknown
= 0):
195 # Somebody sometimes does s/@/ at /; let's fix it.
196 email
= email
.lower ().replace (' at ', '@')
198 return EmailToEmployer
[email
]
201 namedom
= email
.split ('@')
202 if len (namedom
) < 2:
203 print 'Oops...funky email %s' % email
204 return [(nextyear
, GetEmployer ('Funky'))]
205 s
= namedom
[1].split ('.')
206 for dots
in range (len (s
) - 2, -1, -1):
207 addr
= '.'.join (s
[dots
:])
209 return EmailToEmployer
[addr
]
213 return [(nextyear
, GetEmployer ('(Unknown)'))]
214 return [(nextyear
, GetEmployer (email
))]
217 def LookupEmployer (email
, mapunknown
= 0):
218 elist
= MapToEmployer (email
, mapunknown
)
219 return elist
# GetEmployer (ename)