https://github.com/eoineoineoin updated 
https://github.com/llvm/llvm-project/pull/204336

>From 6e3b1a76f578b4e4dfe09b813d921fbe47b01b21 Mon Sep 17 00:00:00 2001
From: Eoin Mcloughlin <[email protected]>
Date: Wed, 17 Jun 2026 11:48:32 +0100
Subject: [PATCH 1/2] Add --whole-file option to git-clang-format

---
 clang/tools/clang-format/git-clang-format | 25 +++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/clang/tools/clang-format/git-clang-format 
b/clang/tools/clang-format/git-clang-format
index d79b57e7f6e10..f630cd4f8f28c 100755
--- a/clang/tools/clang-format/git-clang-format
+++ b/clang/tools/clang-format/git-clang-format
@@ -190,6 +190,11 @@ def main():
         action="store_true",
         help="format lines in the stage instead of the working dir",
     )
+    p.add_argument(
+        "--whole-file",
+        action="store_true",
+        help="format whole file instead of only modified lines",
+    )
     p.add_argument(
         "--style",
         default=config.get("clangformat.style", None),
@@ -256,7 +261,7 @@ def main():
         opts.binary = os.path.abspath(opts.binary)
 
     changed_lines = compute_diff_and_extract_lines(
-        commits, files, opts.staged, opts.diff_from_common_commit
+        commits, files, opts.staged, opts.whole_file, 
opts.diff_from_common_commit
     )
     if opts.verbose >= 1:
         ignored_files = set(changed_lines)
@@ -410,10 +415,10 @@ def get_object_type(value):
     return convert_string(stdout.strip())
 
 
-def compute_diff_and_extract_lines(commits, files, staged, diff_common_commit):
+def compute_diff_and_extract_lines(commits, files, staged, whole_file, 
diff_common_commit):
     """Calls compute_diff() followed by extract_lines()."""
     diff_process = compute_diff(commits, files, staged, diff_common_commit)
-    changed_lines = extract_lines(diff_process.stdout)
+    changed_lines = extract_lines(diff_process.stdout, whole_file)
     diff_process.stdout.close()
     diff_process.wait()
     if diff_process.returncode != 0:
@@ -446,7 +451,7 @@ def compute_diff(commits, files, staged, 
diff_common_commit):
     return p
 
 
-def extract_lines(patch_file):
+def extract_lines(patch_file, whole_file):
     """Extract the changed lines in `patch_file`.
 
     The return value is a dictionary mapping filename to a list of (start_line,
@@ -456,11 +461,23 @@ def extract_lines(patch_file):
     zero lines of context.  The return value is a dict mapping filename to a
     list of line `Range`s."""
     matches = {}
+
+    if whole_file:
+        # Find the repository root, in case this is run in a subdirectory
+        cmd = ['git', 'rev-parse', '--show-toplevel']
+        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+        repo_root = convert_string(p.stdout.read()).strip()
+
     for line in patch_file:
         line = convert_string(line)
         match = re.search(r"^\+\+\+\ [^/]+/(.*)", line)
         if match:
             filename = match.group(1).rstrip("\r\n\t")
+            if whole_file and filename not in matches:
+                full_path = os.path.join(repo_root, filename)
+                num_lines = sum(1 for _ in open(full_path))
+                matches.setdefault(filename, []).append(Range(1, num_lines))
+                continue
         match = re.search(r"^@@ -[0-9,]+ \+(\d+)(,(\d+))?", line)
         if match:
             start_line = int(match.group(1))

>From ae17aaac4a4ebc9b665947d2c254a3b074eb4752 Mon Sep 17 00:00:00 2001
From: Eoin Mcloughlin <[email protected]>
Date: Wed, 24 Jun 2026 09:15:20 +0100
Subject: [PATCH 2/2] Avoid any filtering or file start/end calculation

---
 clang/tools/clang-format/git-clang-format | 38 ++++++++++-------------
 1 file changed, 17 insertions(+), 21 deletions(-)

diff --git a/clang/tools/clang-format/git-clang-format 
b/clang/tools/clang-format/git-clang-format
index f630cd4f8f28c..cc2bf0607dc84 100755
--- a/clang/tools/clang-format/git-clang-format
+++ b/clang/tools/clang-format/git-clang-format
@@ -415,7 +415,9 @@ def get_object_type(value):
     return convert_string(stdout.strip())
 
 
-def compute_diff_and_extract_lines(commits, files, staged, whole_file, 
diff_common_commit):
+def compute_diff_and_extract_lines(
+    commits, files, staged, whole_file, diff_common_commit
+):
     """Calls compute_diff() followed by extract_lines()."""
     diff_process = compute_diff(commits, files, staged, diff_common_commit)
     changed_lines = extract_lines(diff_process.stdout, whole_file)
@@ -461,34 +463,28 @@ def extract_lines(patch_file, whole_file):
     zero lines of context.  The return value is a dict mapping filename to a
     list of line `Range`s."""
     matches = {}
-
-    if whole_file:
-        # Find the repository root, in case this is run in a subdirectory
-        cmd = ['git', 'rev-parse', '--show-toplevel']
-        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-        repo_root = convert_string(p.stdout.read()).strip()
-
     for line in patch_file:
         line = convert_string(line)
         match = re.search(r"^\+\+\+\ [^/]+/(.*)", line)
         if match:
             filename = match.group(1).rstrip("\r\n\t")
             if whole_file and filename not in matches:
-                full_path = os.path.join(repo_root, filename)
-                num_lines = sum(1 for _ in open(full_path))
-                matches.setdefault(filename, []).append(Range(1, num_lines))
+                # Initialize the key for filename but ensure ranges is an empty
+                # list. This will prevent any filtering in 
clang_format_to_blob().
+                matches[filename] = []
                 continue
-        match = re.search(r"^@@ -[0-9,]+ \+(\d+)(,(\d+))?", line)
-        if match:
-            start_line = int(match.group(1))
-            line_count = 1
-            if match.group(3):
-                line_count = int(match.group(3))
-            if line_count == 0:
+        if not whole_file:
+            match = re.search(r"^@@ -[0-9,]+ \+(\d+)(,(\d+))?", line)
+            if match:
+                start_line = int(match.group(1))
                 line_count = 1
-            if start_line == 0:
-                continue
-            matches.setdefault(filename, []).append(Range(start_line, 
line_count))
+                if match.group(3):
+                    line_count = int(match.group(3))
+                if line_count == 0:
+                    line_count = 1
+                if start_line == 0:
+                    continue
+                matches.setdefault(filename, []).append(Range(start_line, 
line_count))
     return matches
 
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to