Changeset 91462f6 in rtems-source-builder


Ignore:
Timestamp:
Aug 9, 2014, 1:51:19 PM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, master
Children:
8db5212
Parents:
c21f09e
Message:

sb: Add INI format output to the reports.

The INI format report is a way to export a configuration.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source-builder/sb/reports.py

    rc21f09e r91462f6  
    3838    import path
    3939    import setbuilder
     40    import sources
    4041    import version
    4142except KeyboardInterrupt:
     
    6364        self.out = ''
    6465        self.asciidoc = None
     66        if self.is_ini():
     67            self.cini = ';'
     68        else:
     69            self.cini = ''
     70        self.files = { 'buildsets':[], 'configs':[] }
     71        self.sources = {}
     72        self.patches = {}
    6573
    6674    def _sbpath(self, *args):
     
    7987        return self.format == 'asciidoc' or self.format == 'html'
    8088
     89    def is_html(self):
     90        return self.format == 'html'
     91
     92    def is_ini(self):
     93        return self.format == 'ini'
     94
    8195    def setup(self):
    82         if self.format == 'html':
     96        if self.is_html():
    8397            try:
    8498                import asciidocapi
     
    104118            self.output('')
    105119            self.output('.%s' % (text))
     120        elif self.is_ini():
     121            self.output(';')
     122            self.output('; %s' % (text))
     123            self.output(';')
    106124        else:
    107125            self.output('-' * self.line_len)
     
    113131                self.output('*Remotes*:;;')
    114132            else:
    115                 self.output(' Remotes:')
     133                self.output('%s Remotes:' % (self.cini))
    116134            repo_remotes = repo.remotes()
    117135            rc = 0
     
    126144                    self.output('. %s' % (text))
    127145                else:
    128                     self.output('  %2d: %s' % (rc, text))
     146                    self.output('%s  %2d: %s' % (self.cini, rc, text))
    129147            if self.is_asciidoc():
    130148                self.output('*Status*:;;')
    131149            else:
    132                 self.output(' Status:')
    133             if repo.clean():
     150                self.output('%s Status:' % (self.cini))
     151            if repo.dirty():
     152                if self.is_asciidoc():
     153                    self.output('_Repository is dirty_')
     154                else:
     155                    self.output('%s  Repository is dirty' % (self.cini))
     156            else:
    134157                if self.is_asciidoc():
    135158                    self.output('Clean')
    136159                else:
    137                     self.output('  Clean')
    138             else:
    139                 if self.is_asciidoc():
    140                     self.output('_Repository is dirty_')
    141                 else:
    142                     self.output('  Repository is dirty')
     160                    self.output('%s  Clean' % (self.cini))
    143161            repo_head = repo.head()
    144162            if self.is_asciidoc():
     
    146164                self.output('Commit: %s' % (repo_head))
    147165            else:
    148                 self.output(' Head:')
    149                 self.output('  Commit: %s' % (repo_head))
    150         else:
    151             self.output('_Not a valid GIT repository_')
     166                self.output('%s Head:' % (self.cini))
     167                self.output('%s  Commit: %s' % (self.cini, repo_head))
     168        else:
     169            if self.is_asciidoc():
     170                self.output('_Not a valid GIT repository_')
     171            else:
     172                self.output('%s Not a valid GIT repository' % (self.cini))
    152173        if self.is_asciidoc():
    153174            self.output('')
     
    156177
    157178    def introduction(self, name, intro_text = None):
     179        now = datetime.datetime.now().ctime()
    158180        if self.is_asciidoc():
    159181            h = 'RTEMS Source Builder Report'
     
    175197            if intro_text:
    176198                self.output('%s' % ('\n'.join(intro_text)))
     199        elif self.is_ini():
     200            self.output(';')
     201            self.output('; RTEMS Tools Project <rtems-users@rtems.org> %s' % now)
     202            if intro_text:
     203                self.output(';')
     204                self.output('; %s' % ('\n; '.join(intro_text)))
     205                self.output(';')
    177206        else:
    178207            self.output('=' * self.line_len)
    179             self.output('RTEMS Tools Project <rtems-users@rtems.org> %s' % datetime.datetime.now().ctime())
     208            self.output('RTEMS Tools Project <rtems-users@rtems.org> %s' % now)
    180209            if intro_text:
    181210                self.output('')
     
    185214        self.git_status()
    186215
    187     def config_start(self, name):
     216    def config_start(self, name, _config):
     217        self.files['configs'] += [name]
     218        for cf in _config.includes():
     219            cfbn = path.basename(cf)
     220            if cfbn not in self.files['configs']:
     221                self.files['configs'] += [cfbn]
    188222        first = not self.configs_active
    189223        self.configs_active = True
    190224
    191     def config_end(self, name):
     225    def config_end(self, name, _config):
    192226        if self.is_asciidoc():
    193227            self.output('')
     
    196230
    197231    def buildset_start(self, name):
     232        self.files['buildsets'] += [name]
    198233        if self.is_asciidoc():
    199234            h = '%s' % (name)
    200235            self.output('=%s %s' % ('=' * self.bset_nesting, h))
     236        elif self.is_ini():
     237            pass
    201238        else:
    202239            self.output('=-' * (self.line_len / 2))
     
    206243        self.configs_active = False
    207244
    208     def source(self, package, source_tag):
    209         return package.sources()
    210 
    211     def patch(self, package, args):
    212         return package.patches()
     245    def source(self, macros):
     246        def err(msg):
     247            raise error.general('%s' % (msg))
     248        srcs = {}
     249        for n in sources.get_source_names(macros, err):
     250            srcs[n] = sources.get_sources(n, macros, err)
     251        return srcs
     252
     253    def patch(self, macros):
     254        def err(msg):
     255            raise error.general('%s' % (msg))
     256        _patches = {}
     257        for n in sources.get_patch_names(macros, err):
     258            _patches[n] = sources.get_patches(n, macros, err)
     259        patches = {}
     260        for n in _patches:
     261            pl = []
     262            for p in _patches[n]:
     263                pl += [p.split()[-1]]
     264            patches[n] = pl
     265        return patches
     266
     267    def hash(self, name, macros):
     268        return sources.get_hash(name, macros)
    213269
    214270    def output_info(self, name, info, separated = False):
     
    246302                self.output('--------------------------------------------')
    247303
     304    def get_sources_patches(self, macros):
     305        def _merge(src, dst):
     306            for name in src:
     307                if name not in dst:
     308                    dst[name] = []
     309                for s in src[name]:
     310                    dst[name] += [s]
     311                dst[name] = dst[name]
     312        sources = self.source(macros)
     313        _merge(sources, self.sources)
     314        patches = self.patch(macros)
     315        _merge(patches, self.patches)
     316        return sources, patches
     317
    248318    def config(self, _config, opts, macros):
    249 
    250319        packages = _config.packages()
    251320        package = packages['main']
    252321        name = package.name()
    253         self.config_start(name)
     322        sources, patches = self.get_sources_patches(macros)
     323        self.config_start(name, _config)
     324        if self.is_ini():
     325            return
    254326        if self.is_asciidoc():
    255327            self.output('*Package*: _%s_ +' % (name))
     
    267339        if self.is_asciidoc():
    268340            self.output('')
    269         sources = package.sources()
    270341        if self.is_asciidoc():
    271342            self.output('*Sources:*::')
     
    275346            self.output('  Sources: %d' % (len(sources)))
    276347        c = 0
    277         for s in sources:
    278             c += 1
    279             if self.is_asciidoc():
    280                 self.output('. %s' % (sources[s][0]))
    281             else:
    282                 self.output('   %2d: %s' % (c, sources[s][0]))
    283         patches = package.patches()
     348        for name in sources:
     349            for s in sources[name]:
     350                c += 1
     351                if self.is_asciidoc():
     352                    self.output('. %s' % (s))
     353                else:
     354                    self.output('   %2d: %s' % (c, s))
     355                hash = self.hash(path.basename(s).lower(), macros)
     356                if hash is None:
     357                    h = 'No checksum'
     358                else:
     359                    hash = hash.split()
     360                    h = '%s: %s' % (hash[0], hash[1])
     361                if self.is_asciidoc():
     362                    self.output(' %s' % (h))
     363                else:
     364                    self.output('       %s' % (h))
    284365        if self.is_asciidoc():
    285366            self.output('')
     
    296377            else:
    297378                self.output('   %2d: %s' % (c, patches[p][0]))
     379                hash = self.hash(path.basename(s).lower(), macros)
     380                if hash is None:
     381                    h = 'No checksum'
     382                else:
     383                    hash = hash.split()
     384                    h = '%s: %s' % (hash[0], hash[1])
     385                if self.is_asciidoc():
     386                    self.output(' %s' % (h))
     387                else:
     388                    self.output('       %s' % (h))
    298389        self.output_directive('Preparation', package.prep())
    299390        self.output_directive('Build', package.build())
    300391        self.output_directive('Install', package.install())
    301392        self.output_directive('Clean', package.clean())
    302         self.config_end(name)
    303 
    304     def write(self, name):
    305         if self.format == 'html':
     393        self.config_end(name, _config)
     394
     395    def generate_ini(self, sysname):
     396        self.output(';')
     397        self.output('; Buildset File(s):')
     398        for bf in sorted(self.files['buildsets']):
     399            self.output(';   %s' % (bf))
     400        self.output(';')
     401        self.output('; Configuration File(s):')
     402        for cf in sorted(self.files['configs']):
     403            self.output(';   %s' % (cf))
     404        names = sorted(set(self.sources.keys() + self.patches.keys()))
     405        self.output(';')
     406        self.output('')
     407        self.output('[%s]' % (sysname))
     408        for name in names:
     409            self.output('%s = rtems-%s' % (name, name))
     410        for name in names:
     411            self.output('')
     412            self.output('[%s-%s]' % (sysname, name))
     413            if name in self.sources:
     414                self.output('sources = %s' % (', '.join(set(self.sources[name]))))
     415            if name in self.patches:
     416                self.output('patches = %s' % (', '.join(set(self.patches[name]))))
     417
     418    def write(self, sysname, name):
     419        if self.is_html():
    306420            if self.asciidoc is None:
    307421                raise error.general('asciidoc not initialised')
     
    313427            infile.close()
    314428            outfile.close()
     429        elif self.is_ini():
     430            self.generate_ini(sysname)
    315431        if name is not None:
    316432            try:
     
    332448        for c in bset.load():
    333449            if c.endswith('.bset'):
    334                 self.buildset(c, bset.opts, bset.macros)
     450                self.generate(c, bset.opts, bset.macros)
    335451            elif c.endswith('.cfg'):
    336452                self.config(config.file(c, bset.opts, bset.macros),
     
    341457        self.bset_nesting -= 1
    342458
    343     def create(self, inname, outname = None, intro_text = None):
     459    def create(self, sysname, inname, outname = None, intro_text = None):
    344460        self.setup()
    345461        self.introduction(inname, intro_text)
    346462        self.generate(inname)
    347         self.write(outname)
     463        self.write(sysname, outname)
    348464
    349465def run(args):
    350466    try:
     467        sysname = 'rtems'
    351468        optargs = { '--list-bsets':   'List available build sets',
    352469                    '--list-configs': 'List available configurations',
    353                     '--format':       'Output format (text, html, asciidoc)',
     470                    '--format':       'Output format (text, html, asciidoc, ini)',
    354471                    '--output':       'File name to output the report' }
    355472        opts = options.load(args, optargs)
     
    379496                    format = 'html'
    380497                    ext = '.html'
     498                elif format_opt[1] == 'ini':
     499                    format = 'ini'
     500                    ext = '.ini'
    381501                else:
    382502                    raise error.general('invalid format: %s' % (format_opt[1]))
     
    391511                if config is None:
    392512                    raise error.general('config file not found: %s' % (inname))
    393                 r.create(config, outname)
     513                r.create(sysname, config, outname)
    394514            del r
    395515        else:
Note: See TracChangeset for help on using the changeset viewer.