[Piglit] [PATCH 5/7] summary.py: Simplify the way HTMLIndex works

Dylan Baker baker.dylan.c at gmail.com
Thu Oct 17 15:09:41 CEST 2013


Basically this patch replaces the returnList() function with
os.path.relpath(), which can be used to return essentially the same
output.

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 framework/summary.py | 116 ++++++++++++++-------------------------------------
 1 file changed, 31 insertions(+), 85 deletions(-)

diff --git a/framework/summary.py b/framework/summary.py
index 25ee320..8215bbc 100644
--- a/framework/summary.py
+++ b/framework/summary.py
@@ -69,94 +69,40 @@ class HTMLIndex(list):
         generates a list of dicts that are passed to mako and turned into HTML
         """
 
-        def returnList(open, close):
-            """
-            As HTMLIndex iterates through the groups and tests it uses this
-            function to determine which groups to close (and thus reduce the
-            depth of the next write) and which ones to open (thus increasing
-            the depth)
-
-            To that end one of two things happens, the path to the previous
-            group (close) and the next group (open) are equal, in that event we
-            don't want to open and close, becasue that will result in a
-            sawtooth pattern of a group with one test followed by the same
-            group with one test, over and over.  Instead we simply return two
-            empty lists, which will result in writing a long list of test
-            results.  The second option is that the paths are different, and
-            the function determines any commonality between the paths, and
-            returns the differences as close (the groups which are completly
-            written) and open (the new groups to write).
-            """
-            common = []
-
-            # Open and close are lists, representing the group hierarchy, open
-            # being the groups that need are soon to be written, and close
-            # representing the groups that have finished writing.
-            if open == close:
-                return [], []
-            else:
-                for i, j in izip_longest(open, close):
-                    if i != j:
-                        for k in common:
-                            open.remove(k)
-                            close.remove(k)
-                        return open, close
-                    else:
-                        common.append(i)
-
         # set a starting depth of 1, 0 is used for 'all' so 1 is the
         # next available group
         depth = 1
-
-        # Current dir is a list representing the groups currently being
-        # written.
-        currentDir = []
-
-        # Add the groups and tests to the out list
-        for key in sorted(page):
-
-            # Split the group names and test names, then determine
-            # which groups to close and which to open
-            openList = key.split('/')
-            test = openList.pop()
-            openList, closeList = returnList(openList, list(currentDir))
-
-            # Close any groups in the close list
-            # for each group closed, reduce the depth by one
-            for i in reversed(closeList):
-                currentDir.remove(i)
-                depth -= 1
-
-            # Open new groups
-            for localGroup in openList:
-                self._newRow()
-
-                # Add the left-most column: the name of the group
-                self._groupRow("head", depth, localGroup)
-
-                # Add the group that we just opened to the currentDir, which
-                # will then be used to add that group to the HTML list. If
-                # there is a KeyError (the group doesn't exist), use (0, 0)
-                # which will get skip. This sets the group coloring correctly
-                currentDir.append(localGroup)
-                for each in summary.results:
-                    # Decide which fields need to be updated
-                    try:
-                        self._groupResult(summary.fractions[each.name]
-                                          [path.join(*currentDir)],
-                                          summary.status[each.name]
-                                          [path.join(*currentDir)])
-                    except KeyError:
-                        self._groupResult((0, 0), 'skip')
-
-                # After each group increase the depth by one
-                depth += 1
-                self._endRow()
-
-            # Add the tests for the current group
+        group = ""
+
+        # The following loop relies on alphabetical sorting of test names
+        for test in sorted(page):
+
+            # If the current group not the same as the last group call
+            # os.path.relpath on it. This gives ".." for each group to close
+            # (reducing the depth) and a name for each group to open
+            # (increasing the depth)
+            if path.dirname(test) != group:
+                for cur in path.relpath(path.dirname(test), group).split('/'):
+                    if cur == "..":
+                        depth -= 1
+                        group = path.dirname(group)
+                    else:
+                        group = path.join(group, cur)
+                        self._newRow()
+                        self._groupRow("head", depth, group)
+                        for each in summary.results:
+                            try:
+                                self._groupResult(
+                                    summary.fractions[each.name][group],
+                                    summary.status[each.name][group])
+                            except KeyError:
+                                self._groupResult((0, 0), 'skip')
+                        depth += 1
+                        self._endRow()
+
+            # Finally add a new row for the test itself, and add the left-most
+            # name column
             self._newRow()
-
-            # Add the left-most column: the name of the test
             self._testRow("group", depth, test)
 
             # Add the result from each test result to the HTML summary If there
@@ -164,7 +110,7 @@ class HTMLIndex(list):
             # return Not Run, with clas skip for highlighting
             for each in summary.results:
                 try:
-                    self._testResult(each.name, key, each.tests[key]['result'])
+                    self._testResult(each.name, test, each.tests[test]['result'])
                 except KeyError:
                     self.append({'type': 'other',
                                  'text': '<td class="skip">Not Run</td>'})
-- 
1.8.1.5



More information about the Piglit mailing list