codereview: allow multiple email addresses in CONTRIBUTORS

R=r
CC=golang-dev
https://golang.org/cl/1650041
diff --git a/lib/codereview/codereview.py b/lib/codereview/codereview.py
index 1ece1fa..2d0977c 100644
--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -101,6 +101,7 @@
 server = "codereview.appspot.com"
 server_url_base = None
 defaultcc = None
+contributors = {}
 
 #######################################################################
 # Change list parsing.
@@ -1021,22 +1022,17 @@
 	return userline
 
 def FindContributor(ui, repo, user, warn=True):
-	try:
-		f = open(repo.root + '/CONTRIBUTORS', 'r')
-	except:
-		raise util.Abort("cannot open %s: %s" % (repo.root+'/CONTRIBUTORS', ExceptionDetail()))
-	for line in f.readlines():
-		line = line.rstrip()
-		if line.startswith('#'):
-			continue
-		match = re.match(r"(.*) <(.*)>", line)
-		if not match:
-			continue
-		if line == user or match.group(2).lower() == user.lower():
-			return match.group(2), line
-	if warn:
-		ui.warn("warning: cannot find %s in CONTRIBUTORS\n" % (user,))
-	return None, None
+	m = re.match(r".*<(.*)>", user)
+	if m:
+		user = m.group(1).lower()
+
+	if user not in contributors:
+		if warn:
+			ui.warn("warning: cannot find %s in CONTRIBUTORS\n" % (user,))
+		return None, None
+	
+	user, email = contributors[user]
+	return email, "%s <%s>" % (user, email)
 
 def submit(ui, repo, *pats, **opts):
 	"""submit change to remote repository
@@ -1615,7 +1611,7 @@
 	pass
 
 def RietveldSetup(ui, repo):
-	global defaultcc, upload_options, rpc, server, server_url_base, force_google_account, verbosity
+	global defaultcc, upload_options, rpc, server, server_url_base, force_google_account, verbosity, contributors
 
 	# Read repository-specific options from lib/codereview/codereview.cfg
 	try:
@@ -1626,6 +1622,26 @@
 	except:
 		pass
 
+	try:
+		f = open(repo.root + '/CONTRIBUTORS', 'r')
+	except:
+		raise util.Abort("cannot open %s: %s" % (repo.root+'/CONTRIBUTORS', ExceptionDetail()))
+	for line in f:
+		# CONTRIBUTORS is a list of lines like:
+		#	Person <email>
+		#	Person <email> <alt-email>
+		# The first email address is the one used in commit logs.
+		if line.startswith('#'):
+			continue
+		m = re.match(r"([^<>]+\S)\s+(<[^<>\s]+>)((\s+<[^<>\s]+>)*)\s*$", line)
+		if m:
+			name = m.group(1)
+			email = m.group(2)[1:-1]
+			contributors[email.lower()] = (name, email)
+			for extra in m.group(3).split():
+				contributors[extra[1:-1].lower()] = (name, email)
+	
+
 	# TODO(rsc): If the repository config has no codereview section,
 	# do not enable the extension.  This allows users to
 	# put the extension in their global .hgrc but only