Beispiel #1
0
 def checkout_layer(lb, lcommit=None, lcommitdate=None, force=False):
     urldir = str(lb.layer.get_fetch_dir())
     repodir = os.path.join(fetchdir, urldir)
     if not repodir in done_repos:
         if not lcommit:
             lcommit = utils.runcmd(
                 'git rev-list -1 --before="%s" origin/master' %
                 lcommitdate,
                 repodir,
                 logger=logger).strip()
         utils.checkout_repo(repodir, lcommit, logger, force)
         done_repos.append(repodir)
 def checkout_layer(lb, lcommit=None, lcommitdate=None, force=False):
     urldir = str(lb.layer.get_fetch_dir())
     repodir = os.path.join(fetchdir, urldir)
     if not repodir in done_repos:
         if not lcommit:
             lcommit = utils.runcmd(['git', 'rev-list', '-1', '--before=%s' % lcommitdate, 'origin/master'], repodir, logger=logger).strip()
         if lb.layer.name == 'openembedded-core':
             lmapcommit = oecore_map.get(lcommit, None)
             if lmapcommit:
                 logger.debug('Preferring OE-Core revision %s over %s' % (lmapcommit, lcommit))
                 lcommit = lmapcommit
         utils.checkout_repo(repodir, lcommit, logger, force)
         if lcommit in oecore_bad_revs_2:
             # Fix issue that was introduced in 309a02931779f32d1139cc1169a039cbe4638706 and fixed in 40a904bf8bc1279c3da0893c003f740f1d2066c2
             with open(os.path.join(repodir, 'meta/conf/bitbake.conf'), 'r') as f:
                 lines = f.readlines()
             lines.insert(0, 'BBINCLUDED ?= ""\n')
             with open(os.path.join(repodir, 'meta/conf/bitbake.conf'), 'w') as f:
                 f.writelines(lines)
         done_repos.append(repodir)
Beispiel #3
0
def generate_history(options, layerbranch_id, commit, logger):
    from layerindex.models import LayerBranch
    from rrs.models import Release
    layerbranch = LayerBranch.objects.get(id=layerbranch_id)

    fetchdir = settings.LAYER_FETCH_DIR
    if not fetchdir:
        logger.error("Please set LAYER_FETCH_DIR in settings.py")
        sys.exit(1)

    layer = layerbranch.layer
    urldir = str(layer.get_fetch_dir())
    repodir = os.path.join(fetchdir, urldir)
    layerdir = os.path.join(repodir, str(layerbranch.vcs_subdir))

    commitdate = checkout_layer_deps(layerbranch, commit, fetchdir, logger)

    if options.initial:
        fns = None
    else:
        fns = _get_recipes_filenames(commit, repodir, layerdir, logger)
        if not fns:
            return

    # setup bitbake
    bitbakepath = os.path.join(fetchdir, 'bitbake')
    if options.bitbake_rev:
        bitbake_rev = options.bitbake_rev
        if not re.match('^[0-9a-f]{40}$', bitbake_rev):
            # Branch name, need to check out detached
            bitbake_rev = 'origin/%s' % bitbake_rev
    else:
        bitbake_rev = utils.runcmd([
            'git', 'rev-list', '-1',
            '--before=%s' % commitdate, 'origin/master'
        ],
                                   bitbakepath,
                                   logger=logger).strip()
    utils.checkout_repo(bitbakepath, bitbake_rev, logger)
    sys.path.insert(0, os.path.join(bitbakepath, 'lib'))

    (tinfoil, d, recipes, tempdir) = load_recipes(layerbranch,
                                                  bitbakepath,
                                                  fetchdir,
                                                  settings,
                                                  logger,
                                                  recipe_files=fns,
                                                  nocheckout=True)
    try:

        if options.initial:
            title = options.initial
            info = 'No maintainer;;' + utils.runcmd([
                'git', 'log', '--format=%ad;%cd', '--date=rfc', '-n', '1',
                commit
            ],
                                                    destdir=repodir,
                                                    logger=logger)
            recordcommit = ''
        else:
            title = utils.runcmd(
                ['git', 'log', '--format=%s', '-n', '1', commit],
                repodir,
                logger=logger)
            info = utils.runcmd([
                'git', 'log', '--format=%an;%ae;%ad;%cd', '--date=rfc', '-n',
                '1', commit
            ],
                                destdir=repodir,
                                logger=logger)
            recordcommit = commit

        try:
            with transaction.atomic():
                for recipe_data in recipes:
                    _create_upgrade(recipe_data,
                                    layerbranch,
                                    recordcommit,
                                    title,
                                    info,
                                    logger,
                                    initial=options.initial)
                if options.dry_run:
                    raise DryRunRollbackException
        except DryRunRollbackException:
            pass

    finally:
        if tinfoil and hasattr(tinfoil, 'shutdown') and (LooseVersion(
                bb.__version__) > LooseVersion("1.27")):
            tinfoil.shutdown()
        utils.rmtree_force(tempdir)
