[rtems-source-builder commit] sb: Fix reporting and installing the reports when building.

Chris Johns chrisj at rtems.org
Thu May 21 11:59:59 UTC 2015


Module:    rtems-source-builder
Branch:    master
Commit:    ce60578b8f6988e6007c169711fed8693e779974
Changeset: http://git.rtems.org/rtems-source-builder/commit/?id=ce60578b8f6988e6007c169711fed8693e779974

Author:    Chris Johns <chrisj at rtems.org>
Date:      Thu May 21 21:49:25 2015 +1000

sb: Fix reporting and installing the reports when building.

Switch the default report to text format.
Fix the report to support the set builder.

---

 source-builder/sb/reports.py    | 65 ++++++++++++++++++++++++++---------------
 source-builder/sb/setbuilder.py | 45 ++++++++++++++++++----------
 2 files changed, 70 insertions(+), 40 deletions(-)

diff --git a/source-builder/sb/reports.py b/source-builder/sb/reports.py
index b81fba9..9a20b2e 100644
--- a/source-builder/sb/reports.py
+++ b/source-builder/sb/reports.py
@@ -247,15 +247,6 @@ class asciidoc_formatter(formatter):
 class html_formatter(asciidoc_formatter):
     def __init__(self):
         super(html_formatter, self).__init__()
-        try:
-            import asciidocapi
-        except:
-            raise error.general('installation error: no asciidocapi found')
-        asciidoc_py = _make_path(self.sbpath, options.basepath, 'asciidoc', 'asciidoc.py')
-        try:
-            self.asciidoc = asciidocapi.AsciiDocAPI(asciidoc_py)
-        except:
-            raise error.general('application error: asciidocapi failed')
 
     def format(self):
         return 'html'
@@ -267,7 +258,16 @@ class html_formatter(asciidoc_formatter):
         import StringIO
         infile = StringIO.StringIO(self.content)
         outfile = StringIO.StringIO()
-        self.asciidoc.execute(infile, outfile)
+        try:
+            import asciidocapi
+        except:
+            raise error.general('installation error: no asciidocapi found')
+        asciidoc_py = _make_path(self.sbpath, options.basepath, 'asciidoc', 'asciidoc.py')
+        try:
+            asciidoc = asciidocapi.AsciiDocAPI(asciidoc_py)
+        except:
+            raise error.general('application error: asciidocapi failed')
+        asciidoc.execute(infile, outfile)
         out = outfile.getvalue()
         infile.close()
         outfile.close()
@@ -440,7 +440,21 @@ class report:
     """Report the build details about a package given a config file."""
 
     def __init__(self, formatter, _configs, opts, macros = None):
-        self.formatter = formatter
+        if type(formatter) == str:
+            if formatter == 'text':
+                self.formatter = text_formatter()
+            elif formatter == 'asciidoc':
+                self.formatter = asciidoc_formatter()
+            elif formatter == 'html':
+                self.formatter = html_formatter()
+            elif formatter == 'ini':
+                self.formatter = ini_formatter()
+            elif formatter == 'xml':
+                self.formatter = xml_formatter()
+            else:
+                raise error.general('invalid format: %s' % (formatter))
+        else:
+            self.formatter = formatter
         self.configs = _configs
         self.opts = opts
         if macros is None:
@@ -554,19 +568,20 @@ class report:
         name = package.name()
         if len(name) == 0:
             return
-        tree['file'] += [_config.file_name()]
         sources = self.source(macros)
         patches = self.patch(macros)
-        if len(sources):
-            if 'sources' in tree:
-                tree['sources'] = dict(tree['sources'].items() + sources.items())
-            else:
-                tree['sources'] = sources
-        if len(patches):
-            if 'patches' in tree:
-                tree['patches'] = dict(tree['patches'].items() + patches.items())
-            else:
-                tree['patches'] = patches
+        if tree is not None:
+            tree['file'] += [_config.file_name()]
+            if len(sources):
+                if 'sources' in tree:
+                    tree['sources'] = dict(tree['sources'].items() + sources.items())
+                else:
+                    tree['sources'] = sources
+            if len(patches):
+                if 'patches' in tree:
+                    tree['patches'] = dict(tree['patches'].items() + patches.items())
+                else:
+                    tree['patches'] = patches
         self.config_start(name, _config)
         self.formatter.config(self.bset_nesting + 2, name, _config)
         self.output_info('Summary', package.get_info('summary'), True)
@@ -682,14 +697,16 @@ class report:
             except IOError, err:
                 raise error.general('writing output file: %s: %s' % (name, err))
 
