v9-0001-Add-script-to-keep-.editorconfig-in-sync-with-.gi.patch
text/x-patch
Filename: v9-0001-Add-script-to-keep-.editorconfig-in-sync-with-.gi.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch v9-0001
Subject: Add script to keep .editorconfig in sync with .gitattributes
| File | + | − |
|---|---|---|
| .editorconfig | 166 | 4 |
| .gitattributes | 5 | 1 |
| src/tools/generate_editorconfig.py | 90 | 0 |
From 04d3176ebdb282662f4b18a2df17d3ad72da5d68 Mon Sep 17 00:00:00 2001
From: Jelte Fennema-Nio <github-tech@jeltef.nl>
Date: Wed, 7 Aug 2024 19:04:05 +0200
Subject: [PATCH v9] 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).
---
.editorconfig | 170 ++++++++++++++++++++++++++++-
.gitattributes | 6 +-
src/tools/generate_editorconfig.py | 90 +++++++++++++++
3 files changed, 261 insertions(+), 5 deletions(-)
create mode 100755 src/tools/generate_editorconfig.py
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..edcee27797f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,11 +1,14 @@
+# 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 +36,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..31285b836c4
--- /dev/null
+++ b/src/tools/generate_editorconfig.py
@@ -0,0 +1,90 @@
+#!/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 hardoced 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()
base-commit: 07f902bd760791527511be9fc47440039bc86b5c
--
2.43.0