14 files = os.popen(
'git diff --name-only')
15 process = subprocess.Popen([
"git",
"rev-parse",
"--show-toplevel"],
16 stdout = subprocess.PIPE,
17 stderr = subprocess.PIPE)
18 (root_dir, error) = process.communicate()
19 if isinstance(root_dir, bytes):
20 root_dir=root_dir.decode(
"utf-8")
21 files_changed = [item.strip()
for item
in files.readlines()]
22 files_changed = [item
for item
in files_changed
if item.endswith(
'.h')
or item.endswith(
'.cc')]
23 return [root_dir[: -1] +
"/" + filename.strip ()
for filename
in files_changed]
26 [tmp,pathname] = tempfile.mkstemp()
27 src = open(filename,
'r') 28 dst = open(pathname, 'w')
48 nl_namespace_brace=ignore 49 nl_after_brace_open=True 50 nl_class_leave_one_liners=False 51 nl_enum_leave_one_liners=False 52 nl_func_leave_one_liners=False 53 nl_if_leave_one_liners=False 55 nl_before_access_spec=2 56 nl_after_access_spec=0 57 indent_access_spec=-indent_columns 58 nl_after_semicolon=True 61 indent_constr_colon=true 63 nl_class_init_args=Add 66 # does not work very well 67 nl_func_type_name=Ignore 68 nl_func_scope_name=Ignore 69 nl_func_type_name_class=Ignore 70 nl_func_proto_type_name=Ignore 78 mod_full_brace_for=Add 80 mod_full_brace_while=Add 81 mod_full_brace_for=Add 82 mod_remove_extra_semicolon=True 85 #ls_for_split_full=True 86 #ls_func_split_full=True 87 nl_cpp_lambda_leave_one_liners=True 90 # extra spaces here and there 98 sp_func_class_paren=Add 104 sp_func_proto_paren=Add 105 sp_func_def_paren=Add 106 sp_func_call_paren=Add 107 sp_after_semi_for=Ignore 108 sp_before_sparen=Ignore 109 sp_before_ellipsis=Remove 112 nl_class_leave_one_liners=True 113 nl_enum_leave_one_liners=True 114 nl_func_leave_one_liners=True 115 nl_assign_leave_one_liners=True 116 nl_collapse_empty_body=True 117 nl_getset_leave_one_liners=True 118 nl_if_leave_one_liners=True 120 # finally, indentation configuration 122 indent_namespace=false 125 indent_case_brace=indent_columns 127 indent_class_colon=True 128 indent_switch_case=indent_columns 130 indent_align_assign=False 131 align_left_shift=True 132 # comment reformating disabled 133 cmt_reflow_mode=1 # do not touch comments at all 134 cmt_indent_multi=False # really, do not touch them 135 disable_processing_cmt= " *NS_CHECK_STYLE_OFF*" 136 enable_processing_cmt= " *NS_CHECK_STYLE_ON*" 138 [tmp,pathname] = tempfile.mkstemp()
139 dst = open(pathname,
'w')
165 @param self The current class 172 @param self The current class 173 @param line source line 180 @param self The current class 181 @param line destination line 188 @param self The current class 196 @param self The current class 197 @param s line to append 203 @param self The current class 209 @param self The current class 210 @return true if type is source 215 @param self The current class 216 @return true if type is destination 221 @param self The current class 223 @return exception if invalid type 226 f.write(
'-%s\n' % self.
__line)
228 f.write(
'+%s\n' % self.
__line)
230 f.write(
' %s\n' % self.
__line)
232 raise Exception(
'invalid patch')
248 @param self: this object 249 @param src_pos: source position 250 @param dst_pos: destination position 257 """! Source start function 258 @param self this object 259 @return source position 263 """! Add line function 264 @param self The current class 265 @param line line to add 270 """! Get source lines 271 @param self The current class 272 @return the source lines 280 """! Get destination lines 281 @param self The current class 282 @return the destination lines 290 """! Get number of source lines 291 @param self The current class 292 @return number of source lines 294 return len(self.
src())
296 """! Get number of destinaton lines 297 @param self The current class 298 @return number of destination lines 300 return len(self.
dst())
302 """! Write lines to file 303 @param self The current class 304 @param f: file to write to 322 @param self The current class 330 @param self this object 337 @param self The current class 343 @param self this object 350 @param self this object 351 @param dst destintion 357 @param self The current class 358 @param filename file name 365 @param self The current class 369 f.write(
'--- %s\n' % self.__src )
370 f.write(
'+++ %s\n' % self.__dst )
371 for chunk
in self.__chunks:
375 src_file = re.compile(
'^--- (.*)$')
376 dst_file = re.compile(
'^\+\+\+ (.*)$')
377 chunk_start = re.compile(
'^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@')
378 src = re.compile(
'^-(.*)$')
379 dst = re.compile(
'^\+(.*)$')
380 both = re.compile(
'^ (.*)$')
383 for line
in generator:
384 m = src_file.search(line)
386 current_patch =
Patch()
387 patchset.append(current_patch)
388 current_patch.set_src(m.group(1))
390 m = dst_file.search(line)
392 current_patch.set_dst(m.group(1))
394 m = chunk_start.search(line)
396 current_chunk =
PatchChunk(m.group(1), m.group(3))
397 current_patch.add_chunk(current_chunk)
402 l.set_src(m.group(1))
403 current_chunk.add_line(l)
408 l.set_dst(m.group(1))
409 current_chunk.add_line(l)
411 m = both.search(line)
414 l.set_both(m.group(1))
415 current_chunk.add_line(l)
421 whitespace = re.compile(
'^(.*)([ \t]+)$')
423 for patch
in patchset:
424 for chunk
in patch.chunks():
428 for i
in range(0,len(src)):
431 m = whitespace.search(s.line())
432 if m
is not None and m.group(1) == d.line():
433 d.append_to_line(m.group(2))
440 output = tempfile.mkstemp()[1]
444 sys.stderr.write(
'original file=' + source +
'\n')
445 sys.stderr.write(
'uncrustify config file=' + cfg +
'\n')
446 sys.stderr.write(
'temporary file=' + output +
'\n')
448 uncrust = subprocess.Popen([
'uncrustify',
'-c', cfg,
'-f', source,
'-o', output],
449 stdin = subprocess.PIPE,
450 stdout = subprocess.PIPE,
451 stderr = subprocess.PIPE,
452 universal_newlines =
True)
453 (out, err) = uncrust.communicate(
'')
455 sys.stderr.write(out)
456 sys.stderr.write(err)
458 raise Exception (
'uncrustify not installed')
460 src = open(source,
'r') 461 dst = open(output, 'r') 462 diff = difflib.unified_diff(src.readlines(), dst.readlines(), 463 fromfile=source, tofile=output) 467 initial_diff = tempfile.mkstemp()[1]
468 sys.stderr.write(
'initial diff file=' + initial_diff +
'\n')
469 tmp = open(initial_diff,
'w')
472 final_diff = tempfile.mkstemp()[1]
475 dst = open(final_diff,
'w')
476 if len(patchset) != 0:
477 patchset[0].write(dst)
480 dst = open(final_diff,
'w')
487 sys.stderr.write(
'final diff file=' + final_diff +
'\n')
488 shutil.copyfile(source,output)
489 patch = subprocess.Popen([
'patch',
'-p1',
'-i', final_diff, output],
490 stdin = subprocess.PIPE,
491 stdout = subprocess.PIPE,
492 stderr = subprocess.PIPE,
493 universal_newlines =
True)
494 (out, err) = patch.communicate(
'')
496 sys.stderr.write(out)
497 sys.stderr.write(err)
502 def indent_files(files, diff=False, debug=False, level=0, inplace=False):
505 dst =
indent(f, debug=debug, level=level)
506 output.append([f,dst])
510 for src,dst
in output:
511 shutil.copyfile(dst,src)
516 for src,dst
in output:
517 if filecmp.cmp(src,dst) == 0:
518 failed.append([src, dst])
521 print(
'Found %u badly indented files:' % len(failed))
522 for src,dst
in failed:
525 for src,dst
in failed:
526 s = open(src,
'r').readlines() 527 d = open(dst, 'r').readlines() 528 for line
in difflib.unified_diff(s, d, fromfile=src, tofile=dst):
529 sys.stdout.write(line)
534 parser = optparse.OptionParser()
535 parser.add_option(
'--debug', action=
'store_true', dest=
'debug', default=
False,
536 help=
'Output some debugging information')
537 parser.add_option(
'-l',
'--level', type=
'int', dest=
'level', default=0,
538 help=
"Level of style conformance: higher levels include all lower levels. " 539 "level=0: re-indent only. level=1: add extra spaces. level=2: insert extra newlines and " 540 "extra braces around single-line statements. level=3: remove all trailing spaces")
541 parser.add_option(
'--check-git', action=
'store_true', dest=
'git', default=
False,
542 help=
"Get the list of files to check from Git\'s list of modified and added files")
543 parser.add_option(
'-f',
'--check-file', action=
'store', dest=
'file', default=
'',
544 help=
"Check a single file")
545 parser.add_option(
'--diff', action=
'store_true', dest=
'diff', default=
False,
546 help=
"Generate a diff on stdout of the indented files")
547 parser.add_option(
'-i',
'--in-place', action=
'store_true', dest=
'in_place', default=
False,
548 help=
"Indent the input files in-place")
549 (options,args) = parser.parse_args()
550 debug = options.debug
551 style_is_correct =
False;
559 inplace=options.in_place)
560 elif options.file !=
'':
562 if not os.path.exists(file)
or \
563 not os.path.isfile(file):
564 print(
'file %s does not exist' % file)
570 inplace=options.in_place)
572 if not style_is_correct:
576 if __name__ ==
'__main__':
579 except Exception
as e:
580 sys.stderr.write(str(e) +
'\n')
def append_to_line(self, s)
Append to line.
def set_src(self, src)
Set source.
def apply(self, filename)
Apply function.
def set_both(self, line)
Set both.
def chunks(self)
Get the chunks.
def dst(self)
Get destination lines.
def indent(source, debug, level)
def __init__(self, src_pos, dst_pos)
Initializer.
def add_line(self, line)
Add line function.
def set_src(self, line)
Set source.
def src(self)
Get source lines.
def write(self, f)
Write to file.
__dst_pos
destination position
def is_src(self)
Is source.
def is_dst(self)
Is destination.
def set_dst(self, dst)
Set destination.
def remove_trailing_whitespace_changes(patch_generator)
def uncrustify_config_file(level)
def dst_len(self)
Get number of destinaton lines.
def __init__(self)
Initializer.
def write(self, f)
Write to file.
def src_start(self)
Source start function.
def set_dst(self, line)
Set destination.
def src_len(self)
Get number of source lines.
def parse_patchset(generator)
def write(self, f)
Write lines to file.
def add_chunk(self, chunk)
Add chunk.
def __init__(self)
Initializer.
def indent_files(files, diff=False, debug=False, level=0, inplace=False)