Files
tamabox/dev/gofmt_keep_crlf.py

64 lines
1.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# dev/gofmt_keep_crlf.py
#
# 运行 gofmt -w,但保留文件原始行尾(CRLF / LF),避免 gofmt 把 CRLF 文件整文件
# 重写成 LF 造成的万行级 diff 污染。
#
# 用法:
# python dev/gofmt_keep_crlf.py <file1> [file2 ...]
# git diff --name-only | grep '\.go$' | xargs python dev/gofmt_keep_crlf.py
#
# 实现要点:先把源文件按 LF 写入临时副本交给 gofmt,gofmt 输出也是 LF;
# 若原文件是 CRLF,再把输出整体换回 CRLF 写回,从而只保留真实的格式化改动。
import os
import sys
import subprocess
GOFMT = r"C:/Program Files/Go/bin/gofmt"
def fmt_one(path):
with open(path, "rb") as f:
data = f.read()
crlf = b"\r\n" in data
tmp = path + ".gofmt.tmp"
with open(tmp, "wb") as f:
f.write(data.replace(b"\r\n", b"\n"))
try:
r = subprocess.run([GOFMT, "-w", tmp], capture_output=True)
if r.returncode != 0:
sys.stderr.write(
"gofmt FAILED on %s:\n%s\n" % (path, r.stderr.decode("utf-8", "replace"))
)
return False
with open(tmp, "rb") as f:
out = f.read()
finally:
try:
os.remove(tmp)
except OSError:
pass
if crlf:
out = out.replace(b"\r\n", b"\n").replace(b"\n", b"\r\n")
with open(path, "wb") as f:
f.write(out)
return True
def main():
files = [a for a in sys.argv[1:] if a.strip()]
if not files:
sys.stderr.write("usage: gofmt_keep_crlf.py <file> [file ...]\n")
return 2
ok = True
for p in files:
if not fmt_one(p):
ok = False
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())