Changeset 0f97375 in rtems-source-builder


Ignore:
Timestamp:
Oct 27, 2017, 6:25:45 AM (19 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
70e3e5e
Parents:
910196d
git-author:
Chris Johns <chrisj@…> (10/27/17 06:25:45)
git-committer:
Chris Johns <chrisj@…> (10/27/17 06:26:26)
Message:

sb: Provide a more detail email message.

Close #3210.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • rtems/config/4.12/rtems-autotools.bset

    r910196d r0f97375  
    1919%define _internal_autotools_path %{_tmppath}/sb-%{_uid}/${SB_PREFIX_CLEAN}
    2020
     21#
     22# Disable emailing reports of this building for RTEMS.
     23#
     24%define mail_disable
     25
    21264.12/rtems-autotools-internal
    22274.12/rtems-autotools-base
  • source-builder/sb/setbuilder.py

    r910196d r0f97375  
    5050    sys.exit(1)
    5151
     52class log_capture(object):
     53    def __init__(self):
     54        self.log = []
     55        log.capture = self.capture
     56
     57    def __str__(self):
     58        return os.linesep.join(self.log)
     59
     60    def capture(self, text):
     61        self.log += [l for l in text.replace(chr(13), '').splitlines()]
     62
     63    def get(self):
     64        return self.log
     65
     66    def clear(self):
     67        self.log = []
     68
    5269class buildset:
    5370    """Build a set builds a set of packages."""
     
    7289        self.mail_header = ''
    7390        self.mail_report = ''
     91        self.mail_report_0subject = ''
    7492        self.build_failure = None
    7593
    76     def write_mail_header(self, text, prepend = False):
    77         if len(text) == 0 or text[-1] != '\n' or text[-1] != '\r':
     94    def write_mail_header(self, text = '', prepend = False):
     95        if type(text) is list:
     96            text = os.linesep.join(text)
     97        text = text.replace('\r', '').replace('\n', os.linesep)
     98        if len(text) == 0 or text[-1] != os.linesep:
    7899            text += os.linesep
    79100        if prepend:
     
    82103            self.mail_header += text
    83104
     105    def get_mail_header(self):
     106        return self.mail_header
     107
    84108    def write_mail_report(self, text, prepend = False):
    85         if len(text) == 0 or text[-1] != '\n' or text[-1] != '\r':
     109        if type(text) is list:
     110            text = os.linesep.join(text)
     111        text = text.replace('\r', '').replace('\n', os.linesep)
     112        if len(text) == 0 or text[-1] != os.linesep:
    86113            text += os.linesep
    87114        if prepend:
     
    89116        else:
    90117            self.mail_report += text
     118
     119    def get_mail_report(self):
     120        return self.mail_report
    91121
    92122    def copy(self, src, dst):
     
    95125            path.copy_tree(src, dst)
    96126
    97     def report(self, _config, _build, opts, macros, format = None):
     127    def report(self, _config, _build, opts, macros, format = None, mail = None):
    98128        if len(_build.main_package().name()) > 0 \
    99129           and not _build.macros.get('%{_disable_reporting}') \
     
    140170                    r.write(outname)
    141171                del r
    142             if _build.opts.get_arg('--mail'):
     172            if mail:
    143173                r = reports.report('text', self.configs,
    144174                                   copy.copy(opts), copy.copy(macros))
     
    146176                r.generate(_build.config.file_name())
    147177                r.epilogue(_build.config.file_name())
    148                 self.write_mail_report(r.out)
     178                self.write_mail_report(r.get_output())
    149179                del r
    150180
     
    300330        return configs
    301331
    302     def build(self, deps = None, nesting_count = 0):
     332    def build(self, deps = None, nesting_count = 0, mail = None):
    303333
    304334        build_error = False
    305335
    306336        nesting_count += 1
     337
     338        if mail:
     339            mail['output'].clear()
    307340
    308341        log.trace('_bset: %s: make' % (self.bset))
    309342        log.notice('Build Set: %s' % (self.bset))
    310343
    311         if self.opts.get_arg('--mail'):
    312             mail_report_subject = '%s %s' % (self.bset, self.macros.expand('%{_host}'))
     344        mail_subject = '%s on %s' % (self.bset, self.macros.expand('%{_host}'))
    313345
    314346        current_path = os.environ['PATH']
     
    318350        mail_report = False
    319351        have_errors = False
     352
     353        if mail:
     354            mail['output'].clear()
    320355
    321356        try:
     
    338373                        log.trace('_bset: == %2d %s' % (nesting_count + 1, '=' * 75))
    339374                        bs = buildset(configs[s], self.configs, opts, macros)
    340                         bs.build(deps, nesting_count)
     375                        bs.build(deps, nesting_count, mail)
    341376                        del bs
    342377                    elif configs[s].endswith('.cfg'):
    343                         mail_report = self.opts.get_arg('--mail')
     378                        if mail:
     379                            mail_report = True
    344380                        log.trace('_bset: -- %2d %s' % (nesting_count + 1, '-' * 75))
    345381                        try:
    346                             b = build.build(configs[s], self.opts.get_arg('--pkg-tar-files'),
    347                                             opts, macros)
     382                            b = build.build(configs[s],
     383                                            self.opts.get_arg('--pkg-tar-files'),
     384                                            opts,
     385                                            macros)
    348386                        except:
    349387                            build_error = True
     
    355393                            self.report(configs[s], b,
    356394                                        copy.copy(self.opts),
    357                                         copy.copy(self.macros))
    358                             # Always product an XML report.
     395                                        copy.copy(self.macros),
     396                                        mail = mail)
     397                            # Always produce an XML report.
    359398                            self.report(configs[s], b,
    360399                                        copy.copy(self.opts),
    361400                                        copy.copy(self.macros),
    362                                         format = 'xml')
     401                                        format = 'xml',
     402                                        mail = mail)
    363403                            if s == len(configs) - 1 and not have_errors:
    364404                                self.bset_tar(b)
     
    429469            os.environ['PATH'] = current_path
    430470            build_time = str(end - start)
    431             if mail_report:
    432                 to_addr = self.opts.get_arg('--mail-to')
    433                 if to_addr is not None:
    434                     to_addr = to_addr[1]
     471            if mail_report and not self.macros.defined('mail_disable'):
     472                self.write_mail_header('Build Time: %s' % (build_time), True)
     473                self.write_mail_header('', True)
     474                if self.build_failure is not None:
     475                    mail_subject = 'Build : FAILED %s (%s)' % \
     476                        (mail_subject, self.build_failure)
    435477                else:
    436                     to_addr = self.macros.expand('%{_mail_tools_to}')
    437                 log.notice('Mailing report: %s' % (to_addr))
    438                 self.write_mail_header('Build Time %s' % (build_time), True)
     478                    mail_subject = 'Build : PASSED %s' % (mail_subject)
     479                self.write_mail_header(mail['header'], True)
    439480                self.write_mail_header('')
    440                 m = mailer.mail(self.opts)
    441                 if self.build_failure is not None:
    442                     mail_report_subject = 'Build: FAILED %s (%s)' %\
    443                         (mail_report_subject, self.build_failure)
    444                     pass_fail = 'FAILED'
    445                 else:
    446                     mail_report_subject = 'Build: PASSED %s' % (mail_report_subject)
    447                 if not self.opts.dry_run():
    448                     m.send(to_addr, mail_report_subject,
    449                            self.mail_header + self.mail_report)
     481                log.notice('Mailing report: %s' % (mail['to']))
     482                body = self.get_mail_header()
     483                body += 'Output' + os.linesep
     484                body += '======' + os.linesep + os.linesep
     485                body += os.linesep.join(mail['output'].get())
     486                body += os.linesep + os.linesep
     487                body += 'Report' + os.linesep
     488                body += '======' + os.linesep + os.linesep
     489                body += self.get_mail_report()
     490                if not opts.dry_run():
     491                    mail['mail'].send(mail['to'], mail_subject, body)
    450492            log.notice('Build Set: Time %s' % (build_time))
    451493
     
    468510    ec = 0
    469511    setbuilder_error = False
     512    mail = None
    470513    try:
    471514        optargs = { '--list-configs':  'List available configurations',
     
    478521        mailer.append_options(optargs)
    479522        opts = options.load(sys.argv, optargs)
     523        if opts.get_arg('--mail'):
     524            mail = { 'mail'  : mailer.mail(opts),
     525                     'output': log_capture() }
     526            to_addr = opts.get_arg('--mail-to')
     527            if to_addr is not None:
     528                mail['to'] = to_addr[1]
     529            else:
     530                mail['to'] = pts.defaults.expand('%{_mail_tools_to}')
     531            mail['from'] = mail['mail'].from_address()
    480532        log.notice('RTEMS Source Builder - Set Builder, %s' % (version.str()))
    481533        opts.log_info()
    482534        if not check.host_setup(opts):
    483535            raise error.general('host build environment is not set up correctly')
     536        if mail:
     537            mail['header'] = os.linesep.join(mail['output'].get())
     538            mail['header'] += os.linesep
     539            mail['header'] += opts.info() + os.linesep
    484540        configs = build.get_configs(opts)
    485541        if opts.get_arg('--list-deps'):
     
    497553               not path.ispathwritable(prefix):
    498554                raise error.general('prefix is not writable: %s' % (path.host(prefix)))
     555
    499556            for bset in opts.params():
    500557                setbuilder_error = True
    501558                b = buildset(bset, configs, opts)
    502                 b.build(deps)
     559                b.build(deps, mail = mail)
    503560                b = None
    504561                setbuilder_error = False
     562
    505563        if deps is not None:
    506564            c = 0
     
    523581        log.notice('abort: user terminated')
    524582        ec = 1
     583    except:
     584        raise
     585        log.notice('abort: unknown error')
     586        ec = 1
    525587    sys.exit(ec)
    526588
Note: See TracChangeset for help on using the changeset viewer.