diff options
author | jbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-01 22:25:46 +0000 |
---|---|---|
committer | jbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-01 22:25:46 +0000 |
commit | 82e186c25971008444e33c6b4924232d690b6d15 (patch) | |
tree | 3cf5252797103af28d5259662b126da24f1f50dd /tools/git/git-diff-ide.py | |
parent | faabc62c51637fe40a384d1f0e3cd1d512efce08 (diff) | |
download | chromium_src-82e186c25971008444e33c6b4924232d690b6d15.zip chromium_src-82e186c25971008444e33c6b4924232d690b6d15.tar.gz chromium_src-82e186c25971008444e33c6b4924232d690b6d15.tar.bz2 |
Add git diff python tool that outputs file:line in front of diff output.
Review URL: https://chromiumcodereview.appspot.com/9562011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124499 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/git/git-diff-ide.py')
-rwxr-xr-x | tools/git/git-diff-ide.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/tools/git/git-diff-ide.py b/tools/git/git-diff-ide.py new file mode 100755 index 0000000..405d270 --- /dev/null +++ b/tools/git/git-diff-ide.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" + Invokes git diff [args...] and inserts file:line in front of each line of diff + output where possible. + + This is useful from an IDE that allows you to double-click lines that begin + with file:line to open and jump to that point in the file. + +Synopsis: + %prog [git diff args...] + +Examples: + %prog + %prog HEAD +""" + +import subprocess +import sys + + +def GitShell(args, ignore_return=False): + """A shell invocation suitable for communicating with git. Returns + output as list of lines, raises exception on error. + """ + job = subprocess.Popen(args, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + (out, err) = job.communicate() + if job.returncode != 0 and not ignore_return: + print out + raise Exception("Error %d running command %s" % ( + job.returncode, args)) + return out.split('\n') + + +def PrintGitDiff(extra_args): + """Outputs git diff extra_args with file:line inserted into relevant lines.""" + current_file = ''; + line_num = 0; + lines = GitShell('git diff %s' % ' '.join(extra_args)) + for line in lines: + # Pass-through lines: + # diff --git a/file.c b/file.c + # index 0e38c2d..8cd69ae 100644 + # --- a/file.c + if (line.startswith('diff ') or + line.startswith('index ') or + line.startswith('--- ')): + print line + continue + + # Get the filename from the +++ line: + # +++ b/file.c + if line.startswith('+++ '): + # Filename might be /dev/null or a/file or b/file. + # Skip the first two characters unless it starts with /. + current_file = line[4:] if line[4] == '/' else line[6:] + print line + continue + + # Update line number from the @@ lines: + # @@ -41,9 +41,9 @@ def MyFunc(): + # ^^ + if line.startswith('@@ '): + _, old_nr, new_nr, _ = line.split(' ', 3) + line_num = int(new_nr.split(',')[0]) + print line + continue + print current_file + ':' + repr(line_num) + ':' + line + + # Increment line number for lines that start with ' ' or '+': + # @@ -41,4 +41,4 @@ def MyFunc(): + # file.c:41: // existing code + # file.c:42: // existing code + # file.c:43:-// deleted code + # file.c:43:-// deleted code + # file.c:43:+// inserted code + # file.c:44:+// inserted code + if line.startswith(' ') or line.startswith('+'): + line_num += 1 + + +def main(): + PrintGitDiff(sys.argv[1:]) + + +if __name__ == '__main__': + main() |