OLD | NEW |
1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
2 """Helper for interacting with the Codereview upload.py tool.""" | 2 """Helper for interacting with the Codereview upload.py tool.""" |
3 from __future__ import print_function | 3 from __future__ import print_function |
4 from __future__ import unicode_literals | 4 from __future__ import unicode_literals |
5 | 5 |
6 import json | 6 import json |
7 import logging | 7 import logging |
8 import os | 8 import os |
9 import random | |
10 import sys | 9 import sys |
11 | 10 |
12 # pylint: disable=import-error,no-name-in-module | 11 # pylint: disable=import-error,no-name-in-module |
13 if sys.version_info[0] < 3: | 12 if sys.version_info[0] < 3: |
14 import urllib2 as urllib_error | 13 import urllib2 as urllib_error |
15 import urllib as urllib_parse | 14 import urllib as urllib_parse |
16 import urllib2 as urllib_request | 15 import urllib2 as urllib_request |
17 else: | 16 else: |
18 import urllib.error as urllib_error | 17 import urllib.error as urllib_error |
19 import urllib.parse as urllib_parse | 18 import urllib.parse as urllib_parse |
20 import urllib.request as urllib_request | 19 import urllib.request as urllib_request |
21 | 20 |
22 # pylint: disable=wrong-import-position | 21 # pylint: disable=wrong-import-position |
23 from l2tdevtools.helpers import cli | 22 from l2tdevtools.helpers import cli |
| 23 from l2tdevtools.helpers import projects |
24 from l2tdevtools.lib import upload as upload_tool | 24 from l2tdevtools.lib import upload as upload_tool |
25 | 25 |
26 | 26 |
27 class UploadHelper(cli.CLIHelper): | 27 class UploadHelper(cli.CLIHelper): |
28 """Codereview upload.py command helper.""" | 28 """Codereview upload.py command helper.""" |
29 | 29 |
30 # yapf: disable | |
31 | |
32 _REVIEWERS_PER_PROJECT = { | |
33 'dfdatetime': frozenset([ | |
34 'joachim.metz@gmail.com', | |
35 'onager@deerpie.com']), | |
36 'dfkinds': frozenset([ | |
37 'joachim.metz@gmail.com', | |
38 'onager@deerpie.com']), | |
39 'dfvfs': frozenset([ | |
40 'joachim.metz@gmail.com', | |
41 'onager@deerpie.com']), | |
42 'dfwinreg': frozenset([ | |
43 'joachim.metz@gmail.com', | |
44 'onager@deerpie.com']), | |
45 'dftimewolf': frozenset([ | |
46 'jberggren@gmail.com', | |
47 'someguyiknow@google.com', | |
48 'tomchop@gmail.com']), | |
49 'l2tpreg': frozenset([ | |
50 'joachim.metz@gmail.com', | |
51 'onager@deerpie.com']), | |
52 'plaso': frozenset([ | |
53 'aaronp@gmail.com', | |
54 'jberggren@gmail.com', | |
55 'joachim.metz@gmail.com', | |
56 'onager@deerpie.com', | |
57 'romaing@google.com'])} | |
58 | |
59 _REVIEWERS_DEFAULT = frozenset([ | |
60 'jberggren@gmail.com', | |
61 'joachim.metz@gmail.com', | |
62 'onager@deerpie.com']) | |
63 | |
64 _REVIEWERS_CC = frozenset([ | |
65 'kiddi@kiddaland.net', | |
66 'log2timeline-dev@googlegroups.com']) | |
67 | |
68 # yapf: enable | |
69 | |
70 def __init__(self, email_address, no_browser=False): | 30 def __init__(self, email_address, no_browser=False): |
71 """Initializes a codereview helper. | 31 """Initializes a codereview helper. |
72 | 32 |
73 Args: | 33 Args: |
74 email_address (str): email address. | 34 email_address (str): email address. |
75 no_browser (Optional[bool]): True if the functionality to use the | 35 no_browser (Optional[bool]): True if the functionality to use the |
76 webbrowser to get the OAuth token should be disabled. | 36 webbrowser to get the OAuth token should be disabled. |
77 """ | 37 """ |
78 super(UploadHelper, self).__init__() | 38 super(UploadHelper, self).__init__() |
79 self._access_token = None | 39 self._access_token = None |
80 self._email_address = email_address | 40 self._email_address = email_address |
81 self._no_browser = no_browser | 41 self._no_browser = no_browser |
82 self._upload_py_path = os.path.join( | 42 self._upload_py_path = os.path.join( |
83 os.path.dirname(__file__), '..', 'lib', 'upload.py') | 43 os.path.dirname(__file__), '..', 'lib', 'upload.py') |
84 self._xsrf_token = None | 44 self._xsrf_token = None |
85 | 45 |
86 def _GetReviewer(self, project_name): | |
87 """Determines the reviewer. | |
88 | |
89 Args: | |
90 project_name (str): name of the project. | |
91 | |
92 Returns: | |
93 str: email address of the reviewer that is used on codereview. | |
94 """ | |
95 reviewers = list( | |
96 self._REVIEWERS_PER_PROJECT.get(project_name, self._REVIEWERS_DEFAULT)) | |
97 | |
98 try: | |
99 reviewers.remove(self._email_address) | |
100 except ValueError: | |
101 pass | |
102 | |
103 random.shuffle(reviewers) | |
104 | |
105 return reviewers[0] | |
106 | |
107 def _GetReviewersOnCC(self, project_name, reviewer): | |
108 """Determines the reviewers on CC. | |
109 | |
110 Args: | |
111 project_name (str): name of the project. | |
112 reviewer (str): email address of the reviewer that is used on codereview. | |
113 | |
114 Returns: | |
115 str: comma separated email addresses. | |
116 """ | |
117 reviewers_cc = set( | |
118 self._REVIEWERS_PER_PROJECT.get(project_name, self._REVIEWERS_DEFAULT)) | |
119 reviewers_cc.update(self._REVIEWERS_CC) | |
120 | |
121 reviewers_cc.remove(reviewer) | |
122 | |
123 try: | |
124 reviewers_cc.remove(self._email_address) | |
125 except KeyError: | |
126 pass | |
127 | |
128 return ','.join(reviewers_cc) | |
129 | |
130 def AddMergeMessage(self, issue_number, message): | 46 def AddMergeMessage(self, issue_number, message): |
131 """Adds a merge message to the code review issue. | 47 """Adds a merge message to the code review issue. |
132 | 48 |
133 Where the merge is a commit to the main project git repository. | 49 Where the merge is a commit to the main project git repository. |
134 | 50 |
135 Args: | 51 Args: |
136 issue_number (int|str): codereview issue number. | 52 issue_number (int|str): codereview issue number. |
137 message (str): message to add to the code review issue. | 53 message (str): message to add to the code review issue. |
138 | 54 |
139 Returns: | 55 Returns: |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 """Creates a new codereview issue. | 144 """Creates a new codereview issue. |
229 | 145 |
230 Args: | 146 Args: |
231 project_name (str): name of the project. | 147 project_name (str): name of the project. |
232 diffbase (str): diffbase. | 148 diffbase (str): diffbase. |
233 description (str): description. | 149 description (str): description. |
234 | 150 |
235 Returns: | 151 Returns: |
236 int: codereview issue number or None. | 152 int: codereview issue number or None. |
237 """ | 153 """ |
238 reviewer = self._GetReviewer(project_name) | 154 reviewer = projects.ProjectsHelper.GetReviewer( |
239 reviewers_cc = self._GetReviewersOnCC(project_name, reviewer) | 155 project_name, self._email_address) |
| 156 reviewers_cc = projects.ProjectsHelper.GetReviewersOnCC( |
| 157 project_name, self._email_address, reviewer) |
240 | 158 |
241 command = '{0:s} {1:s} --oauth2'.format( | 159 command = '{0:s} {1:s} --oauth2'.format( |
242 sys.executable, self._upload_py_path) | 160 sys.executable, self._upload_py_path) |
243 | 161 |
244 if self._no_browser: | 162 if self._no_browser: |
245 command = '{0:s} --no_oauth2_webbrowser'.format(command) | 163 command = '{0:s} --no_oauth2_webbrowser'.format(command) |
246 | 164 |
247 command = ( | 165 command = ( |
248 '{0:s} --send_mail -r {1:s} --cc {2:s} -t "{3:s}" -y -- ' | 166 '{0:s} --send_mail -r {1:s} --cc {2:s} -t "{3:s}" -y -- ' |
249 '{4:s}').format( | 167 '{4:s}').format( |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 'and copy the access token.\n' | 330 'and copy the access token.\n' |
413 '\n') | 331 '\n') |
414 print('Enter access token:', end=' ') | 332 print('Enter access token:', end=' ') |
415 | 333 |
416 sys.stdout.flush() | 334 sys.stdout.flush() |
417 | 335 |
418 exit_code, output, _ = self.RunCommand(command) | 336 exit_code, output, _ = self.RunCommand(command) |
419 print(output) | 337 print(output) |
420 | 338 |
421 return exit_code == 0 | 339 return exit_code == 0 |
OLD | NEW |