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 append_to_line(self, s)
 
def apply(self, filename)
 
def indent(source, debug, level)
 
def __init__(self, src_pos, dst_pos)
 
def run_as_hg_hook(ui, repo, kwargs)
 
def remove_trailing_whitespace_changes(patch_generator)
 
def uncrustify_config_file(level)
 
def parse_patchset(generator)
 
def add_chunk(self, chunk)