From 42ff0aa076c79c1632441425d63368d8af879fce Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio Date: Tue, 9 Apr 2024 12:31:00 +0200 Subject: [PATCH v5] 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 makes a few small changes to our .gitattributes file, so we don't regress on the behaviour of our previous .editorconfig file. It also includes the newly generated .editorconfig file. --- .editorconfig | 138 +++++++++++++++++++++++++++-- .gitattributes | 6 +- src/tools/generate_editorconfig.py | 80 +++++++++++++++++ 3 files changed, 217 insertions(+), 7 deletions(-) create mode 100755 src/tools/generate_editorconfig.py diff --git a/.editorconfig b/.editorconfig index d69a3d1dc4e..32db5848926 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,14 +1,142 @@ 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 = 8 + +[*.[chly]] +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 = unset +tab_width = 4 + +[*.pm] +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = unset tab_width = 4 -[*.{sgml,xml}] +[*.po] +trim_trailing_whitespace = true +insert_final_newline = unset +indent_style = space +tab_width = 8 + +[*.sgml] +trim_trailing_whitespace = true +insert_final_newline = true indent_style = space -indent_size = 1 +tab_width = 1 + +[*.xml] +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +tab_width = 1 [*.xsl] +trim_trailing_whitespace = true +insert_final_newline = true indent_style = space -indent_size = 2 +tab_width = 2 + +[*.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 = 8 + +[src/backend/catalog/sql_features.txt] +trim_trailing_whitespace = unset +insert_final_newline = true +indent_style = unset +tab_width = 8 + +[*.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/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/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 + +# 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). +[*.{pl,pm}] +indent_style = tab diff --git a/.gitattributes b/.gitattributes index e9ff4a56bd2..65093d0e404 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,12 @@ +# 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 *.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 -*.sgml whitespace=space-before-tab,trailing-space,tab-in-indent -*.x[ms]l whitespace=space-before-tab,trailing-space,tab-in-indent +*.sgml whitespace=space-before-tab,trailing-space,tab-in-indent,tabwidth=1 +*.xml whitespace=space-before-tab,trailing-space,tab-in-indent,tabwidth=1 +*.xsl whitespace=space-before-tab,trailing-space,tab-in-indent,tabwidth=2 # Avoid confusing ASCII underlines with leftover merge conflict markers README conflict-marker-size=32 diff --git a/src/tools/generate_editorconfig.py b/src/tools/generate_editorconfig.py new file mode 100755 index 00000000000..2d4fd689155 --- /dev/null +++ b/src/tools/generate_editorconfig.py @@ -0,0 +1,80 @@ +#!/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) + +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"] + else: + rules += ["indent_style = unset"] + + tab_width = '8' + for rule in git_whitespace_rules: + if rule.startswith('tabwidth='): + tab_width = rule.replace('tabwidth=', '') + rules += [f'tab_width = {tab_width}'] + + else: + continue + + rules = '\n'.join(rules) + new_contents += f"\n[{name}]\n{rules}\n" + + new_contents += """ +# 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). +[*.{pl,pm}] +indent_style = tab +""" + + with open(".editorconfig", "w") as f: + f.write(new_contents) + + + + +if __name__ == "__main__": + main() base-commit: 43a9cab4844b9c933f1a24e24a38311ee24deefd -- 2.34.1