lodato added a subscriber: lodato.
lodato added a comment.

Hi lhchavez,

This patch does not work as intended. If I understand correctly, you want to 
see if a given `<commit>` has any clang-format problems. However:

1. This patch only computes `changed_lines` from `<commit>` but then runs 
clang-format on the files in the working directory. Instead, you need to 
somehow update `run_clang_format_and_save_to_tree()` to operate on `<commit>`.

2. Unless `--diff` is given, this new mode writes clang-formatted contents of 
`<commit>` to the working directory, blowing away any changes since then. The 
simple solution is to require `--diff` whenever this new mode is used, since 
it's not obvious what should be written to the working directory.

See also D15465 <https://reviews.llvm.org/D15465>, which had similar problems.

Here is an example showing the problem. The last command should have said that 
aa207 was bad, but since the current working directory is fine, it shows no 
diff.

  $ git log -p --reverse
  commit a2765ba80f03f02aaa0cefbfe705ae844c219065
  Author: ...
  Date:   2016-09-12 16:29:53 -0400
  
      initial commit; x and y bad
  
  diff --git a/foo.cc b/foo.cc
  new file mode 100644
  index 0000000..08422a0
  --- /dev/null
  +++ b/foo.cc
  @@ -0,0 +1,4 @@
  +void foo() {
  +  int x=1;
  +  int y=2;
  +}
  
  commit aa207f7991d26d1ee6826bf272f8eefffdf31b31
  Author: ...
  Date:   2016-09-12 16:30:19 -0400
  
      modify x, still bad
  
  diff --git a/foo.cc b/foo.cc
  index 08422a0..dd75f40 100644
  --- a/foo.cc
  +++ b/foo.cc
  @@ -1,4 +1,4 @@
   void foo() {
  -  int x=1;
  +  int x=3;
     int y=2;
   }
  
  commit 72858d5d2b13ed9dcf6a3328fef43a81ee3f01fc
  Author: ...
  Date:   2016-09-12 16:30:58 -0400
  
      modify both lines, still bad
  
  diff --git a/foo.cc b/foo.cc
  index dd75f40..3eff9ca 100644
  --- a/foo.cc
  +++ b/foo.cc
  @@ -1,4 +1,4 @@
   void foo() {
  -  int x=3;
  -  int y=2;
  +  int x=30;
  +  int y=20;
   }
  
  commit 9e6bfa1b9582b1423efc6d2339e269636fa0718b
  Author: ...
  Date:   2016-09-12 16:32:21 -0400
  
      clang-format
  
  diff --git a/foo.cc b/foo.cc
  index 3eff9ca..ac4d00d 100644
  --- a/foo.cc
  +++ b/foo.cc
  @@ -1,4 +1,4 @@
   void foo() {
  -  int x=30;
  -  int y=20;
  +  int x = 30;
  +  int y = 20;
   }
  $ ~/tmp/git-clang-format --single-commit aa207
  clang-format did not modify any files


================
Comment at: cfe/trunk/tools/clang-format/git-clang-format:93
@@ -92,1 +92,3 @@
                  help='default commit to use if none is specified'),
+  p.add_argument('--single-commit', action='store_true',
+                 help=('run clang-format on a single commit instead of against 
'
----------------
nit: I find this flag confusing since it does not follow any git convention. 
Instead, I suggest making the interface similar to `git diff`: if two 
`<commit>`s are given, take the diff of those two trees to find the list of 
changed lines, then run clang-format on the second commit.

For example:

* `git clang-format --diff HEAD HEAD~` would tell you if HEAD was properly 
clang-formatted or not.
* `git clang-format --diff 8bf003 ae9172` would tell you if any of the lines in 
ae9172 that differ from 8bf003 are not properly clang-formatted.

 operate in this new mode only if two `<commit>`s are given.  Then the 
interface would be, for example, `git clang-format abcd1234 abcd1234~`.

================
Comment at: cfe/trunk/tools/clang-format/git-clang-format:323
@@ -312,1 +322,3 @@
 
+def create_tree_from_commit(commit, filenames):
+  """Create a new git tree with the given files from `commit`.
----------------
Unless I'm mistaken, this function is unnecessary. There is no need to filter 
out files in the tree that do not match the pattern, since the filtering 
happens in `compute_diff()` (`cmd.extend(files)`).


Repository:
  rL LLVM

https://reviews.llvm.org/D24319



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to