forked from darktable-org/darktable
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate_modelines.py
executable file
·106 lines (92 loc) · 2.74 KB
/
update_modelines.py
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/python
import re
import sys
from enum import Enum
import shlex
import subprocess
CLANG_OFF='// clang-format off\n'
NOTIFICATION_LINE='// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py\n'
VIM_MODELINE='// vim: shiftwidth=2 expandtab tabstop=2 cindent\n'
KATE_MODELINE='// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;\n'
CLANG_ON='// clang-format on\n'
class estate(Enum):
none=1
start=2
inside=3
end=4
class modelines_updater_t:
def __init__(self, filename):
self.filename = filename
self.state = estate.none
self.begin = -1
self.end = -1
self.lines = []
def load_lines(self):
with open(self.filename,'r') as file:
self.lines = file.readlines()
def process_line(self, line, lineno):
if(self.state == estate.none):
if(line.startswith(CLANG_OFF)):
self.state=estate.start
return
elif(self.state == estate.start):
if(line.startswith('// modelines:')):
self.state=estate.inside
self.begin = lineno-1
else:
self.state=estate.none
return
elif(self.state == estate.inside):
if(line.startswith(CLANG_ON)):
self.state=estate.end
self.end = lineno
return
elif(self.state == estate.end):
if(not line.strip()):
self.end = lineno
else:
self.state=estate.none
return
def remove_lines(self):
with open(self.filename,'w') as file:
for lineno,line in enumerate(self.lines):
if((lineno >= self.begin) and (lineno <= self.end)):
continue
if(line.startswith('// modelines')):
continue
if(line.startswith('// vim')):
continue
if(line.startswith('// kate')):
continue
file.write(line)
def write_file(self):
with open(self.filename,'a') as file:
file.write(CLANG_OFF)
file.write(NOTIFICATION_LINE)
file.write(VIM_MODELINE)
file.write(KATE_MODELINE)
file.write(CLANG_ON)
def update(self):
print('parsing {}'.format(self.filename));
self.load_lines()
for lineno,line in enumerate(self.lines):
self.process_line(line, lineno)
if((self.begin == -1) != (self.end == -1)):
raise RuntimeError("parsing error")
print('removing old modelines')
self.remove_lines()
print('writing file')
self.write_file()
if __name__ == "__main__":
files = []
args = shlex.split('sh -c \'find src/ -name "*.c" -or -name "*.cc" -or -name "*.h" | grep -v src/external\'')
ret = subprocess.run(args,capture_output=True)
if ret.returncode != 0:
print(ret.stderr.decode(sys.stderr.encoding))
raise RuntimeError("error listing files")
files = ret.stdout.decode(sys.stdout.encoding).split('\n')
for file in files:
if (not file.strip()):
continue
updater = modelines_updater_t(file.strip())
updater.update()