Преглед на файлове

Minor fix for cpp.py, improved debugging capabilities.

avkonst преди 12 години
родител
ревизия
5bf3f25e9e

+ 24 - 4
mainline/core/db/loader.py

@@ -770,10 +770,30 @@ class Loader(object):
                                     region.get_id(),
                                     DataIterator(self, region, namespace, support_regions = True))
 
-    def iterate_file_data(self):
-        if self.db != None:
-            for data in self.db.iterate_files():
-                yield FileData(self, data.path, data.id, data.checksum, None)
+    def iterate_file_data(self, path = None, path_like_filter = "%"):
+        if self.db == None:
+            return None
+        
+        final_path_like = path_like_filter
+        if path != None:
+            if self.db.check_dir(path) == False and self.db.check_file(path) == False:
+                return None
+            final_path_like = path + path_like_filter
+
+        class FileDataIterator(object):
+            def iterate_file_data(self, loader, final_path_like):
+                for data in loader.db.iterate_files(path_like=final_path_like):
+                    yield FileData(loader, data.path, data.id, data.checksum, None)
+            
+            def __init__(self, loader, final_path_like):
+                self.iterator = self.iterate_file_data(loader, final_path_like)
+    
+            def __iter__(self):
+                return self.iterator
+
+        if self.db == None:
+            return None
+        return FileDataIterator(self, final_path_like)
 
     def load_aggregated_data(self, path = None, path_like_filter = "%", namespaces = None):
         if self.db == None:

+ 5 - 7
mainline/core/db/sqlite.py

@@ -465,11 +465,9 @@ class Database(object):
         assert(len(result) == 1)
         return self.FileData(result[0]['id'], result[0]['path'], result[0]['checksum'])
 
-    def iterate_files(self):
-        sql = "SELECT * FROM __files__ WHERE (confirmed = 1)"
-        self.log(sql)
-        for row in self.conn.execute(sql).fetchall(): 
-            yield self.FileData(row['id'], row['path'], row['checksum']) 
+    def iterate_files(self, path_like = None):
+        for row in self.select_rows('__files__', path_like=path_like, filters=[('confirmed','=','1')]): 
+            yield self.FileData(row['id'], row['path'], row['checksum'])
 
     def create_region(self, file_id, region_id, name, begin, end, line_begin, line_end, cursor, group, checksum):
         assert(self.read_only == False)
@@ -563,10 +561,10 @@ class Database(object):
         what_stmt = ", ".join(column_names)
         if len(what_stmt) == 0:
             what_stmt = "*"
-        elif path_like != None:
+        elif path_like != None and table_name != '__files__':
             what_stmt += ", '__files__'.'path', '__files__'.'id'"
         inner_stmt = ""
-        if path_like != None:
+        if path_like != None and table_name != '__files__':
             inner_stmt = " INNER JOIN '__files__' ON '__files__'.'id' = '" + table_name + "'.'file_id' "
 
         where_stmt = " "

+ 30 - 9
mainline/debug.py

@@ -85,16 +85,37 @@ def dumphtml(args, loader):
         result += (cgi.escape(text[last_pos:]))
         last_pos = 0
         result += ('</pre></td><td><pre>')
