diff options
-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() |