-    def generate(self, name, tree = None, opts = None, defaults = None):
+    def generate(self, name, tree = None, opts = None, macros = None):
         self.bset_nesting += 1
         self.buildset_start(name)
         if tree is None:
             tree = self.tree
         if opts is None:
             opts = self.opts
-        bset = setbuilder.buildset(name, self.configs, opts, defaults)
+        if macros is None:
+            macros = self.macros
+        bset = setbuilder.buildset(name, self.configs, opts, macros)
         if name in tree:
             raise error.general('duplicate build set in tree: %s' % (name))
         tree[name] = { 'bset': { }, 'cfg': { 'file': []  } }
diff --git a/source-builder/sb/setbuilder.py b/source-builder/sb/setbuilder.py
index 8e5d8bb..d46dabd 100644
--- a/source-builder/sb/setbuilder.py
+++ b/source-builder/sb/setbuilder.py
@@ -90,14 +90,15 @@ class buildset:
         if not self.opts.dry_run():
             path.copy_tree(src, dst)
 
-    def report(self, _config, _build):
-        if not _build.opts.get_arg('--no-report') \
+    def report(self, _config, _build, opts, macros):
+        if len(_build.main_package().name()) > 0 \
            and not _build.macros.get('%{_disable_reporting}') \
-           and _build.opts.get_arg('--mail'):
+           and (not _build.opts.get_arg('--no-report') \
+                or _build.opts.get_arg('--mail')):
             format = _build.opts.get_arg('--report-format')
             if format is None:
-                format = 'html'
-                ext = '.html'
+                format = 'text'
+                ext = '.txt'
             else:
                 if len(format) != 2:
                     raise error.general('invalid report format option: %s' % ('='.join(format)))
@@ -110,6 +111,12 @@ class buildset:
                 elif format[1] == 'html':
                     format = 'html'
                     ext = '.html'
+                elif format[1] == 'xml':
+                    format = 'xml'
+                    ext = '.xml'
+                elif format[1] == 'ini':
+                    format = 'ini'
+                    ext = '.ini'
                 else:
                     raise error.general('invalid report format: %s' % (format[1]))
             buildroot = _build.config.abspath('%{buildroot}')
@@ -117,22 +124,26 @@ class buildset:
             name = _build.main_package().name() + ext
             log.notice('reporting: %s -> %s' % (_config, name))
             if not _build.opts.get_arg('--no-report'):
-                outpath = path.host(path.join(buildroot, prefix, 'share', 'rtems-source-builder'))
-                outname = path.host(path.join(outpath, name))
-                r = reports.report(format, self.configs, _build.opts, _build.macros)
-                r.setup()
+                outpath = path.host(path.join(buildroot, prefix, 'share', 'rtems', 'rsb'))
+                if not _build.opts.dry_run():
+                    outname = path.host(path.join(outpath, name))
+                else:
+                    outname = None
+                r = reports.report(format, self.configs,
+                                   copy.copy(opts), copy.copy(macros))
                 r.introduction(_build.config.file_name())
-                r.config(_build.config, _build.opts, _build.macros)
+                r.generate(_build.config.file_name())
+                r.epilogue(_build.config.file_name())
                 if not _build.opts.dry_run():
                     _build.mkdir(outpath)
                     r.write(outname)
                 del r
-            if not _build.macros.get('%{_disable_reporting}') \
-               and _build.opts.get_arg('--mail'):
-                r = reports.report('text', self.configs, _build.opts, _build.macros)
-                r.setup()
+            if _build.opts.get_arg('--mail'):
+                r = reports.report('text', self.configs,
+                                   copy.copy(opts), copy.copy(macros))
                 r.introduction(_build.config.file_name())
-                r.config(_build.config, _build.opts, _build.macros)
+                r.generate(_build.config.file_name())
+                r.epilogue(_build.config.file_name())
                 self.write_mail_report(r.out)
                 del r
 
@@ -176,7 +187,6 @@ class buildset:
             if _build.canadian_cross():
                 self.canadian_cross(_build)
             _build.make()
-            self.report(_config, _build)
             if not _build.macros.get('%{_disable_collecting}'):
                 self.root_copy(_build.config.expand('%{buildroot}'),
                                _build.config.expand('%{_tmproot}'))
@@ -340,6 +350,9 @@ class buildset:
                             mail_report = False
                         if deps is None:
                             self.build_package(configs[s], b)
+                            self.report(configs[s], b,
+                                        copy.copy(self.opts),
+                                        copy.copy(self.macros))
                             if s == len(configs) - 1 and not have_errors:
                                 self.bset_tar(b)
                         else:



More information about the vc mailing list