14 files = os.popen (
'hg st -nma')
15 return [filename.strip()
for filename
in files]
18 [tmp,pathname] = tempfile.mkstemp()
19 src = open(filename,
'r')
20 dst = open(pathname, 'w')
30 nl_collapse_empty_body=False
41 nl_namespace_brace=Remove
42 nl_after_brace_open=True
43 nl_class_leave_one_liners=False
44 nl_enum_leave_one_liners=False
45 nl_func_leave_one_liners=False
46 nl_if_leave_one_liners=False
48 nl_after_access_spec=1
49 nl_after_semicolon=True
53 nl_class_init_args=Add
56 # does not work very well
57 nl_func_type_name=Ignore
58 nl_func_scope_name=Ignore
59 nl_func_type_name_class=Ignore
60 nl_func_proto_type_name=Ignore
68 mod_full_brace_for=Add
70 mod_full_brace_while=Add
71 mod_full_brace_for=Add
72 mod_remove_extra_semicolon=True
75 #ls_for_split_full=True
76 #ls_func_split_full=True
79 # extra spaces here and there
87 sp_func_class_paren=Add
93 sp_func_proto_paren=Add
95 sp_func_call_paren=Add
96 sp_after_semi_for=Ignore
97 sp_before_sparen=Ignore
100 nl_class_leave_one_liners=True
101 nl_enum_leave_one_liners=True
102 nl_func_leave_one_liners=True
103 nl_assign_leave_one_liners=True
104 #nl_collapse_empty_body=False
105 nl_getset_leave_one_liners=True
106 nl_if_leave_one_liners=True
108 # finally, indentation configuration
110 indent_namespace=false
115 indent_class_colon=True
117 indent_align_assign=False
118 align_left_shift=True
119 # comment reformating disabled
120 cmt_reflow_mode=1 # do not touch comments at all
121 cmt_indent_multi=False # really, do not touch them
123 [tmp,pathname] = tempfile.mkstemp()
124 dst = open(pathname,
'w')
159 f.write(
'-%s\n' % self.
__line)
161 f.write(
'+%s\n' % self.
__line)
163 f.write(
' %s\n' % self.
__line)
165 raise Exception(
'invalid patch')
176 self.__lines.append(line)
190 return len(self.
src())
192 return len(self.
dst())
205 self.__chunks.append(chunk)
216 f.write(
'--- %s\n' % self.__src )
217 f.write(
'+++ %s\n' % self.__dst )
218 for chunk
in self.__chunks:
222 src_file = re.compile(
'^--- (.*)$')
223 dst_file = re.compile(
'^\+\+\+ (.*)$')
224 chunk_start = re.compile(
'^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@')
225 src = re.compile(
'^-(.*)$')
226 dst = re.compile(
'^\+(.*)$')
227 both = re.compile(
'^ (.*)$')
230 for line
in generator:
231 m = src_file.search(line)
233 current_patch =
Patch()
234 patchset.append(current_patch)
235 current_patch.set_src(m.group(1))
237 m = dst_file.search(line)
239 current_patch.set_dst(m.group(1))
241 m = chunk_start.search(line)
243 current_chunk =
PatchChunk(m.group(1), m.group(3))
244 current_patch.add_chunk(current_chunk)
249 l.set_src(m.group(1))
250 current_chunk.add_line(l)
255 l.set_dst(m.group(1))
256 current_chunk.add_line(l)
258 m = both.search(line)
261 l.set_both(m.group(1))
262 current_chunk.add_line(l)
268 whitespace = re.compile(
'^(.*)([ \t]+)$')
270 for patch
in patchset:
271 for chunk
in patch.chunks():
275 for i
in range(0,len(src)):
278 m = whitespace.search(s.line())
279 if m
is not None and m.group(1) == d.line():
280 d.append_to_line(m.group(2))
287 output = tempfile.mkstemp()[1]
291 sys.stderr.write(
'original file=' + source +
'\n')
292 sys.stderr.write(
'uncrustify config file=' + cfg +
'\n')
293 sys.stderr.write(
'temporary file=' + output +
'\n')
295 uncrust = subprocess.Popen([
'uncrustify',
'-c', cfg,
'-f', source,
'-o', output],
296 stdin = subprocess.PIPE,
297 stdout = subprocess.PIPE,
298 stderr = subprocess.PIPE)
299 (out, err) = uncrust.communicate(
'')
301 sys.stderr.write(out)
302 sys.stderr.write(err)
304 raise Exception (
'uncrustify not installed')
306 src = open(source,
'r')
307 dst = open(output, 'r')
308 diff = difflib.unified_diff(src.readlines(), dst.readlines(),
309 fromfile=source, tofile=output)
313 initial_diff = tempfile.mkstemp()[1]
314 sys.stderr.write(
'initial diff file=' + initial_diff +
'\n')
315 tmp = open(initial_diff,
'w')
318 final_diff = tempfile.mkstemp()[1]
321 dst = open(final_diff,
'w')
322 if len(patchset) != 0:
323 patchset[0].write(dst)
326 dst = open(final_diff,
'w')
333 sys.stderr.write(
'final diff file=' + final_diff +
'\n')
334 shutil.copyfile(source,output)
335 patch = subprocess.Popen([
'patch',
'-p1',
'-i', final_diff, output],
336 stdin = subprocess.PIPE,
337 stdout = subprocess.PIPE,
338 stderr = subprocess.PIPE)
339 (out, err) = patch.communicate(
'')
341 sys.stderr.write(out)
342 sys.stderr.write(err)
347 def indent_files(files, diff=False, debug=False, level=0, inplace=False):
350 dst =
indent(f, debug=debug, level=level)
351 output.append([f,dst])
355 for src,dst
in output:
356 shutil.copyfile(dst,src)
361 for src,dst
in output:
362 if filecmp.cmp(src,dst) == 0:
363 failed.append([src, dst])
366 print 'Found %u badly indented files:' % len(failed)
367 for src,dst
in failed:
370 for src,dst
in failed:
371 s = open(src,
'r').readlines()
372 d = open(dst, 'r').readlines()
373 for line
in difflib.unified_diff(s, d, fromfile=src, tofile=dst):
374 sys.stdout.write(line)
380 from mercurial
import lock, error
381 lock.LockError = error.LockError
389 parser = optparse.OptionParser()
390 parser.add_option(
'--debug', action=
'store_true', dest=
'debug', default=
False,
391 help=
'Output some debugging information')
392 parser.add_option(
'-l',
'--level', type=
'int', dest=
'level', default=0,
393 help=
"Level of style conformance: higher levels include all lower levels. "
394 "level=0: re-indent only. level=1: add extra spaces. level=2: insert extra newlines and "
395 "extra braces around single-line statements. level=3: remove all trailing spaces")
396 parser.add_option(
'--check-hg-hook', action=
'store_true', dest=
'hg_hook', default=
False,
397 help=
'Get the list of files to check from mercurial\'s list of modified '
398 'and added files and assume that the script runs as a pretxncommit mercurial hook')
399 parser.add_option(
'--check-hg', action=
'store_true', dest=
'hg', default=
False,
400 help=
"Get the list of files to check from mercurial\'s list of modified and added files")
401 parser.add_option(
'-f',
'--check-file', action=
'store', dest=
'file', default=
'',
402 help=
"Check a single file")
403 parser.add_option(
'--diff', action=
'store_true', dest=
'diff', default=
False,
404 help=
"Generate a diff on stdout of the indented files")
405 parser.add_option(
'-i',
'--in-place', action=
'store_true', dest=
'in_place', default=
False,
406 help=
"Indent the input files in-place")
407 (options,args) = parser.parse_args()
408 debug = options.debug
420 inplace=options.in_place)
421 elif options.file !=
'':
423 if not os.path.exists(file)
or \
424 not os.path.isfile(file):
425 print 'file %s does not exist' % file
430 inplace=options.in_place)
433 if __name__ ==
'__main__':
def remove_trailing_whitespace_changes
def uncrustify_config_file