1#!/usr/bin/env python3
2#
3# Collects the recorded SRCREV values from buildhistory and reports on them
4#
5# Copyright 2013 Intel Corporation
6# Authored-by:  Paul Eggleton <paul.eggleton@intel.com>
7#
8# SPDX-License-Identifier: GPL-2.0-only
9#
10
11import collections
12import os
13import sys
14import optparse
15import logging
16
17def logger_create():
18    logger = logging.getLogger("buildhistory")
19    loggerhandler = logging.StreamHandler()
20    loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
21    logger.addHandler(loggerhandler)
22    logger.setLevel(logging.INFO)
23    return logger
24
25logger = logger_create()
26
27def main():
28    parser = optparse.OptionParser(
29        description = "Collects the recorded SRCREV values from buildhistory and reports on them.",
30        usage = """
31    %prog [options]""")
32
33    parser.add_option("-a", "--report-all",
34            help = "Report all SRCREV values, not just ones where AUTOREV has been used",
35            action="store_true", dest="reportall")
36    parser.add_option("-f", "--forcevariable",
37            help = "Use forcevariable override for all output lines",
38            action="store_true", dest="forcevariable")
39    parser.add_option("-p", "--buildhistory-dir",
40            help = "Specify path to buildhistory directory (defaults to buildhistory/ under cwd)",
41            action="store", dest="buildhistory_dir", default='buildhistory/')
42
43    options, args = parser.parse_args(sys.argv)
44
45    if len(args) > 1:
46        sys.stderr.write('Invalid argument(s) specified: %s\n\n' % ' '.join(args[1:]))
47        parser.print_help()
48        sys.exit(1)
49
50    if not os.path.exists(options.buildhistory_dir):
51        sys.stderr.write('Buildhistory directory "%s" does not exist\n\n' % options.buildhistory_dir)
52        parser.print_help()
53        sys.exit(1)
54
55    if options.forcevariable:
56        forcevariable = '_forcevariable'
57    else:
58        forcevariable = ''
59
60    all_srcrevs = collections.defaultdict(list)
61    for root, dirs, files in os.walk(options.buildhistory_dir):
62        if '.git' in dirs:
63            dirs.remove('.git')
64        for fn in files:
65            if fn == 'latest_srcrev':
66                curdir = os.path.basename(os.path.dirname(root))
67                fullpath = os.path.join(root, fn)
68                pn = os.path.basename(root)
69                srcrev = None
70                orig_srcrev = None
71                orig_srcrevs = {}
72                srcrevs = {}
73                with open(fullpath) as f:
74                    for line in f:
75                        if '=' in line:
76                            splitval = line.split('=')
77                            value = splitval[1].strip('" \t\n\r')
78                        if line.startswith('# SRCREV = '):
79                            orig_srcrev = value
80                        elif line.startswith('# SRCREV_'):
81                            splitval = line.split('=')
82                            name = splitval[0].split('_')[1].strip()
83                            orig_srcrevs[name] = value
84                        elif line.startswith('SRCREV ='):
85                            srcrev = value
86                        elif line.startswith('SRCREV_'):
87                            name = splitval[0].split('_')[1].strip()
88                            srcrevs[name] = value
89                if srcrev and (options.reportall or srcrev != orig_srcrev):
90                    all_srcrevs[curdir].append((pn, None, srcrev))
91                for name, value in srcrevs.items():
92                    orig = orig_srcrevs.get(name, orig_srcrev)
93                    if options.reportall or value != orig:
94                        all_srcrevs[curdir].append((pn, name, value))
95
96    for curdir, srcrevs in sorted(all_srcrevs.items()):
97        if srcrevs:
98            print('# %s' % curdir)
99            for pn, name, srcrev in srcrevs:
100                if name:
101                    print('SRCREV_%s_pn-%s%s = "%s"' % (name, pn, forcevariable, srcrev))
102                else:
103                    print('SRCREV_pn-%s%s = "%s"' % (pn, forcevariable, srcrev))
104
105
106if __name__ == "__main__":
107    main()
108