Re-land "git-cl: Fix format --dry-run not working with --full."
Re-land fixes format always saying the folder was dirty.
The --full option would skip setting the return value of the format
command when used with --dry-run. This in turn would cause the
presubmit check to always pass when --full was enabled in a repo by
default.
Was discovered in the ANGLE repository.
Bug: angleproject:4241
Change-Id: I986646336d1857af2826863ef4becbf2b9ee3049
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1993910
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Edward Lesmes <ehmaldonado@chromium.org>
diff --git a/git_cl.py b/git_cl.py
index cf30eff..337ed3e 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -5117,6 +5117,65 @@
return diff_cmd
+def _RunClangFormatDiff(opts, clang_diff_files, top_dir, upstream_commit):
+ """Runs clang-format-diff and sets a return value if necessary."""
+
+ if not clang_diff_files:
+ return 0
+
+ # Set to 2 to signal to CheckPatchFormatted() that this patch isn't
+ # formatted. This is used to block during the presubmit.
+ return_value = 0
+
+ # Locate the clang-format binary in the checkout
+ try:
+ clang_format_tool = clang_format.FindClangFormatToolInChromiumTree()
+ except clang_format.NotFoundError as e:
+ DieWithError(e)
+
+ if opts.full or settings.GetFormatFullByDefault():
+ cmd = [clang_format_tool]
+ if not opts.dry_run and not opts.diff:
+ cmd.append('-i')
+ if opts.dry_run:
+ for diff_file in clang_diff_files:
+ with open(diff_file, 'r') as myfile:
+ code = myfile.read().replace('\r\n', '\n')
+ stdout = RunCommand(cmd + [diff_file], cwd=top_dir)
+ stdout = stdout.replace('\r\n', '\n')
+ if opts.diff:
+ sys.stdout.write(stdout)
+ if code != stdout:
+ return_value = 2
+ else:
+ 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))
+ try:
+ script = clang_format.FindClangFormatScriptInChromiumTree(
+ 'clang-format-diff.py')
+ except clang_format.NotFoundError as e:
+ DieWithError(e)
+
+ cmd = [sys.executable, script, '-p0']
+ 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)
+ if opts.dry_run and len(stdout) > 0:
+ return_value = 2
+
+ return return_value
+
+
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)])
@@ -5213,45 +5272,8 @@
top_dir = os.path.normpath(
RunGit(["rev-parse", "--show-toplevel"]).rstrip('\n'))
- # Set to 2 to signal to CheckPatchFormatted() that this patch isn't
- # formatted. This is used to block during the presubmit.
- return_value = 0
-
- if clang_diff_files:
- # Locate the clang-format binary in the checkout
- try:
- clang_format_tool = clang_format.FindClangFormatToolInChromiumTree()
- except clang_format.NotFoundError as e:
- DieWithError(e)
-
- if opts.full or settings.GetFormatFullByDefault():
- cmd = [clang_format_tool]
- if not opts.dry_run and not opts.diff:
- cmd.append('-i')
- 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))
- try:
- script = clang_format.FindClangFormatScriptInChromiumTree(
- 'clang-format-diff.py')
- except clang_format.NotFoundError as e:
- DieWithError(e)
-
- cmd = [sys.executable, script, '-p0']
- 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)
- if opts.dry_run and len(stdout) > 0:
- return_value = 2
+ return_value = _RunClangFormatDiff(opts, clang_diff_files, top_dir,
+ upstream_commit)
# Similar code to above, but using yapf on .py files rather than clang-format
# on C/C++ files
@@ -5336,7 +5358,7 @@
stdout = RunCommand(command, cwd=top_dir)
if opts.dry_run and stdout:
return_value = 2
- except dart_format.NotFoundError as e:
+ except dart_format.NotFoundError:
print('Warning: Unable to check Dart code formatting. Dart SDK not '
'found in this checkout. Files in other languages are still '
'formatted.')