Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index b34edcf38df385ee4be9566372e16259c696c6d4..cd477b908dd4bcac5d4f92b2329b9892eae5c5f1 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -1952,24 +1952,52 @@ def CMDformat(parser, args): |
if args: |
parser.error('Unrecognized args: %s' % ' '.join(args)) |
+ # Generate diff for the current branch's changes. |
+ diff_cmd = ['diff', '--no-ext-diff'] |
if opts.full: |
- cmd = ['diff', '--name-only', '--'] + ['.*' + ext for ext in CLANG_EXTS] |
- files = RunGit(cmd).split() |
+ # Only list the names of modified files. |
+ diff_cmd.append('--name-only') |
+ else: |
+ # Only generate context-less patches. |
+ diff_cmd.append('-U0') |
+ |
+ # Grab the merge-base commit, i.e. the upstream commit of the current |
+ # branch when it was created or the last time it was rebased. This is |
+ # to cover the case where the user may have called "git fetch origin", |
+ # moving the origin branch to a newer commit, but hasn't rebased yet. |
+ upstream_commit = None |
+ cl = Changelist() |
+ upstream_branch = cl.GetUpstreamBranch() |
+ if upstream_branch: |
+ upstream_commit = RunGit(['merge-base', 'HEAD', upstream_branch]) |
+ upstream_commit = upstream_commit.strip() |
+ |
+ if not upstream_commit: |
+ DieWithError('Could not find base commit for this branch. ' |
+ 'Are you in detached state?') |
+ |
+ diff_cmd.append(upstream_commit) |
+ |
+ # Handle source file filtering. |
+ diff_cmd.append('--') |
+ diff_cmd += ['*' + ext for ext in CLANG_EXTS] |
+ diff_output = RunGit(diff_cmd) |
+ |
+ if opts.full: |
+ # diff_output is a list of files to send to clang-format. |
+ files = diff_output.splitlines() |
if not files: |
print "Nothing to format." |
return 0 |
- RunCommand(['clang-format', '-i'] + files) |
+ RunCommand(['clang-format', '-i', '-style', 'Chromium'] + files) |
else: |
+ # diff_output is a patch to send to clang-format-diff.py |
cfd_path = os.path.join('/usr', 'lib', 'clang-format', |
'clang-format-diff.py') |
if not os.path.exists(cfd_path): |
- print >> sys.stderr, 'Could not find clang-format-diff at %s.' % cfd_path |
- return 2 |
- cmd = ['diff', '-U0', '@{u}', '--'] + ['.*' + ext for ext in CLANG_EXTS] |
- diff = RunGit(cmd) |
- cmd = [sys.executable, '/usr/lib/clang-format/clang-format-diff.py', |
- '-style', 'Chromium'] |
- RunCommand(cmd, stdin=diff) |
+ DieWithError('Could not find clang-format-diff at %s.' % cfd_path) |
+ cmd = [sys.executable, cfd_path, '-style', 'Chromium'] |
+ RunCommand(cmd, stdin=diff_output) |
return 0 |