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