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

Side by Side Diff: git_cl.py

Issue 141493002: Add a canned clang-format presubmit check (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Rebased Created 6 years, 11 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 | presubmit_canned_checks.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) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 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 # Copyright (C) 2008 Evan Martin <martine@danga.com> 6 # Copyright (C) 2008 Evan Martin <martine@danga.com>
7 7
8 """A git-command for integrating reviews on Rietveld.""" 8 """A git-command for integrating reviews on Rietveld."""
9 9
10 from distutils.version import LooseVersion 10 from distutils.version import LooseVersion
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 'Command "%s" failed.\n%s' % ( 73 'Command "%s" failed.\n%s' % (
74 ' '.join(args), error_message or e.stdout or '')) 74 ' '.join(args), error_message or e.stdout or ''))
75 return e.stdout 75 return e.stdout
76 76
77 77
78 def RunGit(args, **kwargs): 78 def RunGit(args, **kwargs):
79 """Returns stdout.""" 79 """Returns stdout."""
80 return RunCommand(['git'] + args, **kwargs) 80 return RunCommand(['git'] + args, **kwargs)
81 81
82 82
83 def RunGitWithCode(args): 83 def RunGitWithCode(args, suppress_stderr=False):
84 """Returns return code and stdout.""" 84 """Returns return code and stdout."""
85 try: 85 try:
86 env = os.environ.copy() 86 env = os.environ.copy()
87 # 'cat' is a magical git string that disables pagers on all platforms. 87 # 'cat' is a magical git string that disables pagers on all platforms.
88 env['GIT_PAGER'] = 'cat' 88 env['GIT_PAGER'] = 'cat'
89 if suppress_stderr:
90 stderr = subprocess2.VOID
91 else:
92 stderr = sys.stderr
89 out, code = subprocess2.communicate(['git'] + args, 93 out, code = subprocess2.communicate(['git'] + args,
90 env=env, 94 env=env,
91 stdout=subprocess2.PIPE) 95 stdout=subprocess2.PIPE,
96 stderr=stderr)
92 return code, out[0] 97 return code, out[0]
93 except ValueError: 98 except ValueError:
94 # When the subprocess fails, it returns None. That triggers a ValueError 99 # When the subprocess fails, it returns None. That triggers a ValueError
95 # when trying to unpack the return value into (out, code). 100 # when trying to unpack the return value into (out, code).
96 return 1, '' 101 return 1, ''
97 102
98 103
99 def IsGitVersionAtLeast(min_version): 104 def IsGitVersionAtLeast(min_version):
100 prefix = 'git version ' 105 prefix = 'git version '
101 version = RunGit(['--version']).strip() 106 version = RunGit(['--version']).strip()
(...skipping 2192 matching lines...) Expand 10 before | Expand all | Expand 10 after
2294 [f.LocalPath() for f in 2299 [f.LocalPath() for f in
2295 cl.GetChange(base_branch, None).AffectedFiles()], 2300 cl.GetChange(base_branch, None).AffectedFiles()],
2296 change.RepositoryRoot(), author, 2301 change.RepositoryRoot(), author,
2297 fopen=file, os_path=os.path, glob=glob.glob, 2302 fopen=file, os_path=os.path, glob=glob.glob,
2298 disable_color=options.no_color).run() 2303 disable_color=options.no_color).run()
2299 2304
2300 2305
2301 def CMDformat(parser, args): 2306 def CMDformat(parser, args):
2302 """Runs clang-format on the diff.""" 2307 """Runs clang-format on the diff."""
2303 CLANG_EXTS = ['.cc', '.cpp', '.h'] 2308 CLANG_EXTS = ['.cc', '.cpp', '.h']
2304 parser.add_option('--full', action='store_true', default=False) 2309 parser.add_option('--full', action='store_true',
2310 help='Reformat the full content of all touched files')
2311 parser.add_option('--dry-run', action='store_true',
2312 help='Don\'t modify any file on disk.')
2305 opts, args = parser.parse_args(args) 2313 opts, args = parser.parse_args(args)
2306 if args: 2314 if args:
2307 parser.error('Unrecognized args: %s' % ' '.join(args)) 2315 parser.error('Unrecognized args: %s' % ' '.join(args))
2308 2316
2309 # git diff generates paths against the root of the repository. Change 2317 # git diff generates paths against the root of the repository. Change
2310 # to that directory so clang-format can find files even within subdirs. 2318 # to that directory so clang-format can find files even within subdirs.
2311 rel_base_path = RunGit(['rev-parse', '--show-cdup']).strip() 2319 rel_base_path = RunGit(['rev-parse', '--show-cdup']).strip()
2312 if rel_base_path: 2320 if rel_base_path:
2313 os.chdir(rel_base_path) 2321 os.chdir(rel_base_path)
2314 2322
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2351 clang_format_tool = clang_format.FindClangFormatToolInChromiumTree() 2359 clang_format_tool = clang_format.FindClangFormatToolInChromiumTree()
2352 except clang_format.NotFoundError, e: 2360 except clang_format.NotFoundError, e:
2353 DieWithError(e) 2361 DieWithError(e)
2354 2362
2355 if opts.full: 2363 if opts.full:
2356 # diff_output is a list of files to send to clang-format. 2364 # diff_output is a list of files to send to clang-format.
2357 files = diff_output.splitlines() 2365 files = diff_output.splitlines()
2358 if not files: 2366 if not files:
2359 print "Nothing to format." 2367 print "Nothing to format."
2360 return 0 2368 return 0
2361 RunCommand([clang_format_tool, '-i'] + files, 2369 cmd = [clang_format_tool]
2362 cwd=top_dir) 2370 if not opts.dry_run:
2371 cmd.append('-i')
2372 stdout = RunCommand(cmd + files, cwd=top_dir)
2363 else: 2373 else:
2364 env = os.environ.copy() 2374 env = os.environ.copy()
2365 env['PATH'] = os.path.dirname(clang_format_tool) 2375 env['PATH'] = os.path.dirname(clang_format_tool)
2366 # diff_output is a patch to send to clang-format-diff.py 2376 # diff_output is a patch to send to clang-format-diff.py
2367 try: 2377 try:
2368 script = clang_format.FindClangFormatScriptInChromiumTree( 2378 script = clang_format.FindClangFormatScriptInChromiumTree(
2369 'clang-format-diff.py') 2379 'clang-format-diff.py')
2370 except clang_format.NotFoundError, e: 2380 except clang_format.NotFoundError, e:
2371 DieWithError(e) 2381 DieWithError(e)
2372 2382
2373 cmd = [sys.executable, script, '-p0', '-i'] 2383 cmd = [sys.executable, script, '-p0']
2384 if not opts.dry_run:
2385 cmd.append('-i')
2374 2386
2375 RunCommand(cmd, stdin=diff_output, cwd=top_dir, env=env) 2387 stdout = RunCommand(cmd, stdin=diff_output, cwd=top_dir, env=env)
2388 if opts.dry_run and len(stdout) > 0:
2389 return 2
2376 2390
2377 return 0 2391 return 0
2378 2392
2379 2393
2380 class OptionParser(optparse.OptionParser): 2394 class OptionParser(optparse.OptionParser):
2381 """Creates the option parse and add --verbose support.""" 2395 """Creates the option parse and add --verbose support."""
2382 def __init__(self, *args, **kwargs): 2396 def __init__(self, *args, **kwargs):
2383 optparse.OptionParser.__init__( 2397 optparse.OptionParser.__init__(
2384 self, *args, prog='git cl', version=__version__, **kwargs) 2398 self, *args, prog='git cl', version=__version__, **kwargs)
2385 self.add_option( 2399 self.add_option(
(...skipping 29 matching lines...) Expand all
2415 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' 2429 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith '
2416 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) 2430 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)))
2417 2431
2418 2432
2419 if __name__ == '__main__': 2433 if __name__ == '__main__':
2420 # These affect sys.stdout so do it outside of main() to simplify mocks in 2434 # These affect sys.stdout so do it outside of main() to simplify mocks in
2421 # unit testing. 2435 # unit testing.
2422 fix_encoding.fix_encoding() 2436 fix_encoding.fix_encoding()
2423 colorama.init() 2437 colorama.init()
2424 sys.exit(main(sys.argv[1:])) 2438 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | presubmit_canned_checks.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698