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 111 nl_class_leave_one_liners=True 112 nl_enum_leave_one_liners=True 113 nl_func_leave_one_liners=True 114 nl_assign_leave_one_liners=True 115 nl_collapse_empty_body=True 116 nl_getset_leave_one_liners=True 117 nl_if_leave_one_liners=True 119 # finally, indentation configuration 121 indent_namespace=false 124 indent_case_brace=indent_columns 126 indent_class_colon=True 127 indent_switch_case=indent_columns 129 indent_align_assign=False 130 align_left_shift=True 131 # comment reformating disabled 132 cmt_reflow_mode=1 # do not touch comments at all 133 cmt_indent_multi=False # really, do not touch them 134 disable_processing_cmt= " *NS_CHECK_STYLE_OFF*" 135 enable_processing_cmt= " *NS_CHECK_STYLE_ON*" 137 [tmp,pathname] = tempfile.mkstemp()
138 dst = open(pathname,
'w')
164 @param self The current class 171 @param self The current class 172 @param line source line 179 @param self The current class 180 @param line destination line 187 @param self The current class 195 @param self The current class 196 @param s line to append 202 @param self The current class 208 @param self The current class 209 @return true if type is source 214 @param self The current class 215 @return true if type is destination 220 @param self The current class 222 @return exception if invalid type 225 f.write(
'-%s\n' % self.
__line)
227 f.write(
'+%s\n' % self.
__line)
229 f.write(
' %s\n' % self.
__line)
231 raise Exception(
'invalid patch')
247 @param self: this object 248 @param src_pos: source position 249 @param dst_pos: destination position 256 """! Source start function 257 @param self this object 258 @return source position 262 """! Add line function 263 @param self The current class 264 @param line line to add 269 """! Get source lines 270 @param self The current class 271 @return the source lines 279 """! Get destination lines 280 @param self The current class 281 @return the destination lines 289 """! Get number of source lines 290 @param self The current class 291 @return number of source lines 293 return len(self.
src())
295 """! Get number of destinaton lines 296 @param self The current class 297 @return number of destination lines 299 return len(self.
dst())
301 """! Write lines to file 302 @param self The current class 303 @param f: file to write to 321 @param self The current class 329 @param self this object 336 @param self The current class 342 @param self this object 349 @param self this object 350 @param dst destintion 356 @param self The current class 357 @param filename file name 364 @param self The current class 368 f.write(
'--- %s\n' % self.__src )
369 f.write(
'+++ %s\n' % self.__dst )
370 for chunk
in self.__chunks:
374 src_file = re.compile(
'^--- (.*)$')
375 dst_file = re.compile(
'^\+\+\+ (.*)$')
376 chunk_start = re.compile(
'^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@')
377 src = re.compile(
'^-(.*)$')
378 dst = re.compile(
'^\+(.*)$')
379 both = re.compile(
'^ (.*)$')
382 for line
in generator:
383 m = src_file.search(line)
385 current_patch =
Patch()
386 patchset.append(current_patch)
387 current_patch.set_src(m.group(1))
389 m = dst_file.search(line)
391 current_patch.set_dst(m.group(1))
393 m = chunk_start.search(line)
395 current_chunk =
PatchChunk(m.group(1), m.group(3))
396 current_patch.add_chunk(current_chunk)
401 l.set_src(m.group(1))
402 current_chunk.add_line(l)
407 l.set_dst(m.group(1))
408 current_chunk.add_line(l)
410 m = both.search(line)
413 l.set_both(m.group(1))
414 current_chunk.add_line(l)
420 whitespace = re.compile(
'^(.*)([ \t]+)$')
422 for patch
in patchset:
423 for chunk
in patch.chunks():
427 for i
in range(0,len(src)):
430 m = whitespace.search(s.line())
431 if m
is not None and m.group(1) == d.line():
432 d.append_to_line(m.group(2))
439 output = tempfile.mkstemp()[1]
443 sys.stderr.write(
'original file=' + source +
'\n')
444 sys.stderr.write(
'uncrustify config file=' + cfg +
'\n')
445 sys.stderr.write(
'temporary file=' + output +
'\n')
447 uncrust = subprocess.Popen([
'uncrustify',
'-c', cfg,
'-f', source,
'-o', output],
448 stdin = subprocess.PIPE,
449 stdout = subprocess.PIPE,
450 stderr = subprocess.PIPE,
451 universal_newlines =
True)
452 (out, err) = uncrust.communicate(
'')
454 sys.stderr.write(out)
455 sys.stderr.write(err)
457 raise Exception (
'uncrustify not installed')
459 src = open(source,
'r') 460 dst = open(output, 'r') 461 diff = difflib.unified_diff(src.readlines(), dst.readlines(), 462 fromfile=source, tofile=output) 466 initial_diff = tempfile.mkstemp()[1]
467 sys.stderr.write(
'initial diff file=' + initial_diff +
'\n')
468 tmp = open(initial_diff,
'w')
471 final_diff = tempfile.mkstemp()[1]
474 dst = open(final_diff,
'w')
475 if len(patchset) != 0:
476 patchset[0].write(dst)
479 dst = open(final_diff,
'w')
486 sys.stderr.write(
'final diff file=' + final_diff +
'\n')
487 shutil.copyfile(source,output)
488 patch = subprocess.Popen([
'patch',
'-p1',
'-i', final_diff, output],
489 stdin = subprocess.PIPE,
490 stdout = subprocess.PIPE,
491 stderr = subprocess.PIPE,
492 universal_newlines =
True)
493 (out, err) = patch.communicate(
'')
495 sys.stderr.write(out)
496 sys.stderr.write(err)
501 def indent_files(files, diff=False, debug=False, level=0, inplace=False):
504 dst =
indent(f, debug=debug, level=level)
505 output.append([f,dst])
509 for src,dst
in output:
510 shutil.copyfile(dst,src)
515 for src,dst
in output:
516 if filecmp.cmp(src,dst) == 0:
517 failed.append([src, dst])
520 print(
'Found %u badly indented files:' % len(failed))
521 for src,dst
in failed:
524 for src,dst
in failed:
525 s = open(src,
'r').readlines() 526 d = open(dst, 'r').readlines() 527 for line
in difflib.unified_diff(s, d, fromfile=src, tofile=dst):
528 sys.stdout.write(line)
533 parser = optparse.OptionParser()
534 parser.add_option(
'--debug', action=
'store_true', dest=
'debug', default=
False,
535 help=
'Output some debugging information')
536 parser.add_option(
'-l',
'--level', type=
'int', dest=
'level', default=0,
537 help=
"Level of style conformance: higher levels include all lower levels. " 538 "level=0: re-indent only. level=1: add extra spaces. level=2: insert extra newlines and " 539 "extra braces around single-line statements. level=3: remove all trailing spaces")
540 parser.add_option(
'--check-git', action=
'store_true', dest=
'git', default=
False,
541 help=
"Get the list of files to check from Git\'s list of modified and added files")
542 parser.add_option(
'-f',
'--check-file', action=
'store', dest=
'file', default=
'',
543 help=
"Check a single file")
544 parser.add_option(
'--diff', action=
'store_true', dest=
'diff', default=
False,
545 help=
"Generate a diff on stdout of the indented files")
546 parser.add_option(
'-i',
'--in-place', action=
'store_true', dest=
'in_place', default=
False,
547 help=
"Indent the input files in-place")
548 (options,args) = parser.parse_args()
549 debug = options.debug
550 style_is_correct =
False;
558 inplace=options.in_place)
559 elif options.file !=
'':
561 if not os.path.exists(file)
or \
562 not os.path.isfile(file):
563 print(
'file %s does not exist' % file)
569 inplace=options.in_place)
571 if not style_is_correct:
575 if __name__ ==
'__main__':
578 except Exception
as e:
579 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)