def _get_recipe_upgrade_status(data): uv = get_recipe_upstream_version(data) pn = data.getVar('PN') cur_ver = uv['current_version'] upstream_version_unknown = data.getVar('UPSTREAM_VERSION_UNKNOWN') if not uv['version']: status = "UNKNOWN" if upstream_version_unknown else "UNKNOWN_BROKEN" else: cmp = vercmp_string(uv['current_version'], uv['version']) if cmp == -1: status = "UPDATE" if not upstream_version_unknown else "KNOWN_BROKEN" elif cmp == 0: status = "MATCH" if not upstream_version_unknown else "KNOWN_BROKEN" else: status = "UNKNOWN" if upstream_version_unknown else "UNKNOWN_BROKEN" next_ver = uv['version'] if uv['version'] else "N/A" revision = uv['revision'] if uv['revision'] else "N/A" maintainer = data.getVar('RECIPE_MAINTAINER') no_upgrade_reason = data.getVar('RECIPE_NO_UPDATE_REASON') return (pn, status, cur_ver, next_ver, maintainer, revision, no_upgrade_reason)
def get_upstream_info(layerbranch, recipe_data, result): from bb.utils import vercmp_string from oe.recipeutils import get_recipe_upstream_version, \ get_recipe_pv_without_srcpv pn = recipe_data.getVar('PN', True) recipes = Recipe.objects.filter(layerbranch=layerbranch, pn=pn) if not recipes: logger.warning("%s: in layer branch %s not found." % \ (pn, str(layerbranch))) return recipe = recipes[0] ru = RecipeUpstream() ru.recipe = recipe ru_info = None try: ru_info = get_recipe_upstream_version(recipe_data) except Exception as e: logger.exception("%s: in layer branch %s, %s" % (pn, str(layerbranch), str(e))) if ru_info is not None and ru_info['version']: ru.version = ru_info['version'] ru.type = ru_info['type'] ru.date = ru_info['datetime'] pv, _, _ = get_recipe_pv_without_srcpv(recipe.pv, get_pv_type(recipe.pv)) upv, _, _ = get_recipe_pv_without_srcpv( ru_info['version'], get_pv_type(ru_info['version'])) if pv and upv: cmp_ver = vercmp_string(pv, upv) if cmp_ver == -1: ru.status = 'N' # Not update elif cmp_ver == 0: ru.status = 'Y' # Up-to-date elif cmp_ver == 1: ru.status = 'D' # Downgrade, need to review why else: logger.debug( 'Unable to determine upgrade status for %s: %s -> %s' % (recipe.pn, pv, upv)) ru.status = 'U' # Unknown else: ru.version = '' ru.type = 'M' ru.date = datetime.now() ru.status = 'U' # Unknown ru.no_update_reason = recipe_data.getVar('RECIPE_NO_UPDATE_REASON', True) or '' result.append((recipe, ru))
def get_recipe_upgrade_status(recipes=None): pkgs_list = [] with bb.tinfoil.Tinfoil() as tinfoil: tinfoil.prepare(config_only=False) if not recipes: recipes = tinfoil.all_recipe_files(variants=False) for fn in recipes: try: if fn.startswith("/"): data = tinfoil.parse_recipe_file(fn) else: data = tinfoil.parse_recipe(fn) except bb.providers.NoProvider: bb.note(" No provider for %s" % fn) continue unreliable = data.getVar('UPSTREAM_CHECK_UNRELIABLE') if unreliable == "1": bb.note(" Skip package %s as upstream check unreliable" % pn) continue uv = get_recipe_upstream_version(data) pn = data.getVar('PN') cur_ver = uv['current_version'] upstream_version_unknown = data.getVar('UPSTREAM_VERSION_UNKNOWN') if not uv['version']: status = "UNKNOWN" if upstream_version_unknown else "UNKNOWN_BROKEN" else: cmp = vercmp_string(uv['current_version'], uv['version']) if cmp == -1: status = "UPDATE" if not upstream_version_unknown else "KNOWN_BROKEN" elif cmp == 0: status = "MATCH" if not upstream_version_unknown else "KNOWN_BROKEN" else: status = "UNKNOWN" if upstream_version_unknown else "UNKNOWN_BROKEN" next_ver = uv['version'] if uv['version'] else "N/A" revision = uv['revision'] if uv['revision'] else "N/A" maintainer = data.getVar('RECIPE_MAINTAINER') no_upgrade_reason = data.getVar('RECIPE_NO_UPDATE_REASON') pkgs_list.append((pn, status, cur_ver, next_ver, maintainer, revision, no_upgrade_reason)) return pkgs_list
def _create_upgrade(recipe_data, layerbranch, ct, title, info, logger, initial=False): from layerindex.models import Recipe from rrs.models import RecipeUpgrade from bb.utils import vercmp_string pn = recipe_data.getVar('PN', True) pv = recipe_data.getVar('PV', True) if '..' in pv or pv.endswith('.'): logger.warn('Invalid version for recipe %s in commit %s, ignoring' % (recipe_data.getVar('FILE', True), ct)) return recipes = Recipe.objects.filter(pn=pn, layerbranch=layerbranch).order_by('id') if not recipes: logger.warn("%s: Not found in Layer branch %s." % (pn, str(layerbranch))) return recipe = recipes[0] try: latest_upgrade = RecipeUpgrade.objects.filter( recipe=recipe).order_by('-commit_date')[0] prev_pv = latest_upgrade.version except KeyboardInterrupt: raise except: prev_pv = None if prev_pv is None: logger.debug("%s: Initial upgrade ( -> %s)." % (recipe.pn, pv)) _save_upgrade(recipe, pv, ct, title, info, logger) else: from common import get_recipe_pv_without_srcpv (ppv, _, _) = get_recipe_pv_without_srcpv(prev_pv, get_pv_type(prev_pv)) (npv, _, _) = get_recipe_pv_without_srcpv(pv, get_pv_type(pv)) try: if npv == 'git': logger.debug("%s: Avoiding upgrade to unversioned git." % \ (recipe.pn)) elif ppv == 'git' or vercmp_string(ppv, npv) == -1: if initial is True: logger.debug("%s: Update initial upgrade ( -> %s)." % \ (recipe.pn, pv)) latest_upgrade.version = pv latest_upgrade.save() else: logger.debug("%s: detected upgrade (%s -> %s)" \ " in ct %s." % (pn, prev_pv, pv, ct)) _save_upgrade(recipe, pv, ct, title, info, logger) except KeyboardInterrupt: raise except Exception as e: logger.error("%s: fail to detect upgrade (%s -> %s)" \ " in ct %s: %s" % (pn, prev_pv, pv, ct, str(e)))
def _create_upgrade(recipe_data, layerbranch, ct, title, info, filepath, logger, initial=False, orig_filepath=None): from rrs.models import RecipeUpgrade, RecipeSymbol, RecipeUpgradeGroupRule from bb.utils import vercmp_string pn = recipe_data.getVar('PN', True) pv = recipe_data.getVar('PV', True) srcrev = recipe_data.getVar('SRCREV', True) if srcrev == 'INVALID': srcrev = '' license = recipe_data.getVar('LICENSE', True) if '..' in pv or pv.endswith('.'): logger.warn('Invalid version for recipe %s in commit %s, ignoring' % (recipe_data.getVar('FILE', True), ct)) return summary = recipe_data.getVar('SUMMARY', True) or recipe_data.getVar('DESCRIPTION', True) recipesymbol = RecipeSymbol.symbol(recipe_data.getVar('PN', True), layerbranch, summary=summary) all_rupgrades = RecipeUpgrade.objects.filter(recipesymbol=recipesymbol).exclude(sha1=ct) rupgrades = all_rupgrades group = RecipeUpgradeGroupRule.group_for_params(recipesymbol, pv, license) if group: rupgrades = all_rupgrades.filter(group=group) latest_upgrade = rupgrades.order_by('-commit_date', '-id').first() if latest_upgrade: prev_pv = latest_upgrade.version prev_srcrev = latest_upgrade.srcrev else: prev_pv = None prev_srcrev = '' if prev_pv is None: logger.debug("%s: Initial upgrade ( -> %s)." % (pn, pv)) _save_upgrade(recipesymbol, layerbranch, pv, srcrev, license, ct, title, info, filepath, logger) else: from common import get_recipe_pv_without_srcpv (ppv, _, _) = get_recipe_pv_without_srcpv(prev_pv, get_pv_type(prev_pv)) (npv, _, _) = get_recipe_pv_without_srcpv(pv, get_pv_type(pv)) try: vercmp_result = 0 if not (npv == 'git' or ppv == 'git'): vercmp_result = vercmp_string(ppv, npv) if npv == 'git': logger.debug("%s: Avoiding upgrade to unversioned git." % pn) elif ppv == 'git' or vercmp_result != 0 or srcrev != prev_srcrev or latest_upgrade.upgrade_type == 'R': if initial is True: logger.debug("%s: Update initial upgrade ( -> %s)." % \ (pn, pv)) latest_upgrade.filepath = filepath latest_upgrade.version = pv latest_upgrade.save() else: # Check if the "new" version is already in the database same_pv_upgrade = all_rupgrades.filter(version=pv).order_by('-commit_date', '-id').first() if same_pv_upgrade and \ not all_rupgrades.filter(prev_version=pv, commit_date__gt=same_pv_upgrade.commit_date).exists() \ and \ not all_rupgrades.filter(upgrade_type__in=['R', 'N'], commit_date__gt=same_pv_upgrade.commit_date).exists(): # The "previous" recipe is still present, we won't call this an upgrade logger.debug('%s: new version %s already exists' % (pn, pv)) return upgrade_type = 'U' if vercmp_result == 1: upgrade_type = 'D' op = {'U': 'upgrade', 'D': 'downgrade'}[upgrade_type] logger.debug("%s: detected %s (%s -> %s)" \ " in ct %s." % (pn, op, prev_pv, pv, ct)) _save_upgrade(recipesymbol, layerbranch, pv, srcrev, license, ct, title, info, filepath, logger, upgrade_type=upgrade_type, orig_filepath=orig_filepath, prev_version=prev_pv) except KeyboardInterrupt: raise except Exception as e: logger.error("%s: fail to detect upgrade (%s -> %s)" \ " in ct %s: %s" % (pn, prev_pv, pv, ct, str(e)))