lint-hunks: support operating on arbirary revs

Rather than diffing only the index, support checking arbitrary commits.

Change-Id: Ia135a487990d8293d1e0799dc062b9f49e020b25
diff --git a/tools/lint-hunks.py b/tools/lint-hunks.py
index 87c7b03..c14caec 100755
--- a/tools/lint-hunks.py
+++ b/tools/lint-hunks.py
@@ -21,7 +21,8 @@
 LONG_OPTIONS = ["help"]
 
 TOPLEVEL_CMD = ["git", "rev-parse", "--show-toplevel"]
-DIFF_CMD = ["git", "diff-index", "-u", "--cached", "HEAD", "--"]
+DIFF_CMD = ["git", "diff"]
+DIFF_INDEX_CMD = ["git", "diff-index", "-u", "--cached", "HEAD", "--"]
 SHOW_CMD = ["git", "show"]
 CPPLINT_FILTERS = ["-readability/casting", "-runtime/int"]
 
@@ -61,7 +62,7 @@
         argv = sys.argv
     try:
         try:
-            opts, _ = getopt.getopt(argv[1:], SHORT_OPTIONS, LONG_OPTIONS)
+            opts, args = getopt.getopt(argv[1:], SHORT_OPTIONS, LONG_OPTIONS)
         except getopt.error, msg:
             raise Usage(msg)
 
@@ -71,10 +72,20 @@
                 print __doc__
                 sys.exit(0)
 
+        if args and len(args) > 1:
+            print __doc__
+            sys.exit(0)
+
         # Find the fully qualified path to the root of the tree
         tl = Subprocess(TOPLEVEL_CMD, stdout=subprocess.PIPE)
         tl = tl.communicate()[0].strip()
 
+        # See if we're working on the index or not.
+        if args:
+            diff_cmd = DIFF_CMD + [args[0] + "^!"]
+        else:
+            diff_cmd = DIFF_INDEX_CMD
+
         # Build the command line to execute cpplint
         cpplint_cmd = [os.path.join(tl, "tools", "cpplint.py"),
                        "--filter=" + ",".join(CPPLINT_FILTERS),
@@ -82,7 +93,7 @@
 
         # Get a list of all affected lines
         file_affected_line_map = {}
-        p = Subprocess(DIFF_CMD, stdout=subprocess.PIPE)
+        p = Subprocess(diff_cmd, stdout=subprocess.PIPE)
         stdout = p.communicate()[0]
         for hunk in diff.ParseDiffHunks(StringIO.StringIO(stdout)):
             filename = hunk.right.filename[2:]