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