-        styles = ['<span style="background-color:#ffff80">', '<span style="background-color:#ff80ff">']
-        for item in enumerate(data.iterate_regions(filter_group=data.get_region_types().FUNCTION)):
-            reg = item[1]
-            result += (cgi.escape(text[last_pos:reg.get_offset_begin()]))
-            result += (styles[item[0] % 2])
-            result += ('<a href="#line' + str(reg.get_cursor()) + '" id=line"' + str(reg.get_cursor()) + '"></a>')
-            result += (cgi.escape(text[reg.get_offset_begin():reg.get_offset_end()]))
+        styles = [('<span style="background-color:#F0F010">',
+                  '<span style="background-color:#F010F0">'),
+                  ('<span style="background-color:#F0F030">',
+                  '<span style="background-color:#F030F0">'),
+                  ('<span style="background-color:#F0F050">',
+                  '<span style="background-color:#F050F0">'),
+                  ('<span style="background-color:#F0F070">',
+                  '<span style="background-color:#F070F0">'),
+                  ('<span style="background-color:#F0F090">',
+                  '<span style="background-color:#F090F0">'),
+                  ('<span style="background-color:#F0F0B0">',
+                  '<span style="background-color:#F0B0F0">'),
+                  ('<span style="background-color:#F0F0D0">',
+                  '<span style="background-color:#F0D0F0">'),
+                  ('<span style="background-color:#F0F0E0">',
+                  '<span style="background-color:#F0E0F0">')]
+        
+        def proc_rec(region_id, file_data, styles, indent, pos):
+            result = (styles[indent % len(styles)][pos % 2])
+            region = file_data.get_region(region_id)
+            result += ('<a href="#line' + str(region.get_cursor()) + '" id=line"' + str(region.get_cursor()) + '"></a>')
+            last_pos = region.get_offset_begin() 
+            for (ind, sub_id) in enumerate(file_data.get_region(region_id).iterate_subregion_ids()):
+                subregion = file_data.get_region(sub_id)
+                result += (cgi.escape(text[last_pos:subregion.get_offset_begin()]))
+                result += proc_rec(sub_id, file_data, styles, indent + 3, ind)
+                last_pos = subregion.get_offset_end()
+            result += (cgi.escape(text[last_pos:region.get_offset_end()]))
             result += ('</span>')
-            last_pos = reg.get_offset_end()
-        result += (cgi.escape(text[last_pos:]))
+            return result
+        result += proc_rec(1, data, styles, 0, 0)
         result += ('</pre></td></tr></table>')
     result += ('</body></html>')
     print result

+ 1 - 2
mainline/ext/std/code/cpp.py

@@ -190,10 +190,9 @@ class CppCodeParser(object):
 
             # Template argument closing bracket
             elif text[m.start()] == '>':
-                # Reset next block name and start (in order to skip class names in templates), if has not been confirmed before
+                # Reset next block name (in order to skip class names in templates), if has not been confirmed before
                 if next_block['confirmed'] == False and (next_block['type'] == 'class' or next_block['type'] == 'struct'):
                     next_block['name'] = ""
-                    next_block['start'] = m.end() # potential region start
                     
             # Template argument opening bracket or after class inheritance specification
             elif text[m.start()] == ':' or text[m.start()] == '<':

+ 32 - 7
mainline/info.py

@@ -32,7 +32,7 @@ def main():
     log_plugin = core.log.Plugin()
     db_plugin = core.db.post.Plugin()
 
-    parser = core.cmdparser.MultiOptionParser(usage="Usage: %prog [options]")
+    parser = core.cmdparser.MultiOptionParser(usage="Usage: %prog [options] -- [path 1] ... [path N]")
     log_plugin.declare_configuration(parser)
     db_plugin.declare_configuration(parser)
 
@@ -40,8 +40,6 @@ def main():
     log_plugin.configure(options)
     db_plugin.configure(options)
     
-    args = args # used
-
     loader = core.db.loader.Loader()
     loader.open_database(db_plugin.dbfile)
     loader_prev = None
@@ -54,8 +52,11 @@ def main():
         prev_value_str = ""
         if loader_prev != None:
             prev = loader_prev.get_property(each.name)
-            if prev != each.value:
-                prev_value_str = " [previous file: " + loader_prev.get_property(each.name) + "]"
+            if prev == None:
+                prev_value_str = " [new]"
+                print "(!)",
+            elif prev != each.value:
+                prev_value_str = " [modified (was: " + loader_prev.get_property(each.name) + ")]"
                 print "(!)",
         print "\t" + each.name + "\t=>\t" + each.value + prev_value_str
 
@@ -65,7 +66,7 @@ def main():
         if loader_prev != None:
             prev = loader_prev.get_namespace(each)
             if prev == None:
-                prev_value_str = " [previous file: missed]"
+                prev_value_str = " [new]"
                 print "(!)",
         print "\t" + each + prev_value_str
         for field in loader.get_namespace(each).iterate_field_names():
@@ -73,9 +74,33 @@ def main():
             if loader_prev != None:
                 prev = loader_prev.get_namespace(each).get_field_packager(field)
                 if prev == None:
-                    prev_value_str = " [previous file: missed]"
+                    prev_value_str = " [new]"
                     print "(!)",
             print "\t\t- " + field + prev_value_str
