Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: gcl.py

Issue 8355007: Get rid of RunShell*() functions in gcl.py to finish the conversion to subprocess2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/gcl_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """\ 6 """\
7 Wrapper script around Rietveld's upload.py that simplifies working with groups 7 Wrapper script around Rietveld's upload.py that simplifies working with groups
8 of files. 8 of files.
9 """ 9 """
10 10
(...skipping 20 matching lines...) Expand all
31 import simplejson as json # pylint: disable=F0401 31 import simplejson as json # pylint: disable=F0401
32 32
33 import fix_encoding 33 import fix_encoding
34 import gclient_utils 34 import gclient_utils
35 import presubmit_support 35 import presubmit_support
36 import rietveld 36 import rietveld
37 from scm import SVN 37 from scm import SVN
38 import subprocess2 38 import subprocess2
39 from third_party import upload 39 from third_party import upload
40 40
41 __version__ = '1.2.1' 41 __version__ = '1.2.2'
42 42
43 43
44 CODEREVIEW_SETTINGS = { 44 CODEREVIEW_SETTINGS = {
45 # To make gcl send reviews to a server, check in a file named 45 # To make gcl send reviews to a server, check in a file named
46 # "codereview.settings" (see |CODEREVIEW_SETTINGS_FILE| below) to your 46 # "codereview.settings" (see |CODEREVIEW_SETTINGS_FILE| below) to your
47 # project's base directory and add the following line to codereview.settings: 47 # project's base directory and add the following line to codereview.settings:
48 # CODE_REVIEW_SERVER: codereview.yourserver.org 48 # CODE_REVIEW_SERVER: codereview.yourserver.org
49 } 49 }
50 50
51 # globals that store the root of the current repository and the directory where 51 # globals that store the root of the current repository and the directory where
(...skipping 10 matching lines...) Expand all
62 62
63 # Global cache of files cached in GetCacheDir(). 63 # Global cache of files cached in GetCacheDir().
64 FILES_CACHE = {} 64 FILES_CACHE = {}
65 65
66 # Valid extensions for files we want to lint. 66 # Valid extensions for files we want to lint.
67 DEFAULT_LINT_REGEX = r"(.*\.cpp|.*\.cc|.*\.h)" 67 DEFAULT_LINT_REGEX = r"(.*\.cpp|.*\.cc|.*\.h)"
68 DEFAULT_LINT_IGNORE_REGEX = r"$^" 68 DEFAULT_LINT_IGNORE_REGEX = r"$^"
69 69
70 REVIEWERS_REGEX = r'\s*R=(.+)' 70 REVIEWERS_REGEX = r'\s*R=(.+)'
71 71
72
72 def CheckHomeForFile(filename): 73 def CheckHomeForFile(filename):
73 """Checks the users home dir for the existence of the given file. Returns 74 """Checks the users home dir for the existence of the given file. Returns
74 the path to the file if it's there, or None if it is not. 75 the path to the file if it's there, or None if it is not.
75 """ 76 """
76 home_vars = ['HOME'] 77 home_vars = ['HOME']
77 if sys.platform in ('cygwin', 'win32'): 78 if sys.platform in ('cygwin', 'win32'):
78 home_vars.append('USERPROFILE') 79 home_vars.append('USERPROFILE')
79 for home_var in home_vars: 80 for home_var in home_vars:
80 home = os.getenv(home_var) 81 home = os.getenv(home_var)
81 if home != None: 82 if home != None:
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 221
221 def Warn(msg): 222 def Warn(msg):
222 print >> sys.stderr, msg 223 print >> sys.stderr, msg
223 224
224 225
225 def ErrorExit(msg): 226 def ErrorExit(msg):
226 print >> sys.stderr, msg 227 print >> sys.stderr, msg
227 sys.exit(1) 228 sys.exit(1)
228 229
229 230
230 def RunShellWithReturnCode(command, print_output=False):
231 """Executes a command and returns the output and the return code."""
232 p = subprocess2.Popen(
233 command, stdout=subprocess2.PIPE,
234 stderr=subprocess2.STDOUT, universal_newlines=True)
235 if print_output:
236 output_array = []
237 while True:
238 line = p.stdout.readline()
239 if not line:
240 break
241 if print_output:
242 print line.strip('\n')
243 output_array.append(line)
244 output = "".join(output_array)
245 else:
246 output = p.stdout.read()
247 p.wait()
248 p.stdout.close()
249 return output, p.returncode
250
251
252 def RunShell(command, print_output=False):
253 """Executes a command and returns the output."""
254 return RunShellWithReturnCode(command, print_output)[0]
255
256
257 def FilterFlag(args, flag): 231 def FilterFlag(args, flag):
258 """Returns True if the flag is present in args list. 232 """Returns True if the flag is present in args list.
259 233
260 The flag is removed from args if present. 234 The flag is removed from args if present.
261 """ 235 """
262 if flag in args: 236 if flag in args:
263 args.remove(flag) 237 args.remove(flag)
264 return True 238 return True
265 return False 239 return False
266 240
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 commit_message = change_info.description.replace('\r\n', '\n') 981 commit_message = change_info.description.replace('\r\n', '\n')
1008 if change_info.issue: 982 if change_info.issue:
1009 server = change_info.rietveld 983 server = change_info.rietveld
1010 if not server.startswith("http://") and not server.startswith("https://"): 984 if not server.startswith("http://") and not server.startswith("https://"):
1011 server = "http://" + server 985 server = "http://" + server
1012 commit_message += ('\nReview URL: %s/%d' % (server, change_info.issue)) 986 commit_message += ('\nReview URL: %s/%d' % (server, change_info.issue))
1013 987
1014 handle, commit_filename = tempfile.mkstemp(text=True) 988 handle, commit_filename = tempfile.mkstemp(text=True)
1015 os.write(handle, commit_message) 989 os.write(handle, commit_message)
1016 os.close(handle) 990 os.close(handle)
1017 991 try:
1018 handle, targets_filename = tempfile.mkstemp(text=True) 992 handle, targets_filename = tempfile.mkstemp(text=True)
1019 os.write(handle, "\n".join(change_info.GetFileNames())) 993 os.write(handle, "\n".join(change_info.GetFileNames()))
1020 os.close(handle) 994 os.close(handle)
1021 995 try:
1022 commit_cmd += ['--file=' + commit_filename] 996 commit_cmd += ['--file=' + commit_filename]
1023 commit_cmd += ['--targets=' + targets_filename] 997 commit_cmd += ['--targets=' + targets_filename]
1024 # Change the current working directory before calling commit. 998 # Change the current working directory before calling commit.
1025 previous_cwd = os.getcwd() 999 previous_cwd = os.getcwd()
1026 os.chdir(change_info.GetLocalRoot()) 1000 os.chdir(change_info.GetLocalRoot())
1027 output = RunShell(commit_cmd, True) 1001 output = ''
1028 os.remove(commit_filename) 1002 try:
1029 os.remove(targets_filename) 1003 output = subprocess2.check_output(commit_cmd)
1004 except subprocess2.CalledProcessError, e:
1005 ErrorExit('Commit failed.\n%s' % e)
1006 finally:
1007 os.remove(commit_filename)
1008 finally:
1009 os.remove(targets_filename)
1030 if output.find("Committed revision") != -1: 1010 if output.find("Committed revision") != -1:
1031 change_info.Delete() 1011 change_info.Delete()
1032 1012
1033 if change_info.issue: 1013 if change_info.issue:
1034 revision = re.compile(".*?\nCommitted revision (\d+)", 1014 revision = re.compile(".*?\nCommitted revision (\d+)",
1035 re.DOTALL).match(output).group(1) 1015 re.DOTALL).match(output).group(1)
1036 viewvc_url = GetCodeReviewSetting("VIEW_VC") 1016 viewvc_url = GetCodeReviewSetting("VIEW_VC")
1037 change_info.description += '\n' 1017 change_info.description += '\n'
1038 if viewvc_url: 1018 if viewvc_url:
1039 change_info.description += "\nCommitted: " + viewvc_url + revision 1019 change_info.description += "\nCommitted: " + viewvc_url + revision
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 if args: 1277 if args:
1298 change_info = ChangeInfo.Load(args.pop(0), GetRepositoryRoot(), True, True) 1278 change_info = ChangeInfo.Load(args.pop(0), GetRepositoryRoot(), True, True)
1299 files = change_info.GetFileNames() 1279 files = change_info.GetFileNames()
1300 else: 1280 else:
1301 files = [f[1] for f in GetFilesNotInCL()] 1281 files = [f[1] for f in GetFilesNotInCL()]
1302 1282
1303 root = GetRepositoryRoot() 1283 root = GetRepositoryRoot()
1304 cmd = ['svn', 'diff'] 1284 cmd = ['svn', 'diff']
1305 cmd.extend([os.path.join(root, x) for x in files]) 1285 cmd.extend([os.path.join(root, x) for x in files])
1306 cmd.extend(args) 1286 cmd.extend(args)
1307 return RunShellWithReturnCode(cmd, print_output=True)[1] 1287 return subprocess2.call(cmd)
1308 1288
1309 1289
1310 @no_args 1290 @no_args
1311 def CMDsettings(): 1291 def CMDsettings():
1312 """Prints code review settings for this checkout.""" 1292 """Prints code review settings for this checkout."""
1313 # Force load settings 1293 # Force load settings
1314 GetCodeReviewSetting("UNKNOWN") 1294 GetCodeReviewSetting("UNKNOWN")
1315 del CODEREVIEW_SETTINGS['__just_initialized'] 1295 del CODEREVIEW_SETTINGS['__just_initialized']
1316 print '\n'.join(("%s: %s" % (str(k), str(v)) 1296 print '\n'.join(("%s: %s" % (str(k), str(v))
1317 for (k,v) in CODEREVIEW_SETTINGS.iteritems())) 1297 for (k,v) in CODEREVIEW_SETTINGS.iteritems()))
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 def CMDpassthru(args): 1360 def CMDpassthru(args):
1381 """Everything else that is passed into gcl we redirect to svn. 1361 """Everything else that is passed into gcl we redirect to svn.
1382 1362
1383 It assumes a change list name is passed and is converted with the files names. 1363 It assumes a change list name is passed and is converted with the files names.
1384 """ 1364 """
1385 args = ["svn", args[0]] 1365 args = ["svn", args[0]]
1386 if len(args) > 1: 1366 if len(args) > 1:
1387 root = GetRepositoryRoot() 1367 root = GetRepositoryRoot()
1388 change_info = ChangeInfo.Load(args[1], root, True, True) 1368 change_info = ChangeInfo.Load(args[1], root, True, True)
1389 args.extend([os.path.join(root, x) for x in change_info.GetFileNames()]) 1369 args.extend([os.path.join(root, x) for x in change_info.GetFileNames()])
1390 return RunShellWithReturnCode(args, print_output=True)[1] 1370 return subprocess2.call(args)
1391 1371
1392 1372
1393 def Command(name): 1373 def Command(name):
1394 return getattr(sys.modules[__name__], 'CMD' + name, None) 1374 return getattr(sys.modules[__name__], 'CMD' + name, None)
1395 1375
1396 1376
1397 def GenUsage(command): 1377 def GenUsage(command):
1398 """Modify an OptParse object with the function's documentation.""" 1378 """Modify an OptParse object with the function's documentation."""
1399 obj = Command(command) 1379 obj = Command(command)
1400 display = command 1380 display = command
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 raise 1457 raise
1478 print >> sys.stderr, ( 1458 print >> sys.stderr, (
1479 'AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' 1459 'AppEngine is misbehaving and returned HTTP %d, again. Keep faith '
1480 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)) 1460 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))
1481 return 1 1461 return 1
1482 1462
1483 1463
1484 if __name__ == "__main__": 1464 if __name__ == "__main__":
1485 fix_encoding.fix_encoding() 1465 fix_encoding.fix_encoding()
1486 sys.exit(main(sys.argv[1:])) 1466 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | tests/gcl_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698