r187592 - Simplify git-clang-format by using new -lines option.

Daniel Jasper djasper at google.com
Thu Aug 1 11:17:14 PDT 2013


Author: djasper
Date: Thu Aug  1 13:17:13 2013
New Revision: 187592

URL: http://llvm.org/viewvc/llvm-project?rev=187592&view=rev
Log:
Simplify git-clang-format by using new -lines option.

Patch by Mark Lodato. Thank you!

Modified:
    cfe/trunk/tools/clang-format/git-clang-format

Modified: cfe/trunk/tools/clang-format/git-clang-format
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-format/git-clang-format?rev=187592&r1=187591&r2=187592&view=diff
==============================================================================
--- cfe/trunk/tools/clang-format/git-clang-format (original)
+++ cfe/trunk/tools/clang-format/git-clang-format Thu Aug  1 13:17:13 2013
@@ -137,9 +137,8 @@ def main():
   # The computed diff outputs absolute paths, so we must cd before accessing
   # those files.
   cd_to_toplevel()
-  changed_bytes = lines_to_bytes(changed_lines)
-  old_tree = create_tree_from_workdir(changed_bytes)
-  new_tree = run_clang_format_and_save_to_tree(changed_bytes,
+  old_tree = create_tree_from_workdir(changed_lines)
+  new_tree = run_clang_format_and_save_to_tree(changed_lines,
                                                binary=opts.binary,
                                                style=opts.style)
   if opts.verbose >= 1:
@@ -267,6 +266,9 @@ def compute_diff(commit, files):
 def extract_lines(patch_file):
   """Extract the changed lines in `patch_file`.
 
+  The return value is a dictionary mapping filename to a list of (start_line,
+  line_count) pairs.
+
   The input must have been produced with ``-U0``, meaning unidiff format with
   zero lines of context.  The return value is a dict mapping filename to a
   list of line `Range`s."""
@@ -304,41 +306,6 @@ def cd_to_toplevel():
   os.chdir(toplevel)
 
 
-def lines_to_bytes(changed_lines):
-  """Convert the mapping of changed line ranges to changed byte ranges.
-
-  This function opens each file to compute the byte ranges."""
-  changed_bytes = {}
-  for filename, line_ranges in changed_lines.iteritems():
-    with open(filename) as f:
-      changed_bytes[filename] = lines_to_bytes_single_file(f, line_ranges)
-  return changed_bytes
-
-
-def lines_to_bytes_single_file(file, line_ranges):
-  byte_ranges = []
-  line_ranges_iter = iter(line_ranges + [None])
-  r = next(line_ranges_iter)
-  linenum = 1
-  byte_idx = 0
-  byte_start = None
-  byte_count = None
-  for line in file:
-    if r is None:
-      break
-    if linenum == r.start:
-      byte_start = byte_idx
-    if linenum == r.start + r.count:
-      byte_ranges.append(Range(byte_start, byte_idx - byte_start - 1))
-      r = next(line_ranges_iter)
-    linenum += 1
-    byte_idx += len(line)
-  if r is not None:
-    # FIXME: Detect and warn if line ranges go past the end of file?
-    byte_ranges.append(Range(byte_start, byte_idx - byte_start - 1))
-  return byte_ranges
-
-
 def create_tree_from_workdir(filenames):
   """Create a new git tree with the given files from the working directory.
 
@@ -346,15 +313,15 @@ def create_tree_from_workdir(filenames):
   return create_tree(filenames, '--stdin')
 
 
-def run_clang_format_and_save_to_tree(changed_bytes, binary='clang-format',
+def run_clang_format_and_save_to_tree(changed_lines, binary='clang-format',
                                       style=None):
   """Run clang-format on each file and save the result to a git tree.
 
   Returns the object ID (SHA-1) of the created tree."""
   def index_info_generator():
-    for filename, byte_ranges in changed_bytes.iteritems():
+    for filename, line_ranges in changed_lines.iteritems():
       mode = oct(os.stat(filename).st_mode)
-      blob_id = clang_format_to_blob(filename, byte_ranges, binary=binary,
+      blob_id = clang_format_to_blob(filename, line_ranges, binary=binary,
                                      style=style)
       yield '%s %s\t%s' % (mode, blob_id, filename)
   return create_tree(index_info_generator(), '--index-info')
@@ -380,7 +347,7 @@ def create_tree(input_lines, mode):
     return tree_id
 
 
-def clang_format_to_blob(filename, byte_ranges, binary='clang-format',
+def clang_format_to_blob(filename, line_ranges, binary='clang-format',
                          style=None):
   """Run clang-format on the given file and save the result to a git blob.
 
@@ -388,8 +355,9 @@ def clang_format_to_blob(filename, byte_
   clang_format_cmd = [binary, filename]
   if style:
     clang_format_cmd.extend(['-style='+style])
-  for offset, length in byte_ranges:
-    clang_format_cmd.extend(['-offset='+str(offset), '-length='+str(length)])
+  clang_format_cmd.extend([
+      '-lines=%s:%s' % (start_line, start_line+line_count-1)
+      for start_line, line_count in line_ranges])
   try:
     clang_format = subprocess.Popen(clang_format_cmd, stdin=subprocess.PIPE,
                                     stdout=subprocess.PIPE)





More information about the cfe-commits mailing list