+
+    print "Files:"
+    paths = None
+    if len(args) == 0:
+        paths = [""]
+    else:
+        paths = args
+    for path in paths:
+        file_iterator = loader.iterate_file_data(path=path)
+        if file_iterator == None:
+            logging.error("Specified path '" + path + "' is invalid (not found in the database records)")
+            exit_code += 1
+            continue
+        for each in file_iterator:
+            prev_value_str = ""
+            if loader_prev != None:
+                prev = loader_prev.load_file_data(each.get_path())
+                if prev == None:
+                    prev_value_str = " [new]"
+                    print "(!)",
+                elif prev.get_checksum() != each.get_checksum():
+                    prev_value_str = " [modified]"
+                    print "(!)",
+            print "\t" + each.get_path() + prev_value_str
         
     return exit_code
             

+ 1 - 1
mainline/tests/general/test_basic/test_help_info_default_stdout.gold.txt

@@ -1,4 +1,4 @@
-Usage: info.py [options]
+Usage: info.py [options] -- [path 1] ... [path N]
 
 Options:
   -h, --help            show this help message and exit

+ 1 - 1
mainline/tests/general/test_basic/test_workflow_export_default_stderr.gold.txt

@@ -1,3 +1,3 @@
 [LOG]: WARNING:	Logging enabled with INFO level
 [LOG]: INFO:	Processing: 
-[LOG]: WARNING:	Exit code: 0. Time spent: 0.01 seconds. Done
+[LOG]: WARNING:	Exit code: 0. Time spent: 0.0 seconds. Done

+ 2 - 0
mainline/tests/general/test_basic/test_workflow_info_default_stdout.gold.txt

@@ -12,3 +12,5 @@ Namespaces:
 	std.code.complexity
 		- cyclomatic
 	general
+Files:
+	./simple.cpp

+ 3 - 0
mainline/tests/general/test_basic/test_workflow_info_second_stdout.gold.txt

@@ -12,3 +12,6 @@ Namespaces:
 	std.code.complexity
 		- cyclomatic
 	general
+Files:
+(!) 	./simple.cpp [modified]
+(!) 	./simple2.cpp [new]

+ 1 - 1
mainline/tests/general/test_basic/test_workflow_limit_default_stderr.gold.txt

@@ -1,4 +1,4 @@
 [LOG]: WARNING:	Logging enabled with INFO level
 [LOG]: INFO:	Processing: 
 [LOG]: INFO:	Applying limit: namespace 'std.code.complexity', filter '('cyclomatic', '>', 0.0)'
-[LOG]: WARNING:	Exit code: 4. Time spent: 0.0 seconds. Done
+[LOG]: WARNING:	Exit code: 4. Time spent: 0.01 seconds. Done

+ 4 - 4
mainline/tests/general/test_std_code_cpp/test_parser_export_files_stdout.gold.txt

@@ -787,10 +787,10 @@ data:
 .   .   .   .   .   cursor="134"
 .   .   .   .   .   name="mycontainer"
 .   .   .   .   .   offset_end="2785"
-.   .   .   .   .   line_begin="134"
+.   .   .   .   .   line_begin="132"
 .   .   .   .   .   type="class"
 .   .   .   .   .   line_end="139"
-.   .   .   .   .   offset_begin="2662"
+.   .   .   .   .   offset_begin="2624"
 .   .   .   .   data: 
 .   .   
 .   .   .   region:  
@@ -877,7 +877,7 @@ data:
 .   .   .   .   .   line_begin="164"
 .   .   .   .   .   type="struct"
 .   .   .   .   .   line_end="252"
-.   .   .   .   .   offset_begin="3245"
+.   .   .   .   .   offset_begin="3227"
 .   .   .   .   data: 
 .   .   
 .   .   .   region:  
@@ -1031,7 +1031,7 @@ data:
 .   .   .   .   .   line_begin="261"
 .   .   .   .   .   type="function"
 .   .   .   .   .   line_end="264"
-.   .   .   .   .   offset_begin="5333"
+.   .   .   .   .   offset_begin="5315"
 .   .   .   .   data:  
 .   .   .   .   .   std.code.complexity: 
 .   .   .   .   .   .   cyclomatic="0"