Delete fix_tabs.h
This commit is contained in:
@@ -1,83 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
fix_tabs.py
|
|
||||||
|
|
||||||
Replaces all tab characters (\t) in tracked text files with two spaces.
|
|
||||||
|
|
||||||
Behavior
|
|
||||||
- Operates only on Git-tracked files.
|
|
||||||
- Skips binary files automatically via Git attributes.
|
|
||||||
- Modifies files in place.
|
|
||||||
- Intended for CI and local formatting enforcement.
|
|
||||||
|
|
||||||
Exit codes
|
|
||||||
- 0: Success, no errors
|
|
||||||
- 1: One or more files failed processing
|
|
||||||
"""
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
REPLACEMENT = " " # two spaces
|
|
||||||
|
|
||||||
|
|
||||||
def get_tracked_files():
|
|
||||||
try:
|
|
||||||
result = subprocess.run(
|
|
||||||
["git", "ls-files"],
|
|
||||||
check=True,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.PIPE,
|
|
||||||
text=True,
|
|
||||||
)
|
|
||||||
return [Path(p) for p in result.stdout.splitlines() if p.strip()]
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print("Error: unable to list git-tracked files", file=sys.stderr)
|
|
||||||
print(e.stderr, file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def is_binary(path: Path) -> bool:
|
|
||||||
try:
|
|
||||||
with path.open("rb") as f:
|
|
||||||
chunk = f.read(1024)
|
|
||||||
return b"\0" in chunk
|
|
||||||
except Exception:
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def process_file(path: Path) -> bool:
|
|
||||||
try:
|
|
||||||
if is_binary(path):
|
|
||||||
return True
|
|
||||||
|
|
||||||
content = path.read_text(encoding="utf-8", errors="strict")
|
|
||||||
|
|
||||||
if "\t" not in content:
|
|
||||||
return True
|
|
||||||
|
|
||||||
updated = content.replace("\t", REPLACEMENT)
|
|
||||||
path.write_text(updated, encoding="utf-8")
|
|
||||||
print(f"Normalized tabs: {path}")
|
|
||||||
return True
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
# Non-UTF8 text file, skip safely
|
|
||||||
return True
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Failed processing {path}: {e}", file=sys.stderr)
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
|
||||||
failures = False
|
|
||||||
|
|
||||||
for file_path in get_tracked_files():
|
|
||||||
if not process_file(file_path):
|
|
||||||
failures = True
|
|
||||||
|
|
||||||
return 1 if failures else 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
Reference in New Issue
Block a user