#!/usr/bin/env python3 # # Copyright (c) 2017, Intel Corporation. # # This program is free software; you can redistribute it and/or modify it # under the terms and conditions of the GNU General Public License, # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # import os import shutil import csv import sys import argparse __version__ = "0.1.0" # set of BPNs recipenames = set() # map of recipe -> data allrecipes = {} def make_bpn(recipe): prefixes = ("nativesdk-",) suffixes = ("-native", "-cross", "-initial", "-intermediate", "-crosssdk", "-cross-canadian") for ix in prefixes + suffixes: if ix in recipe: recipe = recipe.replace(ix, "") return recipe def gather_recipes(rows): for row in rows: recipe = row[0] bpn = make_bpn(recipe) if bpn not in recipenames: recipenames.add(bpn) if recipe not in allrecipes: allrecipes[recipe] = row def generate_recipe_list(): # machine list machine_list = ( "qemuarm64", "qemuarm", "qemumips64", "qemumips", "qemuppc", "qemux86-64", "qemux86" ) # set filename format fnformat = 'distrodata.%s.csv' # store all data files in distrodata datadir = 'distrodata' # create the directory if it does not exists if not os.path.exists(datadir): os.mkdir(datadir) # doing bitbake distrodata for machine in machine_list: os.system('MACHINE='+ machine + ' bitbake -k universe -c distrodata') shutil.copy('tmp/log/distrodata.csv', 'distrodata/' + fnformat % machine) for machine in machine_list: with open('distrodata/' + fnformat % machine) as f: reader = csv.reader(f) rows = reader.__iter__() gather_recipes(rows) with open('recipe-list.txt', 'w') as f: for recipe in sorted(recipenames): f.write("%s\n" % recipe) print("file : recipe-list.txt is created with %d entries." % len(recipenames)) with open('all-recipe-list.txt', 'w') as f: for recipe, row in sorted(allrecipes.items()): f.write("%s\n" % ','.join(row)) def diff_for_new_recipes(recipe1, recipe2): prev_recipe_path = recipe1 + '/' curr_recipe_path = recipe2 + '/' if not os.path.isfile(prev_recipe_path + 'recipe-list.txt') or not os.path.isfile(curr_recipe_path + 'recipe-list.txt'): print("recipe files do not exists. please verify that the file exists.") exit(1) import csv prev = [] new = [] with open(prev_recipe_path + 'recipe-list.txt') as f: prev = f.readlines() with open(curr_recipe_path + 'recipe-list.txt') as f: new = f.readlines() updates = [] for pn in new: if not pn in prev: updates.append(pn.rstrip()) allrecipe = [] with open(recipe1 + '_' + recipe2 + '_new_recipe_list.txt','w') as dr: with open(curr_recipe_path + 'all-recipe-list.txt') as f: reader = csv.reader(f, delimiter=',') for row in reader: if row[0] in updates: dr.write("%s,%s,%s" % (row[0], row[3], row[5])) if len(row[9:]) > 0: dr.write(",%s" % ','.join(row[9:])) dr.write("\n") def main(argv): if argv[0] == "generate_recipe_list": generate_recipe_list() elif argv[0] == "compare_recipe": diff_for_new_recipes(argv[1], argv[2]) else: print("no such option. choose either 'generate_recipe_list' or 'compare_recipe'") exit(0) if __name__ == "__main__": try: sys.exit(main(sys.argv[1:])) except Exception as e: print("Exception :", e) sys.exit(1)