initial import
[vuplus_webkit] / Tools / Scripts / webkitpy / common / config / committers.py
1 # Copyright (c) 2011, Apple Inc. All rights reserved.
2 # Copyright (c) 2009, 2011 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7 #
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #
30 # WebKit's Python module for committer and reviewer validation.
31
32 class Contributor(object):
33     def __init__(self, name, email_or_emails, irc_nickname_or_nicknames=None):
34         assert(name)
35         assert(email_or_emails)
36         self.full_name = name
37         if isinstance(email_or_emails, str):
38             self.emails = [email_or_emails]
39         else:
40             self.emails = email_or_emails
41         if isinstance(irc_nickname_or_nicknames, str):
42             self.irc_nicknames = [irc_nickname_or_nicknames]
43         else:
44             self.irc_nicknames = irc_nickname_or_nicknames
45         self.can_commit = False
46         self.can_review = False
47
48     def bugzilla_email(self):
49         # FIXME: We're assuming the first email is a valid bugzilla email,
50         # which might not be right.
51         return self.emails[0]
52
53     def __str__(self):
54         return '"%s" <%s>' % (self.full_name, self.emails[0])
55
56     def contains_string(self, search_string):
57         string = search_string.lower()
58         if string in self.full_name.lower():
59             return True
60         if self.irc_nicknames:
61             for nickname in self.irc_nicknames:
62                 if string in nickname.lower():
63                     return True
64         for email in self.emails:
65             if string in email.lower():
66                 return True
67         return False
68
69
70 class Committer(Contributor):
71     def __init__(self, name, email_or_emails, irc_nickname=None):
72         Contributor.__init__(self, name, email_or_emails, irc_nickname)
73         self.can_commit = True
74
75
76 class Reviewer(Committer):
77     def __init__(self, name, email_or_emails, irc_nickname=None):
78         Committer.__init__(self, name, email_or_emails, irc_nickname)
79         self.can_review = True
80
81
82 # This is a list of people who are neither committers nor reviewers, but get
83 # frequently CC'ed by others on Bugzilla bugs, so their names should be
84 # supported by autocomplete. No review needed to add to the list.
85
86
87 contributors_who_are_not_committers = [
88     Contributor("Alexey Marinichev", ["amarinichev@chromium.org", "amarinichev@google.com"], "amarinichev"),
89     Contributor("Alice Boxhall", "aboxhall@chromium.org", "aboxhall"),
90     Contributor("Ami Fischman", "fischman@chromium.org", "amifischman0"),
91     Contributor("Andras Piroska", "pandras@inf.u-szeged.hu", "andris88"),
92     Contributor("Anna Cavender", "annacc@chromium.org", "annacc"),
93     Contributor("Anne van Kesteren", "annevankesteren+webkit@gmail.com", "annevk"),
94     Contributor("Annie Sullivan", "sullivan@chromium.org", "annie"),
95     Contributor("Aryeh Gregor", "ayg@aryeh.name", "AryehGregor"),
96     Contributor("David Barr", "davidbarr@chromium.org", "barrbrain"),
97     Contributor("David Dorwin", "ddorwin@chromium.org", "ddorwin"),
98     Contributor("David Grogan", "dgrogan@chromium.org", "dgrogan"),
99     Contributor("Douglas Davidson", "ddavidso@apple.com"),
100     Contributor("Edward O'Connor", "eoconnor@apple.com", "hober"),
101     Contributor("Felician Marton", "felician@inf.u-szeged.hu", "Felician"),
102     Contributor("Finnur Thorarinsson", "finnur@chromium.org", "finnur"),
103     Contributor("Greg Simon", "gregsimon@chromium.org", "gregsimon"),
104     Contributor("Gregg Tavares", ["gman@google.com", "gman@chromium.org"], "gman"),
105     Contributor("Ian Hickson", "ian@hixie.ch", "hixie"),
106     Contributor("John Bates", ["jbates@google.com", "jbates@chromium.org"], "jbates"),
107     Contributor("John Bauman", ["jbauman@chromium.org", "jbauman@google.com"], "jbauman"),
108     Contributor("Kristof Kosztyo", "kkristof@inf.u-szeged.hu", "kkristof"),
109     Contributor("Oliver Varga", "voliver@inf.u-szeged.hu", "TwistO"),
110     Contributor("Peter Beverloo", "peter@chromium.org", "beverloo"),
111     Contributor("Peter Gal", "galpeter@inf.u-szeged.hu", "elecro"),
112     Contributor("Pierre Rossi", "pierre.rossi@gmail.com", "elproxy"),
113     Contributor("Tab Atkins", ["tabatkins@google.com", "jackalmage@gmail.com"], "tabatkins"),
114     Contributor("Tamas Czene", "tczene@inf.u-szeged.hu", "tczene"),
115     Contributor("Wyatt Carss", "wcarss@chromium.org", "wcarss"),
116     Contributor("Xianzhu Wang", ["wangxianzhu@chromium.org", "phnixwxz@gmail.com"], "wangxianzhu"),
117     Contributor("Zsolt Feher", "feherzs@inf.u-szeged.hu", "Smith"),
118 ]
119
120
121 # This is intended as a canonical, machine-readable list of all non-reviewer
122 # committers for WebKit.  If your name is missing here and you are a committer,
123 # please add it.  No review needed.  All reviewers are committers, so this list
124 # is only of committers who are not reviewers.
125
126
127 committers_unable_to_review = [
128     Committer("Aaron Boodman", "aa@chromium.org", "aboodman"),
129     Committer("Abhishek Arya", "inferno@chromium.org", "inferno-sec"),
130     Committer("Adam Klein", "adamk@chromium.org", "aklein"),
131     Committer("Adam Langley", "agl@chromium.org", "agl"),
132     Committer("Ademar de Souza Reis Junior", ["ademar.reis@openbossa.org", "ademar@webkit.org"], "ademar"),
133     Committer("Adrienne Walker", ["enne@google.com", "enne@chromium.org"], "enne"),
134     Committer("Albert J. Wong", "ajwong@chromium.org"),
135     Committer("Alejandro G. Castro", ["alex@igalia.com", "alex@webkit.org"], "alexg"),
136     Committer("Alexander Kellett", ["lypanov@mac.com", "a-lists001@lypanov.net", "lypanov@kde.org"], "lypanov"),
137     Committer("Alexander Pavlov", "apavlov@chromium.org", "apavlov"),
138     Committer("Alexis Menard", ["alexis.menard@openbossa.org", "menard@kde.org"], "darktears"),
139     Committer("Alok Priyadarshi", "alokp@chromium.org", "alokp"),
140     Committer("Andre Boule", "aboule@apple.com"),
141     Committer("Andrei Popescu", "andreip@google.com", "andreip"),
142     Committer("Andrew Wellington", ["andrew@webkit.org", "proton@wiretapped.net"], "proton"),
143     Committer("Andrew Scherkus", "scherkus@chromium.org", "scherkus"),
144     Committer("Andrey Kosyakov", "caseq@chromium.org", "caseq"),
145     Committer("Andras Becsi", ["abecsi@webkit.org", "andras.becsi@nokia.com"], "bbandix"),
146     Committer("Anthony Ricaud", "rik@webkit.org", "rik"),
147     Committer("Anton D'Auria", "adauria@apple.com", "antonlefou"),
148     Committer("Anton Muhin", "antonm@chromium.org", "antonm"),
149     Committer("Balazs Kelemen", "kbalazs@webkit.org", "kbalazs"),
150     Committer("Ben Murdoch", "benm@google.com", "benm"),
151     Committer("Benjamin C Meyer", ["ben@meyerhome.net", "ben@webkit.org"], "icefox"),
152     Committer("Benjamin Kalman", ["kalman@chromium.org", "kalman@google.com"], "kalman"),
153     Committer("Benjamin Otte", ["otte@gnome.org", "otte@webkit.org"], "otte"),
154     Committer("Brett Wilson", "brettw@chromium.org", "brettx"),
155     Committer("Caio Marcelo de Oliveira Filho", ["cmarcelo@webkit.org", "caio.oliveira@openbossa.org"], "cmarcelo"),
156     Committer("Cameron McCormack", ["cam@mcc.id.au", "cam@webkit.org"], "heycam"),
157     Committer("Carlos Garcia Campos", ["cgarcia@igalia.com", "carlosgc@gnome.org", "carlosgc@webkit.org"], "KaL"),
158     Committer("Carol Szabo", "carol@webkit.org", "cszabo1"),
159     Committer("Cary Clark", "caryclark@google.com", "caryclark"),
160     Committer("Chris Evans", "cevans@google.com"),
161     Committer("Chris Guillory", ["ctguil@chromium.org", "chris.guillory@google.com"], "ctguil"),
162     Committer("Chris Petersen", "cpetersen@apple.com", "cpetersen"),
163     Committer("Chris Rogers", "crogers@google.com", "crogers"),
164     Committer("Christian Dywan", ["christian@twotoasts.de", "christian@webkit.org"]),
165     Committer("Collin Jackson", "collinj@webkit.org", "collinjackson"),
166     Committer("Cris Neckar", "cdn@chromium.org", "cneckar"),
167     Committer("Daniel Cheng", "dcheng@chromium.org", "dcheng"),
168     Committer("David Smith", ["catfish.man@gmail.com", "dsmith@webkit.org"], "catfishman"),
169     Committer("Diego Gonzalez", ["diegohcg@webkit.org", "diego.gonzalez@openbossa.org"], "diegohcg"),
170     Committer("Dmitry Lomov", ["dslomov@google.com", "dslomov@chromium.org"], "dslomov"),
171     Committer("Dominic Cooney", "dominicc@chromium.org", "dominicc"),
172     Committer("Drew Wilson", "atwilson@chromium.org", "atwilson"),
173     Committer("Eli Fidler", "eli@staikos.net", "QBin"),
174     Committer("Emil A Eklund", "eae@chromium.org", "eae"),
175     Committer("Erik Arvidsson", "arv@chromium.org", "arv"),
176     Committer("Eric Roman", "eroman@chromium.org", "eroman"),
177     Committer("Eric Uhrhane", "ericu@chromium.org", "ericu"),
178     Committer("Evan Martin", "evan@chromium.org", "evmar"),
179     Committer("Evan Stade", "estade@chromium.org", "estade"),
180     Committer("Fady Samuel", "fsamuel@chromium.org", "fsamuel"),
181     Committer("Feng Qian", "feng@chromium.org"),
182     Committer("Filip Pizlo", "fpizlo@apple.com", "pizlo"),
183     Committer("Fumitoshi Ukai", "ukai@chromium.org", "ukai"),
184     Committer("Gabor Loki", "loki@webkit.org", "loki04"),
185     Committer("Gabor Rapcsanyi", ["rgabor@webkit.org", "rgabor@inf.u-szeged.hu"], "rgabor"),
186     Committer("Gavin Peters", ["gavinp@chromium.org", "gavinp@webkit.org", "gavinp@google.com"], "gavinp"),
187     Committer("Girish Ramakrishnan", ["girish@forwardbias.in", "ramakrishnan.girish@gmail.com"], "girishr"),
188     Committer("Graham Dennis", ["Graham.Dennis@gmail.com", "gdennis@webkit.org"]),
189     Committer("Greg Bolsinga", "bolsinga@apple.com"),
190     Committer("Gyuyoung Kim", ["gyuyoung.kim@samsung.com", "gyuyoung.kim@webkit.org"], "gyuyoung"),
191     Committer("Hans Wennborg", "hans@chromium.org", "hwennborg"),
192     Committer("Hayato Ito", "hayato@chromium.org", "hayato"),
193     Committer("Helder Correia", "helder@sencha.com", "helder"),
194     Committer("Hin-Chung Lam", ["hclam@google.com", "hclam@chromium.org"]),
195     Committer("Igor Trindade Oliveira", ["igor.oliveira@webkit.org", "igor.oliveira@openbossa.org"], "igoroliveira"),
196     Committer("Ilya Sherman", "isherman@chromium.org", "isherman"),
197     Committer("Ilya Tikhonovsky", "loislo@chromium.org", "loislo"),
198     Committer("Ivan Krsti\u0107", "ike@apple.com"),
199     Committer("Jakob Petsovits", ["jpetsovits@rim.com", "jpetso@gmx.at"], "jpetso"),
200     Committer("Jakub Wieczorek", "jwieczorek@webkit.org", "fawek"),
201     Committer("James Hawkins", ["jhawkins@chromium.org", "jhawkins@google.com"], "jhawkins"),
202     Committer("James Kozianski", ["koz@chromium.org", "koz@google.com"], "koz"),
203     Committer("James Simonsen", "simonjam@chromium.org", "simonjam"),
204     Committer("Jay Civelli", "jcivelli@chromium.org", "jcivelli"),
205     Committer("Jeff Miller", "jeffm@apple.com", "jeffm7"),
206     Committer("Jeffrey Pfau", ["jeffrey@endrift.com", "jpfau@apple.com"], "jpfau"),
207     Committer("Jenn Braithwaite", "jennb@chromium.org", "jennb"),
208     Committer("Jens Alfke", ["snej@chromium.org", "jens@apple.com"]),
209     Committer("Jer Noble", "jer.noble@apple.com", "jernoble"),
210     Committer("Jeremy Moskovich", ["playmobil@google.com", "jeremy@chromium.org"], "jeremymos"),
211     Committer("Jessie Berlin", ["jberlin@webkit.org", "jberlin@apple.com"]),
212     Committer("Jesus Sanchez-Palencia", ["jesus@webkit.org", "jesus.palencia@openbossa.org"], "jeez_"),
213     Committer("Jia Pu", "jpu@apple.com"),
214     Committer("Jocelyn Turcotte", "jocelyn.turcotte@nokia.com", "jturcotte"),
215     Committer("Jochen Eisinger", "jochen@chromium.org", "jochen__"),
216     Committer("John Abd-El-Malek", "jam@chromium.org", "jam"),
217     Committer("John Gregg", ["johnnyg@google.com", "johnnyg@chromium.org"], "johnnyg"),
218     Committer("John Knottenbelt", "jknotten@chromium.org", "jknotten"),
219     Committer("Johnny Ding", ["jnd@chromium.org", "johnnyding.webkit@gmail.com"], "johnnyding"),
220     Committer("Jon Lee", "jonlee@apple.com", "jonlee"),
221     Committer("Joone Hur", ["joone.hur@collabora.co.uk", "joone@kldp.org", "joone@webkit.org"], "joone"),
222     Committer("Joost de Valk", ["joost@webkit.org", "webkit-dev@joostdevalk.nl"], "Altha"),
223     Committer("Julie Parent", ["jparent@google.com", "jparent@chromium.org"], "jparent"),
224     Committer("Julien Chaffraix", ["jchaffraix@webkit.org", "julien.chaffraix@gmail.com"]),
225     Committer("Jungshik Shin", "jshin@chromium.org"),
226     Committer("Justin Schuh", "jschuh@chromium.org", "jschuh"),
227     Committer("Keishi Hattori", "keishi@webkit.org", "keishi"),
228     Committer("Kelly Norton", "knorton@google.com"),
229     Committer("Kenichi Ishibashi", "bashi@chromium.org", "bashi"),
230     Committer("Kenji Imasaki", "imasaki@chromium.org", "imasaki"),
231     Committer("Kent Hansen", "kent.hansen@nokia.com", "khansen"),
232     Committer(u"Kim Gr\u00f6nholm", "kim.1.gronholm@nokia.com"),
233     Committer("Kimmo Kinnunen", ["kimmo.t.kinnunen@nokia.com", "kimmok@iki.fi", "ktkinnun@webkit.org"], "kimmok"),
234     Committer("Kinuko Yasuda", "kinuko@chromium.org", "kinuko"),
235     Committer("Krzysztof Kowalczyk", "kkowalczyk@gmail.com"),
236     Committer("Kwang Yul Seo", ["kwangyul.seo@gmail.com", "skyul@company100.net", "kseo@webkit.org"], "kwangseo"),
237     Committer("Leandro Gracia Gil", "leandrogracia@chromium.org", "leandrogracia"),
238     Committer("Leandro Pereira", ["leandro@profusion.mobi", "leandro@webkit.org"], "acidx"),
239     Committer("Leo Yang", ["leo.yang@torchmobile.com.cn", "leoyang@webkit.org", "leoyang.webkit@gmail.com"], "leoyang"),
240     Committer("Levi Weintraub", ["leviw@chromium.org", "leviw@google.com", "lweintraub@apple.com"], "leviw"),
241     Committer("Lucas De Marchi", ["demarchi@webkit.org", "lucas.demarchi@profusion.mobi"], "demarchi"),
242     Committer("Lucas Forschler", ["lforschler@apple.com"], "lforschler"),
243     Committer("Luke Macpherson", ["macpherson@chromium.org", "macpherson@google.com"], "macpherson"),
244     Committer("Mads Ager", "ager@chromium.org"),
245     Committer("Mahesh Kulkarni", "mahesh.kulkarni@nokia.com", "maheshk"),
246     Committer("Marcus Voltis Bulach", "bulach@chromium.org"),
247     Committer("Mario Sanchez Prada", ["msanchez@igalia.com", "mario@webkit.org"], "msanchez"),
248     Committer("Mark Hahnenberg", "mhahnenberg@apple.com"),
249     Committer("Matt Delaney", "mdelaney@apple.com"),
250     Committer("Matt Lilek", ["mlilek@apple.com", "webkit@mattlilek.com", "pewtermoose@webkit.org"], "pewtermoose"),
251     Committer("Matt Perry", "mpcomplete@chromium.org"),
252     Committer("Maxime Britto", ["maxime.britto@gmail.com", "britto@apple.com"]),
253     Committer("Maxime Simon", ["simon.maxime@gmail.com", "maxime.simon@webkit.org"], "maxime.simon"),
254     Committer("Michael Nordman", "michaeln@google.com", "michaeln"),
255     Committer("Michael Saboff", "msaboff@apple.com"),
256     Committer("Michelangelo De Simone", "michelangelo@webkit.org", "michelangelo"),
257     Committer("Mike Belshe", ["mbelshe@chromium.org", "mike@belshe.com"]),
258     Committer("Mike Fenton", ["mifenton@rim.com", "mike.fenton@torchmobile.com"], "mfenton"),
259     Committer("Mike Lawther", "mikelawther@chromium.org", "mikelawther"),
260     Committer("Mike Reed", "reed@google.com", "reed"),
261     Committer("Mike Thole", ["mthole@mikethole.com", "mthole@apple.com"]),
262     Committer("Mikhail Naganov", "mnaganov@chromium.org"),
263     Committer("Nat Duca", ["nduca@chromium.org", "nduca@google.com"], "nduca"),
264     Committer("Nico Weber", ["thakis@chromium.org", "thakis@google.com"], "thakis"),
265     Committer("Noel Gordon", ["noel.gordon@gmail.com", "noel@chromium.org", "noel@google.com"], "noel"),
266     Committer("Pam Greene", "pam@chromium.org", "pamg"),
267     Committer("Patrick Gansterer", ["paroga@paroga.com", "paroga@webkit.org"], "paroga"),
268     Committer("Pavel Podivilov", "podivilov@chromium.org", "podivilov"),
269     Committer("Peter Kasting", ["pkasting@google.com", "pkasting@chromium.org"], "pkasting"),
270     Committer("Peter Varga", ["pvarga@webkit.org", "pvarga@inf.u-szeged.hu"], "stampho"),
271     Committer("Pierre d'Herbemont", ["pdherbemont@free.fr", "pdherbemont@apple.com"], "pdherbemont"),
272     Committer("Pierre-Olivier Latour", "pol@apple.com", "pol"),
273     Committer("Pratik Solanki", "psolanki@apple.com", "psolanki"),
274     Committer("Qi Zhang", ["qi.2.zhang@nokia.com", "qi.zhang02180@gmail.com"], "qi"),
275     Committer("Rafael Antognolli", "antognolli@profusion.mobi", "antognolli"),
276     Committer("Renata Hodovan", "reni@webkit.org", "reni"),
277     Committer("Robert Hogan", ["robert@webkit.org", "robert@roberthogan.net", "lists@roberthogan.net"], "mwenge"),
278     Committer("Roland Steiner", "rolandsteiner@chromium.org"),
279     Committer("Ryuan Choi", "ryuan.choi@samsung.com", "ryuan"),
280     Committer("Satish Sampath", "satish@chromium.org"),
281     Committer("Scott Violet", "sky@chromium.org", "sky"),
282     Committer("Sergio Villar Senin", ["svillar@igalia.com", "sergio@webkit.org"], "svillar"),
283     Committer("Siddharth Mathur", "siddharth.mathur@nokia.com", "simathur"),
284     Committer("Steve Lacey", "sjl@chromium.org", "stevela"),
285     Committer("Tim Horton", "timothy_horton@apple.com", "thorton"),
286     Committer("Trey Matteson", "trey@usa.net", "trey"),
287     Committer("Tristan O'Tierney", ["tristan@otierney.net", "tristan@apple.com"]),
288     Committer("Vangelis Kokkevis", "vangelis@chromium.org", "vangelis"),
289     Committer("Victor Wang", "victorw@chromium.org", "victorw"),
290     Committer("Victoria Kirst", "vrk@chromium.org", "vrk"),
291     Committer("Vitaly Repeshko", "vitalyr@chromium.org"),
292     Committer("Vsevolod Vlasov", "vsevik@chromium.org"),
293     Committer("William Siegrist", "wsiegrist@apple.com", "wms"),
294     Committer("W. James MacLean", "wjmaclean@chromium.org", "wjmaclean"),
295     Committer("Xiaomei Ji", "xji@chromium.org", "xji"),
296     Committer("Yael Aharon", "yael.aharon@nokia.com", "yael"),
297     Committer("Yaar Schnitman", ["yaar@chromium.org", "yaar@google.com"]),
298     Committer("Yong Li", ["yong.li.webkit@gmail.com", "yong.li@torchmobile.com"], "yong"),
299     Committer("Yongjun Zhang", "yongjun.zhang@nokia.com"),
300     Committer("Yi Shen", ["yi.4.shen@nokia.com", "shenyi2006@gmail.com"]),
301     Committer("Yuta Kitamura", "yutak@chromium.org", "yutak"),
302     Committer("Yuzo Fujishima", "yuzo@google.com", "yuzo"),
303     Committer("Zhenyao Mo", "zmo@google.com", "zhenyao"),
304     Committer("Zoltan Horvath", ["zoltan@webkit.org", "hzoltan@inf.u-szeged.hu", "horvath.zoltan.6@stud.u-szeged.hu"], "zoltan"),
305     Committer("Naoki Takano", "honten@chromium.org", "honten"),
306 ]
307
308
309 # This is intended as a canonical, machine-readable list of all reviewers for
310 # WebKit.  If your name is missing here and you are a reviewer, please add it.
311 # No review needed.
312
313
314 reviewers_list = [
315     Reviewer("Ada Chan", "adachan@apple.com", "chanada"),
316     Reviewer("Adam Barth", "abarth@webkit.org", "abarth"),
317     Reviewer("Adam Roben", "aroben@apple.com", "aroben"),
318     Reviewer("Adam Treat", ["treat@kde.org", "treat@webkit.org", "atreat@rim.com"], "manyoso"),
319     Reviewer("Adele Peterson", "adele@apple.com", "adele"),
320     Reviewer("Alexey Proskuryakov", ["ap@webkit.org", "ap@apple.com"], "ap"),
321     Reviewer("Alice Liu", "alice.liu@apple.com", "aliu"),
322     Reviewer("Alp Toker", ["alp@nuanti.com", "alp@atoker.com", "alp@webkit.org"], "alp"),
323     Reviewer("Anders Carlsson", ["andersca@apple.com", "acarlsson@apple.com"], "andersca"),
324     Reviewer("Andreas Kling", ["kling@webkit.org", "andreas.kling@nokia.com"], "kling"),
325     Reviewer("Andy Estes", "aestes@apple.com", "estes"),
326     Reviewer("Antonio Gomes", ["tonikitoo@webkit.org", "agomes@rim.com"], "tonikitoo"),
327     Reviewer("Antti Koivisto", ["koivisto@iki.fi", "antti@apple.com", "antti.j.koivisto@nokia.com"], "anttik"),
328     Reviewer("Ariya Hidayat", ["ariya.hidayat@gmail.com", "ariya@sencha.com", "ariya@webkit.org"], "ariya"),
329     Reviewer("Benjamin Poulain", ["benjamin@webkit.org", "benjamin.poulain@nokia.com", "ikipou@gmail.com"], "benjaminp"),
330     Reviewer("Beth Dakin", "bdakin@apple.com", "dethbakin"),
331     Reviewer("Brady Eidson", "beidson@apple.com", "bradee-oh"),
332     Reviewer("Brent Fulgham", "bfulgham@webkit.org", "bfulgham"),
333     Reviewer("Brian Weinstein", "bweinstein@apple.com", "bweinstein"),
334     Reviewer("Cameron Zwarich", ["zwarich@apple.com", "cwzwarich@apple.com", "cwzwarich@webkit.org"]),
335     Reviewer("Chang Shu", ["cshu@webkit.org", "Chang.Shu@nokia.com"], "cshu"),
336     Reviewer("Chris Blumenberg", "cblu@apple.com", "cblu"),
337     Reviewer("Chris Marrin", "cmarrin@apple.com", "cmarrin"),
338     Reviewer("Chris Fleizach", "cfleizach@apple.com", "cfleizach"),
339     Reviewer("Chris Jerdonek", "cjerdonek@webkit.org", "cjerdonek"),
340     Reviewer(u"Csaba Osztrogon\u00e1c", "ossy@webkit.org", "ossy"),
341     Reviewer("Dan Bernstein", ["mitz@webkit.org", "mitz@apple.com"], "mitzpettel"),
342     Reviewer("Daniel Bates", "dbates@webkit.org", "dydz"),
343     Reviewer("Darin Adler", "darin@apple.com", "darin"),
344     Reviewer("Darin Fisher", ["fishd@chromium.org", "darin@chromium.org"], "fishd"),
345     Reviewer("David Harrison", "harrison@apple.com", "harrison"),
346     Reviewer("David Hyatt", "hyatt@apple.com", ["dhyatt", "hyatt"]),
347     Reviewer("David Kilzer", ["ddkilzer@webkit.org", "ddkilzer@apple.com"], "ddkilzer"),
348     Reviewer("David Levin", "levin@chromium.org", "dave_levin"),
349     Reviewer("Dean Jackson", "dino@apple.com", "dino"),
350     Reviewer("Dimitri Glazkov", "dglazkov@chromium.org", "dglazkov"),
351     Reviewer("Dirk Pranke", "dpranke@chromium.org", "dpranke"),
352     Reviewer("Dirk Schulze", "krit@webkit.org", "krit"),
353     Reviewer("Dmitry Titov", "dimich@chromium.org", "dimich"),
354     Reviewer("Don Melton", "gramps@apple.com", "gramps"),
355     Reviewer("Dumitru Daniliuc", "dumi@chromium.org", "dumi"),
356     Reviewer("Enrica Casucci", "enrica@apple.com", "enrica"),
357     Reviewer("Eric Carlson", "eric.carlson@apple.com", "eric_carlson"),
358     Reviewer("Eric Seidel", "eric@webkit.org", "eseidel"),
359     Reviewer("Gavin Barraclough", "barraclough@apple.com", "gbarra"),
360     Reviewer("Geoffrey Garen", "ggaren@apple.com", "ggaren"),
361     Reviewer("George Staikos", ["staikos@kde.org", "staikos@webkit.org"]),
362     Reviewer("Gustavo Noronha Silva", ["gns@gnome.org", "kov@webkit.org", "gustavo.noronha@collabora.co.uk"], "kov"),
363     Reviewer("Hajime Morita", ["morrita@google.com", "morrita@chromium.org"], "morrita"),
364     Reviewer("Holger Freyther", ["zecke@selfish.org", "zecke@webkit.org"], "zecke"),
365     Reviewer("James Robinson", ["jamesr@chromium.org", "jamesr@google.com"], "jamesr"),
366     Reviewer("Jan Alonzo", ["jmalonzo@gmail.com", "jmalonzo@webkit.org"], "janm"),
367     Reviewer("Jeremy Orlow", "jorlow@webkit.org", "jorlow"),
368     Reviewer("Jian Li", "jianli@chromium.org", "jianli"),
369     Reviewer("John Sullivan", "sullivan@apple.com", "sullivan"),
370     Reviewer("Jon Honeycutt", "jhoneycutt@apple.com", "jhoneycutt"),
371     Reviewer("Joseph Pecoraro", ["joepeck@webkit.org", "pecoraro@apple.com"], "JoePeck"),
372     Reviewer("Justin Garcia", "justin.garcia@apple.com", "justing"),
373     Reviewer("Ken Kocienda", "kocienda@apple.com"),
374     Reviewer("Kenneth Rohde Christiansen", ["kenneth@webkit.org", "kenneth.christiansen@openbossa.org", "kenneth.christiansen@gmail.com"], ["kenne", "kenneth"]),
375     Reviewer("Kenneth Russell", "kbr@google.com", "kbr_google"),
376     Reviewer("Kent Tamura", "tkent@chromium.org", "tkent"),
377     Reviewer("Kevin Decker", "kdecker@apple.com", "superkevin"),
378     Reviewer("Kevin McCullough", "kmccullough@apple.com", "maculloch"),
379     Reviewer("Kevin Ollivier", ["kevino@theolliviers.com", "kevino@webkit.org"], "kollivier"),
380     Reviewer("Lars Knoll", ["lars@trolltech.com", "lars@kde.org", "lars.knoll@nokia.com"], "lars"),
381     Reviewer("Laszlo Gombos", "laszlo.1.gombos@nokia.com", "lgombos"),
382     Reviewer("Luiz Agostini", ["luiz@webkit.org", "luiz.agostini@openbossa.org"], "lca"),
383     Reviewer("Maciej Stachowiak", "mjs@apple.com", "othermaciej"),
384     Reviewer("Mark Rowe", "mrowe@apple.com", "bdash"),
385     Reviewer("Martin Robinson", ["mrobinson@webkit.org", "mrobinson@igalia.com", "martin.james.robinson@gmail.com"], "mrobinson"),
386     Reviewer("Mihai Parparita", "mihaip@chromium.org", "mihaip"),
387     Reviewer("Nate Chapin", "japhet@chromium.org", ["japhet", "natechapin"]),
388     Reviewer("Nikolas Zimmermann", ["zimmermann@kde.org", "zimmermann@physik.rwth-aachen.de", "zimmermann@webkit.org"], "wildfox"),
389     Reviewer("Noam Rosenthal", "noam.rosenthal@nokia.com", "noamr"),
390     Reviewer("Ojan Vafai", "ojan@chromium.org", "ojan"),
391     Reviewer("Oliver Hunt", "oliver@apple.com", "olliej"),
392     Reviewer("Pavel Feldman", "pfeldman@chromium.org", "pfeldman"),
393     Reviewer("Philippe Normand", ["pnormand@igalia.com", "philn@webkit.org", "philn@igalia.com"], ["philn-tp", "pnormand"]),
394     Reviewer("Richard Williamson", "rjw@apple.com", "rjw"),
395     Reviewer("Rob Buis", ["rwlbuis@gmail.com", "rwlbuis@webkit.org"], "rwlbuis"),
396     Reviewer("Ryosuke Niwa", "rniwa@webkit.org", "rniwa"),
397     Reviewer("Sam Weinig", ["sam@webkit.org", "weinig@apple.com"], "weinig"),
398     Reviewer("Shinichiro Hamaji", "hamaji@chromium.org", "hamaji"),
399     Reviewer("Simon Fraser", "simon.fraser@apple.com", "smfr"),
400     Reviewer("Simon Hausmann", ["hausmann@webkit.org", "hausmann@kde.org", "simon.hausmann@nokia.com"], "tronical"),
401     Reviewer("Stephanie Lewis", "slewis@apple.com", "sundiamonde"),
402     Reviewer("Stephen White", "senorblanco@chromium.org", "senorblanco"),
403     Reviewer("Steve Block", "steveblock@google.com", "steveblock"),
404     Reviewer("Steve Falkenburg", "sfalken@apple.com", "sfalken"),
405     Reviewer("Tim Omernick", "timo@apple.com"),
406     Reviewer("Timothy Hatcher", ["timothy@apple.com", "timothy@hatcher.name"], "xenon"),
407     Reviewer("Tony Chang", "tony@chromium.org", "tony^work"),
408     Reviewer("Tony Gentilcore", "tonyg@chromium.org", "tonyg-cr"),
409     Reviewer(u"Tor Arne Vestb\u00f8", ["vestbo@webkit.org", "tor.arne.vestbo@nokia.com"], "torarne"),
410     Reviewer("Vicki Murley", "vicki@apple.com"),
411     Reviewer("Xan Lopez", ["xan.lopez@gmail.com", "xan@gnome.org", "xan@webkit.org"], "xan"),
412     Reviewer("Yury Semikhatsky", "yurys@chromium.org", "yurys"),
413     Reviewer("Zack Rusin", "zack@kde.org", "zackr"),
414     Reviewer("Zoltan Herczeg", "zherczeg@webkit.org", "zherczeg"),
415 ]
416
417
418 class CommitterList(object):
419
420     # Committers and reviewers are passed in to allow easy testing
421     def __init__(self,
422                  committers=committers_unable_to_review,
423                  reviewers=reviewers_list,
424                  contributors=contributors_who_are_not_committers):
425         self._contributors = contributors + committers + reviewers
426         self._committers = committers + reviewers
427         self._reviewers = reviewers
428         self._contributors_by_email = {}
429
430     def contributors(self):
431         return self._contributors
432
433     def committers(self):
434         return self._committers
435
436     def reviewers(self):
437         return self._reviewers
438
439     def _email_to_contributor_map(self):
440         if not len(self._contributors_by_email):
441             for contributor in self._contributors:
442                 for email in contributor.emails:
443                     assert(email not in self._contributors_by_email)  # We should never have duplicate emails.
444                     self._contributors_by_email[email] = contributor
445         return self._contributors_by_email
446
447     def _committer_only(self, record):
448         if record and not record.can_commit:
449             return None
450         return record
451
452     def _reviewer_only(self, record):
453         if record and not record.can_review:
454             return None
455         return record
456
457     def contributor_by_name(self, name):
458         # This could be made into a hash lookup if callers need it to be fast.
459         for contributor in self.contributors():
460             if contributor.full_name and contributor.full_name == name:
461                 return contributor
462         return None
463
464     def committer_by_name(self, name):
465         return self._committer_only(self.contributor_by_name(name))
466
467     def contributor_by_irc_nickname(self, irc_nickname):
468         for contributor in self.contributors():
469             if contributor.irc_nicknames and irc_nickname in contributor.irc_nicknames:
470                 return contributor
471         return None
472
473     def contributors_by_search_string(self, string):
474         return filter(lambda contributor: contributor.contains_string(string), self.contributors())
475
476     def contributor_by_email(self, email):
477         return self._email_to_contributor_map().get(email)
478
479     def committer_by_email(self, email):
480         return self._committer_only(self.contributor_by_email(email))
481
482     def reviewer_by_email(self, email):
483         return self._reviewer_only(self.contributor_by_email(email))