summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2025-02-01 09:01:16 +0000
committerPeter Eisentraut2025-02-01 09:09:45 +0000
commit2452e71ff2fe642ff35535d48a728aeca2d61a8d (patch)
tree55b9dad9161b96873f8e8d4009802ad065db1af0
parent79e872fedb4d2f73baa0a80ba572480774edc61b (diff)
Add script to keep .editorconfig in sync with .gitattributes
Our repo already contained an .editorconfig file, but it was not kept up to date with .gitattributes. This adds a script that keeps these files in sync. A big advantage of the editorconfig file is that it many editors/IDEs get automatically configured to trim trailing newlines and add a final newline on save, while .gitattributes only complains about these problems instead of automatically fixing them. This also adds rules to .gitattributes for Python files as well as for C files in pg_bsd_indent directory (which have a different tab_width than most C files due to being vendored in). Author: Jelte Fennema-Nio <github-tech@jeltef.nl> Discussion: https://www.postgresql.org/message-id/flat/CAGECzQQGzbroAXi+Yicp3HvcCo4=g84kaOgjuvQ5MW9F0ubOGg@mail.gmail.com
-rw-r--r--.editorconfig170
-rw-r--r--.gitattributes7
-rwxr-xr-xsrc/tools/generate_editorconfig.py94
3 files changed, 266 insertions, 5 deletions
diff --git a/.editorconfig b/.editorconfig
index d69a3d1dc4e..e20d15d4533 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,14 +1,176 @@
root = true
-[*.{c,h,l,y,pl,pm}]
-indent_style = tab
+[*]
indent_size = tab
+
+[*]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = unset
+tab_width = unset
+
+[*.[chly]]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
+tab_width = 4
+
+[*.cpp]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
+tab_width = 4
+
+[*.pl]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
tab_width = 4
-[*.{sgml,xml}]
+[*.pm]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
+tab_width = 4
+
+[*.po]
+trim_trailing_whitespace = true
+insert_final_newline = unset
+indent_style = space
+tab_width = unset
+
+[*.py]
+trim_trailing_whitespace = true
+insert_final_newline = true
indent_style = space
+tab_width = unset
+indent_size = 4
+
+[*.sgml]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+tab_width = unset
indent_size = 1
-[*.xsl]
+[*.xml]
+trim_trailing_whitespace = true
+insert_final_newline = true
indent_style = space
+tab_width = unset
indent_size = 2
+
+[*.xsl]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+tab_width = unset
+indent_size = 1
+
+[*.data]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[contrib/pgcrypto/sql/pgp-armor.sql]
+trim_trailing_whitespace = unset
+insert_final_newline = true
+indent_style = unset
+tab_width = unset
+
+[src/backend/catalog/sql_features.txt]
+trim_trailing_whitespace = unset
+insert_final_newline = true
+indent_style = unset
+tab_width = unset
+
+[*.out]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/interfaces/ecpg/test/expected/*]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[configure]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[ppport.h]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/backend/jit/llvm/SectionMemoryManager.cpp]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/backend/jit/llvm/SectionMemoryManager.LICENSE]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/backend/regex/COPYRIGHT]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/backend/snowball/libstemmer/*.c]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/backend/utils/mb/Unicode/*-std.txt]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/include/jit/SectionMemoryManager.h]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/include/snowball/libstemmer/*]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/timezone/data/*]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/tools/pg_bsd_indent/*]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/tools/pg_bsd_indent/tests/*]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+
+[src/tools/pg_bsd_indent/*.[ch]]
+trim_trailing_whitespace = unset
+insert_final_newline = unset
+indent_style = unset
+tab_width = 8
diff --git a/.gitattributes b/.gitattributes
index d33e5ef0941..8df6b75e653 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,11 +1,15 @@
+# IMPORTANT: After updating this file, also run src/tools/generate_editorconfig.py
+
* whitespace=space-before-tab,trailing-space
*.[chly] whitespace=space-before-tab,trailing-space,indent-with-non-tab,tabwidth=4
*.cpp whitespace=space-before-tab,trailing-space,indent-with-non-tab,tabwidth=4
*.pl whitespace=space-before-tab,trailing-space,tabwidth=4
*.pm whitespace=space-before-tab,trailing-space,tabwidth=4
*.po whitespace=space-before-tab,trailing-space,tab-in-indent,-blank-at-eof
+*.py whitespace=space-before-tab,trailing-space,tab-in-indent
*.sgml whitespace=space-before-tab,trailing-space,tab-in-indent
-*.x[ms]l whitespace=space-before-tab,trailing-space,tab-in-indent
+*.xml whitespace=space-before-tab,trailing-space,tab-in-indent
+*.xsl whitespace=space-before-tab,trailing-space,tab-in-indent
# Avoid confusing ASCII underlines with leftover merge conflict markers
README conflict-marker-size=32
@@ -33,3 +37,4 @@ src/include/snowball/libstemmer/* -whitespace
src/timezone/data/* -whitespace
src/tools/pg_bsd_indent/* -whitespace
src/tools/pg_bsd_indent/tests/* -whitespace
+src/tools/pg_bsd_indent/*.[ch] whitespace=-blank-at-eol,-blank-at-eof,tabwidth=8
diff --git a/src/tools/generate_editorconfig.py b/src/tools/generate_editorconfig.py
new file mode 100755
index 00000000000..0ce54f7292a
--- /dev/null
+++ b/src/tools/generate_editorconfig.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python3
+
+import os
+
+
+def cd_to_repo_root():
+ abspath = os.path.abspath(__file__)
+ dname = os.path.join(os.path.dirname(abspath), "..", "..")
+ os.chdir(dname)
+
+
+# Space based indentation levels are not tracked in .gitattributes, so
+# we hardcode them here for the relevant filetypes.
+space_based_indent_sizes = {
+ "*.py": 4,
+ "*.sgml": 1,
+ "*.xsl": 1,
+ "*.xml": 2,
+}
+
+
+def main():
+ cd_to_repo_root()
+
+ with open(".gitattributes", "r") as f:
+ lines = f.read().splitlines()
+
+ new_contents = """root = true
+
+[*]
+indent_size = tab
+"""
+
+ for line in lines:
+ if line.startswith("#") or len(line) == 0:
+ continue
+ name, git_rules = line.split()
+ if git_rules == "-whitespace":
+ rules = [
+ "indent_style = unset",
+ "indent_size = unset",
+ "trim_trailing_whitespace = unset",
+ "insert_final_newline = unset",
+ ]
+ elif git_rules.startswith("whitespace="):
+ git_whitespace_rules = git_rules.replace("whitespace=", "").split(",")
+ rules = []
+ if "-blank-at-eol" in git_whitespace_rules:
+ rules += ["trim_trailing_whitespace = unset"]
+ else:
+ rules += ["trim_trailing_whitespace = true"]
+
+ if "-blank-at-eof" in git_whitespace_rules:
+ rules += ["insert_final_newline = unset"]
+ else:
+ rules += ["insert_final_newline = true"]
+
+ if "tab-in-indent" in git_whitespace_rules:
+ rules += ["indent_style = space"]
+ elif "indent-with-non-tab" in git_whitespace_rules:
+ rules += ["indent_style = tab"]
+ elif name in ["*.pl", "*.pm"]:
+ # We want editors to use tabs for indenting Perl
+ # files, but we cannot add it such a rule to
+ # .gitattributes, because certain lines are still
+ # indented with spaces (e.g. SYNOPSIS blocks). So we
+ # hardcode the rule here.
+
+ rules += ["indent_style = tab"]
+ else:
+ rules += ["indent_style = unset"]
+
+ tab_width = "unset"
+ for rule in git_whitespace_rules:
+ if rule.startswith("tabwidth="):
+ tab_width = rule.replace("tabwidth=", "")
+ rules += [f"tab_width = {tab_width}"]
+
+ if name in space_based_indent_sizes:
+ indent_size = space_based_indent_sizes[name]
+ rules += [f"indent_size = {indent_size}"]
+
+ else:
+ continue
+
+ rules = "\n".join(rules)
+ new_contents += f"\n[{name}]\n{rules}\n"
+
+ with open(".editorconfig", "w") as f:
+ f.write(new_contents)
+
+
+if __name__ == "__main__":
+ main()