def generate_history(options, layerbranch_id, commit, logger):
    from layerindex.models import LayerBranch
    from rrs.models import Release, RecipeUpgrade
    layerbranch = LayerBranch.objects.get(id=layerbranch_id)

    fetchdir = settings.LAYER_FETCH_DIR
    if not fetchdir:
        logger.error("Please set LAYER_FETCH_DIR in settings.py")
        sys.exit(1)

    layer = layerbranch.layer
    urldir = str(layer.get_fetch_dir())
    repodir = os.path.join(fetchdir, urldir)
    layerdir = os.path.join(repodir, str(layerbranch.vcs_subdir))

    if layerbranch.vcs_subdir:
        layersubdir_start = layerbranch.vcs_subdir
        if not layersubdir_start.endswith('/'):
            layersubdir_start += '/'
    else:
        layersubdir_start = ''

    repo = git.Repo(repodir)
    if repo.bare:
        logger.error('Repository %s is bare, not supported' % repodir)
        sys.exit(1)

    commitdate = checkout_layer_deps(layerbranch, commit, fetchdir, logger)

    if options.initial:
        fns = None
        deleted = []
        moved = []
    else:
        if options.filter_files:
            filepath_start = options.filter_files
        else:
            filepath_start = layersubdir_start
        fns, deleted, moved = _get_recipes_filenames(commit, repo, repodir, filepath_start, logger)
        if not (fns or deleted or moved):
            return

    # setup bitbake
    bitbakepath = os.path.join(fetchdir, 'bitbake')
    if options.bitbake_rev:
        bitbake_rev = options.bitbake_rev
        if not re.match('^[0-9a-f]{40}$', bitbake_rev):
            # Branch name, need to check out detached
            bitbake_rev = 'origin/%s' % bitbake_rev
    else:
        bitbake_rev = utils.runcmd(['git', 'rev-list', '-1', '--before=%s' % commitdate, 'origin/master'], bitbakepath, logger=logger).strip()
    utils.checkout_repo(bitbakepath, bitbake_rev, logger)
    sys.path.insert(0, os.path.join(bitbakepath, 'lib'))

    (tinfoil, d, recipes, tempdir) = load_recipes(layerbranch, bitbakepath,
                        fetchdir, settings, logger, recipe_files=fns,
                        nocheckout=True)
    try:

        if options.initial:
            title = options.initial
            info = 'No maintainer;;' + utils.runcmd(['git', 'log', '--format=%ad;%cd', '--date=rfc', '-n', '1', commit], destdir=repodir, logger=logger)
            recordcommit = ''
        else:
            title = utils.runcmd(['git', 'log', '--format=%s', '-n', '1', commit],
                                            repodir, logger=logger)
            info = utils.runcmd(['git', 'log', '--format=%an;%ae;%ad;%cd', '--date=rfc', '-n', '1', commit], destdir=repodir, logger=logger)
            recordcommit = commit

        fn_data = {}
        for recipe_data in recipes:
            fn = os.path.relpath(recipe_data.getVar('FILE', True), repodir)
            fn_data[fn] = recipe_data

        seen_pns = []
        try:
            with transaction.atomic():
                # Handle recipes where PN has changed
                for a, b in moved:
                    logger.debug('Move %s -> %s' % (a,b))
                    rus = RecipeUpgrade.objects.filter(recipesymbol__layerbranch=layerbranch, filepath=a).order_by('-commit_date', '-id')
                    recipe_data = fn_data.get(b, None)
                    if recipe_data:
                        pn = recipe_data.getVar('PN', True)
                        ru = rus.first()
                        if ru and ru.recipesymbol.pn != pn:
                            # PN has been changed! We need to mark the old record as deleted
                            logger.debug('PN changed (with move): %s -> %s' % (ru.recipesymbol.pn, pn))
                            if a not in deleted:
                                deleted.append(a)
                    else:
                        logger.warning('Unable to find parsed data for recipe %s' % b)

                # Handle recipes that exist at this point in time (which may have upgraded)
                for recipe_data in recipes:
                    pn = recipe_data.getVar('PN', True)
                    filepath = os.path.relpath(recipe_data.getVar('FILE', True), repodir)
                    # Check if PN has changed internally
                    rus = RecipeUpgrade.objects.filter(recipesymbol__layerbranch=layerbranch, filepath=filepath).order_by('-commit_date', '-id')
                    deleted_pns = rus.filter(upgrade_type__in=['R', 'N']).values_list('recipesymbol__pn', flat=True).distinct()
                    for ru in rus:
                        if ru.recipesymbol.pn != pn and ru.recipesymbol.pn not in deleted_pns and ru.upgrade_type not in ['R', 'N']:
                            # PN changed (set within recipe), we need to mark the old recipe as deleted
                            logger.debug('PN changed (without move): %s -> %s' % (ru.recipesymbol.pn, pn))
                            _save_upgrade(ru.recipesymbol, layerbranch, ru.version, ru.srcrev, ru.license, recordcommit, title, info, ru.filepath, logger, upgrade_type='R')
                    orig_filepath = None
                    for a, b in moved:
                        if b == filepath:
                            orig_filepath = a
                            break
                    _create_upgrade(recipe_data, layerbranch, recordcommit, title,
                            info, filepath, logger, initial=options.initial, orig_filepath=orig_filepath)
                    seen_pns.append(pn)

                # Handle recipes that have been moved without it being an upgrade/delete
                for a, b in moved:
                    if a not in deleted:
                        rus = RecipeUpgrade.objects.filter(recipesymbol__layerbranch=layerbranch, filepath=a).order_by('-commit_date', '-id')
                        if rus:
                            ru = rus.first()
                            if not RecipeUpgrade.objects.filter(recipesymbol=ru.recipesymbol, filepath=b).exists():
                                # Need to record the move, otherwise we won't be able to
                                # find the record if we need to mark the recipe as deleted later
                                _save_upgrade(ru.recipesymbol, layerbranch, ru.version, ru.srcrev, ru.license, recordcommit, title, info, b, logger, upgrade_type='M', orig_filepath=a)

                # Handle deleted recipes
                for df in deleted:
                    rus = RecipeUpgrade.objects.filter(recipesymbol__layerbranch=layerbranch, filepath=df).order_by('-commit_date', '-id')
                    for ru in rus:
                        other_rus = RecipeUpgrade.objects.filter(recipesymbol=ru.recipesymbol, commit_date__gte=ru.commit_date).exclude(filepath=df).order_by('-commit_date', '-id')
                        # We make a distinction between deleting just one version and the entire recipe being deleted
                        upgrade_type = 'R'
                        for other_ru in other_rus:
                            if other_ru.upgrade_type == 'R':
                                logger.debug('There is a delete: %s' % other_ru)
                                upgrade_type = ''
                                break
                            if os.path.exists(os.path.join(repodir, other_ru.filepath)):
                                upgrade_type = 'N'
                        if not upgrade_type:
                            continue
                        if ru.upgrade_type != upgrade_type and ru.recipesymbol.pn not in seen_pns:
                            if upgrade_type == 'R':
                                finalmsg = ' [FINAL]'
                            else:
                                finalmsg = ''
                            logger.debug("%s: marking as deleted%s (%s)" % (ru.recipesymbol.pn, finalmsg, ru.filepath))
                            _save_upgrade(ru.recipesymbol, layerbranch, ru.version, ru.srcrev, ru.license, recordcommit, title, info, df, logger, upgrade_type=upgrade_type)
                            break

                if options.dry_run:
                    raise DryRunRollbackException
        except DryRunRollbackException:
            pass

    finally:
        if tinfoil and hasattr(tinfoil, 'shutdown') and (LooseVersion(bb.__version__) > LooseVersion("1.27")):
            tinfoil.shutdown()
        utils.rmtree_force(tempdir)