#!/usr/bin/env python3 """ easy command line to run against all citus-style checked files: $ git ls-files \ | git check-attr --stdin citus-style \ | grep 'citus-style: set' \ | awk '{print $1}' \ | cut -d':' -f1 \ | xargs -n1 ./ci/include-grouping.py """ import os import sys def main(args): if len(args) < 2: print("Usage: include-grouping.py ") return file = args[1] if not os.path.isfile(file): print("File does not exist", file=sys.stderr) return sys.exit(1) with open(file, "r") as f: with open(file + ".tmp", "w") as out_file: lines = f.readlines() includes = [] skipped_lines = [] for line in lines: if line.startswith("#include"): includes.append(line) skipped_lines = [] else: if len(includes) > 0: # regroup all includes by skipping all empty lines while scanning if len(line.strip()) == 0: skipped_lines.append(line) continue print_sorted_includes(includes, file=out_file) includes = [] # print skipped lines for skipped_line in skipped_lines: print(skipped_line, end="", file=out_file) skipped_lines = [] print(line, end="", file=out_file) # move out_file to file os.rename(file + ".tmp", file) pass def print_sorted_includes(includes, file=sys.stdout): default_group_key = 1 groups = {} matches = [ { "name": "system includes", "matcher": lambda x: x.startswith("<"), "group_key": -2, "priority": 0, }, { "name": "toplevel postgres includes", "matcher": lambda x: "/" not in x, "group_key": 0, "priority": 9, }, { "name": "postgres.h", "list": ['"postgres.h"'], "group_key": -1, "priority": -1, }, { "name": "toplevel citus inlcudes", "list": [ '"citus_version.h"', '"pg_version_compat.h"', '"pg_version_constants.h"', ], "group_key": 3, "priority": 0, }, { "name": "columnar includes", "matcher": lambda x: x.startswith('"columnar/'), "group_key": 4, "priority": 1, }, { "name": "distributed includes", "matcher": lambda x: x.startswith('"distributed/'), "group_key": 5, "priority": 1, }, ] matches.sort(key=lambda x: x["priority"]) common_system_include_error_prefixes = ["