1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# SPDX-License-Identifier: GPL-2.0-or-later
# check that the first header included in C files is either
# zebra.h or config.h
#
# Copyright (C) 2020 David Lamparter for NetDEF, Inc.
import sys
import os
import re
import subprocess
import argparse
argp = argparse.ArgumentParser(description="include fixer")
argp.add_argument("--autofix", action="store_const", const=True)
argp.add_argument("--warn-empty", action="store_const", const=True)
argp.add_argument("--pipe", action="store_const", const=True)
include_re = re.compile('^#\s*include\s+["<]([^ ">]+)[">]', re.M)
ignore = [
lambda fn: fn.startswith("tools/"),
lambda fn: fn
in [
"lib/elf_py.c",
],
]
def run(args):
out = []
files = subprocess.check_output(["git", "ls-files"]).decode("ASCII")
for fn in files.splitlines():
if not fn.endswith(".c"):
continue
if max([i(fn) for i in ignore]):
continue
with open(fn, "r") as fd:
data = fd.read()
m = include_re.search(data)
if m is None:
if args.warn_empty:
sys.stderr.write("no #include in %s?\n" % (fn))
continue
if m.group(1) in ["config.h", "zebra.h", "lib/zebra.h"]:
continue
if args.autofix:
sys.stderr.write("%s: %s - fixing\n" % (fn, m.group(0)))
if fn.startswith("pceplib/"):
insert = '#ifdef HAVE_CONFIG_H\n#include "config.h"\n#endif\n\n'
else:
insert = "#include <zebra.h>\n\n"
pos = m.span()[0]
data = data[:pos] + insert + data[pos:]
with open(fn + ".new", "w") as fd:
fd.write(data)
os.rename(fn + ".new", fn)
else:
sys.stderr.write("%s: %s\n" % (fn, m.group(0)))
out.append(fn)
if len(out):
if args.pipe:
# for "vim `firstheader.py`"
print("\n".join(out))
return 1
return 0
if __name__ == "__main__":
args = argp.parse_args()
sys.exit(run(args))
|