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

Unified Diff: git_cl.py

Issue 1585923004: 5X speed up of 'git cl format', which also speeds up 'git cl upload' (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Update comment Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: git_cl.py
diff --git a/git_cl.py b/git_cl.py
index 49bed386baa821cfedf4370030bc9cb1b6afb452..ead73c25c155d0442bf430b5ad62b58e062eeec9 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -3421,7 +3421,7 @@ def CMDowners(parser, args):
disable_color=options.no_color).run()
-def BuildGitDiffCmd(diff_type, upstream_commit, args, extensions):
+def BuildGitDiffCmd(diff_type, upstream_commit, args):
"""Generates a diff command."""
# Generate diff for the current branch's changes.
diff_cmd = ['diff', '--no-ext-diff', '--no-prefix', diff_type,
@@ -3429,17 +3429,16 @@ def BuildGitDiffCmd(diff_type, upstream_commit, args, extensions):
if args:
for arg in args:
- if os.path.isdir(arg):
- diff_cmd.extend(os.path.join(arg, '*' + ext) for ext in extensions)
- elif os.path.isfile(arg):
+ if os.path.isdir(arg) or os.path.isfile(arg):
diff_cmd.append(arg)
else:
DieWithError('Argument "%s" is not a file or a directory' % arg)
- else:
- diff_cmd.extend('*' + ext for ext in extensions)
return diff_cmd
+def MatchingFileType(file_name, extensions):
+ """Returns true if the file name ends with one of the given extensions."""
+ return bool([ext for ext in extensions if file_name.lower().endswith(ext)])
@subcommand.usage('[files or directories to diff]')
def CMDformat(parser, args):
@@ -3476,15 +3475,13 @@ def CMDformat(parser, args):
DieWithError('Could not find base commit for this branch. '
'Are you in detached state?')
- if opts.full:
- # Only list the names of modified files.
- diff_type = '--name-only'
- else:
- # Only generate context-less patches.
- diff_type = '-U0'
+ changed_files_cmd = BuildGitDiffCmd('--name-only', upstream_commit, args)
+ diff_output = RunGit(changed_files_cmd)
+ diff_files = diff_output.splitlines()
- diff_cmd = BuildGitDiffCmd(diff_type, upstream_commit, args, CLANG_EXTS)
- diff_output = RunGit(diff_cmd)
+ clang_diff_files = [x for x in diff_files if MatchingFileType(x, CLANG_EXTS)]
+ python_diff_files = [x for x in diff_files if MatchingFileType(x, ['.py'])]
+ dart_diff_files = [x for x in diff_files if MatchingFileType(x, ['.dart'])]
top_dir = os.path.normpath(
RunGit(["rev-parse", "--show-toplevel"]).rstrip('\n'))
@@ -3500,19 +3497,16 @@ def CMDformat(parser, args):
return_value = 0
if opts.full:
- # diff_output is a list of files to send to clang-format.
- files = diff_output.splitlines()
- if files:
+ if clang_diff_files:
cmd = [clang_format_tool]
if not opts.dry_run and not opts.diff:
cmd.append('-i')
- stdout = RunCommand(cmd + files, cwd=top_dir)
+ stdout = RunCommand(cmd + clang_diff_files, cwd=top_dir)
if opts.diff:
sys.stdout.write(stdout)
else:
env = os.environ.copy()
env['PATH'] = str(os.path.dirname(clang_format_tool))
- # diff_output is a patch to send to clang-format-diff.py
try:
script = clang_format.FindClangFormatScriptInChromiumTree(
'clang-format-diff.py')
@@ -3523,6 +3517,9 @@ def CMDformat(parser, args):
if not opts.dry_run and not opts.diff:
cmd.append('-i')
+ diff_cmd = BuildGitDiffCmd('-U0', upstream_commit, clang_diff_files)
+ diff_output = RunGit(diff_cmd)
+
stdout = RunCommand(cmd, stdin=diff_output, cwd=top_dir, env=env)
if opts.diff:
sys.stdout.write(stdout)
@@ -3532,19 +3529,16 @@ def CMDformat(parser, args):
# Similar code to above, but using yapf on .py files rather than clang-format
# on C/C++ files
if opts.python:
- diff_cmd = BuildGitDiffCmd(diff_type, upstream_commit, args, ['.py'])
- diff_output = RunGit(diff_cmd)
yapf_tool = gclient_utils.FindExecutable('yapf')
if yapf_tool is None:
DieWithError('yapf not found in PATH')
if opts.full:
- files = diff_output.splitlines()
- if files:
+ if python_diff_files:
cmd = [yapf_tool]
if not opts.dry_run and not opts.diff:
cmd.append('-i')
- stdout = RunCommand(cmd + files, cwd=top_dir)
+ stdout = RunCommand(cmd + python_diff_files, cwd=top_dir)
if opts.diff:
sys.stdout.write(stdout)
else:
@@ -3552,18 +3546,14 @@ def CMDformat(parser, args):
# https://github.com/google/yapf/issues/154
DieWithError('--python currently only works with --full')
- # Build a diff command that only operates on dart files. dart's formatter
- # does not have the nice property of only operating on modified chunks, so
- # hard code full.
- dart_diff_cmd = BuildGitDiffCmd('--name-only', upstream_commit,
- args, ['.dart'])
- dart_diff_output = RunGit(dart_diff_cmd)
- if dart_diff_output:
+ # Dart's formatter does not have the nice property of only operating on
+ # modified chunks, so hard code full.
+ if dart_diff_files:
try:
command = [dart_format.FindDartFmtToolInChromiumTree()]
if not opts.dry_run and not opts.diff:
command.append('-w')
- command.extend(dart_diff_output.splitlines())
+ command.extend(dart_diff_files)
stdout = RunCommand(command, cwd=top_dir, env=env)
if opts.dry_run and stdout:
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698