[prev in list] [next in list] [prev in thread] [next in thread]
List: openembedded-core
Subject: [OE-core] [PATCH 7/8] PEP8 double aggressive E301 ~ E306
From: "Armin Kuster" <akuster808 () gmail ! com>
Date: 2021-06-29 14:08:25
Message-ID: 20210629140826.13243-8-akuster808 () gmail ! com
[Download RAW message or body]
From: persianpros <persianpros@yahoo.com>
---
meta-selftest/lib/devtool/bbpath.py | 7 ++++
meta-selftest/lib/devtool/test.py | 2 ++
.../lib/oeqa/runtime/cases/dnf_runtime.py | 1 +
.../lib/oeqa/runtime/cases/selftest.py | 1 +
meta-selftest/lib/oeqa/runtime/cases/virgl.py | 1 +
meta-selftest/lib/recipetool/bbpath.py | 7 ++++
meta/files/ext-sdk-prepare.py | 5 +++
meta/lib/bblayers/create.py | 3 ++
meta/lib/buildstats.py | 2 +-
meta/lib/oe/buildhistory_analysis.py | 7 ++++
meta/lib/oe/cachedpath.py | 1 +
meta/lib/oe/classextend.py | 4 +++
meta/lib/oe/classutils.py | 3 ++
meta/lib/oe/copy_buildsystem.py | 7 ++++
meta/lib/oe/cve_check.py | 2 ++
meta/lib/oe/data.py | 2 ++
meta/lib/oe/distro_check.py | 20 ++++++++++-
meta/lib/oe/elf.py | 1 +
meta/lib/oe/gpg_sign.py | 5 ++-
meta/lib/oe/license.py | 19 ++++++++++
meta/lib/oe/lsb.py | 5 +++
meta/lib/oe/maketype.py | 7 ++++
meta/lib/oe/manifest.py | 5 ++-
meta/lib/oe/package.py | 10 ++++++
meta/lib/oe/package_manager/__init__.py | 10 +++++-
meta/lib/oe/package_manager/deb/__init__.py | 6 ++--
meta/lib/oe/package_manager/deb/manifest.py | 1 +
meta/lib/oe/package_manager/deb/rootfs.py | 3 +-
meta/lib/oe/package_manager/deb/sdk.py | 2 +-
meta/lib/oe/package_manager/ipk/__init__.py | 5 +--
meta/lib/oe/package_manager/ipk/manifest.py | 2 ++
meta/lib/oe/package_manager/ipk/rootfs.py | 6 ++++
meta/lib/oe/package_manager/ipk/sdk.py | 1 +
meta/lib/oe/package_manager/rpm/__init__.py | 5 +--
meta/lib/oe/package_manager/rpm/manifest.py | 2 ++
meta/lib/oe/package_manager/rpm/rootfs.py | 3 +-
meta/lib/oe/package_manager/rpm/sdk.py | 1 +
meta/lib/oe/packagedata.py | 12 +++++++
meta/lib/oe/packagegroup.py | 6 ++++
meta/lib/oe/patch.py | 13 +++++--
meta/lib/oe/path.py | 17 +++++++++
meta/lib/oe/prservice.py | 5 +++
meta/lib/oe/qa.py | 4 +++
meta/lib/oe/recipeutils.py | 10 +++++-
meta/lib/oe/reproducible.py | 6 ++++
meta/lib/oe/rootfs.py | 7 ++--
meta/lib/oe/sdk.py | 4 +++
meta/lib/oe/sstatesig.py | 18 ++++++++++
meta/lib/oe/terminal.py | 21 +++++++++++
meta/lib/oe/types.py | 13 +++++++
meta/lib/oe/useradd.py | 5 +++
meta/lib/oe/utils.py | 35 +++++++++++++++++++
meta/lib/oeqa/buildperf/base.py | 2 --
meta/lib/oeqa/buildperf/test_basic.py | 1 +
meta/lib/oeqa/controllers/masterimage.py | 1 +
meta/lib/oeqa/controllers/testtargetloader.py | 2 ++
meta/lib/oeqa/core/case.py | 3 ++
.../lib/oeqa/core/cases/example/test_basic.py | 2 ++
meta/lib/oeqa/core/context.py | 4 +++
meta/lib/oeqa/core/decorator/__init__.py | 5 +++
meta/lib/oeqa/core/decorator/data.py | 16 +++++++++
meta/lib/oeqa/core/decorator/depends.py | 5 +++
meta/lib/oeqa/core/decorator/oetimeout.py | 2 ++
meta/lib/oeqa/core/exception.py | 7 ++++
meta/lib/oeqa/core/loader.py | 4 ++-
meta/lib/oeqa/core/runner.py | 7 ++++
meta/lib/oeqa/core/target/__init__.py | 1 +
meta/lib/oeqa/core/target/qemu.py | 1 +
meta/lib/oeqa/core/target/ssh.py | 4 +--
meta/lib/oeqa/core/tests/cases/data.py | 1 +
meta/lib/oeqa/core/tests/cases/depends.py | 1 +
.../core/tests/cases/loader/valid/another.py | 1 +
meta/lib/oeqa/core/tests/cases/oetag.py | 2 ++
meta/lib/oeqa/core/tests/cases/timeout.py | 2 +-
meta/lib/oeqa/core/tests/common.py | 2 ++
meta/lib/oeqa/core/tests/test_data.py | 2 ++
meta/lib/oeqa/core/tests/test_decorators.py | 4 +++
meta/lib/oeqa/core/tests/test_loader.py | 2 ++
meta/lib/oeqa/core/tests/test_runner.py | 2 ++
meta/lib/oeqa/core/utils/concurrencytest.py | 18 ++++++++++
meta/lib/oeqa/core/utils/misc.py | 7 ++++
meta/lib/oeqa/core/utils/path.py | 2 ++
meta/lib/oeqa/core/utils/test.py | 11 ++++++
meta/lib/oeqa/oetest.py | 16 +++++++++
meta/lib/oeqa/runexported.py | 5 +++
meta/lib/oeqa/runtime/case.py | 1 +
meta/lib/oeqa/runtime/cases/_qemutiny.py | 1 +
meta/lib/oeqa/runtime/cases/apt.py | 2 ++
meta/lib/oeqa/runtime/cases/boot.py | 1 +
meta/lib/oeqa/runtime/cases/buildcpio.py | 1 +
.../lib/oeqa/runtime/cases/buildgalculator.py | 1 +
meta/lib/oeqa/runtime/cases/buildlzip.py | 1 +
meta/lib/oeqa/runtime/cases/connman.py | 1 +
meta/lib/oeqa/runtime/cases/date.py | 1 +
meta/lib/oeqa/runtime/cases/df.py | 1 +
meta/lib/oeqa/runtime/cases/dnf.py | 3 ++
.../oeqa/runtime/cases/ethernet_ip_connman.py | 1 +
meta/lib/oeqa/runtime/cases/gcc.py | 1 +
meta/lib/oeqa/runtime/cases/gi.py | 1 +
meta/lib/oeqa/runtime/cases/gstreamer.py | 1 +
meta/lib/oeqa/runtime/cases/kernelmodule.py | 1 +
meta/lib/oeqa/runtime/cases/ksample.py | 3 ++
meta/lib/oeqa/runtime/cases/ldd.py | 1 +
meta/lib/oeqa/runtime/cases/logrotate.py | 1 +
meta/lib/oeqa/runtime/cases/ltp.py | 3 +-
meta/lib/oeqa/runtime/cases/ltp_compliance.py | 3 +-
meta/lib/oeqa/runtime/cases/ltp_stress.py | 4 +--
meta/lib/oeqa/runtime/cases/multilib.py | 1 +
meta/lib/oeqa/runtime/cases/oe_syslog.py | 5 ++-
meta/lib/oeqa/runtime/cases/opkg.py | 2 ++
meta/lib/oeqa/runtime/cases/pam.py | 1 +
meta/lib/oeqa/runtime/cases/parselogs.py | 1 +
meta/lib/oeqa/runtime/cases/perl.py | 1 +
meta/lib/oeqa/runtime/cases/ping.py | 1 +
meta/lib/oeqa/runtime/cases/ptest.py | 1 +
meta/lib/oeqa/runtime/cases/python.py | 1 +
meta/lib/oeqa/runtime/cases/rpm.py | 1 +
meta/lib/oeqa/runtime/cases/rtc.py | 1 +
meta/lib/oeqa/runtime/cases/runlevel.py | 1 +
meta/lib/oeqa/runtime/cases/scons.py | 1 +
meta/lib/oeqa/runtime/cases/scp.py | 1 +
meta/lib/oeqa/runtime/cases/skeletoninit.py | 1 +
meta/lib/oeqa/runtime/cases/ssh.py | 1 +
meta/lib/oeqa/runtime/cases/stap.py | 1 +
meta/lib/oeqa/runtime/cases/storage.py | 2 +-
meta/lib/oeqa/runtime/cases/suspend.py | 1 +
meta/lib/oeqa/runtime/cases/systemd.py | 3 ++
meta/lib/oeqa/runtime/cases/terminal.py | 1 +
meta/lib/oeqa/runtime/cases/usb_hid.py | 1 +
meta/lib/oeqa/runtime/cases/weston.py | 1 +
meta/lib/oeqa/runtime/cases/x32lib.py | 1 +
meta/lib/oeqa/runtime/cases/xorg.py | 1 +
meta/lib/oeqa/runtime/context.py | 3 ++
meta/lib/oeqa/runtime/decorator/package.py | 2 ++
meta/lib/oeqa/runtime/loader.py | 1 +
.../oeqa/runtime/utils/targetbuildproject.py | 1 +
meta/lib/oeqa/sdk/case.py | 1 +
meta/lib/oeqa/sdk/cases/assimp.py | 1 +
meta/lib/oeqa/sdk/cases/buildcpio.py | 2 ++
meta/lib/oeqa/sdk/cases/buildepoxy.py | 2 ++
meta/lib/oeqa/sdk/cases/buildgalculator.py | 2 ++
meta/lib/oeqa/sdk/cases/buildlzip.py | 2 ++
meta/lib/oeqa/sdk/cases/gcc.py | 1 +
meta/lib/oeqa/sdk/cases/perl.py | 1 +
meta/lib/oeqa/sdk/cases/python.py | 2 ++
meta/lib/oeqa/sdk/context.py | 3 ++
meta/lib/oeqa/sdk/testsdk.py | 2 ++
meta/lib/oeqa/sdk/utils/sdkbuildproject.py | 1 +
meta/lib/oeqa/sdkext/case.py | 1 +
meta/lib/oeqa/sdkext/cases/devtool.py | 2 ++
meta/lib/oeqa/sdkext/context.py | 3 ++
meta/lib/oeqa/sdkext/testsdk.py | 1 +
meta/lib/oeqa/selftest/case.py | 2 ++
meta/lib/oeqa/selftest/cases/archiver.py | 3 +-
meta/lib/oeqa/selftest/cases/bblayers.py | 1 +
meta/lib/oeqa/selftest/cases/bbtests.py | 2 +-
meta/lib/oeqa/selftest/cases/binutils.py | 2 ++
meta/lib/oeqa/selftest/cases/buildoptions.py | 6 ++++
.../lib/oeqa/selftest/cases/containerimage.py | 2 ++
meta/lib/oeqa/selftest/cases/cve_check.py | 1 +
meta/lib/oeqa/selftest/cases/devtool.py | 15 ++++++--
meta/lib/oeqa/selftest/cases/distrodata.py | 1 +
meta/lib/oeqa/selftest/cases/eSDK.py | 1 +
.../oeqa/selftest/cases/efibootpartition.py | 1 +
meta/lib/oeqa/selftest/cases/fetch.py | 1 +
meta/lib/oeqa/selftest/cases/fitimage.py | 5 +--
meta/lib/oeqa/selftest/cases/gcc.py | 16 +++++++++
meta/lib/oeqa/selftest/cases/glibc.py | 4 +++
meta/lib/oeqa/selftest/cases/image_typedep.py | 1 +
meta/lib/oeqa/selftest/cases/imagefeatures.py | 2 +-
.../oeqa/selftest/cases/incompatible_lic.py | 3 ++
.../oeqa/selftest/cases/kerneldevelopment.py | 1 +
meta/lib/oeqa/selftest/cases/layerappend.py | 1 +
meta/lib/oeqa/selftest/cases/liboe.py | 1 +
meta/lib/oeqa/selftest/cases/lic_checksum.py | 1 +
meta/lib/oeqa/selftest/cases/manifest.py | 4 ++-
meta/lib/oeqa/selftest/cases/meta_ide.py | 1 +
meta/lib/oeqa/selftest/cases/multiconfig.py | 1 +
.../oeqa/selftest/cases/oelib/buildhistory.py | 2 ++
meta/lib/oeqa/selftest/cases/oelib/elf.py | 1 +
meta/lib/oeqa/selftest/cases/oelib/license.py | 5 +++
meta/lib/oeqa/selftest/cases/oelib/path.py | 1 +
meta/lib/oeqa/selftest/cases/oelib/types.py | 2 ++
meta/lib/oeqa/selftest/cases/oelib/utils.py | 2 ++
meta/lib/oeqa/selftest/cases/oescripts.py | 8 +++--
meta/lib/oeqa/selftest/cases/package.py | 3 ++
meta/lib/oeqa/selftest/cases/pkgdata.py | 1 +
meta/lib/oeqa/selftest/cases/prservice.py | 1 +
meta/lib/oeqa/selftest/cases/pseudo.py | 1 +
meta/lib/oeqa/selftest/cases/recipetool.py | 3 +-
meta/lib/oeqa/selftest/cases/recipeutils.py | 3 --
meta/lib/oeqa/selftest/cases/reproducible.py | 8 +++++
.../oeqa/selftest/cases/resulttooltests.py | 1 +
meta/lib/oeqa/selftest/cases/runcmd.py | 2 ++
meta/lib/oeqa/selftest/cases/runqemu.py | 3 +-
meta/lib/oeqa/selftest/cases/runtime_test.py | 7 ++--
meta/lib/oeqa/selftest/cases/selftest.py | 3 ++
meta/lib/oeqa/selftest/cases/signing.py | 2 --
meta/lib/oeqa/selftest/cases/sstatetests.py | 10 +++---
meta/lib/oeqa/selftest/cases/sysroot.py | 1 +
meta/lib/oeqa/selftest/cases/tinfoil.py | 1 +
meta/lib/oeqa/selftest/cases/wic.py | 7 ++--
meta/lib/oeqa/selftest/context.py | 5 +++
meta/lib/oeqa/targetcontrol.py | 2 +-
meta/lib/oeqa/utils/__init__.py | 5 +++
meta/lib/oeqa/utils/buildproject.py | 1 +
meta/lib/oeqa/utils/commands.py | 8 ++++-
meta/lib/oeqa/utils/decorators.py | 19 ++++++++++
meta/lib/oeqa/utils/dump.py | 4 +++
meta/lib/oeqa/utils/ftools.py | 4 +++
meta/lib/oeqa/utils/git.py | 2 ++
meta/lib/oeqa/utils/gitarchive.py | 7 ++++
meta/lib/oeqa/utils/httpserver.py | 4 ++-
meta/lib/oeqa/utils/logparser.py | 2 ++
meta/lib/oeqa/utils/metadata.py | 5 +++
meta/lib/oeqa/utils/network.py | 1 +
meta/lib/oeqa/utils/nfs.py | 1 +
meta/lib/oeqa/utils/package_manager.py | 11 ++++++
meta/lib/oeqa/utils/qemurunner.py | 5 +--
meta/lib/oeqa/utils/qemutinyrunner.py | 3 +-
meta/lib/oeqa/utils/sshcontrol.py | 4 +--
meta/lib/oeqa/utils/subprocesstweak.py | 2 ++
meta/lib/oeqa/utils/targetbuild.py | 2 ++
meta/lib/oeqa/utils/testexport.py | 3 ++
meta/lib/rootfspostcommands.py | 3 ++
.../systemd/systemd-systemctl/systemctl | 2 ++
.../meson/meson/meson-setup.py | 3 ++
.../python/python3/create_manifest3.py | 11 +++---
.../python/python3/get_module_deps3.py | 2 +-
meta/recipes-rt/rt-tests/files/rt_bmark.py | 16 +++++++++
scripts/bitbake-whatchanged | 7 ++++
scripts/buildhistory-collect-srcrevs | 3 ++
scripts/buildhistory-diff | 3 ++
scripts/buildstats-diff | 2 ++
scripts/combo-layer | 28 ++++++++++++++-
scripts/contrib/bbvars.py | 5 +++
scripts/contrib/devtool-stress.py | 2 ++
scripts/contrib/graph-tool | 1 +
scripts/contrib/image-manifest | 11 ++++++
scripts/contrib/list-packageconfig-flags.py | 8 +++++
scripts/contrib/oe-build-perf-report-email.py | 1 +
scripts/contrib/patchreview.py | 5 +--
scripts/contrib/verify-homepage.py | 3 ++
scripts/cp-noerror | 2 ++
scripts/crosstap | 5 +++
scripts/devtool | 5 ++-
scripts/gen-lockedsig-cache | 8 +++++
scripts/install-buildtools | 2 ++
scripts/lib/argparse_oe.py | 5 +++
scripts/lib/build_perf/__init__.py | 1 +
scripts/lib/build_perf/report.py | 1 +
scripts/lib/buildstats.py | 3 +-
scripts/lib/checklayer/__init__.py | 14 ++++++++
scripts/lib/checklayer/case.py | 1 +
scripts/lib/checklayer/cases/bsp.py | 4 ++-
scripts/lib/checklayer/cases/common.py | 1 +
scripts/lib/checklayer/cases/distro.py | 1 +
scripts/lib/checklayer/context.py | 1 +
scripts/lib/devtool/__init__.py | 17 +++++++++
scripts/lib/devtool/build.py | 3 ++
scripts/lib/devtool/build_image.py | 4 +++
scripts/lib/devtool/deploy.py | 3 +-
scripts/lib/devtool/export.py | 3 +-
scripts/lib/devtool/import.py | 2 ++
scripts/lib/devtool/menuconfig.py | 2 ++
scripts/lib/devtool/package.py | 2 ++
scripts/lib/devtool/runqemu.py | 2 ++
scripts/lib/devtool/sdk.py | 9 +++++
scripts/lib/devtool/search.py | 3 +-
scripts/lib/devtool/standard.py | 23 ++++++++++++
scripts/lib/devtool/upgrade.py | 21 +++++++++++
scripts/lib/devtool/utilcmds.py | 1 +
scripts/lib/recipetool/append.py | 7 ++++
scripts/lib/recipetool/create.py | 21 +++++++++++
scripts/lib/recipetool/create_buildsys.py | 7 +++-
scripts/lib/recipetool/create_kernel.py | 3 ++
scripts/lib/recipetool/create_kmod.py | 2 ++
scripts/lib/recipetool/create_npm.py | 3 ++
scripts/lib/recipetool/setvar.py | 2 ++
scripts/lib/resulttool/log.py | 4 +++
scripts/lib/resulttool/manualexecution.py | 4 +++
scripts/lib/resulttool/merge.py | 2 ++
scripts/lib/resulttool/regression.py | 6 ++++
scripts/lib/resulttool/report.py | 3 +-
scripts/lib/resulttool/resultutils.py | 16 +++++++++
scripts/lib/resulttool/store.py | 1 +
scripts/lib/scriptpath.py | 2 ++
scripts/lib/scriptutils.py | 9 +++++
scripts/lib/wic/__init__.py | 1 +
scripts/lib/wic/engine.py | 8 +++++
scripts/lib/wic/filemap.py | 9 +++++
scripts/lib/wic/help.py | 1 +
scripts/lib/wic/ksparser.py | 10 +++++-
scripts/lib/wic/misc.py | 9 +++++
scripts/lib/wic/partition.py | 1 +
scripts/lib/wic/pluginbase.py | 4 +++
scripts/lib/wic/plugins/imager/direct.py | 3 ++
.../wic/plugins/source/bootimg-biosplusefi.py | 1 +
scripts/lib/wic/plugins/source/bootimg-efi.py | 2 +-
.../wic/plugins/source/bootimg-partition.py | 3 +-
.../lib/wic/plugins/source/bootimg-pcbios.py | 1 +
scripts/lib/wic/plugins/source/empty.py | 1 +
.../wic/plugins/source/isoimage-isohybrid.py | 1 +
scripts/lib/wic/plugins/source/rawcopy.py | 1 +
scripts/lib/wic/plugins/source/rootfs.py | 1 +
scripts/oe-build-perf-report | 8 ++---
scripts/oe-build-perf-test | 1 +
scripts/oe-depends-dot | 2 ++
scripts/oe-git-archive | 3 ++
scripts/oe-pkgdata-browser | 10 ++++++
scripts/oe-pkgdata-util | 16 +++++++--
scripts/oe-publish-sdk | 3 ++
scripts/oe-selftest | 3 +-
scripts/oe-test | 2 ++
scripts/oe-trim-schemas | 3 ++
scripts/oepydevshell-internal.py | 4 +++
.../pybootchartgui/pybootchartgui/batch.py | 1 +
scripts/pybootchartgui/pybootchartgui/draw.py | 27 ++++++++++++++
scripts/pybootchartgui/pybootchartgui/gui.py | 3 ++
.../pybootchartgui/pybootchartgui/main.py.in | 6 ++++
.../pybootchartgui/pybootchartgui/parsing.py | 28 ++++++++++++---
.../pybootchartgui/process_tree.py | 1 +
.../pybootchartgui/pybootchartgui/samples.py | 10 ++++++
.../pybootchartgui/tests/parser_test.py | 4 +++
.../pybootchartgui/tests/process_tree_test.py | 2 ++
scripts/pythondeps | 1 +
scripts/recipetool | 2 ++
scripts/relocate_sdk.py | 5 +++
scripts/resulttool | 2 ++
scripts/runqemu | 10 +++++-
scripts/send-error-report | 7 ++--
scripts/sysroot-relativelinks.py | 2 ++
scripts/task-time | 7 ++++
scripts/test-remote-image | 10 ++++--
scripts/tiny/dirsize.py | 1 +
scripts/tiny/ksize.py | 1 +
scripts/tiny/ksum.py | 10 ++++++
scripts/verify-bashisms | 6 +++-
scripts/wic | 16 +++++++++
scripts/yocto-check-layer | 4 +++
340 files changed, 1367 insertions(+), 121 deletions(-)
diff --git a/meta-selftest/lib/devtool/bbpath.py \
b/meta-selftest/lib/devtool/bbpath.py index 973ed779af..40be57a69e 100644
--- a/meta-selftest/lib/devtool/bbpath.py
+++ b/meta-selftest/lib/devtool/bbpath.py
@@ -3,27 +3,34 @@ import argparse
already_loaded = False
kept_context = None
+
def plugin_name(filename):
return os.path.splitext(os.path.basename(filename))[0]
+
def plugin_init(plugins):
global already_loaded
already_loaded = plugin_name(__file__) in (plugin_name(p.__name__) for p in \
plugins)
+
def print_name(args, config, basepath, workspace):
print(__file__)
+
def print_bbdir(args, config, basepath, workspace):
print(__file__.replace('/lib/devtool/bbpath.py', ''))
+
def print_registered(args, config, basepath, workspace):
global kept_context
print(kept_context.loaded)
+
def multiloaded(args, config, basepath, workspace):
global already_loaded
print("yes" if already_loaded else "no")
+
def register_commands(subparsers, context):
global kept_context
kept_context = context
diff --git a/meta-selftest/lib/devtool/test.py b/meta-selftest/lib/devtool/test.py
index 31190f58e7..eac0d472c1 100644
--- a/meta-selftest/lib/devtool/test.py
+++ b/meta-selftest/lib/devtool/test.py
@@ -1,9 +1,11 @@
import argparse
+
def selftest_reverse(args, config, basepath, workspace):
"""Reverse the value passed to verify the plugin is executing."""
print(args.value[::-1])
+
def register_commands(subparsers, context):
parser_build = subparsers.add_parser('selftest-reverse', help='Reverse value \
(for selftest)',
\
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
diff --git a/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py \
b/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py index fcd6ae313c..6507f401b1 \
100644
--- a/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py
+++ b/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py
@@ -3,6 +3,7 @@ from oeqa.runtime.cases.dnf import DnfTest
from oeqa.utils.httpserver import HTTPService
from oeqa.core.decorator.data import skipIfDataVar
+
class DnfSelftest(DnfTest):
@classmethod
diff --git a/meta-selftest/lib/oeqa/runtime/cases/selftest.py \
b/meta-selftest/lib/oeqa/runtime/cases/selftest.py index 19de740623..a61ebfc6c5 \
100644
--- a/meta-selftest/lib/oeqa/runtime/cases/selftest.py
+++ b/meta-selftest/lib/oeqa/runtime/cases/selftest.py
@@ -1,6 +1,7 @@
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
+
class Selftest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
diff --git a/meta-selftest/lib/oeqa/runtime/cases/virgl.py \
b/meta-selftest/lib/oeqa/runtime/cases/virgl.py index e3b6fe1d80..346e63cce3 100644
--- a/meta-selftest/lib/oeqa/runtime/cases/virgl.py
+++ b/meta-selftest/lib/oeqa/runtime/cases/virgl.py
@@ -3,6 +3,7 @@ from oeqa.core.decorator.depends import OETestDepends
import subprocess
import oe.lsb
+
class VirglTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
diff --git a/meta-selftest/lib/recipetool/bbpath.py \
b/meta-selftest/lib/recipetool/bbpath.py index d0df800c3d..ae129c62a8 100644
--- a/meta-selftest/lib/recipetool/bbpath.py
+++ b/meta-selftest/lib/recipetool/bbpath.py
@@ -3,28 +3,35 @@ import argparse
already_loaded = False
register_count = 0
+
def plugin_name(filename):
return os.path.splitext(os.path.basename(filename))[0]
+
def plugin_init(plugins):
global already_loaded
already_loaded = plugin_name(__file__) in (plugin_name(p.__name__) for p in \
plugins)
+
def print_name(opts):
print(__file__)
+
def print_bbdir(opts):
print(__file__.replace('/lib/recipetool/bbpath.py', ''))
+
def print_registered(opts):
#global kept_context
#print(kept_context.loaded)
print("1")
+
def multiloaded(opts):
global already_loaded
print("yes" if already_loaded else "no")
+
def register_commands(subparsers):
global register_count
register_count += 1
diff --git a/meta/files/ext-sdk-prepare.py b/meta/files/ext-sdk-prepare.py
index d191e5e19c..2b4a43ead9 100644
--- a/meta/files/ext-sdk-prepare.py
+++ b/meta/files/ext-sdk-prepare.py
@@ -7,9 +7,11 @@ import os
import subprocess
import signal
+
def reenable_sigint():
signal.signal(signal.SIGINT, signal.SIG_DFL)
+
def run_command_interruptible(cmd):
"""
Run a command with output displayed on the console, but ensure any Ctrl+C is
@@ -22,6 +24,7 @@ def run_command_interruptible(cmd):
signal.signal(signal.SIGINT, signal.SIG_DFL)
return ret
+
def get_last_consolelog():
'''Return the most recent console log file'''
logdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'tmp', 'log', \
'cooker') @@ -35,6 +38,7 @@ def get_last_consolelog():
return os.path.join(logdir, logfiles[-1])
return None
+
def main():
if len(sys.argv) < 2:
print('Please specify output log file')
@@ -81,6 +85,7 @@ def main():
print('ERROR: SDK preparation failed: error log written to %s' % \
logfile) return ret
+
if __name__ == "__main__":
try:
ret = main()
diff --git a/meta/lib/bblayers/create.py b/meta/lib/bblayers/create.py
index 06e1f6d342..f5af56f215 100644
--- a/meta/lib/bblayers/create.py
+++ b/meta/lib/bblayers/create.py
@@ -13,15 +13,18 @@ from bblayers.common import LayerPlugin
logger = logging.getLogger('bitbake-layers')
+
def plugin_init(plugins):
return CreatePlugin()
+
def read_template(template, template_dir='templates'):
lines = str()
with open(os.path.join(os.path.dirname(__file__), template_dir, template)) as \
fd: lines = ''.join(fd.readlines())
return lines
+
class CreatePlugin(LayerPlugin):
def do_create_layer(self, args):
"""Create a basic layer"""
diff --git a/meta/lib/buildstats.py b/meta/lib/buildstats.py
index 27bff9dda6..b10712886e 100644
--- a/meta/lib/buildstats.py
+++ b/meta/lib/buildstats.py
@@ -9,6 +9,7 @@ import time
import re
import bb.event
+
class SystemStats:
def __init__(self, d):
bn = d.getVar('BUILDNAME')
@@ -103,7 +104,6 @@ class SystemStats:
self.diskstats_data = diskdata
return reduced
-
def _reduce_nop(self, time, data):
return (time, data)
diff --git a/meta/lib/oe/buildhistory_analysis.py \
b/meta/lib/oe/buildhistory_analysis.py index 44b02c1ae0..e74de876e0 100644
--- a/meta/lib/oe/buildhistory_analysis.py
+++ b/meta/lib/oe/buildhistory_analysis.py
@@ -41,6 +41,7 @@ colours = {
'colour_remove': '',
}
+
def init_colours(use_colours):
global colours
if use_colours:
@@ -56,6 +57,7 @@ def init_colours(use_colours):
'colour_remove': '',
}
+
class ChangeRecord:
def __init__(self, path, fieldname, oldvalue, newvalue, monitored):
self.path = path
@@ -206,6 +208,7 @@ class ChangeRecord:
return '%s%s' % (prefix, out) if out else ''
+
class FileChange:
changetype_add = 'A'
changetype_remove = 'R'
@@ -257,6 +260,7 @@ class FileChange:
else:
return '%s changed (unknown)' % self.path
+
def blob_to_dict(blob):
alines = [line for line in blob.data_stream.read().decode('utf-8').splitlines()]
adict = {}
@@ -283,8 +287,10 @@ def file_list_to_dict(lines):
adict[path] = splitv[0:3]
return adict
+
numeric_removal = str.maketrans('0123456789', 'XXXXXXXXXX')
+
def compare_file_lists(alines, blines, compare_ownership=True):
adict = file_list_to_dict(alines)
bdict = file_list_to_dict(blines)
@@ -523,6 +529,7 @@ def compare_siglists(a_blob, b_blob, taskdiff=False):
blines = b_blob.data_stream.read().decode('utf-8').splitlines()
keys = []
pnmap = {}
+
def readsigs(lines):
sigs = {}
for line in lines:
diff --git a/meta/lib/oe/cachedpath.py b/meta/lib/oe/cachedpath.py
index 607421e29d..a94b03f6d2 100644
--- a/meta/lib/oe/cachedpath.py
+++ b/meta/lib/oe/cachedpath.py
@@ -10,6 +10,7 @@ import os
import errno
import stat as statmod
+
class CachedPath(object):
def __init__(self):
self.statcache = {}
diff --git a/meta/lib/oe/classextend.py b/meta/lib/oe/classextend.py
index d5f252c63e..d7dea36a1b 100644
--- a/meta/lib/oe/classextend.py
+++ b/meta/lib/oe/classextend.py
@@ -4,15 +4,18 @@
import collections
+
def get_packages(d):
pkgs = d.getVar("PACKAGES_NONML")
extcls = d.getVar("EXTENDERCLASS")
return extcls.rename_packages_internal(pkgs)
+
def get_depends(varprefix, d):
extcls = d.getVar("EXTENDERCLASS")
return extcls.map_depends_variable(varprefix + "_NONML")
+
class ClassExtender(object):
def __init__(self, extname, d):
self.extname = extname
@@ -144,6 +147,7 @@ class ClassExtender(object):
for subs in variables:
self.d.renameVar("%s_%s" % (subs, pkg_mapping[0]), "%s_%s" % (subs, \
pkg_mapping[1]))
+
class NativesdkClassExtender(ClassExtender):
def map_depends(self, dep):
if dep.startswith(self.extname):
diff --git a/meta/lib/oe/classutils.py b/meta/lib/oe/classutils.py
index 08bb66b365..4169baaef3 100644
--- a/meta/lib/oe/classutils.py
+++ b/meta/lib/oe/classutils.py
@@ -2,12 +2,14 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+
class ClassRegistryMeta(type):
"""Give each ClassRegistry their own registry"""
def __init__(cls, name, bases, attrs):
cls.registry = {}
type.__init__(cls, name, bases, attrs)
+
class ClassRegistry(type, metaclass=ClassRegistryMeta):
"""Maintain a registry of classes, indexed by name.
@@ -22,6 +24,7 @@ Subclasses of ClassRegistry may define an 'implemented' property to \
exert control over whether the class will be added to the registry (e.g. to keep
abstract base classes out of the registry)."""
priority = 0
+
def __init__(cls, name, bases, attrs):
super(ClassRegistry, cls).__init__(name, bases, attrs)
try:
diff --git a/meta/lib/oe/copy_buildsystem.py b/meta/lib/oe/copy_buildsystem.py
index b294083a20..4f5bdce46e 100644
--- a/meta/lib/oe/copy_buildsystem.py
+++ b/meta/lib/oe/copy_buildsystem.py
@@ -13,6 +13,7 @@
import stat
import shutil
+
def _smart_copy(src, dest):
import subprocess
# smart_copy will choose the correct function depending on whether the
@@ -27,6 +28,7 @@ def _smart_copy(src, dest):
shutil.copyfile(src, dest)
shutil.copymode(src, dest)
+
class BuildSystem(object):
def __init__(self, context, d):
self.d = d
@@ -171,12 +173,14 @@ class BuildSystem(object):
return copied_corebase, layers_copied
+
def generate_locked_sigs(sigfile, d):
bb.utils.mkdirhier(os.path.dirname(sigfile))
depd = d.getVar('BB_TASKDEPDATA', False)
tasks = ['%s:%s' % (v[2], v[1]) for v in depd.values()]
bb.parse.siggen.dump_lockedsigs(sigfile, tasks)
+
def prune_lockedsigs(excluded_tasks, excluded_targets, lockedsigs, onlynative, \
pruned_output): with open(lockedsigs, 'r') as infile:
bb.utils.mkdirhier(os.path.dirname(pruned_output))
@@ -199,6 +203,7 @@ def prune_lockedsigs(excluded_tasks, excluded_targets, \
lockedsigs, onlynative, p invalue = True
f.write(line)
+
def merge_lockedsigs(copy_tasks, lockedsigs_main, lockedsigs_extra, merged_output, \
copy_output=None): merged = {}
arch_order = []
@@ -254,6 +259,7 @@ def merge_lockedsigs(copy_tasks, lockedsigs_main, \
lockedsigs_extra, merged_outpu if merged_output:
write_sigs_file(merged_output, arch_order, merged)
+
def create_locked_sstate_cache(lockedsigs, input_sstate_cache, output_sstate_cache, \
d, fixedlsbstring="", filterfile=None): import shutil
bb.note('Generating sstate-cache...')
@@ -275,6 +281,7 @@ def create_locked_sstate_cache(lockedsigs, input_sstate_cache, \
output_sstate_cac bb.utils.mkdirhier(os.path.dirname(dest))
shutil.move(src, dest)
+
def check_sstate_task_list(d, targets, filteroutfile, cmdprefix='', cwd=None, \
logfile=None): import subprocess
diff --git a/meta/lib/oe/cve_check.py b/meta/lib/oe/cve_check.py
index cb4c86cf29..efeae3db48 100644
--- a/meta/lib/oe/cve_check.py
+++ b/meta/lib/oe/cve_check.py
@@ -7,6 +7,7 @@ _Version = collections.namedtuple(
"_Version", ["release", "patch_l", "pre_l", "pre_v"]
)
+
@functools.total_ordering
class Version():
@@ -50,6 +51,7 @@ class Version():
return NotImplemented
return self._key > other._key
+
def _cmpkey(release, patch_l, pre_l, pre_v):
# remove leading 0
_release = tuple(
diff --git a/meta/lib/oe/data.py b/meta/lib/oe/data.py
index a340ce3b1b..995f7166d6 100644
--- a/meta/lib/oe/data.py
+++ b/meta/lib/oe/data.py
@@ -5,6 +5,7 @@
import json
import oe.maketype
+
def typed_value(key, d):
"""Construct a value for the specified metadata variable, using its flags
to determine the type and parameters for construction."""
@@ -21,6 +22,7 @@ def typed_value(key, d):
except (TypeError, ValueError) as exc:
bb.msg.fatal("Data", "%s: %s" % (key, str(exc)))
+
def export2json(d, json_file, expand=True, searchString="", replaceString=""):
data2export = {}
keys2export = []
diff --git a/meta/lib/oe/distro_check.py b/meta/lib/oe/distro_check.py
index 213c9e66e1..24b875d616 100644
--- a/meta/lib/oe/distro_check.py
+++ b/meta/lib/oe/distro_check.py
@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+
def create_socket(url, d):
import urllib
from bb.utils import export_proxies
@@ -9,6 +10,7 @@ def create_socket(url, d):
export_proxies(d)
return urllib.request.urlopen(url)
+
def get_links_from_url(url, d):
"Return all the href links found on the web location"
@@ -20,6 +22,7 @@ def get_links_from_url(url, d):
hyperlinks.append(line['href'].strip('/'))
return hyperlinks
+
def find_latest_numeric_release(url, d):
"Find the latest listed numeric release on the given url"
max = 0
@@ -35,10 +38,12 @@ def find_latest_numeric_release(url, d):
maxstr = link
return maxstr
+
def is_src_rpm(name):
"Check if the link is pointing to a src.rpm file"
return name.endswith(".src.rpm")
+
def package_name_from_srpm(srpm):
"Strip out the package name from the src.rpm filename"
@@ -47,6 +52,7 @@ def package_name_from_srpm(srpm):
(name, version, release) = srpm.replace(".src.rpm", "").rsplit("-", 2)
return name
+
def get_source_package_list_from_url(url, section, d):
"Return a sectioned list of package names from a URL list"
@@ -60,6 +66,7 @@ def get_source_package_list_from_url(url, section, d):
new_pkgs.add(pkgs + ":" + section)
return new_pkgs
+
def get_source_package_list_from_url_by_letter(url, section, d):
import string
from urllib.error import HTTPError
@@ -73,6 +80,7 @@ def get_source_package_list_from_url_by_letter(url, section, d):
raise
return packages
+
def get_latest_released_fedora_source_package_list(d):
"Returns list of all the name os packages in the latest fedora distro"
latest = find_latest_numeric_release("http://archive.fedoraproject.org/pub/fedora/linux/releases/", \
d) @@ -80,6 +88,7 @@ def get_latest_released_fedora_source_package_list(d):
package_names |= \
get_source_package_list_from_url_by_letter("http://archive.fedoraproject.org/pub/fedora/linux/updates/%s/SRPMS/" \
% latest, "updates", d) return latest, package_names
+
def get_latest_released_opensuse_source_package_list(d):
"Returns list of all the name os packages in the latest opensuse distro"
latest = find_latest_numeric_release("http://download.opensuse.org/source/distribution/leap", \
d) @@ -88,11 +97,13 @@ def get_latest_released_opensuse_source_package_list(d):
package_names |= \
get_source_package_list_from_url("http://download.opensuse.org/update/leap/%s/oss/src/" \
% latest, "updates", d) return latest, package_names
+
def get_latest_released_clear_source_package_list(d):
latest = find_latest_numeric_release("https://download.clearlinux.org/releases/", \
d)
package_names = \
get_source_package_list_from_url("https://download.clearlinux.org/releases/%s/clear/source/SRPMS/" \
% latest, "main", d) return latest, package_names
+
def find_latest_debian_release(url, d):
"Find the latest listed debian release on the given url"
@@ -105,6 +116,7 @@ def find_latest_debian_release(url, d):
except:
return "_NotFound_"
+
def get_debian_style_source_package_list(url, section, d):
"Return the list of package-names stored in the debian style Sources.gz file"
import gzip
@@ -116,6 +128,7 @@ def get_debian_style_source_package_list(url, section, d):
package_names.add(pkg + ":" + section)
return package_names
+
def get_latest_released_debian_source_package_list(d):
"Returns list of all the name of packages in the latest debian distro"
latest = find_latest_debian_release("http://ftp.debian.org/debian/dists/", d)
@@ -125,6 +138,7 @@ def get_latest_released_debian_source_package_list(d):
package_names |= get_debian_style_source_package_list(url, "updates", d)
return latest, package_names
+
def find_latest_ubuntu_release(url, d):
"""
Find the latest listed Ubuntu release on the given ubuntu/dists/ URL.
@@ -139,6 +153,7 @@ def find_latest_ubuntu_release(url, d):
return distro
return "_NotFound_"
+
def get_latest_released_ubuntu_source_package_list(d):
"Returns list of all the name os packages in the latest ubuntu distro"
latest = find_latest_ubuntu_release("http://archive.ubuntu.com/ubuntu/dists/", \
d) @@ -148,6 +163,7 @@ def get_latest_released_ubuntu_source_package_list(d):
package_names |= get_debian_style_source_package_list(url, "updates", d)
return latest, package_names
+
def create_distro_packages_list(distro_check_dir, d):
import shutil
@@ -177,6 +193,7 @@ def create_distro_packages_list(distro_check_dir, d):
for pkg in sorted(package_list):
f.write(pkg + "\n")
+
def update_distro_data(distro_check_dir, datetime, d):
"""
If distro packages list data is old then rebuild it.
@@ -190,7 +207,6 @@ def update_distro_data(distro_check_dir, datetime, d):
except OSError:
raise Exception('Unable to create directory %s' % (distro_check_dir))
-
datetime_file = os.path.join(distro_check_dir, "build_datetime")
saved_datetime = "_invalid_"
import fcntl
@@ -214,6 +230,7 @@ def update_distro_data(distro_check_dir, datetime, d):
fcntl.lockf(f, fcntl.LOCK_UN)
f.close()
+
def compare_in_distro_packages_list(distro_check_dir, d):
if not os.path.isdir(distro_check_dir):
raise Exception("compare_in_distro_packages_list: invalid distro_check_dir \
passed") @@ -278,6 +295,7 @@ def compare_in_distro_packages_list(distro_check_dir, \
d): bb.note("Matching: %s" % matching_distros)
return matching_distros
+
def create_log_file(d, logname):
logpath = d.getVar('LOG_DIR')
bb.utils.mkdirhier(logpath)
diff --git a/meta/lib/oe/elf.py b/meta/lib/oe/elf.py
index b307e4a651..5e8be92592 100644
--- a/meta/lib/oe/elf.py
+++ b/meta/lib/oe/elf.py
@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+
def machine_dict(d):
# TARGET_OS TARGET_ARCH MACHINE, OSABI, ABIVERSION, Little Endian, \
32bit? machdata = {
diff --git a/meta/lib/oe/gpg_sign.py b/meta/lib/oe/gpg_sign.py
index 805cedd963..9cd7968da1 100644
--- a/meta/lib/oe/gpg_sign.py
+++ b/meta/lib/oe/gpg_sign.py
@@ -9,8 +9,10 @@ import bb
import subprocess
import shlex
+
class LocalSigner(object):
"""Class for handling local (on the build host) signing"""
+
def __init__(self, d):
self.gpg_bin = d.getVar('GPG_BIN') or \
bb.utils.which(os.getenv('PATH'), 'gpg')
@@ -25,7 +27,6 @@ class LocalSigner(object):
self.rpm_bin = bb.utils.which(os.getenv('PATH'), "rpmsign")
self.gpg_version = self.get_gpg_version()
-
def export_pubkey(self, output_file, keyid, armor=True):
"""Export GPG public key to a file"""
cmd = self.gpg_cmd + ["--no-permission-warning", "--batch", "--yes", \
"--export", "-o", output_file] @@ -98,7 +99,6 @@ class LocalSigner(object):
bb.error("OS error (%s): %s" % (e.errno, e.strerror))
raise Exception("Failed to sign '%s" % input_file)
-
def get_gpg_version(self):
"""Return the gpg version as a tuple of ints"""
try:
@@ -108,7 +108,6 @@ class LocalSigner(object):
except subprocess.CalledProcessError as e:
bb.fatal("Could not get gpg version: %s" % e)
-
def verify(self, sig_file):
"""Verify signature"""
cmd = self.gpg_cmd + ["--verify", "--no-permission-warning"]
diff --git a/meta/lib/oe/license.py b/meta/lib/oe/license.py
index 7aefeaaae0..98e65c32be 100644
--- a/meta/lib/oe/license.py
+++ b/meta/lib/oe/license.py
@@ -7,6 +7,7 @@ import ast
import re
from fnmatch import fnmatchcase as fnmatch
+
def license_ok(license, dont_want_licenses):
""" Return False if License exist in dont_want_licenses else True """
for dwl in dont_want_licenses:
@@ -14,9 +15,11 @@ def license_ok(license, dont_want_licenses):
return False
return True
+
class LicenseError(Exception):
pass
+
class LicenseSyntaxError(LicenseError):
def __init__(self, licensestr, exc):
self.licensestr = licensestr
@@ -26,6 +29,7 @@ class LicenseSyntaxError(LicenseError):
def __str__(self):
return "error in '%s': %s" % (self.licensestr, self.exc)
+
class InvalidLicense(LicenseError):
def __init__(self, license):
self.license = license
@@ -34,12 +38,15 @@ class InvalidLicense(LicenseError):
def __str__(self):
return "invalid characters in license '%s'" % self.license
+
license_operator_chars = '&|() '
license_operator = re.compile(r'([' + license_operator_chars + '])')
license_pattern = re.compile(r'[a-zA-Z0-9.+_\-]+$')
+
class LicenseVisitor(ast.NodeVisitor):
"""Get elements based on OpenEmbedded license strings"""
+
def get_elements(self, licensestr):
new_elements = []
elements = list([x for x in license_operator.split(licensestr) if \
x.strip()]) @@ -56,16 +63,20 @@ class LicenseVisitor(ast.NodeVisitor):
"""Syntax tree visitor which can accept elements previously generated with
OpenEmbedded license string"""
+
def visit_elements(self, elements):
self.visit(ast.parse(' '.join(elements)))
"""Syntax tree visitor which can accept OpenEmbedded license strings"""
+
def visit_string(self, licensestr):
self.visit_elements(self.get_elements(licensestr))
+
class FlattenVisitor(LicenseVisitor):
"""Flatten a license tree (parsed from a string) by selecting one of each
set of OR options, in the way the user specifies"""
+
def __init__(self, choose_licenses):
self.choose_licenses = choose_licenses
self.licenses = []
@@ -87,6 +98,7 @@ class FlattenVisitor(LicenseVisitor):
else:
self.generic_visit(node)
+
def flattened_licenses(licensestr, choose_licenses):
"""Given a license string and choose_licenses function, return a flat list of \
licenses""" flatten = FlattenVisitor(choose_licenses)
@@ -96,6 +108,7 @@ def flattened_licenses(licensestr, choose_licenses):
raise LicenseSyntaxError(licensestr, exc)
return flatten.licenses
+
def is_included(licensestr, whitelist=None, blacklist=None):
"""Given a license string and whitelist and blacklist, determine if the
license string matches the whitelist and does not match the blacklist.
@@ -142,9 +155,11 @@ def is_included(licensestr, whitelist=None, blacklist=None):
else:
return True, included
+
class ManifestVisitor(LicenseVisitor):
"""Walk license tree (parsed from a string) removing the incompatible
licenses specified"""
+
def __init__(self, dont_want_licenses, canonical_license, d):
self._dont_want_licenses = dont_want_licenses
self._canonical_license = canonical_license
@@ -198,6 +213,7 @@ class ManifestVisitor(LicenseVisitor):
self.generic_visit(node)
+
def manifest_licenses(licensestr, dont_want_licenses, canonical_license, d):
"""Given a license string and dont_want_licenses list,
return license string filtered and a list of licenses"""
@@ -219,14 +235,17 @@ def manifest_licenses(licensestr, dont_want_licenses, \
canonical_license, d):
return (manifest.licensestr, manifest.licenses)
+
class ListVisitor(LicenseVisitor):
"""Record all different licenses found in the license string"""
+
def __init__(self):
self.licenses = set()
def visit_Str(self, node):
self.licenses.add(node.s)
+
def list_licenses(licensestr):
"""Simply get a list of all licenses mentioned in a license string.
Binary operators are not applied or taken into account in any way"""
diff --git a/meta/lib/oe/lsb.py b/meta/lib/oe/lsb.py
index fa540b48b3..f5ccddee3d 100644
--- a/meta/lib/oe/lsb.py
+++ b/meta/lib/oe/lsb.py
@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+
def get_os_release():
"""Get all key-value pairs from /etc/os-release as a dict"""
from collections import OrderedDict
@@ -17,6 +18,7 @@ def get_os_release():
data[key.strip()] = val.strip('"')
return data
+
def release_dict_osr():
""" Populate a dict with pertinent values from /etc/os-release """
data = {}
@@ -28,6 +30,7 @@ def release_dict_osr():
return data
+
def release_dict_lsb():
""" Return the output of lsb_release -ir as a dictionary """
from subprocess import PIPE
@@ -57,6 +60,7 @@ def release_dict_lsb():
return data
+
def release_dict_file():
""" Try to gather release information manually when other methods fail """
data = {}
@@ -89,6 +93,7 @@ def release_dict_file():
return {}
return data
+
def distro_identifier(adjust_hook=None):
"""Return a distro identifier string based upon lsb_release -ri,
with optional adjustment via a hook"""
diff --git a/meta/lib/oe/maketype.py b/meta/lib/oe/maketype.py
index d929c8b3e5..66d1cf6cce 100644
--- a/meta/lib/oe/maketype.py
+++ b/meta/lib/oe/maketype.py
@@ -19,9 +19,11 @@ except ImportError:
available_types = {}
+
class MissingFlag(TypeError):
"""A particular flag is required to construct the type, but has not been
provided."""
+
def __init__(self, flag, type):
self.flag = flag
self.type = type
@@ -30,6 +32,7 @@ class MissingFlag(TypeError):
def __str__(self):
return "Type '%s' requires flag '%s'" % (self.type, self.flag)
+
def factory(var_type):
"""Return the factory for a specified type."""
if var_type is None:
@@ -41,6 +44,7 @@ def factory(var_type):
raise TypeError("Invalid type '%s':\n Valid types: %s" %
(var_type, ', '.join(available_types)))
+
def create(value, var_type, **flags):
"""Create an object of the specified type, given the specified flags and
string value."""
@@ -55,6 +59,7 @@ def create(value, var_type, **flags):
return obj(value, **objflags)
+
def get_callable_args(obj):
"""Grab all but the first argument of the specified callable, returning
the list, as well as a list of which of the arguments have default
@@ -76,6 +81,7 @@ def get_callable_args(obj):
optional |= set(flaglist[-len(defaults):])
return flaglist, optional
+
def factory_setup(name, obj):
"""Prepare a factory for use."""
args, optional = get_callable_args(obj)
@@ -89,6 +95,7 @@ def factory_setup(name, obj):
if not hasattr(obj, 'name'):
obj.name = name
+
def register(name, factory):
"""Register a type, given its name and a factory callable.
diff --git a/meta/lib/oe/manifest.py b/meta/lib/oe/manifest.py
index 1a058dcd73..3f4224fed4 100644
--- a/meta/lib/oe/manifest.py
+++ b/meta/lib/oe/manifest.py
@@ -7,6 +7,7 @@ import os
import re
import bb
+
class Manifest(object, metaclass=ABCMeta):
"""
This is an abstract class. Do not instantiate this directly.
@@ -84,6 +85,7 @@ class Manifest(object, metaclass=ABCMeta):
This creates a standard initial manifest for core-image-(minimal|sato|sato-sdk).
This will be used for testing until the class is implemented properly!
"""
+
def _create_dummy_initial(self):
image_rootfs = self.d.getVar('IMAGE_ROOTFS')
pkg_list = dict()
@@ -144,6 +146,7 @@ class Manifest(object, metaclass=ABCMeta):
The following function parses an initial manifest and returns a dictionary
object with the must install, attempt only, multilib and language packages.
"""
+
def parse_initial_manifest(self):
pkgs = dict()
@@ -175,6 +178,7 @@ class Manifest(object, metaclass=ABCMeta):
This following function parses a full manifest and return a list
object with packages.
'''
+
def parse_full_manifest(self):
installed_pkgs = list()
if not os.path.exists(self.full_manifest):
@@ -188,7 +192,6 @@ class Manifest(object, metaclass=ABCMeta):
return installed_pkgs
-
def create_manifest(d, final_manifest=False, manifest_dir=None,
manifest_type=Manifest.MANIFEST_TYPE_IMAGE):
import importlib
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index 9dd6aef641..0113f97b83 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -6,6 +6,7 @@ import stat
import mmap
import subprocess
+
def runstrip(arg):
# Function to strip a single file, called from split_and_strip_files below
# A working 'file' (one which works on the target architecture)
@@ -51,11 +52,15 @@ def runstrip(arg):
os.chmod(file, origmode)
# Detect .ko module by searching for "vermagic=" string
+
+
def is_kernel_module(path):
with open(path) as f:
return mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ).find(b"vermagic=") >= 0
# Detect if .ko module is signed
+
+
def is_kernel_module_signed(path):
with open(path, "rb") as f:
f.seek(-28, 2)
@@ -69,6 +74,8 @@ def is_kernel_module_signed(path):
# 4 - executable
# 8 - shared library
# 16 - kernel module
+
+
def is_elf(path):
exec_type = 0
result = subprocess.check_output(["file", "-b", path], \
stderr=subprocess.STDOUT).decode("utf-8") @@ -86,6 +93,7 @@ def is_elf(path):
exec_type |= 16
return (path, exec_type)
+
def is_static_lib(path):
if path.endswith('.a') and not os.path.islink(path):
with open(path, 'rb') as fh:
@@ -96,6 +104,7 @@ def is_static_lib(path):
return start == magic
return False
+
def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, d, \
qa_already_stripped=False): """
Strip executable code (like executables, shared libraries) _in_place_
@@ -189,6 +198,7 @@ def file_translate(file):
ft = ft.replace("_", "@underscore@")
return ft
+
def filedeprunner(arg):
import re
import subprocess
diff --git a/meta/lib/oe/package_manager/__init__.py \
b/meta/lib/oe/package_manager/__init__.py index 633c5c4bf2..9feae4b6c0 100644
--- a/meta/lib/oe/package_manager/__init__.py
+++ b/meta/lib/oe/package_manager/__init__.py
@@ -19,6 +19,8 @@ import hashlib
import fnmatch
# this can be used by all PM backends to create the index files in parallel
+
+
def create_index(arg):
index_cmd = arg
@@ -27,6 +29,7 @@ def create_index(arg):
if result:
bb.note(result)
+
def opkg_query(cmd_output):
"""
This method parse the output from the package managerand return
@@ -88,12 +91,14 @@ def opkg_query(cmd_output):
return output
+
def failed_postinsts_abort(pkgs, log_path):
bb.fatal("""Postinstall scriptlets of %s have failed. If the intention is to \
defer them to first boot, then please place them into pkg_postinst_ontarget_${PN} \
(). Deferring to first boot via 'exit 1' is no longer supported.
Details of the failure are in %s.""" % (pkgs, log_path))
+
def generate_locale_archive(d, rootfs, target_arch, localedir):
# Pretty sure we don't need this for locale archive generation but
# keeping it to be safe...
@@ -140,6 +145,7 @@ def generate_locale_archive(d, rootfs, target_arch, localedir):
cmd += ["--add-to-archive", path]
subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT)
+
class Indexer(object, metaclass=ABCMeta):
def __init__(self, d, deploy_dir):
self.d = d
@@ -149,6 +155,7 @@ class Indexer(object, metaclass=ABCMeta):
def write_index(self):
pass
+
class PkgsList(object, metaclass=ABCMeta):
def __init__(self, d, rootfs_dir):
self.d = d
@@ -158,6 +165,7 @@ class PkgsList(object, metaclass=ABCMeta):
def list_pkgs(self):
pass
+
class PackageManager(object, metaclass=ABCMeta):
"""
This is an abstract class. Do not instantiate this directly.
@@ -212,7 +220,6 @@ class PackageManager(object, metaclass=ABCMeta):
# call the backend dependent handler
self._handle_intercept_failure(registered_pkgs)
-
def run_intercepts(self, populate_sdk=None):
intercepts_dir = self.intercepts_dir
@@ -451,6 +458,7 @@ class PackageManager(object, metaclass=ABCMeta):
return res
return _append(uris, base_paths)
+
def create_packages_dir(d, subrepo_dir, deploydir, taskname, filterbydependencies):
"""
Go through our do_package_write_X dependencies and hardlink the packages we \
depend
diff --git a/meta/lib/oe/package_manager/deb/__init__.py \
b/meta/lib/oe/package_manager/deb/__init__.py index 457e936862..9e99074eab 100644
--- a/meta/lib/oe/package_manager/deb/__init__.py
+++ b/meta/lib/oe/package_manager/deb/__init__.py
@@ -6,6 +6,7 @@ import re
import subprocess
from oe.package_manager import *
+
class DpkgIndexer(Indexer):
def _create_configs(self):
bb.utils.mkdirhier(self.apt_conf_dir)
@@ -79,6 +80,7 @@ class DpkgIndexer(Indexer):
if self.d.getVar('PACKAGE_FEED_SIGN') == '1':
raise NotImplementedError('Package feed signing not implementd for \
dpkg')
+
class PMPkgsList(PkgsList):
def list_pkgs(self):
@@ -96,6 +98,7 @@ class PMPkgsList(PkgsList):
return opkg_query(cmd_output)
+
class OpkgDpkgPM(PackageManager):
def __init__(self, d, target_rootfs):
"""
@@ -163,6 +166,7 @@ class OpkgDpkgPM(PackageManager):
def _handle_intercept_failure(self, registered_pkgs):
self.mark_packages("unpacked", registered_pkgs.split())
+
class DpkgPM(OpkgDpkgPM):
def __init__(self, d, target_rootfs, archs, base_archs, apt_conf_dir=None, \
deb_repo_workdir="oe-rootfs-repo", filterbydependencies=True): super(DpkgPM, \
self).__init__(d, target_rootfs) @@ -308,7 +312,6 @@ class DpkgPM(OpkgDpkgPM):
bb.utils.rename(os.path.join(root, file),
os.path.join(root, new_file))
-
def remove(self, pkgs, with_dependencies=True):
if not pkgs:
return
@@ -348,7 +351,6 @@ class DpkgPM(OpkgDpkgPM):
if feed_uris == "":
return
-
sources_conf = os.path.join("%s/etc/apt/sources.list"
% self.target_rootfs)
if not os.path.exists(os.path.dirname(sources_conf)):
diff --git a/meta/lib/oe/package_manager/deb/manifest.py \
b/meta/lib/oe/package_manager/deb/manifest.py index d8eab24a06..23b24b0855 100644
--- a/meta/lib/oe/package_manager/deb/manifest.py
+++ b/meta/lib/oe/package_manager/deb/manifest.py
@@ -4,6 +4,7 @@
from oe.manifest import Manifest
+
class PkgManifest(Manifest):
def create_initial(self):
with open(self.initial_manifest, "w+") as manifest:
diff --git a/meta/lib/oe/package_manager/deb/rootfs.py \
b/meta/lib/oe/package_manager/deb/rootfs.py index 56ed7e2359..8b293ea201 100644
--- a/meta/lib/oe/package_manager/deb/rootfs.py
+++ b/meta/lib/oe/package_manager/deb/rootfs.py
@@ -10,6 +10,7 @@ from oe.utils import execute_pre_post_process
from oe.package_manager.deb.manifest import PkgManifest
from oe.package_manager.deb import DpkgPM
+
class DpkgOpkgRootfs(Rootfs):
def __init__(self, d, progress_reporter=None, logcatcher=None):
super(DpkgOpkgRootfs, self).__init__(d, progress_reporter, logcatcher)
@@ -120,6 +121,7 @@ class DpkgOpkgRootfs(Rootfs):
num += 1
+
class PkgRootfs(DpkgOpkgRootfs):
def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None):
super(PkgRootfs, self).__init__(d, progress_reporter, logcatcher)
@@ -136,7 +138,6 @@ class PkgRootfs(DpkgOpkgRootfs):
d.getVar('PACKAGE_ARCHS'),
d.getVar('DPKG_ARCH'))
-
def _create(self):
pkgs_to_install = self.manifest.parse_initial_manifest()
deb_pre_process_cmds = self.d.getVar('DEB_PREPROCESS_COMMANDS')
diff --git a/meta/lib/oe/package_manager/deb/sdk.py \
b/meta/lib/oe/package_manager/deb/sdk.py index f4b0b6510a..cb5545e0ce 100644
--- a/meta/lib/oe/package_manager/deb/sdk.py
+++ b/meta/lib/oe/package_manager/deb/sdk.py
@@ -10,6 +10,7 @@ from oe.manifest import Manifest
from oe.package_manager.deb import DpkgPM
from oe.package_manager.deb.manifest import PkgManifest
+
class PkgSdk(Sdk):
def __init__(self, d, manifest_dir=None):
super(PkgSdk, self).__init__(d, manifest_dir)
@@ -17,7 +18,6 @@ class PkgSdk(Sdk):
self.target_conf_dir = os.path.join(self.d.getVar("APTCONF_TARGET"), "apt")
self.host_conf_dir = os.path.join(self.d.getVar("APTCONF_TARGET"), \
"apt-sdk")
-
self.target_manifest = PkgManifest(d, self.manifest_dir,
Manifest.MANIFEST_TYPE_SDK_TARGET)
self.host_manifest = PkgManifest(d, self.manifest_dir,
diff --git a/meta/lib/oe/package_manager/ipk/__init__.py \
b/meta/lib/oe/package_manager/ipk/__init__.py index 504830cdec..0cea1b1942 100644
--- a/meta/lib/oe/package_manager/ipk/__init__.py
+++ b/meta/lib/oe/package_manager/ipk/__init__.py
@@ -7,6 +7,7 @@ import shutil
import subprocess
from oe.package_manager import *
+
class OpkgIndexer(Indexer):
def write_index(self):
arch_vars = ["ALL_MULTILIB_PACKAGE_ARCHS",
@@ -59,6 +60,7 @@ class OpkgIndexer(Indexer):
\
self.d.getVar('PACKAGE_FEED_GPG_PASSPHRASE_FILE'), armor=is_ascii_sig)
+
class PMPkgsList(PkgsList):
def __init__(self, d, rootfs_dir):
super(PMPkgsList, self).__init__(d, rootfs_dir)
@@ -87,7 +89,6 @@ class PMPkgsList(PkgsList):
return opkg_query(cmd_output)
-
class OpkgDpkgPM(PackageManager):
def __init__(self, d, target_rootfs):
"""
@@ -155,6 +156,7 @@ class OpkgDpkgPM(PackageManager):
def _handle_intercept_failure(self, registered_pkgs):
self.mark_packages("unpacked", registered_pkgs.split())
+
class OpkgPM(OpkgDpkgPM):
def __init__(self, d, target_rootfs, config_file, archs, task_name='target', \
ipk_repo_workdir="oe-rootfs-repo", filterbydependencies=True, prepare_index=True): \
super(OpkgPM, self).__init__(d, target_rootfs) @@ -265,7 +267,6 @@ class \
OpkgPM(OpkgDpkgPM):
cfg_file.write("option lists_dir %s\n" % \
os.path.join(self.d.getVar('OPKGLIBDIR'), 'opkg', 'lists'))
cfg_file.write("option status_file %s\n" % \
os.path.join(self.d.getVar('OPKGLIBDIR'), 'opkg', 'status'))
-
def _create_config(self):
with open(self.config_file, "w+") as config_file:
priority = 1
diff --git a/meta/lib/oe/package_manager/ipk/manifest.py \
b/meta/lib/oe/package_manager/ipk/manifest.py index ee4b57bcb0..5700d8e2e1 100644
--- a/meta/lib/oe/package_manager/ipk/manifest.py
+++ b/meta/lib/oe/package_manager/ipk/manifest.py
@@ -4,10 +4,12 @@
from oe.manifest import Manifest
+
class PkgManifest(Manifest):
"""
Returns a dictionary object with mip and mlp packages.
"""
+
def _split_multilib(self, pkg_list):
pkgs = dict()
diff --git a/meta/lib/oe/package_manager/ipk/rootfs.py \
b/meta/lib/oe/package_manager/ipk/rootfs.py index 077c061c91..8033ee2020 100644
--- a/meta/lib/oe/package_manager/ipk/rootfs.py
+++ b/meta/lib/oe/package_manager/ipk/rootfs.py
@@ -11,6 +11,7 @@ from oe.utils import execute_pre_post_process
from oe.package_manager.ipk.manifest import PkgManifest
from oe.package_manager.ipk import OpkgPM
+
class DpkgOpkgRootfs(Rootfs):
def __init__(self, d, progress_reporter=None, logcatcher=None):
super(DpkgOpkgRootfs, self).__init__(d, progress_reporter, logcatcher)
@@ -121,6 +122,7 @@ class DpkgOpkgRootfs(Rootfs):
num += 1
+
class PkgRootfs(DpkgOpkgRootfs):
def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None):
super(PkgRootfs, self).__init__(d, progress_reporter, logcatcher)
@@ -173,6 +175,7 @@ class PkgRootfs(DpkgOpkgRootfs):
creation and the file has been changed, so we need to
prelink the other one and compare them.
'''
+
def _file_equal(self, key, f1, f2):
# Both of them are not prelinked
@@ -198,6 +201,7 @@ class PkgRootfs(DpkgOpkgRootfs):
See commit: "image.bbclass: Added variables for multilib support." by
Lianhao Lu.
"""
+
def _multilib_sanity_test(self, dirs):
allow_replace = self.d.getVar("MULTILIBRE_ALLOW_REP")
@@ -259,6 +263,7 @@ class PkgRootfs(DpkgOpkgRootfs):
unneeded pkgs by comparing the old full manifest in previous existing
image and the new full manifest in the current image.
'''
+
def _remove_extra_packages(self, pkgs_initial_install):
if self.inc_opkg_image_gen == "1":
# Parse full manifest in previous existing image creation session
@@ -286,6 +291,7 @@ class PkgRootfs(DpkgOpkgRootfs):
The conditions include any of 'PACKAGE_EXCLUDE, NO_RECOMMENDATIONS
and BAD_RECOMMENDATIONS' has been changed.
'''
+
def _remove_old_rootfs(self):
if self.inc_opkg_image_gen != "1":
return True
diff --git a/meta/lib/oe/package_manager/ipk/sdk.py \
b/meta/lib/oe/package_manager/ipk/sdk.py index e2ca415c8e..8c503e4efc 100644
--- a/meta/lib/oe/package_manager/ipk/sdk.py
+++ b/meta/lib/oe/package_manager/ipk/sdk.py
@@ -10,6 +10,7 @@ from oe.package_manager.ipk.manifest import PkgManifest
from oe.manifest import Manifest
from oe.package_manager.ipk import OpkgPM
+
class PkgSdk(Sdk):
def __init__(self, d, manifest_dir=None):
super(PkgSdk, self).__init__(d, manifest_dir)
diff --git a/meta/lib/oe/package_manager/rpm/__init__.py \
b/meta/lib/oe/package_manager/rpm/__init__.py index 1a38055891..c28a0aa0ab 100644
--- a/meta/lib/oe/package_manager/rpm/__init__.py
+++ b/meta/lib/oe/package_manager/rpm/__init__.py
@@ -6,6 +6,7 @@ import shutil
import subprocess
from oe.package_manager import *
+
class RpmIndexer(Indexer):
def write_index(self):
self.do_write_index(self.deploy_dir)
@@ -30,6 +31,7 @@ class RpmIndexer(Indexer):
self.d.getVar('PACKAGE_FEED_GPG_PASSPHRASE_FILE'),
armor=is_ascii_sig)
+
class RpmSubdirIndexer(RpmIndexer):
def write_index(self):
bb.note("Generating package index for %s" % (self.deploy_dir))
@@ -50,6 +52,7 @@ class PMPkgsList(PkgsList):
def list_pkgs(self):
return RpmPM(self.d, self.rootfs_dir, self.d.getVar('TARGET_VENDOR'), \
needfeed=False).list_installed()
+
class RpmPM(PackageManager):
def __init__(self,
d,
@@ -102,7 +105,6 @@ class RpmPM(PackageManager):
open(oe.path.join(self.target_rootfs, "etc/dnf/dnf.conf"), 'w').write("")
-
def _configure_rpm(self):
# We need to configure rpm to use our primary package architecture as the \
installation architecture,
# and to make it compatible with other package architectures that we use.
@@ -180,7 +182,6 @@ class RpmPM(PackageManager):
os.environ['INTERCEPT_DIR'] = self.intercepts_dir
os.environ['NATIVE_ROOT'] = self.d.getVar('STAGING_DIR_NATIVE')
-
def install(self, pkgs, attempt_only=False):
if len(pkgs) == 0:
return
diff --git a/meta/lib/oe/package_manager/rpm/manifest.py \
b/meta/lib/oe/package_manager/rpm/manifest.py index e6604b301f..6415c81210 100644
--- a/meta/lib/oe/package_manager/rpm/manifest.py
+++ b/meta/lib/oe/package_manager/rpm/manifest.py
@@ -4,10 +4,12 @@
from oe.manifest import Manifest
+
class PkgManifest(Manifest):
"""
Returns a dictionary object with mip and mlp packages.
"""
+
def _split_multilib(self, pkg_list):
pkgs = dict()
diff --git a/meta/lib/oe/package_manager/rpm/rootfs.py \
b/meta/lib/oe/package_manager/rpm/rootfs.py index 00d07cd9cc..470fec8718 100644
--- a/meta/lib/oe/package_manager/rpm/rootfs.py
+++ b/meta/lib/oe/package_manager/rpm/rootfs.py
@@ -8,6 +8,7 @@ from oe.utils import execute_pre_post_process
from oe.package_manager.rpm.manifest import PkgManifest
from oe.package_manager.rpm import RpmPM
+
class PkgRootfs(Rootfs):
def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None):
super(PkgRootfs, self).__init__(d, progress_reporter, logcatcher)
@@ -36,6 +37,7 @@ class PkgRootfs(Rootfs):
unneeded pkgs by comparing the new install solution manifest and the
old installed manifest.
'''
+
def _create_incremental(self, pkgs_initial_install):
if self.inc_rpm_image_gen == "1":
@@ -118,7 +120,6 @@ class PkgRootfs(Rootfs):
if self.progress_reporter:
self.progress_reporter.next_stage()
-
@staticmethod
def _depends_list():
return ['DEPLOY_DIR_RPM', 'INC_RPM_IMAGE_GEN', 'RPM_PREPROCESS_COMMANDS',
diff --git a/meta/lib/oe/package_manager/rpm/sdk.py \
b/meta/lib/oe/package_manager/rpm/sdk.py index c5f232431f..da226de092 100644
--- a/meta/lib/oe/package_manager/rpm/sdk.py
+++ b/meta/lib/oe/package_manager/rpm/sdk.py
@@ -9,6 +9,7 @@ from oe.manifest import Manifest
from oe.package_manager.rpm.manifest import PkgManifest
from oe.package_manager.rpm import RpmPM
+
class PkgSdk(Sdk):
def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"):
super(PkgSdk, self).__init__(d, manifest_dir)
diff --git a/meta/lib/oe/packagedata.py b/meta/lib/oe/packagedata.py
index a82085a792..24c93b4f05 100644
--- a/meta/lib/oe/packagedata.py
+++ b/meta/lib/oe/packagedata.py
@@ -5,9 +5,11 @@
import codecs
import os
+
def packaged(pkg, d):
return os.access(get_subpkgedata_fn(pkg, d) + '.packaged', os.R_OK)
+
def read_pkgdatafile(fn):
pkgdata = {}
@@ -27,19 +29,24 @@ def read_pkgdatafile(fn):
return pkgdata
+
def get_subpkgedata_fn(pkg, d):
return d.expand('${PKGDATA_DIR}/runtime/%s' % pkg)
+
def has_subpkgdata(pkg, d):
return os.access(get_subpkgedata_fn(pkg, d), os.R_OK)
+
def read_subpkgdata(pkg, d):
return read_pkgdatafile(get_subpkgedata_fn(pkg, d))
+
def has_pkgdata(pn, d):
fn = d.expand('${PKGDATA_DIR}/%s' % pn)
return os.access(fn, os.R_OK)
+
def read_pkgdata(pn, d):
fn = d.expand('${PKGDATA_DIR}/%s' % pn)
return read_pkgdatafile(fn)
@@ -47,6 +54,8 @@ def read_pkgdata(pn, d):
#
# Collapse FOO_pkg variables into FOO
#
+
+
def read_subpkgdata_dict(pkg, d):
ret = {}
subd = read_pkgdatafile(get_subpkgedata_fn(pkg, d))
@@ -57,6 +66,7 @@ def read_subpkgdata_dict(pkg, d):
ret[newvar] = subd[var]
return ret
+
def _pkgmap(d):
"""Return a dictionary mapping package to recipe name."""
@@ -81,6 +91,7 @@ def _pkgmap(d):
return pkgmap
+
def pkgmap(d):
"""Return a dictionary mapping package to recipe name.
Cache the mapping in the metadata"""
@@ -92,6 +103,7 @@ def pkgmap(d):
return pkgmap_data
+
def recipename(pkg, d):
"""Return the recipe name for the given binary package name."""
diff --git a/meta/lib/oe/packagegroup.py b/meta/lib/oe/packagegroup.py
index 8fcaecde82..5728fcbc85 100644
--- a/meta/lib/oe/packagegroup.py
+++ b/meta/lib/oe/packagegroup.py
@@ -4,27 +4,33 @@
import itertools
+
def is_optional(feature, d):
return bool(d.getVarFlag("FEATURE_PACKAGES_%s" % feature, "optional"))
+
def packages(features, d):
for feature in features:
packages = d.getVar("FEATURE_PACKAGES_%s" % feature)
for pkg in (packages or "").split():
yield pkg
+
def required_packages(features, d):
req = [feature for feature in features if not is_optional(feature, d)]
return packages(req, d)
+
def optional_packages(features, d):
opt = [feature for feature in features if is_optional(feature, d)]
return packages(opt, d)
+
def active_packages(features, d):
return itertools.chain(required_packages(features, d),
optional_packages(features, d))
+
def active_recipes(features, d):
import oe.packagedata
diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
index 4cab28a215..2bf13ec34b 100644
--- a/meta/lib/oe/patch.py
+++ b/meta/lib/oe/patch.py
@@ -5,6 +5,7 @@
import oe.path
import oe.types
+
class NotFoundError(bb.BBHandledException):
def __init__(self, path):
self.path = path
@@ -12,6 +13,7 @@ class NotFoundError(bb.BBHandledException):
def __str__(self):
return "Error: %s not found." % self.path
+
class CmdError(bb.BBHandledException):
def __init__(self, command, exitstatus, output):
self.command = command
@@ -56,6 +58,7 @@ def runcmd(args, dir=None):
if dir:
os.chdir(olddir)
+
class PatchError(Exception):
def __init__(self, msg):
self.msg = msg
@@ -63,6 +66,7 @@ class PatchError(Exception):
def __str__(self):
return "Patch Error: %s" % self.msg
+
class PatchSet(object):
defaults = {
"strippath": 1
@@ -290,6 +294,7 @@ class PatchTree(PatchSet):
""""""
self.Pop(all=True)
+
class GitApplyTree(PatchTree):
patch_line_prefix = '%% original patch'
ignore_commit_prefix = '%% ignore'
@@ -569,7 +574,6 @@ class QuiltTree(PatchSet):
def _quiltpatchpath(self, file):
return os.path.join(self.dir, "patches", os.path.basename(file))
-
def __init__(self, dir, d):
PatchSet.__init__(self, dir, d)
self.initialized = False
@@ -632,7 +636,6 @@ class QuiltTree(PatchSet):
self.patches.insert(self._current or 0, patch)
-
def Push(self, force=False, all=False, run=True):
# quilt push [-f]
@@ -690,6 +693,7 @@ class QuiltTree(PatchSet):
args.append(os.path.basename(self.patches[kwargs["patch"]]["quiltfile"]))
self._runcmd(args)
+
class Resolver(object):
def __init__(self, patchset, terminal):
raise NotImplementedError()
@@ -703,6 +707,7 @@ class Resolver(object):
def Finalize(self):
raise NotImplementedError()
+
class NOOPResolver(Resolver):
def __init__(self, patchset, terminal):
self.patchset = patchset
@@ -721,6 +726,8 @@ class NOOPResolver(Resolver):
# Patch resolver which relies on the user doing all the work involved in the
# resolution, with the exception of refreshing the remote copy of the patch
# files (the urls).
+
+
class UserResolver(Resolver):
def __init__(self, patchset, terminal):
self.patchset = patchset
@@ -803,6 +810,7 @@ def patch_path(url, fetch, workdir, expand=True):
return local
+
def src_patches(d, all=False, expand=True):
workdir = d.getVar('WORKDIR')
fetch = bb.fetch2.Fetch([], d)
@@ -866,7 +874,6 @@ def should_apply(parm, d):
if "mindate" in parm and parm["mindate"] > srcdate:
return False, 'is predated'
-
if "minrev" in parm:
srcrev = d.getVar('SRCREV')
if srcrev and srcrev < parm["minrev"]:
diff --git a/meta/lib/oe/path.py b/meta/lib/oe/path.py
index 101ee2d029..1ac9c2cfcf 100644
--- a/meta/lib/oe/path.py
+++ b/meta/lib/oe/path.py
@@ -8,10 +8,12 @@ import shutil
import subprocess
import os.path
+
def join(*paths):
"""Like os.path.join but doesn't treat absolute RHS specially"""
return os.path.normpath("/".join(paths))
+
def relative(src, dest):
""" Return a relative path from src to dest.
@@ -27,6 +29,7 @@ def relative(src, dest):
return os.path.relpath(dest, src)
+
def make_relative_symlink(path):
""" Convert an absolute symlink to a relative one """
if not os.path.islink(path):
@@ -54,6 +57,7 @@ def make_relative_symlink(path):
os.remove(path)
os.symlink(base, path)
+
def replace_absolute_symlinks(basedir, d):
"""
Walk basedir looking for absolute symlinks and replacing them with relative \
ones. @@ -75,6 +79,7 @@ def replace_absolute_symlinks(basedir, d):
os.remove(path)
os.symlink(base, path)
+
def format_display(path, metadata):
""" Prepare a path for display to the user. """
rel = relative(metadata.getVar("TOPDIR"), path)
@@ -83,6 +88,7 @@ def format_display(path, metadata):
else:
return rel
+
def copytree(src, dst):
# We could use something like shutil.copytree here but it turns out to
# to be slow. It takes twice as long copying to an empty directory.
@@ -93,6 +99,7 @@ def copytree(src, dst):
cmd = "tar --xattrs --xattrs-include='*' -cf - -S -C %s -p . | tar --xattrs \
--xattrs-include='*' -xf - -C %s" % (src, dst) subprocess.check_output(cmd, \
shell=True, stderr=subprocess.STDOUT)
+
def copyhardlinktree(src, dst):
"""Make a tree of hard links when possible, otherwise copy."""
bb.utils.mkdirhier(dst)
@@ -133,6 +140,7 @@ def copyhardlinktree(src, dst):
else:
copytree(src, dst)
+
def copyhardlink(src, dst):
"""Make a hard link when possible, otherwise copy."""
@@ -141,6 +149,7 @@ def copyhardlink(src, dst):
except OSError:
shutil.copy(src, dst)
+
def remove(path, recurse=True):
"""
Equivalent to rm -f or rm -rf
@@ -159,6 +168,7 @@ def remove(path, recurse=True):
elif exc.errno != errno.ENOENT:
raise
+
def symlink(source, destination, force=False):
"""Create a symbolic link"""
try:
@@ -169,6 +179,7 @@ def symlink(source, destination, force=False):
if e.errno != errno.EEXIST or os.readlink(destination) != source:
raise
+
def find(dir, **walkoptions):
""" Given a directory, recurses into that directory,
returning all files as absolute paths. """
@@ -182,6 +193,7 @@ def find(dir, **walkoptions):
def __is_path_below(file, root):
return (file + os.path.sep).startswith(root)
+
def __realpath_rel(start, rel_path, root, loop_cnt, assume_dir):
"""Calculates real path of symlink 'start' + 'rel_path' below
'root'; no part of 'start' below 'root' must contain symlinks. """
@@ -206,6 +218,7 @@ def __realpath_rel(start, rel_path, root, loop_cnt, assume_dir):
return start
+
def __realpath(file, root, loop_cnt, assume_dir):
while os.path.islink(file) and len(file) >= len(root):
if loop_cnt == 0:
@@ -229,6 +242,7 @@ def __realpath(file, root, loop_cnt, assume_dir):
return (file, is_dir)
+
def realpath(file, root, use_physdir=True, loop_cnt=100, assume_dir=False):
""" Returns the canonical path of 'file' with assuming a
toplevel 'root' directory. When 'use_physdir' is set, all
@@ -265,6 +279,7 @@ def realpath(file, root, use_physdir=True, loop_cnt=100, \
assume_dir=False):
return file
+
def is_path_parent(possible_parent, *paths):
"""
Return True if a path is the parent of another, False otherwise.
@@ -287,6 +302,7 @@ def is_path_parent(possible_parent, *paths):
return False
return True
+
def which_wild(pathname, path=None, mode=os.F_OK, *, reverse=False, \
candidates=False): """Search a search path for pathname, supporting wildcards.
@@ -320,6 +336,7 @@ def which_wild(pathname, path=None, mode=os.F_OK, *, \
reverse=False, candidates=F
return files
+
def canonicalize(paths, sep=','):
"""Given a string with paths (separated by commas by default), expand
each path using os.path.realpath() and return the resulting paths as a
diff --git a/meta/lib/oe/prservice.py b/meta/lib/oe/prservice.py
index d71140980a..30808e362a 100644
--- a/meta/lib/oe/prservice.py
+++ b/meta/lib/oe/prservice.py
@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+
def prserv_make_conn(d, check=False):
import prserv.serv
host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if \
_f]) @@ -17,6 +18,7 @@ def prserv_make_conn(d, check=False):
return conn
+
def prserv_dump_db(d):
if not d.getVar('PRSERV_HOST'):
bb.error("Not using network based PR service")
@@ -36,6 +38,7 @@ def prserv_dump_db(d):
opt_col = ("1" == d.getVar('PRSERV_DUMPOPT_COL'))
return conn.export(opt_version, opt_pkgarch, opt_checksum, opt_col)
+
def prserv_import_db(d, filter_version=None, filter_pkgarch=None, \
filter_checksum=None): if not d.getVar('PRSERV_HOST'):
bb.error("Not using network based PR service")
@@ -72,6 +75,7 @@ def prserv_import_db(d, filter_version=None, filter_pkgarch=None, \
filter_checksu imported.append((version, pkgarch, checksum, value))
return imported
+
def prserv_export_tofile(d, metainfo, datainfo, lockdown, nomax=False):
import bb.utils
#initilize the output file
@@ -115,6 +119,7 @@ def prserv_export_tofile(d, metainfo, datainfo, lockdown, \
nomax=False):
f.write("PRAUTO_%s_%s = \"%s\"\n" % \
(str(datainfo[idx[i]]['version']), str(datainfo[idx[i]]['pkgarch']), \
str(datainfo[idx[i]]['value']))) bb.utils.unlockfile(lf)
+
def prserv_check_avail(d):
host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if \
_f]) try:
diff --git a/meta/lib/oe/qa.py b/meta/lib/oe/qa.py
index c6aaa0af06..f2310c18be 100644
--- a/meta/lib/oe/qa.py
+++ b/meta/lib/oe/qa.py
@@ -6,9 +6,11 @@ import os
import struct
import mmap
+
class NotELFFileError(Exception):
pass
+
class ELFFile:
EI_NIDENT = 16
@@ -151,6 +153,7 @@ class ELFFile:
bb.note("%s %s %s failed: %s" % (objdump, cmd, self.name, e))
return ""
+
def elf_machine_to_string(machine):
"""
Return the name of a given ELF e_machine field or the hex value as a string
@@ -173,6 +176,7 @@ def elf_machine_to_string(machine):
except:
return "Unknown (%s)" % repr(machine)
+
if __name__ == "__main__":
import sys
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py
index 6842f7387d..610500b6a0 100644
--- a/meta/lib/oe/recipeutils.py
+++ b/meta/lib/oe/recipeutils.py
@@ -232,6 +232,7 @@ def patch_recipe_lines(fromlines, values, trailing_newline=True):
lines.extend(addlines)
existingnames = []
+
def patch_recipe_varfunc(varname, origvalue, op, newlines):
if modifying:
# Insert anything that should come before this variable
@@ -334,11 +335,13 @@ def localise_file_vars(fn, varfiles, varlist):
return filevars
+
def patch_recipe(d, fn, varvalues, patch=False, relpath='', redirect_output=None):
"""Modify a list of variable values in the specified recipe. Handles inc files \
if used by the recipe.
"""
overrides = d.getVar('OVERRIDES').split(':')
+
def override_applicable(hevent):
op = hevent['op']
if '[' in op:
@@ -389,7 +392,6 @@ def patch_recipe(d, fn, varvalues, patch=False, relpath='', \
redirect_output=None return None
-
def copy_recipe_files(d, tgt_dir, whole_dir=False, download=True, \
all_variants=False):
"""Copy (local) recipe files, including both files included via include/require,
and files referred to in the SRC_URI variable."""
@@ -400,6 +402,7 @@ def copy_recipe_files(d, tgt_dir, whole_dir=False, download=True, \
all_variants=F
uri_values = []
localpaths = []
+
def fetch_urls(rdata):
# Collect the local paths from SRC_URI
srcuri = rdata.getVar('SRC_URI') or ""
@@ -612,6 +615,7 @@ def get_bbfile_path(d, destdir, extrapathhint=None):
return pathoption
return None
+
def get_bbappend_path(d, destlayerdir, wildcardver=False):
"""Determine how a bbappend for a recipe should be named and located within \
another layer"""
@@ -942,6 +946,7 @@ def replace_dir_vars(path, d):
path = path.replace(dirpath, '${%s}' % dirvars[dirpath])
return path
+
def get_recipe_pv_without_srcpv(pv, uri_type):
"""
Get PV without SRCPV common in SCM's for now only
@@ -969,6 +974,7 @@ def get_recipe_pv_without_srcpv(pv, uri_type):
return (pv, pfx, sfx)
+
def get_recipe_upstream_version(rd):
"""
Get upstream version of recipe using bb.fetch2 methods with support for
@@ -1048,6 +1054,7 @@ def get_recipe_upstream_version(rd):
return ru
+
def _get_recipe_upgrade_status(data):
uv = get_recipe_upstream_version(data)
@@ -1073,6 +1080,7 @@ def _get_recipe_upgrade_status(data):
return (pn, status, cur_ver, next_ver, maintainer, revision, no_upgrade_reason)
+
def get_recipe_upgrade_status(recipes=None):
pkgs_list = []
data_copy_list = []
diff --git a/meta/lib/oe/reproducible.py b/meta/lib/oe/reproducible.py
index 204b9bd734..fd9f9354fd 100644
--- a/meta/lib/oe/reproducible.py
+++ b/meta/lib/oe/reproducible.py
@@ -5,6 +5,7 @@ import os
import subprocess
import bb
+
def get_source_date_epoch_from_known_files(d, sourcedir):
source_date_epoch = None
newest_file = None
@@ -21,6 +22,7 @@ def get_source_date_epoch_from_known_files(d, sourcedir):
bb.debug(1, "SOURCE_DATE_EPOCH taken from: %s" % newest_file)
return source_date_epoch
+
def find_git_folder(d, sourcedir):
# First guess: WORKDIR/git
# This is the default git fetcher unpack path
@@ -46,6 +48,7 @@ def find_git_folder(d, sourcedir):
bb.warn("Failed to find a git repository in WORKDIR: %s" % workdir)
return None
+
def get_source_date_epoch_from_git(d, sourcedir):
if not "git://" in d.getVar('SRC_URI') and not "gitsm://" in \
d.getVar('SRC_URI'): return None
@@ -65,6 +68,7 @@ def get_source_date_epoch_from_git(d, sourcedir):
p = subprocess.run(['git', '--git-dir', gitpath, 'log', '-1', '--pretty=%ct'], \
check=True, stdout=subprocess.PIPE) return int(p.stdout.decode('utf-8'))
+
def get_source_date_epoch_from_youngest_file(d, sourcedir):
if sourcedir == d.getVar('WORKDIR'):
# These sources are almost certainly not from a tarball
@@ -90,6 +94,7 @@ def get_source_date_epoch_from_youngest_file(d, sourcedir):
bb.debug(1, "Newest file found: %s" % newest_file)
return source_date_epoch
+
def fixed_source_date_epoch(d):
bb.debug(1, "No tarball or git repo found to determine SOURCE_DATE_EPOCH")
source_date_epoch = d.getVar('SOURCE_DATE_EPOCH_FALLBACK')
@@ -98,6 +103,7 @@ def fixed_source_date_epoch(d):
return int(source_date_epoch)
return 0
+
def get_source_date_epoch(d, sourcedir):
return (
get_source_date_epoch_from_git(d, sourcedir) or
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index 0043df18d7..cd4d158570 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -11,6 +11,7 @@ import os
import subprocess
import re
+
class Rootfs(object, metaclass=ABCMeta):
"""
This is an abstract class. Do not instantiate this directly.
@@ -94,7 +95,6 @@ class Rootfs(object, metaclass=ABCMeta):
self.d.getVar('PACKAGE_FEED_BASE_PATHS') or "",
self.d.getVar('PACKAGE_FEED_ARCHS'))
-
"""
The _cleanup() method should be used to clean-up stuff that we don't really
want to end up on target. For example, in the case of RPM, the DB locks.
@@ -248,7 +248,6 @@ class Rootfs(object, metaclass=ABCMeta):
if self.progress_reporter:
self.progress_reporter.next_stage()
-
def _uninstall_unneeded(self):
# Remove the run-postinsts package if no delayed postinsts are found
delayed_postinsts = self._get_delayed_postinsts()
@@ -337,6 +336,7 @@ class Rootfs(object, metaclass=ABCMeta):
If neither are specified then the default name of files/device_table-minimal.txt
is searched for in the BBPATH (same as the old version.)
"""
+
def _create_devfs(self):
devtable_list = []
devtable = self.d.getVar('IMAGE_DEVICE_TABLE')
@@ -359,11 +359,13 @@ def get_class_for_type(imgtype):
mod = importlib.import_module('oe.package_manager.' + imgtype + '.rootfs')
return mod.PkgRootfs
+
def variable_depends(d, manifest_dir=None):
img_type = d.getVar('IMAGE_PKGTYPE')
cls = get_class_for_type(img_type)
return cls._depends_list()
+
def create_rootfs(d, manifest_dir=None, progress_reporter=None, logcatcher=None):
env_bkp = os.environ.copy()
@@ -385,6 +387,7 @@ def image_list_installed_packages(d, rootfs_dir=None):
cls = importlib.import_module('oe.package_manager.' + img_type)
return cls.PMPkgsList(d, rootfs_dir).list_pkgs()
+
if __name__ == "__main__":
"""
We should be able to run this as a standalone script, from outside bitbake
diff --git a/meta/lib/oe/sdk.py b/meta/lib/oe/sdk.py
index aad3f571da..7dca15b65c 100644
--- a/meta/lib/oe/sdk.py
+++ b/meta/lib/oe/sdk.py
@@ -9,6 +9,7 @@ from oe.package_manager import *
import os
import traceback
+
class Sdk(object, metaclass=ABCMeta):
def __init__(self, d, manifest_dir):
self.d = d
@@ -120,6 +121,7 @@ def sdk_list_installed_packages(d, target, rootfs_dir=None):
cls = importlib.import_module('oe.package_manager.' + img_type)
return cls.PMPkgsList(d, rootfs_dir).list_pkgs()
+
def populate_sdk(d, manifest_dir=None):
env_bkp = os.environ.copy()
@@ -131,6 +133,7 @@ def populate_sdk(d, manifest_dir=None):
os.environ.clear()
os.environ.update(env_bkp)
+
def get_extra_sdkinfo(sstate_dir):
"""
This function is going to be used for generating the target and host manifest \
files packages of eSDK. @@ -150,5 +153,6 @@ def get_extra_sdkinfo(sstate_dir):
extra_info['filesizes'][fn] = fsize
return extra_info
+
if __name__ == "__main__":
pass
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index 560c6a40dd..588332042d 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -5,23 +5,30 @@ import bb.siggen
import bb.runqueue
import oe
+
def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, dataCaches):
# Return True if we should keep the dependency, False to drop it
def isNative(x):
return x.endswith("-native")
+
def isCross(x):
return "-cross-" in x
+
def isNativeSDK(x):
return x.startswith("nativesdk-")
+
def isKernel(mc, fn):
inherits = " ".join(dataCaches[mc].inherits[fn])
return inherits.find("/module-base.bbclass") != -1 or \
inherits.find("/linux-kernel-base.bbclass") != -1 +
def isPackageGroup(mc, fn):
inherits = " ".join(dataCaches[mc].inherits[fn])
return "/packagegroup.bbclass" in inherits
+
def isAllArch(mc, fn):
inherits = " ".join(dataCaches[mc].inherits[fn])
return "/allarch.bbclass" in inherits
+
def isImage(mc, fn):
return "/image.bbclass" in " ".join(dataCaches[mc].inherits[fn])
@@ -71,6 +78,7 @@ def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, \
dataCaches): # Default to keep dependencies
return True
+
def sstate_lockedsigs(d):
sigs = {}
types = (d.getVar("SIGGEN_LOCKEDSIGS_TYPES") or "").split()
@@ -84,15 +92,19 @@ def sstate_lockedsigs(d):
sigs[pn][task] = [h, siggen_lockedsigs_var]
return sigs
+
class SignatureGeneratorOEBasic(bb.siggen.SignatureGeneratorBasic):
name = "OEBasic"
+
def init_rundepcheck(self, data):
self.abisaferecipes = (data.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or \
"").split()
self.saferecipedeps = (data.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or \
"").split() pass
+
def rundep_check(self, fn, recipename, task, dep, depname, dataCaches=None):
return sstate_rundepfilter(self, fn, recipename, task, dep, depname, \
dataCaches)
+
class SignatureGeneratorOEBasicHashMixIn(object):
supports_multiconfig_datacaches = True
@@ -301,9 +313,11 @@ class SignatureGeneratorOEBasicHashMixIn(object):
if error_msgs:
bb.fatal("\n".join(error_msgs))
+
class SignatureGeneratorOEBasicHash(SignatureGeneratorOEBasicHashMixIn, \
bb.siggen.SignatureGeneratorBasicHash): name = "OEBasicHash"
+
class SignatureGeneratorOEEquivHash(SignatureGeneratorOEBasicHashMixIn, \
bb.siggen.SignatureGeneratorUniHashMixIn, bb.siggen.SignatureGeneratorBasicHash): \
name = "OEEquivHash"
@@ -316,6 +330,7 @@ class \
SignatureGeneratorOEEquivHash(SignatureGeneratorOEBasicHashMixIn, bb.sigge if not \
self.method:
bb.fatal("OEEquivHash requires SSTATE_HASHEQUIV_METHOD to be set")
+
# Insert these classes into siggen's namespace so it can see and select them
bb.siggen.SignatureGeneratorOEBasic = SignatureGeneratorOEBasic
bb.siggen.SignatureGeneratorOEBasicHash = SignatureGeneratorOEBasicHash
@@ -415,6 +430,7 @@ def find_siginfo(pn, taskname, taskhashlist, d):
else:
return filedates
+
bb.siggen.find_siginfo = find_siginfo
@@ -429,6 +445,7 @@ def sstate_get_manifest_filename(task, d):
d2.setVar("SSTATE_MANMACH", extrainf)
return (d2.expand("${SSTATE_MANFILEPREFIX}.%s" % task), d2)
+
def find_sstate_manifest(taskdata, taskdata2, taskname, d, multilibcache):
d2 = d
variant = ''
@@ -467,6 +484,7 @@ def find_sstate_manifest(taskdata, taskdata2, taskname, d, \
multilibcache):
bb.fatal("Manifest %s not found in %s (variant '%s')?" % (manifest, d2.expand(" \
".join(pkgarchs)), variant)) return None, d2
+
def OEOuthashBasic(path, sigfile, task, d):
"""
Basic output hash function
diff --git a/meta/lib/oe/terminal.py b/meta/lib/oe/terminal.py
index 4b9c71eea1..965789c14b 100644
--- a/meta/lib/oe/terminal.py
+++ b/meta/lib/oe/terminal.py
@@ -13,6 +13,7 @@ logger = logging.getLogger('BitBake.OE.Terminal')
class UnsupportedTerminal(Exception):
pass
+
class NoSupportedTerminals(Exception):
def __init__(self, terms):
self.terms = terms
@@ -48,12 +49,14 @@ class Terminal(Popen, metaclass=Registry):
else:
return [element.format(**fmt) for element in self.command]
+
class XTerminal(Terminal):
def __init__(self, sh_cmd, title=None, env=None, d=None):
Terminal.__init__(self, sh_cmd, title, env, d)
if not os.environ.get('DISPLAY'):
raise UnsupportedTerminal(self.name)
+
class Gnome(XTerminal):
command = 'gnome-terminal -t "{title}" -- {command}'
priority = 2
@@ -68,18 +71,22 @@ class Gnome(XTerminal):
XTerminal.__init__(self, sh_cmd, title, env, d)
+
class Mate(XTerminal):
command = 'mate-terminal --disable-factory -t "{title}" -x {command}'
priority = 2
+
class Xfce(XTerminal):
command = 'xfce4-terminal -T "{title}" -e "{command}"'
priority = 2
+
class Terminology(XTerminal):
command = 'terminology -T="{title}" -e {command}'
priority = 2
+
class Konsole(XTerminal):
command = 'konsole --separate --workdir . -p tabtitle="{title}" -e {command}'
priority = 2
@@ -95,14 +102,17 @@ class Konsole(XTerminal):
self.command = 'konsole --nofork --workdir . -p tabtitle="{title}" -e \
{command}' XTerminal.__init__(self, sh_cmd, title, env, d)
+
class XTerm(XTerminal):
command = 'xterm -T "{title}" -e {command}'
priority = 1
+
class Rxvt(XTerminal):
command = 'rxvt -T "{title}" -e {command}'
priority = 1
+
class Screen(Terminal):
command = 'screen -D -m -t "{title}" -S devshell {command}'
@@ -118,6 +128,7 @@ class Screen(Terminal):
else:
logger.warning(msg)
+
class TmuxRunning(Terminal):
"""Open a new pane in the current running tmux window"""
name = 'tmux-running'
@@ -136,6 +147,7 @@ class TmuxRunning(Terminal):
Terminal.__init__(self, sh_cmd, title, env, d)
+
class TmuxNewWindow(Terminal):
"""Open a new window in the current running tmux session"""
name = 'tmux-new-window'
@@ -151,6 +163,7 @@ class TmuxNewWindow(Terminal):
Terminal.__init__(self, sh_cmd, title, env, d)
+
class Tmux(Terminal):
"""Start a new tmux session and window"""
command = 'tmux new -c "{cwd}" -d -s devshell -n devshell "{command}"'
@@ -179,6 +192,7 @@ class Tmux(Terminal):
else:
logger.warning(msg)
+
class Custom(Terminal):
command = 'false' # This is a placeholder
priority = 3
@@ -198,6 +212,7 @@ class Custom(Terminal):
def prioritized():
return Registry.prioritized()
+
def get_cmd_list():
terms = Registry.prioritized()
cmds = []
@@ -206,6 +221,7 @@ def get_cmd_list():
cmds.append(term.command)
return cmds
+
def spawn_preferred(sh_cmd, title=None, env=None, d=None):
"""Spawn the first supported terminal, by priority"""
for terminal in prioritized():
@@ -220,6 +236,7 @@ def spawn_preferred(sh_cmd, title=None, env=None, d=None):
else:
raise NoSupportedTerminals(get_cmd_list())
+
def spawn(name, sh_cmd, title=None, env=None, d=None):
"""Spawn the specified terminal, by name"""
logger.debug('Attempting to spawn terminal "%s"', name)
@@ -259,12 +276,14 @@ def spawn(name, sh_cmd, title=None, env=None, d=None):
except OSError:
return
+
def check_tmux_version(desired):
vernum = check_terminal_version("tmux")
if vernum and LooseVersion(vernum) < desired:
return False
return vernum
+
def check_tmux_pane_size(tmux):
import subprocess as sub
# On older tmux versions (<1.9), return false. The reason
@@ -286,6 +305,7 @@ def check_tmux_pane_size(tmux):
return size / 2 >= 19
+
def check_terminal_version(terminalName):
import subprocess as sub
try:
@@ -317,6 +337,7 @@ def check_terminal_version(terminalName):
vernum = ver.split()[-1][5:]
return vernum
+
def distro_name():
try:
p = Popen(['lsb_release', '-i'])
diff --git a/meta/lib/oe/types.py b/meta/lib/oe/types.py
index ee7cc0e659..01328537f4 100644
--- a/meta/lib/oe/types.py
+++ b/meta/lib/oe/types.py
@@ -31,6 +31,7 @@ class OEList(list):
def __str__(self):
return self.separator.join(self)
+
def choice(value, choices):
"""OpenEmbedded 'choice' type
@@ -47,8 +48,10 @@ def choice(value, choices):
(value, choices))
return value
+
class NoMatch(object):
"""Stub python regex pattern object which never matches anything"""
+
def findall(self, string, flags=0):
return None
@@ -70,8 +73,10 @@ class NoMatch(object):
def subn(pattern, repl, string, count=0):
return None
+
NoMatch = NoMatch()
+
def regex(value, regexflags=None):
"""OpenEmbedded 'regex' type
@@ -103,6 +108,7 @@ def regex(value, regexflags=None):
raise ValueError("Invalid regex value '%s': %s" %
(value, exc.args[0]))
+
def boolean(value):
"""OpenEmbedded 'boolean' type
@@ -125,6 +131,7 @@ def boolean(value):
return False
raise ValueError("Invalid boolean value '%s'" % value)
+
def integer(value, numberbase=10):
"""OpenEmbedded 'integer' type
@@ -133,7 +140,10 @@ def integer(value, numberbase=10):
return int(value, int(numberbase))
+
_float = float
+
+
def float(value, fromhex='false'):
"""OpenEmbedded floating point type
@@ -146,6 +156,7 @@ def float(value, fromhex='false'):
else:
return _float(value)
+
def path(value, relativeto='', normalize='true', mustexist='false'):
value = os.path.join(relativeto, value)
@@ -162,6 +173,7 @@ def path(value, relativeto='', normalize='true', \
mustexist='false'):
return value
+
def is_x86(arch):
"""
Check whether arch is x86 or x86_64
@@ -171,6 +183,7 @@ def is_x86(arch):
else:
return False
+
def qemu_use_kvm(kvm, target_arch):
"""
Enable kvm if target_arch == build_arch or both of them are x86 archs.
diff --git a/meta/lib/oe/useradd.py b/meta/lib/oe/useradd.py
index 8fc77568ff..fea843834a 100644
--- a/meta/lib/oe/useradd.py
+++ b/meta/lib/oe/useradd.py
@@ -4,6 +4,7 @@
import argparse
import re
+
class myArgumentParser(argparse.ArgumentParser):
def _print_message(self, message, file=None):
bb.warn("%s - %s: %s" % (d.getVar('PN'), pkg, message))
@@ -16,16 +17,19 @@ class myArgumentParser(argparse.ArgumentParser):
def error(self, message):
bb.fatal(message)
+
def split_commands(params):
params = re.split('''[ \t]*;[ \t]*(?=(?:[^'"]|'[^']*'|"[^"]*")*$)''', \
params.strip()) # Remove any empty items
return [x for x in params if x]
+
def split_args(params):
params = re.split('''[ \t]+(?=(?:[^'"]|'[^']*'|"[^"]*")*$)''', params.strip())
# Remove any empty items
return [x for x in params if x]
+
def build_useradd_parser():
# The following comes from --help on useradd from shadow
parser = myArgumentParser(prog='useradd')
@@ -55,6 +59,7 @@ def build_useradd_parser():
return parser
+
def build_groupadd_parser():
# The following comes from --help on groupadd from shadow
parser = myArgumentParser(prog='groupadd')
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py
index 929ca9c5b1..60cd4cb446 100644
--- a/meta/lib/oe/utils.py
+++ b/meta/lib/oe/utils.py
@@ -6,6 +6,7 @@ import subprocess
import multiprocessing
import traceback
+
def read_file(filename):
try:
f = open(filename, "r")
@@ -17,18 +18,21 @@ def read_file(filename):
return data
return None
+
def ifelse(condition, iftrue=True, iffalse=False):
if condition:
return iftrue
else:
return iffalse
+
def conditional(variable, checkvalue, truevalue, falsevalue, d):
if d.getVar(variable) == checkvalue:
return truevalue
else:
return falsevalue
+
def vartrue(var, iftrue, iffalse, d):
import oe.types
if oe.types.boolean(d.getVar(var)):
@@ -36,12 +40,14 @@ def vartrue(var, iftrue, iffalse, d):
else:
return iffalse
+
def less_or_equal(variable, checkvalue, truevalue, falsevalue, d):
if float(d.getVar(variable)) <= float(checkvalue):
return truevalue
else:
return falsevalue
+
def version_less_or_equal(variable, checkvalue, truevalue, falsevalue, d):
result = bb.utils.vercmp_string(d.getVar(variable), checkvalue)
if result <= 0:
@@ -49,6 +55,7 @@ def version_less_or_equal(variable, checkvalue, truevalue, \
falsevalue, d): else:
return falsevalue
+
def both_contain(variable1, variable2, checkvalue, d):
val1 = d.getVar(variable1)
val2 = d.getVar(variable2)
@@ -63,6 +70,7 @@ def both_contain(variable1, variable2, checkvalue, d):
else:
return ""
+
def set_intersect(variable1, variable2, d):
"""
Expand both variables, interpret them as lists of strings, and return the
@@ -78,6 +86,7 @@ def set_intersect(variable1, variable2, d):
val2 = set(d.getVar(variable2).split())
return " ".join(val1 & val2)
+
def prune_suffix(var, suffixes, d):
# See if var ends with any of the suffixes listed and
# remove it if found
@@ -91,22 +100,27 @@ def prune_suffix(var, suffixes, d):
return var
+
def str_filter(f, str, d):
from re import match
return " ".join([x for x in str.split() if match(f, x, 0)])
+
def str_filter_out(f, str, d):
from re import match
return " ".join([x for x in str.split() if not match(f, x, 0)])
+
def build_depends_string(depends, task):
"""Append a taskname to a string of dependencies as used by the [depends] \
flag""" return " ".join(dep + ":" + task for dep in depends.split())
+
def inherits(d, *classes):
"""Return True if the metadata inherits any of the specified classes"""
return any(bb.data.inherits_class(cls, d) for cls in classes)
+
def features_backfill(var, d):
# This construct allows the addition of new features to variable specified
# as var
@@ -128,6 +142,7 @@ def features_backfill(var, d):
if addfeatures:
d.appendVar(var, " " + " ".join(addfeatures))
+
def all_distro_features(d, features, truevalue="1", falsevalue=""):
"""
Returns truevalue if *all* given features are set in DISTRO_FEATURES,
@@ -148,6 +163,7 @@ def all_distro_features(d, features, truevalue="1", \
falsevalue=""): """
return bb.utils.contains("DISTRO_FEATURES", features, truevalue, falsevalue, d)
+
def any_distro_features(d, features, truevalue="1", falsevalue=""):
"""
Returns truevalue if at least *one* of the given features is set in \
DISTRO_FEATURES, @@ -169,6 +185,7 @@ def any_distro_features(d, features, \
truevalue="1", falsevalue=""): """
return bb.utils.contains_any("DISTRO_FEATURES", features, truevalue, falsevalue, \
d)
+
def parallel_make(d, makeinst=False):
"""
Return the integer value for the number of parallel threads to use when
@@ -195,6 +212,7 @@ def parallel_make(d, makeinst=False):
return ''
+
def parallel_make_argument(d, fmt, limit=None, makeinst=False):
"""
Helper utility to construct a parallel make argument from the number of
@@ -215,6 +233,7 @@ def parallel_make_argument(d, fmt, limit=None, makeinst=False):
return fmt % v
return ''
+
def packages_filter_out_system(d):
"""
Return a list of packages from PACKAGES with the "system" packages such as
@@ -230,6 +249,7 @@ def packages_filter_out_system(d):
pkgs.append(pkg)
return pkgs
+
def getstatusoutput(cmd):
return subprocess.getstatusoutput(cmd)
@@ -248,10 +268,12 @@ def trim_version(version, num_parts=2):
trimmed = ".".join(parts[:num_parts])
return trimmed
+
def cpu_count(at_least=1):
cpus = len(os.sched_getaffinity(0))
return max(cpus, at_least)
+
def execute_pre_post_process(d, cmds):
if cmds is None:
return
@@ -265,6 +287,8 @@ def execute_pre_post_process(d, cmds):
# For each item in items, call the function 'target' with item as the first
# argument, extraargs as the other arguments and handle any exceptions in the
# parent thread
+
+
def multiprocess_launch(target, items, d, extraargs=None):
class ProcessLaunch(multiprocessing.Process):
@@ -340,10 +364,12 @@ def multiprocess_launch(target, items, d, extraargs=None):
bb.fatal("Fatal errors occurred in subprocesses:\n%s" % msg)
return results
+
def squashspaces(string):
import re
return re.sub(r"\s+", " ", string).strip()
+
def format_pkg_list(pkg_dict, ret_format=None):
output = []
@@ -452,11 +478,14 @@ def get_multilib_datastore(variant, d):
# so implement a version here
#
+
from queue import Queue
from threading import Thread
+
class ThreadedWorker(Thread):
"""Thread executing tasks from a given tasks queue"""
+
def __init__(self, tasks, worker_init, worker_end):
Thread.__init__(self)
self.tasks = tasks
@@ -486,8 +515,10 @@ class ThreadedWorker(Thread):
finally:
self.tasks.task_done()
+
class ThreadedPool:
"""Pool of threads consuming tasks from a queue"""
+
def __init__(self, num_workers, num_tasks, worker_init=None,
worker_end=None):
self.tasks = Queue(num_tasks)
@@ -511,6 +542,7 @@ class ThreadedPool:
for worker in self.workers:
worker.join()
+
def write_ld_so_conf(d):
# Some utils like prelink may not have the correct target library paths
# so write an ld.so.conf to help them
@@ -522,6 +554,7 @@ def write_ld_so_conf(d):
f.write(d.getVar("base_libdir") + '\n')
f.write(d.getVar("libdir") + '\n')
+
class ImageQAFailed(Exception):
def __init__(self, description, name=None, logfile=None):
self.description = description
@@ -535,10 +568,12 @@ class ImageQAFailed(Exception):
return msg
+
def sh_quote(string):
import shlex
return shlex.quote(string)
+
def directory_size(root, blocksize=4096):
"""
Calculate the size of the directory, taking into account hard links,
diff --git a/meta/lib/oeqa/buildperf/base.py b/meta/lib/oeqa/buildperf/base.py
index 5f1805d86c..5c2a87a649 100644
--- a/meta/lib/oeqa/buildperf/base.py
+++ b/meta/lib/oeqa/buildperf/base.py
@@ -142,7 +142,6 @@ class BuildPerfTestResult(unittest.TextTestResult):
[('SKIPPED', t, m) for t, m in self.skipped]
return sorted(compound, key=lambda info: info[1].start_time)
-
def write_buildstats_json(self):
"""Write buildstats file"""
buildstats = OrderedDict()
@@ -152,7 +151,6 @@ class BuildPerfTestResult(unittest.TextTestResult):
with open(os.path.join(self.out_dir, 'buildstats.json'), 'w') as fobj:
json.dump(buildstats, fobj, cls=ResultsJsonEncoder)
-
def write_results_json(self):
"""Write test results into a json-formatted file"""
results = OrderedDict([('tester_host', self.hostname),
diff --git a/meta/lib/oeqa/buildperf/test_basic.py \
b/meta/lib/oeqa/buildperf/test_basic.py index 2104617ba3..0d4537ca24 100644
--- a/meta/lib/oeqa/buildperf/test_basic.py
+++ b/meta/lib/oeqa/buildperf/test_basic.py
@@ -10,6 +10,7 @@ import oe.path
from oeqa.buildperf import BuildPerfTestCase
from oeqa.utils.commands import get_bb_var, get_bb_vars
+
class Test1P1(BuildPerfTestCase):
build_target = 'core-image-sato'
diff --git a/meta/lib/oeqa/controllers/masterimage.py \
b/meta/lib/oeqa/controllers/masterimage.py index c22bc2833d..fab9cde8bd 100644
--- a/meta/lib/oeqa/controllers/masterimage.py
+++ b/meta/lib/oeqa/controllers/masterimage.py
@@ -24,6 +24,7 @@ from oeqa.utils import CommandError
from abc import ABCMeta, abstractmethod
+
class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget, metaclass=ABCMeta):
supported_image_fstypes = ['tar.gz', 'tar.bz2']
diff --git a/meta/lib/oeqa/controllers/testtargetloader.py \
b/meta/lib/oeqa/controllers/testtargetloader.py index 9ef039050e..038d29bd39 100644
--- a/meta/lib/oeqa/controllers/testtargetloader.py
+++ b/meta/lib/oeqa/controllers/testtargetloader.py
@@ -7,6 +7,8 @@ import bb
import os
# This class is responsible for loading a test target controller
+
+
class TestTargetLoader:
# Search oeqa.controllers module directory for and return a controller
diff --git a/meta/lib/oeqa/core/case.py b/meta/lib/oeqa/core/case.py
index 7ddfd07677..afb34a35cf 100644
--- a/meta/lib/oeqa/core/case.py
+++ b/meta/lib/oeqa/core/case.py
@@ -10,6 +10,7 @@ import unittest
from oeqa.core.exception import OEQAMissingVariable
+
def _validate_td_vars(td, td_vars, type_msg):
if td_vars:
for v in td_vars:
@@ -17,6 +18,7 @@ def _validate_td_vars(td, td_vars, type_msg):
raise OEQAMissingVariable("Test %s need %s variable but"
" isn't into td" % (type_msg, v))
+
class OETestCase(unittest.TestCase):
# TestContext and Logger instance set by OETestLoader.
tc = None
@@ -57,6 +59,7 @@ class OETestCase(unittest.TestCase):
d.tearDownDecorator()
self.tearDownMethod()
+
class OEPTestResultTestCase:
"""
Mix-in class to provide functions to make interacting with extraresults for
diff --git a/meta/lib/oeqa/core/cases/example/test_basic.py \
b/meta/lib/oeqa/core/cases/example/test_basic.py index d77edcdcec..686fbca09e 100644
--- a/meta/lib/oeqa/core/cases/example/test_basic.py
+++ b/meta/lib/oeqa/core/cases/example/test_basic.py
@@ -6,6 +6,7 @@
from oeqa.core.case import OETestCase
from oeqa.core.decorator.depends import OETestDepends
+
class OETestExample(OETestCase):
def test_example(self):
self.logger.info('IMAGE: %s' % self.td.get('IMAGE'))
@@ -13,6 +14,7 @@ class OETestExample(OETestCase):
self.logger.info('ARCH: %s' % self.td.get('ARCH'))
self.assertEqual('x86', self.td.get('ARCH'))
+
class OETestExampleDepend(OETestCase):
@OETestDepends(['OETestExample.test_example'])
def test_example_depends(self):
diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 5e647d11c8..995c8ab521 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -15,6 +15,7 @@ from oeqa.core.loader import OETestLoader
from oeqa.core.runner import OETestRunner
from oeqa.core.exception import OEQAMissingManifest, OEQATestNotFound
+
class OETestContext(object):
loaderClass = OETestLoader
runnerClass = OETestRunner
@@ -49,6 +50,7 @@ class OETestContext(object):
def skipTests(self, skips):
if not skips:
return
+
def skipfuncgen(skipmsg):
def func():
raise unittest.SkipTest(skipmsg)
@@ -97,6 +99,7 @@ class OETestContext(object):
self.runner = self.runnerClass(self, verbosity=2)
return self.runner.list_tests(self.suites, display_type)
+
class OETestContextExecutor(object):
_context_class = OETestContext
_script_executor = 'oe-test'
@@ -243,4 +246,5 @@ class OETestContextExecutor(object):
return rc
+
_executor_class = OETestContextExecutor
diff --git a/meta/lib/oeqa/core/decorator/__init__.py \
b/meta/lib/oeqa/core/decorator/__init__.py index 1a82518ab6..d581597aba 100644
--- a/meta/lib/oeqa/core/decorator/__init__.py
+++ b/meta/lib/oeqa/core/decorator/__init__.py
@@ -10,10 +10,12 @@ from oeqa.core.utils.misc import strToList
decoratorClasses = set()
+
def registerDecorator(cls):
decoratorClasses.add(cls)
return cls
+
class OETestDecorator(object, metaclass=ABCMeta):
case = None # Reference of OETestCase decorated
attrs = None # Attributes to be loaded by decorator implementation
@@ -56,6 +58,7 @@ class OETestDecorator(object, metaclass=ABCMeta):
def tearDownDecorator(self):
pass
+
class OETestDiscover(OETestDecorator):
# OETestLoader call it after discover test cases
@@ -64,10 +67,12 @@ class OETestDiscover(OETestDecorator):
def discover(registry):
return registry['cases']
+
def OETestTag(*tags):
expandedtags = []
for tag in tags:
expandedtags += strToList(tag)
+
def decorator(item):
if hasattr(item, "__oeqa_testtags"):
# do not append, create a new list (to handle classes with inheritance)
diff --git a/meta/lib/oeqa/core/decorator/data.py \
b/meta/lib/oeqa/core/decorator/data.py index 23555bc8d3..82aac0b873 100644
--- a/meta/lib/oeqa/core/decorator/data.py
+++ b/meta/lib/oeqa/core/decorator/data.py
@@ -8,6 +8,7 @@ from oeqa.core.exception import OEQAMissingVariable
from . import OETestDecorator, registerDecorator
+
def has_feature(td, feature):
"""
Checks for feature in DISTRO_FEATURES or IMAGE_FEATURES.
@@ -18,6 +19,7 @@ def has_feature(td, feature):
return True
return False
+
def has_machine(td, machine):
"""
Checks for MACHINE.
@@ -27,6 +29,7 @@ def has_machine(td, machine):
return True
return False
+
def is_qemu(td, qemu):
"""
Checks if MACHINE is qemu.
@@ -38,6 +41,7 @@ def is_qemu(td, qemu):
return True
return False
+
@registerDecorator
class skipIfDataVar(OETestDecorator):
"""
@@ -57,6 +61,7 @@ class skipIfDataVar(OETestDecorator):
if self.case.td.get(self.var) == self.value:
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfNotDataVar(OETestDecorator):
"""
@@ -76,6 +81,7 @@ class skipIfNotDataVar(OETestDecorator):
if not self.case.td.get(self.var) == self.value:
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfInDataVar(OETestDecorator):
"""
@@ -83,6 +89,7 @@ class skipIfInDataVar(OETestDecorator):
"""
attrs = ('var', 'value', 'msg')
+
def setUpDecorator(self):
msg = ('Checking if %r value contains %r to skip '
'the test' % (self.var, self.value))
@@ -90,6 +97,7 @@ class skipIfInDataVar(OETestDecorator):
if self.value in (self.case.td.get(self.var)):
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfNotInDataVar(OETestDecorator):
"""
@@ -97,6 +105,7 @@ class skipIfNotInDataVar(OETestDecorator):
"""
attrs = ('var', 'value', 'msg')
+
def setUpDecorator(self):
msg = ('Checking if %r value contains %r to run '
'the test' % (self.var, self.value))
@@ -104,6 +113,7 @@ class skipIfNotInDataVar(OETestDecorator):
if not self.value in (self.case.td.get(self.var) or ""):
self.case.skipTest(self.msg)
+
@registerDecorator
class OETestDataDepends(OETestDecorator):
attrs = ('td_depends',)
@@ -116,6 +126,7 @@ class OETestDataDepends(OETestDecorator):
raise OEQAMissingVariable("Test case need %s variable but"
" isn't into td" % v)
+
@registerDecorator
class skipIfNotFeature(OETestDecorator):
"""
@@ -134,6 +145,7 @@ class skipIfNotFeature(OETestDecorator):
if not has_feature(self.case.td, self.value):
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfFeature(OETestDecorator):
"""
@@ -152,6 +164,7 @@ class skipIfFeature(OETestDecorator):
if has_feature(self.case.td, self.value):
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfNotMachine(OETestDecorator):
"""
@@ -169,6 +182,7 @@ class skipIfNotMachine(OETestDecorator):
if not has_machine(self.case.td, self.value):
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfMachine(OETestDecorator):
"""
@@ -186,6 +200,7 @@ class skipIfMachine(OETestDecorator):
if has_machine(self.case.td, self.value):
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfNotQemu(OETestDecorator):
"""
@@ -203,6 +218,7 @@ class skipIfNotQemu(OETestDecorator):
if not is_qemu(self.case.td, self.value):
self.case.skipTest(self.msg)
+
@registerDecorator
class skipIfQemu(OETestDecorator):
"""
diff --git a/meta/lib/oeqa/core/decorator/depends.py \
b/meta/lib/oeqa/core/decorator/depends.py index eef5c8f7ab..c75407e419 100644
--- a/meta/lib/oeqa/core/decorator/depends.py
+++ b/meta/lib/oeqa/core/decorator/depends.py
@@ -10,6 +10,7 @@ from oeqa.core.exception import OEQADependency
from . import OETestDiscover, registerDecorator
+
def _add_depends(registry, case, depends):
module_name = case.__module__
class_name = case.__class__.__name__
@@ -31,6 +32,7 @@ def _add_depends(registry, case, depends):
if not depend_id in registry[case_id]:
registry[case_id].append(depend_id)
+
def _validate_test_case_depends(cases, depends):
for case in depends:
if not case in cases:
@@ -40,6 +42,7 @@ def _validate_test_case_depends(cases, depends):
raise OEQADependency("TestCase %s depends on %s and isn't available"
", cases available %s." % (case, dep, str(cases.keys())))
+
def _order_test_case_by_depends(cases, depends):
def _dep_resolve(graph, node, resolved, seen):
seen.append(node)
@@ -65,6 +68,7 @@ def _order_test_case_by_depends(cases, depends):
return [cases[case_id] for case_id in cases_ordered]
+
def _skipTestDependency(case, depends):
for dep in depends:
found = False
@@ -76,6 +80,7 @@ def _skipTestDependency(case, depends):
raise SkipTest("Test case %s depends on %s but it didn't pass/run."
% (case.id(), dep))
+
@registerDecorator
class OETestDepends(OETestDiscover):
attrs = ('depends',)
diff --git a/meta/lib/oeqa/core/decorator/oetimeout.py \
b/meta/lib/oeqa/core/decorator/oetimeout.py index 5e6873ad48..d2442352f8 100644
--- a/meta/lib/oeqa/core/decorator/oetimeout.py
+++ b/meta/lib/oeqa/core/decorator/oetimeout.py
@@ -8,12 +8,14 @@ import signal
from . import OETestDecorator, registerDecorator
from oeqa.core.exception import OEQATimeoutError
+
@registerDecorator
class OETimeout(OETestDecorator):
attrs = ('oetimeout',)
def setUpDecorator(self):
timeout = self.oetimeout
+
def _timeoutHandler(signum, frame):
raise OEQATimeoutError("Timed out after %s "
"seconds of execution" % timeout)
diff --git a/meta/lib/oeqa/core/exception.py b/meta/lib/oeqa/core/exception.py
index 05be0ed21f..1e649caee4 100644
--- a/meta/lib/oeqa/core/exception.py
+++ b/meta/lib/oeqa/core/exception.py
@@ -4,23 +4,30 @@
# SPDX-License-Identifier: MIT
#
+
class OEQAException(Exception):
pass
+
class OEQATimeoutError(OEQAException):
pass
+
class OEQAMissingVariable(OEQAException):
pass
+
class OEQADependency(OEQAException):
pass
+
class OEQAMissingManifest(OEQAException):
pass
+
class OEQAPreRun(OEQAException):
pass
+
class OEQATestNotFound(OEQAException):
pass
diff --git a/meta/lib/oeqa/core/loader.py b/meta/lib/oeqa/core/loader.py
index 7f7c96cdd6..3cc1d6b669 100644
--- a/meta/lib/oeqa/core/loader.py
+++ b/meta/lib/oeqa/core/loader.py
@@ -31,12 +31,14 @@ _failed_test_args = \
inspect.getfullargspec(unittest.loader._make_failed_test).ar exec("""def \
_make_failed_test(%s): raise exception""" % ', '.join(_failed_test_args)) \
unittest.loader._make_failed_test = _make_failed_test
+
def _find_duplicated_modules(suite, directory):
for module in getSuiteModules(suite):
path = findFile('%s.py' % module, directory)
if path:
raise ImportError("Duplicated %s module found in %s" % (module, path))
+
def _built_modules_dict(modules):
modules_dict = {}
@@ -61,6 +63,7 @@ def _built_modules_dict(modules):
return modules_dict
+
class OETestLoader(unittest.TestLoader):
caseClass = OETestCase
@@ -313,7 +316,6 @@ class OETestLoader(unittest.TestLoader):
return (load_module, load_underscore)
-
# XXX After Python 3.5, remove backward compatibility hacks for
# use_load_tests deprecation via *args and **kws. See issue 16662.
if sys.version_info >= (3, 5):
diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index d2e7ab5462..5672f17adc 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -15,6 +15,7 @@ import sys
from unittest import TextTestResult as _TestResult
from unittest import TextTestRunner as _TestRunner
+
class OEStreamLogger(object):
def __init__(self, logger):
self.logger = logger
@@ -35,6 +36,7 @@ class OEStreamLogger(object):
for handler in self.logger.handlers:
handler.flush()
+
class OETestResult(_TestResult):
def __init__(self, tc, *args, **kwargs):
super(OETestResult, self).__init__(*args, **kwargs)
@@ -229,10 +231,12 @@ class OETestResult(_TestResult):
# Override as we unexpected successes aren't failures for us
return (len(self.failures) == len(self.errors) == 0)
+
class OEListTestsResult(object):
def wasSuccessful(self):
return True
+
class OETestRunner(_TestRunner):
streamLoggerClass = OEStreamLogger
@@ -279,6 +283,7 @@ class OETestRunner(_TestRunner):
self._walked_cases = 0
curr = {}
+
def _list_classes(logger, case):
if not 'module' in curr or curr['module'] != case.__module__:
curr['module'] = case.__module__
@@ -298,6 +303,7 @@ class OETestRunner(_TestRunner):
self._walked_cases = 0
listed = []
+
def _list_modules(logger, case):
if not case.__module__ in listed:
if case.__module__.startswith('_'):
@@ -319,6 +325,7 @@ class OETestRunner(_TestRunner):
return OEListTestsResult()
+
class OETestResultJSONHelper(object):
testresult_filename = 'testresults.json'
diff --git a/meta/lib/oeqa/core/target/__init__.py \
b/meta/lib/oeqa/core/target/__init__.py index 1382aa9b52..765f842938 100644
--- a/meta/lib/oeqa/core/target/__init__.py
+++ b/meta/lib/oeqa/core/target/__init__.py
@@ -6,6 +6,7 @@
from abc import abstractmethod
+
class OETarget(object):
def __init__(self, logger, *args, **kwargs):
diff --git a/meta/lib/oeqa/core/target/qemu.py b/meta/lib/oeqa/core/target/qemu.py
index bb93b4ee99..6d6561333b 100644
--- a/meta/lib/oeqa/core/target/qemu.py
+++ b/meta/lib/oeqa/core/target/qemu.py
@@ -19,6 +19,7 @@ from oeqa.utils.dump import TargetDumper
supported_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic']
+
class OEQemuTarget(OESSHTarget):
def __init__(self, logger, server_ip, timeout=300, user='root',
port=None, machine='', rootfs='', kernel='', kvm=False, slirp=False,
diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/core/target/ssh.py
index 67bbe639d9..c9edf1f602 100644
--- a/meta/lib/oeqa/core/target/ssh.py
+++ b/meta/lib/oeqa/core/target/ssh.py
@@ -13,6 +13,7 @@ import codecs
from . import OETarget
+
class OESSHTarget(OETarget):
def __init__(self, logger, ip, server_ip, timeout=300, user='root',
port=None, server_port=0, **kwargs):
@@ -169,7 +170,6 @@ class OESSHTarget(OETarget):
self.run(cmd)
-
def deleteDir(self, remotePath):
"""
Deletes target's remotePath directory.
@@ -178,7 +178,6 @@ class OESSHTarget(OETarget):
cmd = "rmdir %s" % remotePath
self.run(cmd)
-
def deleteDirStructure(self, localPath, remotePath):
"""
Delete recursively localPath structure directory in target's remotePath.
@@ -217,6 +216,7 @@ class OESSHTarget(OETarget):
remoteDir = os.path.join(remotePath, tmpDir.lstrip("/"))
self.deleteDir(remoteDir)
+
def SSHCall(command, logger, timeout=None, **opts):
def run():
diff --git a/meta/lib/oeqa/core/tests/cases/data.py \
b/meta/lib/oeqa/core/tests/cases/data.py index 42baa708bf..c933f9e081 100644
--- a/meta/lib/oeqa/core/tests/cases/data.py
+++ b/meta/lib/oeqa/core/tests/cases/data.py
@@ -8,6 +8,7 @@ from oeqa.core.case import OETestCase
from oeqa.core.decorator import OETestTag
from oeqa.core.decorator.data import OETestDataDepends
+
class DataTest(OETestCase):
data_vars = ['IMAGE', 'ARCH']
diff --git a/meta/lib/oeqa/core/tests/cases/depends.py \
b/meta/lib/oeqa/core/tests/cases/depends.py index 46e7db900d..a7032ce1dc 100644
--- a/meta/lib/oeqa/core/tests/cases/depends.py
+++ b/meta/lib/oeqa/core/tests/cases/depends.py
@@ -7,6 +7,7 @@
from oeqa.core.case import OETestCase
from oeqa.core.decorator.depends import OETestDepends
+
class DependsTest(OETestCase):
def testDependsFirst(self):
diff --git a/meta/lib/oeqa/core/tests/cases/loader/valid/another.py \
b/meta/lib/oeqa/core/tests/cases/loader/valid/another.py index bedc20c8a6..834a8b6132 \
100644
--- a/meta/lib/oeqa/core/tests/cases/loader/valid/another.py
+++ b/meta/lib/oeqa/core/tests/cases/loader/valid/another.py
@@ -6,6 +6,7 @@
from oeqa.core.case import OETestCase
+
class AnotherTest(OETestCase):
def testAnother(self):
diff --git a/meta/lib/oeqa/core/tests/cases/oetag.py \
b/meta/lib/oeqa/core/tests/cases/oetag.py index 52f97dfda6..6b89e011e6 100644
--- a/meta/lib/oeqa/core/tests/cases/oetag.py
+++ b/meta/lib/oeqa/core/tests/cases/oetag.py
@@ -7,6 +7,7 @@
from oeqa.core.case import OETestCase
from oeqa.core.decorator import OETestTag
+
class TagTest(OETestCase):
@OETestTag('goodTag')
def testTagGood(self):
@@ -23,6 +24,7 @@ class TagTest(OETestCase):
def testTagNone(self):
self.assertTrue(True, msg='How is this possible?')
+
@OETestTag('classTag')
class TagClassTest(OETestCase):
@OETestTag('otherTag')
diff --git a/meta/lib/oeqa/core/tests/cases/timeout.py \
b/meta/lib/oeqa/core/tests/cases/timeout.py index 69cf969a67..b793fbfaf9 100644
--- a/meta/lib/oeqa/core/tests/cases/timeout.py
+++ b/meta/lib/oeqa/core/tests/cases/timeout.py
@@ -10,6 +10,7 @@ from oeqa.core.case import OETestCase
from oeqa.core.decorator.oetimeout import OETimeout
from oeqa.core.decorator.depends import OETestDepends
+
class TimeoutTest(OETestCase):
@OETimeout(1)
@@ -21,7 +22,6 @@ class TimeoutTest(OETestCase):
sleep(2)
self.assertTrue(True, msg='How is this possible?')
-
def testTimeoutSkip(self):
self.skipTest("This test needs to be skipped, so that testTimeoutDepends()'s \
OETestDepends kicks in")
diff --git a/meta/lib/oeqa/core/tests/common.py b/meta/lib/oeqa/core/tests/common.py
index 88cc758ad3..e513b5b602 100644
--- a/meta/lib/oeqa/core/tests/common.py
+++ b/meta/lib/oeqa/core/tests/common.py
@@ -18,12 +18,14 @@ formatter = logging.Formatter('OEQATest: %(message)s')
consoleHandler.setFormatter(formatter)
logger.addHandler(consoleHandler)
+
def setup_sys_path():
directory = os.path.dirname(os.path.abspath(__file__))
oeqa_lib = os.path.realpath(os.path.join(directory, '../../../'))
if not oeqa_lib in sys.path:
sys.path.insert(0, oeqa_lib)
+
class TestBase(unittest.TestCase):
def setUp(self):
self.logger = logger
diff --git a/meta/lib/oeqa/core/tests/test_data.py \
b/meta/lib/oeqa/core/tests/test_data.py index 6fddbb4e96..59f0ee4364 100755
--- a/meta/lib/oeqa/core/tests/test_data.py
+++ b/meta/lib/oeqa/core/tests/test_data.py
@@ -15,6 +15,7 @@ setup_sys_path()
from oeqa.core.exception import OEQAMissingVariable
from oeqa.core.utils.test import getCaseMethod, getSuiteCasesNames
+
class TestData(TestBase):
modules = ['data']
@@ -51,5 +52,6 @@ class TestData(TestBase):
tc = self._testLoader(d=d, modules=self.modules)
self.assertEqual(True, tc.runTests().wasSuccessful())
+
if __name__ == '__main__':
unittest.main()
diff --git a/meta/lib/oeqa/core/tests/test_decorators.py \
b/meta/lib/oeqa/core/tests/test_decorators.py index 5853aa0027..54a2638ba8 100755
--- a/meta/lib/oeqa/core/tests/test_decorators.py
+++ b/meta/lib/oeqa/core/tests/test_decorators.py
@@ -14,6 +14,7 @@ setup_sys_path()
from oeqa.core.exception import OEQADependency
from oeqa.core.utils.test import getCaseMethod, getSuiteCasesNames, getSuiteCasesIDs
+
class TestTagDecorator(TestBase):
def _runTest(self, modules, filterfn, expect):
tc = self._testLoader(modules=modules, tags_filter=filterfn)
@@ -67,6 +68,7 @@ class TestTagDecorator(TestBase):
'oetag.TagClassTest.testTagNone',
})
+
class TestDependsDecorator(TestBase):
modules = ['depends']
@@ -112,6 +114,7 @@ class TestDependsDecorator(TestBase):
msg = 'Expected OEQADependency exception having a circular dependency'
self.assertTrue(result, msg=msg)
+
class TestTimeoutDecorator(TestBase):
modules = ['timeout']
@@ -139,5 +142,6 @@ class TestTimeoutDecorator(TestBase):
tc = self._testLoader(modules=self.modules, tests=tests)
self.assertTrue(tc.runTests().wasSuccessful(), msg=msg)
+
if __name__ == '__main__':
unittest.main()
diff --git a/meta/lib/oeqa/core/tests/test_loader.py \
b/meta/lib/oeqa/core/tests/test_loader.py index cb38ac845e..0f687be480 100755
--- a/meta/lib/oeqa/core/tests/test_loader.py
+++ b/meta/lib/oeqa/core/tests/test_loader.py
@@ -14,6 +14,7 @@ setup_sys_path()
from oeqa.core.exception import OEQADependency
from oeqa.core.utils.test import getSuiteModules, getSuiteCasesIDs
+
class TestLoader(TestBase):
@unittest.skip("invalid directory is missing oetag.py")
def test_fail_duplicated_module(self):
@@ -59,5 +60,6 @@ class TestLoader(TestBase):
msg = 'Expected modules from two different paths'
self.assertEqual(modules, expected_modules, msg=msg)
+
if __name__ == '__main__':
unittest.main()
diff --git a/meta/lib/oeqa/core/tests/test_runner.py \
b/meta/lib/oeqa/core/tests/test_runner.py index 205464cfae..b6bbc08c52 100755
--- a/meta/lib/oeqa/core/tests/test_runner.py
+++ b/meta/lib/oeqa/core/tests/test_runner.py
@@ -14,6 +14,7 @@ setup_sys_path()
from oeqa.core.runner import OEStreamLogger
+
class TestRunner(TestBase):
def test_stream_logger(self):
fp = tempfile.TemporaryFile(mode='w+')
@@ -36,5 +37,6 @@ class TestRunner(TestBase):
fp.close()
+
if __name__ == '__main__':
unittest.main()
diff --git a/meta/lib/oeqa/core/utils/concurrencytest.py \
b/meta/lib/oeqa/core/utils/concurrencytest.py index 98067c0e8c..089ee8e665 100644
--- a/meta/lib/oeqa/core/utils/concurrencytest.py
+++ b/meta/lib/oeqa/core/utils/concurrencytest.py
@@ -46,6 +46,8 @@ _all__ = [
# Patch the version from testtools to allow access to _test_start and allow
# computation of timing information and threading progress
#
+
+
class BBThreadsafeForwardingResult(ThreadsafeForwardingResult):
def __init__(self, target, semaphore, threadnum, totalinprocess, totaltests, \
output, finalresult): @@ -79,6 +81,7 @@ class \
BBThreadsafeForwardingResult(ThreadsafeForwardingResult): \
self.finalresult._stdout_buffer = io.StringIO()
super(BBThreadsafeForwardingResult, self)._add_result_with_semaphore(method, \
test, *args, **kwargs)
+
class ProxyTestResult:
# a very basic TestResult proxy, in order to modify add* calls
def __init__(self, target):
@@ -111,6 +114,7 @@ class ProxyTestResult:
def __getattr__(self, attr):
return getattr(self.result, attr)
+
class ExtraResultsDecoderTestResult(ProxyTestResult):
def _addResult(self, method, test, *args, exception=False, **kwargs):
if "details" in kwargs and "extraresults" in kwargs["details"]:
@@ -125,6 +129,7 @@ class ExtraResultsDecoderTestResult(ProxyTestResult):
kwargs["details"]["extraresults"] = extraresults
return method(test, *args, **kwargs)
+
class ExtraResultsEncoderTestResult(ProxyTestResult):
def _addResult(self, method, test, *args, exception=False, **kwargs):
if hasattr(test, "extraresults"):
@@ -147,6 +152,8 @@ class ExtraResultsEncoderTestResult(ProxyTestResult):
# outside of a running test case. This can happen if classSetUp() fails
# for a class of tests. This unfortunately has horrible internal knowledge.
#
+
+
def outSideTestaddError(self, offset, line):
"""An 'error:' directive has been read."""
test_name = line[offset:-1].decode('utf8')
@@ -156,12 +163,15 @@ def outSideTestaddError(self, offset, line):
self.parser._reading_error_details.set_simple()
self.parser.subunitLineReceived(line)
+
subunit._OutSideTest.addError = outSideTestaddError
# Like outSideTestaddError above, we need an equivalent for skips
# happening at the setUpClass() level, otherwise we will see "UNKNOWN"
# as a result for concurrent tests
#
+
+
def outSideTestaddSkip(self, offset, line):
"""A 'skip:' directive has been read."""
test_name = line[offset:-1].decode('utf8')
@@ -171,6 +181,7 @@ def outSideTestaddSkip(self, offset, line):
self.parser._reading_skip_details.set_simple()
self.parser.subunitLineReceived(line)
+
subunit._OutSideTest.addSkip = outSideTestaddSkip
#
@@ -178,15 +189,20 @@ subunit._OutSideTest.addSkip = outSideTestaddSkip
# is available and accepts writes. This allows unittest with buffer=True
# to interact ok with subunit which wants to access sys.stdout.buffer.
#
+
+
class dummybuf(object):
def __init__(self, parent):
self.p = parent
+
def write(self, data):
self.p.write(data.decode("utf-8"))
#
# Taken from testtools.ConncurrencyTestSuite but modified for OE use
#
+
+
class ConcurrentTestSuite(unittest.TestSuite):
def __init__(self, suite, processes, setupfunc, removefunc):
@@ -236,6 +252,7 @@ class ConcurrentTestSuite(unittest.TestSuite):
finally:
queue.put(testserver)
+
def fork_for_tests(concurrency_num, suite):
testservers = []
if 'BUILDDIR' in os.environ:
@@ -311,6 +328,7 @@ def fork_for_tests(concurrency_num, suite):
testservers.append((testserver, numtests, output))
return testservers, totaltests
+
def partition_tests(suite, count):
# Keep tests from the same class together but allow tests from modules
# to go to different processes to aid parallelisation.
diff --git a/meta/lib/oeqa/core/utils/misc.py b/meta/lib/oeqa/core/utils/misc.py
index e1a59588eb..5f1e63a1dc 100644
--- a/meta/lib/oeqa/core/utils/misc.py
+++ b/meta/lib/oeqa/core/utils/misc.py
@@ -4,6 +4,7 @@
# SPDX-License-Identifier: MIT
#
+
def toList(obj, obj_type, obj_name="Object"):
if isinstance(obj, obj_type):
return [obj]
@@ -12,6 +13,7 @@ def toList(obj, obj_type, obj_name="Object"):
else:
raise TypeError("%s must be %s or list" % (obj_name, obj_type))
+
def toSet(obj, obj_type, obj_name="Object"):
if isinstance(obj, obj_type):
return {obj}
@@ -22,15 +24,19 @@ def toSet(obj, obj_type, obj_name="Object"):
else:
raise TypeError("%s must be %s or set" % (obj_name, obj_type))
+
def strToList(obj, obj_name="Object"):
return toList(obj, str, obj_name)
+
def strToSet(obj, obj_name="Object"):
return toSet(obj, str, obj_name)
+
def intToList(obj, obj_name="Object"):
return toList(obj, int, obj_name)
+
def dataStoteToDict(d, variables):
data = {}
@@ -39,6 +45,7 @@ def dataStoteToDict(d, variables):
return data
+
def updateTestData(d, td, variables):
"""
Updates variables with values of data store to test data.
diff --git a/meta/lib/oeqa/core/utils/path.py b/meta/lib/oeqa/core/utils/path.py
index c086dcb0b0..803601ddf7 100644
--- a/meta/lib/oeqa/core/utils/path.py
+++ b/meta/lib/oeqa/core/utils/path.py
@@ -7,6 +7,7 @@
import os
import sys
+
def findFile(file_name, directory):
"""
Search for a file in directory and returns its complete path.
@@ -16,6 +17,7 @@ def findFile(file_name, directory):
return os.path.join(r, file_name)
return None
+
def remove_safe(path):
if os.path.exists(path):
os.remove(path)
diff --git a/meta/lib/oeqa/core/utils/test.py b/meta/lib/oeqa/core/utils/test.py
index d38cab8a51..21d5e5ed04 100644
--- a/meta/lib/oeqa/core/utils/test.py
+++ b/meta/lib/oeqa/core/utils/test.py
@@ -8,6 +8,7 @@ import os
import inspect
import unittest
+
def getSuiteCases(suite):
"""
Returns individual test from a test suite.
@@ -22,6 +23,7 @@ def getSuiteCases(suite):
return tests
+
def getSuiteModules(suite):
"""
Returns modules in a test suite.
@@ -31,6 +33,7 @@ def getSuiteModules(suite):
modules.add(getCaseModule(test))
return modules
+
def getSuiteCasesInfo(suite, func):
"""
Returns test case info from suite. Info is fetched from func.
@@ -40,48 +43,56 @@ def getSuiteCasesInfo(suite, func):
tests.append(func(test))
return tests
+
def getSuiteCasesNames(suite):
"""
Returns test case names from suite.
"""
return getSuiteCasesInfo(suite, getCaseMethod)
+
def getSuiteCasesIDs(suite):
"""
Returns test case ids from suite.
"""
return getSuiteCasesInfo(suite, getCaseID)
+
def getSuiteCasesFiles(suite):
"""
Returns test case files paths from suite.
"""
return getSuiteCasesInfo(suite, getCaseFile)
+
def getCaseModule(test_case):
"""
Returns test case module name.
"""
return test_case.__module__
+
def getCaseClass(test_case):
"""
Returns test case class name.
"""
return test_case.__class__.__name__
+
def getCaseID(test_case):
"""
Returns test case complete id.
"""
return test_case.id()
+
def getCaseFile(test_case):
"""
Returns test case file path.
"""
return inspect.getsourcefile(test_case.__class__)
+
def getCaseMethod(test_case):
"""
Returns test case method name.
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py
index 815f2a4c02..0776b54d2a 100644
--- a/meta/lib/oeqa/oetest.py
+++ b/meta/lib/oeqa/oetest.py
@@ -34,6 +34,7 @@ from oeqa.utils.decorators import LogResults, gettag, getResults
logger = logging.getLogger("BitBake")
+
def getVar(obj):
#extend form dict, if a variable didn't exists, need find it in testcase
class VarDict(dict):
@@ -41,9 +42,11 @@ def getVar(obj):
return gettag(obj, key)
return VarDict()
+
def checkTags(tc, tagexp):
return eval(tagexp, None, getVar(tc))
+
def filterByTagExp(testsuite, tagexp):
if not tagexp:
return testsuite
@@ -56,6 +59,7 @@ def filterByTagExp(testsuite, tagexp):
caseList.append(filterByTagExp(each, tagexp))
return testsuite.__class__(caseList)
+
@LogResults
class oeTest(unittest.TestCase):
@@ -88,6 +92,7 @@ class oeTest(unittest.TestCase):
else:
return False
+
class oeRuntimeTest(oeTest):
def __init__(self, methodName='runTest'):
self.target = oeRuntimeTest.tc.target
@@ -132,6 +137,7 @@ class oeRuntimeTest(oeTest):
def tearDownLocal(self):
pass
+
def getmodule(pos=2):
# stack returns a list of tuples containg frame information
# First element of the list the is current frame, caller is 1
@@ -140,6 +146,7 @@ def getmodule(pos=2):
#modname = inspect.getmodule(frameinfo[0]).__name__
return modname
+
def skipModule(reason, pos=2):
modname = getmodule(pos)
if modname not in oeTest.tc.testsrequired:
@@ -149,17 +156,22 @@ def skipModule(reason, pos=2):
"\nTest was required in TEST_SUITES, so either the condition for \
skipping is wrong"
"\nor the image really doesn't have the required feature/package \
when it should." % (modname, reason))
+
def skipModuleIf(cond, reason):
if cond:
skipModule(reason, 3)
+
def skipModuleUnless(cond, reason):
if not cond:
skipModule(reason, 3)
+
_buffer_logger = ""
+
+
def custom_verbose(msg, *args, **kwargs):
global _buffer_logger
if msg[-1] != "\n":
@@ -172,6 +184,7 @@ def custom_verbose(msg, *args, **kwargs):
logger.info(_buffer_logger.rstrip("\n"), *args, **kwargs)
_buffer_logger = ""
+
class TestContext(object):
def __init__(self, d, exported=False):
self.d = d
@@ -361,6 +374,7 @@ class TestContext(object):
return runner.run(self.suite)
+
class RuntimeTestContext(TestContext):
def __init__(self, d, target, exported=False):
super(RuntimeTestContext, self).__init__(d, exported)
@@ -569,6 +583,7 @@ class RuntimeTestContext(TestContext):
elif not install and rm:
self.target.connection.delete_dir_structure(src_dir, "/")
+
class ImageTestContext(RuntimeTestContext):
def __init__(self, d, target, host_dumper):
super(ImageTestContext, self).__init__(d, target)
@@ -594,6 +609,7 @@ class ImageTestContext(RuntimeTestContext):
pkg_dir = self.d.getVar("TEST_EXTRACTED_DIR")
super(ImageTestContext, self).install_uninstall_packages(test_id, pkg_dir, \
install)
+
class ExportTestContext(RuntimeTestContext):
def __init__(self, d, target, exported=False, parsedArgs={}):
"""
diff --git a/meta/lib/oeqa/runexported.py b/meta/lib/oeqa/runexported.py
index fa0ec0ccf6..84276be8a0 100755
--- a/meta/lib/oeqa/runexported.py
+++ b/meta/lib/oeqa/runexported.py
@@ -37,6 +37,8 @@ from oeqa.utils.sshcontrol import SSHControl
# this isn't pretty but we need a fake target object
# for running the tests externally as we don't care
# about deploy/start we only care about the connection methods (run, copy)
+
+
class FakeTarget(object):
def __init__(self, d):
self.connection = None
@@ -69,6 +71,7 @@ class MyDataDict(dict):
def getVar(self, key, unused=None):
return self.get(key, "")
+
def main():
parser = argparse.ArgumentParser()
@@ -124,6 +127,7 @@ def main():
return 0
+
def extract_sdk(d):
"""
Extract SDK if needed
@@ -143,6 +147,7 @@ def extract_sdk(d):
env_file = os.path.join(extract_path, f)
updateEnv(env_file)
+
if __name__ == "__main__":
try:
ret = main()
diff --git a/meta/lib/oeqa/runtime/case.py b/meta/lib/oeqa/runtime/case.py
index f036982e1f..db463ef1d6 100644
--- a/meta/lib/oeqa/runtime/case.py
+++ b/meta/lib/oeqa/runtime/case.py
@@ -7,6 +7,7 @@
from oeqa.core.case import OETestCase
from oeqa.utils.package_manager import install_package, uninstall_package
+
class OERuntimeTestCase(OETestCase):
# target instance set by OERuntimeTestLoader.
target = None
diff --git a/meta/lib/oeqa/runtime/cases/_qemutiny.py \
b/meta/lib/oeqa/runtime/cases/_qemutiny.py index 6886e36502..cb2a115872 100644
--- a/meta/lib/oeqa/runtime/cases/_qemutiny.py
+++ b/meta/lib/oeqa/runtime/cases/_qemutiny.py
@@ -4,6 +4,7 @@
from oeqa.runtime.case import OERuntimeTestCase
+
class QemuTinyTest(OERuntimeTestCase):
def test_boot_tiny(self):
diff --git a/meta/lib/oeqa/runtime/cases/apt.py b/meta/lib/oeqa/runtime/cases/apt.py
index 1e01138760..7842540423 100644
--- a/meta/lib/oeqa/runtime/cases/apt.py
+++ b/meta/lib/oeqa/runtime/cases/apt.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
+
class AptTest(OERuntimeTestCase):
def pkg(self, command, expected=0):
@@ -17,6 +18,7 @@ class AptTest(OERuntimeTestCase):
self.assertEqual(status, expected, message)
return output
+
class AptRepoTest(AptTest):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/boot.py \
b/meta/lib/oeqa/runtime/cases/boot.py index 03a1d4b501..286dd7bc7d 100644
--- a/meta/lib/oeqa/runtime/cases/boot.py
+++ b/meta/lib/oeqa/runtime/cases/boot.py
@@ -10,6 +10,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oetimeout import OETimeout
from oeqa.core.decorator.data import skipIfQemu
+
class BootTest(OERuntimeTestCase):
@OETimeout(120)
diff --git a/meta/lib/oeqa/runtime/cases/buildcpio.py \
b/meta/lib/oeqa/runtime/cases/buildcpio.py index 095a82c10b..01f7400a72 100644
--- a/meta/lib/oeqa/runtime/cases/buildcpio.py
+++ b/meta/lib/oeqa/runtime/cases/buildcpio.py
@@ -8,6 +8,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.runtime.utils.targetbuildproject import TargetBuildProject
+
class BuildCpioTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/buildgalculator.py \
b/meta/lib/oeqa/runtime/cases/buildgalculator.py index f7af48c3be..5066d15cf3 100644
--- a/meta/lib/oeqa/runtime/cases/buildgalculator.py
+++ b/meta/lib/oeqa/runtime/cases/buildgalculator.py
@@ -8,6 +8,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.runtime.utils.targetbuildproject import TargetBuildProject
+
class GalculatorTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/buildlzip.py \
b/meta/lib/oeqa/runtime/cases/buildlzip.py index ef4c9cebac..78c1661968 100644
--- a/meta/lib/oeqa/runtime/cases/buildlzip.py
+++ b/meta/lib/oeqa/runtime/cases/buildlzip.py
@@ -8,6 +8,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.runtime.utils.targetbuildproject import TargetBuildProject
+
class BuildLzipTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/connman.py \
b/meta/lib/oeqa/runtime/cases/connman.py index f0d15fac9b..919905a22b 100644
--- a/meta/lib/oeqa/runtime/cases/connman.py
+++ b/meta/lib/oeqa/runtime/cases/connman.py
@@ -6,6 +6,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class ConnmanTest(OERuntimeTestCase):
def service_status(self, service):
diff --git a/meta/lib/oeqa/runtime/cases/date.py \
b/meta/lib/oeqa/runtime/cases/date.py index e14322911d..aeb3e15560 100644
--- a/meta/lib/oeqa/runtime/cases/date.py
+++ b/meta/lib/oeqa/runtime/cases/date.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class DateTest(OERuntimeTestCase):
def setUp(self):
diff --git a/meta/lib/oeqa/runtime/cases/df.py b/meta/lib/oeqa/runtime/cases/df.py
index e7822af3b4..87687c3850 100644
--- a/meta/lib/oeqa/runtime/cases/df.py
+++ b/meta/lib/oeqa/runtime/cases/df.py
@@ -7,6 +7,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfDataVar, skipIfInDataVar
from oeqa.runtime.decorator.package import OEHasPackage
+
class DfTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
diff --git a/meta/lib/oeqa/runtime/cases/dnf.py b/meta/lib/oeqa/runtime/cases/dnf.py
index 18d562176f..70fbd270f2 100644
--- a/meta/lib/oeqa/runtime/cases/dnf.py
+++ b/meta/lib/oeqa/runtime/cases/dnf.py
@@ -12,6 +12,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature, \
skipIfInDataVar, skipIfNotInDataVar from oeqa.runtime.decorator.package import \
OEHasPackage
+
class DnfTest(OERuntimeTestCase):
def dnf(self, command, expected=0):
@@ -21,6 +22,7 @@ class DnfTest(OERuntimeTestCase):
self.assertEqual(status, expected, message)
return output
+
class DnfBasicTest(DnfTest):
@skipIfNotFeature('package-management',
@@ -48,6 +50,7 @@ class DnfBasicTest(DnfTest):
def test_dnf_history(self):
self.dnf('history')
+
class DnfRepoTest(DnfTest):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py \
b/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py index 40ac36493b..3c71a7c600 \
100644
--- a/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py
+++ b/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py
@@ -2,6 +2,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfQemu
+
class Ethernet_Test(OERuntimeTestCase):
def set_ip(self, x):
diff --git a/meta/lib/oeqa/runtime/cases/gcc.py b/meta/lib/oeqa/runtime/cases/gcc.py
index 1b6e431bf4..ab5b9001d4 100644
--- a/meta/lib/oeqa/runtime/cases/gcc.py
+++ b/meta/lib/oeqa/runtime/cases/gcc.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class GccCompileTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/gi.py b/meta/lib/oeqa/runtime/cases/gi.py
index 42bd100a31..de84873638 100644
--- a/meta/lib/oeqa/runtime/cases/gi.py
+++ b/meta/lib/oeqa/runtime/cases/gi.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class GObjectIntrospectionTest(OERuntimeTestCase):
@OETestDepends(["ssh.SSHTest.test_ssh"])
diff --git a/meta/lib/oeqa/runtime/cases/gstreamer.py \
b/meta/lib/oeqa/runtime/cases/gstreamer.py index f735f82e3b..2647d8a8d3 100644
--- a/meta/lib/oeqa/runtime/cases/gstreamer.py
+++ b/meta/lib/oeqa/runtime/cases/gstreamer.py
@@ -5,6 +5,7 @@
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.runtime.decorator.package import OEHasPackage
+
class GstreamerCliTest(OERuntimeTestCase):
@OEHasPackage(['gstreamer1.0'])
diff --git a/meta/lib/oeqa/runtime/cases/kernelmodule.py \
b/meta/lib/oeqa/runtime/cases/kernelmodule.py index 47fd2f850c..88ec39e7a0 100644
--- a/meta/lib/oeqa/runtime/cases/kernelmodule.py
+++ b/meta/lib/oeqa/runtime/cases/kernelmodule.py
@@ -9,6 +9,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
+
class KernelModuleTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/ksample.py \
b/meta/lib/oeqa/runtime/cases/ksample.py index 1ad6ba8fc8..7508bbf596 100644
--- a/meta/lib/oeqa/runtime/cases/ksample.py
+++ b/meta/lib/oeqa/runtime/cases/ksample.py
@@ -11,6 +11,8 @@ from oeqa.core.decorator.data import skipIfNotFeature
# need some kernel fragments
# echo "KERNEL_FEATURES_append += \" features\/kernel\-sample\/kernel\-sample.scc\"" \
>> local.conf +
+
class KSample(OERuntimeTestCase):
def cmd_and_check(self, cmd='', match_string=''):
status, output = self.target.run(cmd)
@@ -97,6 +99,7 @@ class KSample(OERuntimeTestCase):
# rmmod
self.cmd_and_check("rmmod %s" % module_prename)
+
class KSampleTest(KSample):
# kfifo
@OETestDepends(['ssh.SSHTest.test_ssh'])
diff --git a/meta/lib/oeqa/runtime/cases/ldd.py b/meta/lib/oeqa/runtime/cases/ldd.py
index 9c2caa8f65..48aa0770e3 100644
--- a/meta/lib/oeqa/runtime/cases/ldd.py
+++ b/meta/lib/oeqa/runtime/cases/ldd.py
@@ -7,6 +7,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
+
class LddTest(OERuntimeTestCase):
@OEHasPackage(["ldd"])
diff --git a/meta/lib/oeqa/runtime/cases/logrotate.py \
b/meta/lib/oeqa/runtime/cases/logrotate.py index 7d7dbb7afb..9f88f2dbc0 100644
--- a/meta/lib/oeqa/runtime/cases/logrotate.py
+++ b/meta/lib/oeqa/runtime/cases/logrotate.py
@@ -9,6 +9,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class LogrotateTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/ltp.py b/meta/lib/oeqa/runtime/cases/ltp.py
index 9fe9cb8def..4bf2f11a19 100644
--- a/meta/lib/oeqa/runtime/cases/ltp.py
+++ b/meta/lib/oeqa/runtime/cases/ltp.py
@@ -14,6 +14,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.utils.logparser import LtpParser
+
class LtpTestBase(OERuntimeTestCase):
@classmethod
@@ -42,7 +43,6 @@ class LtpTestBase(OERuntimeTestCase):
cls.extras = cls.tc.extraresults
cls.extras['ltpresult.rawlogs'] = {'log': ""}
-
@classmethod
def ltp_finishup(cls):
cls.extras['ltpresult.sections'] = cls.sections
@@ -55,6 +55,7 @@ class LtpTestBase(OERuntimeTestCase):
if cls.failmsg:
cls.fail(cls.failmsg)
+
class LtpTest(LtpTestBase):
ltp_groups = ["math", "syscalls", "dio", "io", "mm", "ipc", "sched", "nptl", \
"pty", "containers", "controllers", "filecaps", "cap_bounds", "fcntl-locktests", \
"connectors", "commands", "net.ipv6_lib", "input", "fs_perms_simple"]
diff --git a/meta/lib/oeqa/runtime/cases/ltp_compliance.py \
b/meta/lib/oeqa/runtime/cases/ltp_compliance.py index c56c3e6fcf..8b0f8a2cdd 100644
--- a/meta/lib/oeqa/runtime/cases/ltp_compliance.py
+++ b/meta/lib/oeqa/runtime/cases/ltp_compliance.py
@@ -14,6 +14,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.utils.logparser import LtpComplianceParser
+
class LtpPosixBase(OERuntimeTestCase):
@classmethod
@@ -42,7 +43,6 @@ class LtpPosixBase(OERuntimeTestCase):
cls.extras = cls.tc.extraresults
cls.extras['ltpposixresult.rawlogs'] = {'log': ""}
-
@classmethod
def ltp_finishup(cls):
cls.extras['ltpposixresult.sections'] = cls.sections
@@ -56,6 +56,7 @@ class LtpPosixBase(OERuntimeTestCase):
if cls.failmsg:
cls.fail(cls.failmsg)
+
class LtpPosixTest(LtpPosixBase):
posix_groups = ["AIO", "MEM", "MSG", "SEM", "SIG", "THR", "TMR", "TPS"]
diff --git a/meta/lib/oeqa/runtime/cases/ltp_stress.py \
b/meta/lib/oeqa/runtime/cases/ltp_stress.py index d97595e94e..beb47710e4 100644
--- a/meta/lib/oeqa/runtime/cases/ltp_stress.py
+++ b/meta/lib/oeqa/runtime/cases/ltp_stress.py
@@ -15,6 +15,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.core.decorator.data import skipIfQemu
from oeqa.utils.logparser import LtpParser
+
class LtpStressBase(OERuntimeTestCase):
@classmethod
@@ -43,7 +44,6 @@ class LtpStressBase(OERuntimeTestCase):
cls.extras = cls.tc.extraresults
cls.extras['ltpstressresult.rawlogs'] = {'log': ""}
-
@classmethod
def ltp_finishup(cls):
cls.extras['ltpstressresult.sections'] = cls.sections
@@ -57,6 +57,7 @@ class LtpStressBase(OERuntimeTestCase):
if cls.failmsg:
cls.fail(cls.failmsg)
+
class LtpStressTest(LtpStressBase):
def runltp(self, stress_group):
@@ -90,7 +91,6 @@ class LtpStressTest(LtpStressBase):
# LTP stress runtime tests
#
@skipIfQemu('qemuall', 'Test only runs on real hardware')
-
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(["ltp"])
def test_ltp_stress(self):
diff --git a/meta/lib/oeqa/runtime/cases/multilib.py \
b/meta/lib/oeqa/runtime/cases/multilib.py index 0d1b9ae2c9..9dffb0401a 100644
--- a/meta/lib/oeqa/runtime/cases/multilib.py
+++ b/meta/lib/oeqa/runtime/cases/multilib.py
@@ -9,6 +9,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
import subprocess
+
class MultilibTest(OERuntimeTestCase):
def archtest(self, binary, arch):
diff --git a/meta/lib/oeqa/runtime/cases/oe_syslog.py \
b/meta/lib/oeqa/runtime/cases/oe_syslog.py index 2e1a8f153d..45d815baf7 100644
--- a/meta/lib/oeqa/runtime/cases/oe_syslog.py
+++ b/meta/lib/oeqa/runtime/cases/oe_syslog.py
@@ -8,6 +8,7 @@ from oeqa.core.decorator.data import skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
import time
+
class SyslogTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
@@ -20,6 +21,7 @@ class SyslogTest(OERuntimeTestCase):
hasdaemon = "syslogd" in output or "syslog-ng" in output or "svlogd" in \
output self.assertTrue(hasdaemon, msg=msg)
+
class SyslogTestConfig(OERuntimeTestCase):
def verif_not_running(self, pids):
@@ -39,7 +41,6 @@ class SyslogTestConfig(OERuntimeTestCase):
pids.append(pid)
return 0, pids
-
def restart_sanity(self, names, restart_cmd, pidchange=True):
status, original_pids = self.verify_running(names)
if status:
@@ -98,7 +99,6 @@ class SyslogTestConfig(OERuntimeTestCase):
' Output: %s ' % output)
self.assertEqual(status, 0, msg=msg)
-
@OETestDepends(['oe_syslog.SyslogTest.test_syslog_running'])
def test_syslog_restart(self):
if self.restart_sanity(['systemd-journald'], 'systemctl restart \
syslog.service', pidchange=False): @@ -110,7 +110,6 @@ class \
SyslogTestConfig(OERuntimeTestCase): else:
self.logger.info("No syslog found to restart, ignoring")
-
@OETestDepends(['oe_syslog.SyslogTestConfig.test_syslog_logger'])
@OEHasPackage(["busybox-syslog"])
@skipIfDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
diff --git a/meta/lib/oeqa/runtime/cases/opkg.py \
b/meta/lib/oeqa/runtime/cases/opkg.py index de96b3ff3a..c810575180 100644
--- a/meta/lib/oeqa/runtime/cases/opkg.py
+++ b/meta/lib/oeqa/runtime/cases/opkg.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature, \
skipIfFeature from oeqa.runtime.decorator.package import OEHasPackage
+
class OpkgTest(OERuntimeTestCase):
def pkg(self, command, expected=0):
@@ -17,6 +18,7 @@ class OpkgTest(OERuntimeTestCase):
self.assertEqual(status, expected, message)
return output
+
class OpkgRepoTest(OpkgTest):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/pam.py b/meta/lib/oeqa/runtime/cases/pam.py
index 4cd5325201..250c0f9c71 100644
--- a/meta/lib/oeqa/runtime/cases/pam.py
+++ b/meta/lib/oeqa/runtime/cases/pam.py
@@ -10,6 +10,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
+
class PamBasicTest(OERuntimeTestCase):
@skipIfNotFeature('pam', 'Test requires pam to be in DISTRO_FEATURES')
diff --git a/meta/lib/oeqa/runtime/cases/parselogs.py \
b/meta/lib/oeqa/runtime/cases/parselogs.py index c61969d3f2..2d24090c9e 100644
--- a/meta/lib/oeqa/runtime/cases/parselogs.py
+++ b/meta/lib/oeqa/runtime/cases/parselogs.py
@@ -197,6 +197,7 @@ ignore_errors = {
log_locations = ["/var/log/", "/var/log/dmesg", "/tmp/dmesg_output.log"]
+
class ParseLogsTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/perl.py \
b/meta/lib/oeqa/runtime/cases/perl.py index 2c6b3b7846..5b6facd08f 100644
--- a/meta/lib/oeqa/runtime/cases/perl.py
+++ b/meta/lib/oeqa/runtime/cases/perl.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class PerlTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['perl'])
diff --git a/meta/lib/oeqa/runtime/cases/ping.py \
b/meta/lib/oeqa/runtime/cases/ping.py index da40204614..9e5a8dc722 100644
--- a/meta/lib/oeqa/runtime/cases/ping.py
+++ b/meta/lib/oeqa/runtime/cases/ping.py
@@ -7,6 +7,7 @@ from subprocess import Popen, PIPE
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.oetimeout import OETimeout
+
class PingTest(OERuntimeTestCase):
@OETimeout(30)
diff --git a/meta/lib/oeqa/runtime/cases/ptest.py \
b/meta/lib/oeqa/runtime/cases/ptest.py index a8a4d17003..0c42ea995b 100644
--- a/meta/lib/oeqa/runtime/cases/ptest.py
+++ b/meta/lib/oeqa/runtime/cases/ptest.py
@@ -13,6 +13,7 @@ from oeqa.core.decorator.data import skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.utils.logparser import PtestParser
+
class PtestRunnerTest(OERuntimeTestCase):
@skipIfNotFeature('ptest', 'Test requires ptest to be in DISTRO_FEATURES')
diff --git a/meta/lib/oeqa/runtime/cases/python.py \
b/meta/lib/oeqa/runtime/cases/python.py index ec54f1e1db..043bc22442 100644
--- a/meta/lib/oeqa/runtime/cases/python.py
+++ b/meta/lib/oeqa/runtime/cases/python.py
@@ -6,6 +6,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class PythonTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['python3-core'])
diff --git a/meta/lib/oeqa/runtime/cases/rpm.py b/meta/lib/oeqa/runtime/cases/rpm.py
index df0a373c59..9c7a50c567 100644
--- a/meta/lib/oeqa/runtime/cases/rpm.py
+++ b/meta/lib/oeqa/runtime/cases/rpm.py
@@ -12,6 +12,7 @@ from oeqa.core.decorator.data import skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.core.utils.path import findFile
+
class RpmBasicTest(OERuntimeTestCase):
@OEHasPackage(['rpm'])
diff --git a/meta/lib/oeqa/runtime/cases/rtc.py b/meta/lib/oeqa/runtime/cases/rtc.py
index c4e6681324..43de30a23f 100644
--- a/meta/lib/oeqa/runtime/cases/rtc.py
+++ b/meta/lib/oeqa/runtime/cases/rtc.py
@@ -4,6 +4,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
import re
+
class RTCTest(OERuntimeTestCase):
def setUp(self):
diff --git a/meta/lib/oeqa/runtime/cases/runlevel.py \
b/meta/lib/oeqa/runtime/cases/runlevel.py index aa31adf0b7..8dbb2e4f13 100644
--- a/meta/lib/oeqa/runtime/cases/runlevel.py
+++ b/meta/lib/oeqa/runtime/cases/runlevel.py
@@ -3,6 +3,7 @@ from oeqa.core.decorator.depends import OETestDepends
import time
+
class RunLevel_Test(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
diff --git a/meta/lib/oeqa/runtime/cases/scons.py \
b/meta/lib/oeqa/runtime/cases/scons.py index 3c7c7f7270..60f77c499b 100644
--- a/meta/lib/oeqa/runtime/cases/scons.py
+++ b/meta/lib/oeqa/runtime/cases/scons.py
@@ -8,6 +8,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class SconsCompileTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/scp.py b/meta/lib/oeqa/runtime/cases/scp.py
index fdf058d948..faee8852dc 100644
--- a/meta/lib/oeqa/runtime/cases/scp.py
+++ b/meta/lib/oeqa/runtime/cases/scp.py
@@ -9,6 +9,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class ScpTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/skeletoninit.py \
b/meta/lib/oeqa/runtime/cases/skeletoninit.py index 5f3b6b353a..2da4b4e340 100644
--- a/meta/lib/oeqa/runtime/cases/skeletoninit.py
+++ b/meta/lib/oeqa/runtime/cases/skeletoninit.py
@@ -10,6 +10,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
+
class SkeletonBasicTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
diff --git a/meta/lib/oeqa/runtime/cases/ssh.py b/meta/lib/oeqa/runtime/cases/ssh.py
index 60a5fbbfbf..d946bf58a9 100644
--- a/meta/lib/oeqa/runtime/cases/ssh.py
+++ b/meta/lib/oeqa/runtime/cases/ssh.py
@@ -6,6 +6,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
+
class SSHTest(OERuntimeTestCase):
@OETestDepends(['ping.PingTest.test_ping'])
diff --git a/meta/lib/oeqa/runtime/cases/stap.py \
b/meta/lib/oeqa/runtime/cases/stap.py index 5342f6ac34..df4afe58fc 100644
--- a/meta/lib/oeqa/runtime/cases/stap.py
+++ b/meta/lib/oeqa/runtime/cases/stap.py
@@ -9,6 +9,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
+
class StapTest(OERuntimeTestCase):
@classmethod
diff --git a/meta/lib/oeqa/runtime/cases/storage.py \
b/meta/lib/oeqa/runtime/cases/storage.py index f6f9130d20..cd640e214e 100644
--- a/meta/lib/oeqa/runtime/cases/storage.py
+++ b/meta/lib/oeqa/runtime/cases/storage.py
@@ -9,6 +9,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfQemu
+
class StorageBase(OERuntimeTestCase):
def storage_mount(cls, tmo=1):
@@ -29,7 +30,6 @@ class StorageBase(OERuntimeTestCase):
msg = ('Failed to cleanup files @ %s/*' % cls.test_dir)
cls.assertFalse(output, msg=msg)
-
def storage_basic(cls):
# create file on device
(status, output) = cls.target.run('touch %s/%s' % (cls.test_dir, \
cls.test_file))
diff --git a/meta/lib/oeqa/runtime/cases/suspend.py \
b/meta/lib/oeqa/runtime/cases/suspend.py index 708e6ac7e5..84e2e3f710 100644
--- a/meta/lib/oeqa/runtime/cases/suspend.py
+++ b/meta/lib/oeqa/runtime/cases/suspend.py
@@ -4,6 +4,7 @@ from oeqa.core.decorator.data import skipIfQemu
import threading
import time
+
class Suspend_Test(OERuntimeTestCase):
def test_date(self):
diff --git a/meta/lib/oeqa/runtime/cases/systemd.py \
b/meta/lib/oeqa/runtime/cases/systemd.py index a465eaa0b7..7328bb439c 100644
--- a/meta/lib/oeqa/runtime/cases/systemd.py
+++ b/meta/lib/oeqa/runtime/cases/systemd.py
@@ -11,6 +11,7 @@ from oeqa.core.decorator.data import skipIfDataVar, \
skipIfNotDataVar from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.core.decorator.data import skipIfNotFeature, skipIfFeature
+
class SystemdTest(OERuntimeTestCase):
def systemctl(self, action='', target='', expected=0, verbose=False):
@@ -53,6 +54,7 @@ class SystemdTest(OERuntimeTestCase):
% l_match_units)
return output
+
class SystemdBasicTests(SystemdTest):
def settle(self):
@@ -134,6 +136,7 @@ class SystemdServiceTests(SystemdTest):
status = self.target.run('mount -oro,remount /')[0]
self.assertTrue(status == 0, msg='Remounting / as r/o failed')
+
class SystemdJournalTests(SystemdTest):
@OETestDepends(['systemd.SystemdBasicTests.test_systemd_basic'])
diff --git a/meta/lib/oeqa/runtime/cases/terminal.py \
b/meta/lib/oeqa/runtime/cases/terminal.py index 8fcca99f47..fe1cd68118 100644
--- a/meta/lib/oeqa/runtime/cases/terminal.py
+++ b/meta/lib/oeqa/runtime/cases/terminal.py
@@ -5,6 +5,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
import threading
import time
+
class TerminalTest(OERuntimeTestCase):
@OEHasPackage(['matchbox-terminal'])
diff --git a/meta/lib/oeqa/runtime/cases/usb_hid.py \
b/meta/lib/oeqa/runtime/cases/usb_hid.py index a42c856f6a..e8451b4658 100644
--- a/meta/lib/oeqa/runtime/cases/usb_hid.py
+++ b/meta/lib/oeqa/runtime/cases/usb_hid.py
@@ -3,6 +3,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfQemu
from oeqa.runtime.decorator.package import OEHasPackage
+
class USB_HID_Test(OERuntimeTestCase):
def keyboard_mouse_simulation(self):
diff --git a/meta/lib/oeqa/runtime/cases/weston.py \
b/meta/lib/oeqa/runtime/cases/weston.py index 3456803adb..6e8fa0e3f6 100644
--- a/meta/lib/oeqa/runtime/cases/weston.py
+++ b/meta/lib/oeqa/runtime/cases/weston.py
@@ -9,6 +9,7 @@ from oeqa.runtime.decorator.package import OEHasPackage
import threading
import time
+
class WestonTest(OERuntimeTestCase):
weston_log_file = '/tmp/weston.log'
diff --git a/meta/lib/oeqa/runtime/cases/x32lib.py \
b/meta/lib/oeqa/runtime/cases/x32lib.py index f419c8f181..1ffe2388b9 100644
--- a/meta/lib/oeqa/runtime/cases/x32lib.py
+++ b/meta/lib/oeqa/runtime/cases/x32lib.py
@@ -8,6 +8,7 @@ from oeqa.core.decorator.data import skipIfNotInDataVar
import subprocess
+
class X32libTest(OERuntimeTestCase):
@skipIfNotInDataVar('DEFAULTTUNE', 'x86-64-x32',
diff --git a/meta/lib/oeqa/runtime/cases/xorg.py \
b/meta/lib/oeqa/runtime/cases/xorg.py index 0bbef023d9..65b8f3ae30 100644
--- a/meta/lib/oeqa/runtime/cases/xorg.py
+++ b/meta/lib/oeqa/runtime/cases/xorg.py
@@ -7,6 +7,7 @@ from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfNotFeature
from oeqa.runtime.decorator.package import OEHasPackage
+
class XorgTest(OERuntimeTestCase):
@skipIfNotFeature('x11-base',
diff --git a/meta/lib/oeqa/runtime/context.py b/meta/lib/oeqa/runtime/context.py
index 0ea67bee2f..af5639b3b8 100644
--- a/meta/lib/oeqa/runtime/context.py
+++ b/meta/lib/oeqa/runtime/context.py
@@ -13,6 +13,7 @@ from oeqa.utils.dump import HostDumper
from oeqa.runtime.loader import OERuntimeTestLoader
+
class OERuntimeTestContext(OETestContext):
loaderClass = OERuntimeTestLoader
runtime_files_dir = os.path.join(
@@ -35,6 +36,7 @@ class OERuntimeTestContext(OETestContext):
if 'procps' in self.image_packages:
self.target_cmds['ps'] = self.target_cmds['ps'] + ' -ef'
+
class OERuntimeTestContextExecutor(OETestContextExecutor):
_context_class = OERuntimeTestContext
@@ -224,4 +226,5 @@ class OERuntimeTestContextExecutor(OETestContextExecutor):
args.packages_manifest)
self.tc_kwargs['init']['extract_dir'] = args.extract_dir
+
_executor_class = OERuntimeTestContextExecutor
diff --git a/meta/lib/oeqa/runtime/decorator/package.py \
b/meta/lib/oeqa/runtime/decorator/package.py index 2d7e174dbf..687556a6d7 100644
--- a/meta/lib/oeqa/runtime/decorator/package.py
+++ b/meta/lib/oeqa/runtime/decorator/package.py
@@ -7,6 +7,7 @@
from oeqa.core.decorator import OETestDecorator, registerDecorator
from oeqa.core.utils.misc import strToSet
+
@registerDecorator
class OEHasPackage(OETestDecorator):
"""
@@ -58,6 +59,7 @@ class OEHasPackage(OETestDecorator):
def _decorator_fail(self, msg):
self.case.skipTest(msg)
+
@registerDecorator
class OERequirePackage(OEHasPackage):
"""
diff --git a/meta/lib/oeqa/runtime/loader.py b/meta/lib/oeqa/runtime/loader.py
index 7041ddfde8..ecad20087f 100644
--- a/meta/lib/oeqa/runtime/loader.py
+++ b/meta/lib/oeqa/runtime/loader.py
@@ -7,6 +7,7 @@
from oeqa.core.loader import OETestLoader
from oeqa.runtime.case import OERuntimeTestCase
+
class OERuntimeTestLoader(OETestLoader):
caseClass = OERuntimeTestCase
diff --git a/meta/lib/oeqa/runtime/utils/targetbuildproject.py \
b/meta/lib/oeqa/runtime/utils/targetbuildproject.py index f4f4816a9b..214f4cce55 \
100644
--- a/meta/lib/oeqa/runtime/utils/targetbuildproject.py
+++ b/meta/lib/oeqa/runtime/utils/targetbuildproject.py
@@ -6,6 +6,7 @@
from oeqa.utils.buildproject import BuildProject
+
class TargetBuildProject(BuildProject):
def __init__(self, target, uri, foldername=None, dl_dir=None):
diff --git a/meta/lib/oeqa/sdk/case.py b/meta/lib/oeqa/sdk/case.py
index 6b8eab3258..9b05f33dfb 100644
--- a/meta/lib/oeqa/sdk/case.py
+++ b/meta/lib/oeqa/sdk/case.py
@@ -9,6 +9,7 @@ import subprocess
from oeqa.core.case import OETestCase
+
class OESDKTestCase(OETestCase):
def _run(self, cmd):
return subprocess.check_output(". %s > /dev/null; %s;" %
diff --git a/meta/lib/oeqa/sdk/cases/assimp.py b/meta/lib/oeqa/sdk/cases/assimp.py
index f166758e49..3afe203141 100644
--- a/meta/lib/oeqa/sdk/cases/assimp.py
+++ b/meta/lib/oeqa/sdk/cases/assimp.py
@@ -11,6 +11,7 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class BuildAssimp(OESDKTestCase):
"""
Test case to build a project using cmake.
diff --git a/meta/lib/oeqa/sdk/cases/buildcpio.py \
b/meta/lib/oeqa/sdk/cases/buildcpio.py index e7fc211a47..6ad4bb3404 100644
--- a/meta/lib/oeqa/sdk/cases/buildcpio.py
+++ b/meta/lib/oeqa/sdk/cases/buildcpio.py
@@ -11,10 +11,12 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class BuildCpioTest(OESDKTestCase):
"""
Check that autotools will cross-compile correctly.
"""
+
def test_cpio(self):
with tempfile.TemporaryDirectory(prefix="cpio-", dir=self.tc.sdk_dir) as \
testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], \
"https://ftp.gnu.org/gnu/cpio/cpio-2.13.tar.gz")
diff --git a/meta/lib/oeqa/sdk/cases/buildepoxy.py \
b/meta/lib/oeqa/sdk/cases/buildepoxy.py index 385f8ccca8..6f4b430030 100644
--- a/meta/lib/oeqa/sdk/cases/buildepoxy.py
+++ b/meta/lib/oeqa/sdk/cases/buildepoxy.py
@@ -11,10 +11,12 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class EpoxyTest(OESDKTestCase):
"""
Test that Meson builds correctly.
"""
+
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-meson")):
raise unittest.SkipTest("GalculatorTest class: SDK doesn't contain \
Meson")
diff --git a/meta/lib/oeqa/sdk/cases/buildgalculator.py \
b/meta/lib/oeqa/sdk/cases/buildgalculator.py index c6de032b29..b7fe32be2b 100644
--- a/meta/lib/oeqa/sdk/cases/buildgalculator.py
+++ b/meta/lib/oeqa/sdk/cases/buildgalculator.py
@@ -11,10 +11,12 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class GalculatorTest(OESDKTestCase):
"""
Test that autotools and GTK+ 3 compiles correctly.
"""
+
def setUp(self):
if not (self.tc.hasTargetPackage("gtk+3", multilib=True) or
self.tc.hasTargetPackage("libgtk-3.0", multilib=True)):
diff --git a/meta/lib/oeqa/sdk/cases/buildlzip.py \
b/meta/lib/oeqa/sdk/cases/buildlzip.py index 04c4a0ec16..fb894d4183 100644
--- a/meta/lib/oeqa/sdk/cases/buildlzip.py
+++ b/meta/lib/oeqa/sdk/cases/buildlzip.py
@@ -10,10 +10,12 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class BuildLzipTest(OESDKTestCase):
"""
Test that "plain" compilation works, using just $CC $CFLAGS etc.
"""
+
def test_lzip(self):
with tempfile.TemporaryDirectory(prefix="lzip", dir=self.tc.sdk_dir) as \
testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], \
"http://downloads.yoctoproject.org/mirror/sources/lzip-1.19.tar.gz")
diff --git a/meta/lib/oeqa/sdk/cases/gcc.py b/meta/lib/oeqa/sdk/cases/gcc.py
index 7146f368e9..f943cd3fe3 100644
--- a/meta/lib/oeqa/sdk/cases/gcc.py
+++ b/meta/lib/oeqa/sdk/cases/gcc.py
@@ -12,6 +12,7 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class GccCompileTest(OESDKTestCase):
td_vars = ['MACHINE']
diff --git a/meta/lib/oeqa/sdk/cases/perl.py b/meta/lib/oeqa/sdk/cases/perl.py
index 14d76d820f..1259a09963 100644
--- a/meta/lib/oeqa/sdk/cases/perl.py
+++ b/meta/lib/oeqa/sdk/cases/perl.py
@@ -8,6 +8,7 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class PerlTest(OESDKTestCase):
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-perl") or
diff --git a/meta/lib/oeqa/sdk/cases/python.py b/meta/lib/oeqa/sdk/cases/python.py
index 2848481f33..76d3dbabed 100644
--- a/meta/lib/oeqa/sdk/cases/python.py
+++ b/meta/lib/oeqa/sdk/cases/python.py
@@ -9,6 +9,7 @@ from oeqa.sdk.case import OESDKTestCase
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class Python2Test(OESDKTestCase):
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-python-core") or
@@ -20,6 +21,7 @@ class Python2Test(OESDKTestCase):
output = self._run(cmd)
self.assertEqual(output, "Hello, world\n")
+
class Python3Test(OESDKTestCase):
def setUp(self):
if not (self.tc.hasHostPackage("nativesdk-python3-core") or
diff --git a/meta/lib/oeqa/sdk/context.py b/meta/lib/oeqa/sdk/context.py
index b3cd7d0a5b..4e4eb8e5fa 100644
--- a/meta/lib/oeqa/sdk/context.py
+++ b/meta/lib/oeqa/sdk/context.py
@@ -11,6 +11,7 @@ import re
from oeqa.core.context import OETestContext, OETestContextExecutor
+
class OESDKTestContext(OETestContext):
sdk_files_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), \
"files")
@@ -48,6 +49,7 @@ class OESDKTestContext(OETestContext):
pkg = ml + '-' + pkg
return self._hasPackage(self.target_pkg_manifest, pkg, regex=regex)
+
class OESDKTestContextExecutor(OETestContextExecutor):
_context_class = OESDKTestContext
@@ -150,4 +152,5 @@ class OESDKTestContextExecutor(OETestContextExecutor):
self.sdk_env = sdk_envs[args.sdk_env]
return super(OESDKTestContextExecutor, self).run(logger, args)
+
_executor_class = OESDKTestContextExecutor
diff --git a/meta/lib/oeqa/sdk/testsdk.py b/meta/lib/oeqa/sdk/testsdk.py
index 18e03cb8ef..80c2002ecd 100644
--- a/meta/lib/oeqa/sdk/testsdk.py
+++ b/meta/lib/oeqa/sdk/testsdk.py
@@ -6,6 +6,7 @@
from oeqa.sdk.context import OESDKTestContext, OESDKTestContextExecutor
+
class TestSDKBase(object):
@staticmethod
def get_sdk_configuration(d, test_type):
@@ -34,6 +35,7 @@ class TestSDKBase(object):
def get_sdk_result_id(configuration):
return '%s_%s_%s_%s_%s' % (configuration['TEST_TYPE'], \
configuration['IMAGE_BASENAME'], configuration['SDKMACHINE'], \
configuration['MACHINE'], configuration['STARTTIME'])
+
class TestSDK(TestSDKBase):
context_executor_class = OESDKTestContextExecutor
context_class = OESDKTestContext
diff --git a/meta/lib/oeqa/sdk/utils/sdkbuildproject.py \
b/meta/lib/oeqa/sdk/utils/sdkbuildproject.py index 32f5e3310d..aaaeebf762 100644
--- a/meta/lib/oeqa/sdk/utils/sdkbuildproject.py
+++ b/meta/lib/oeqa/sdk/utils/sdkbuildproject.py
@@ -9,6 +9,7 @@ import subprocess
from oeqa.utils.buildproject import BuildProject
+
class SDKBuildProject(BuildProject):
def __init__(self, testpath, sdkenv, uri, testlogdir, builddatetime,
foldername=None, dl_dir=None):
diff --git a/meta/lib/oeqa/sdkext/case.py b/meta/lib/oeqa/sdkext/case.py
index 8a36c1f8ce..bf832cf8c8 100644
--- a/meta/lib/oeqa/sdkext/case.py
+++ b/meta/lib/oeqa/sdkext/case.py
@@ -10,6 +10,7 @@ import subprocess
from oeqa.utils import avoid_paths_in_environ
from oeqa.sdk.case import OESDKTestCase
+
class OESDKExtTestCase(OESDKTestCase):
def _run(self, cmd):
# extensible sdk shows a warning if found bitbake in the path
diff --git a/meta/lib/oeqa/sdkext/cases/devtool.py \
b/meta/lib/oeqa/sdkext/cases/devtool.py index 4567795027..f0fb75a3af 100644
--- a/meta/lib/oeqa/sdkext/cases/devtool.py
+++ b/meta/lib/oeqa/sdkext/cases/devtool.py
@@ -14,6 +14,7 @@ from oeqa.utils.httpserver import HTTPService
from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output()
+
class DevtoolTest(OESDKExtTestCase):
@classmethod
def setUpClass(cls):
@@ -95,6 +96,7 @@ class DevtoolTest(OESDKExtTestCase):
finally:
self._run('devtool reset %s ' % package_nodejs)
+
class SdkUpdateTest(OESDKExtTestCase):
@classmethod
def setUpClass(self):
diff --git a/meta/lib/oeqa/sdkext/context.py b/meta/lib/oeqa/sdkext/context.py
index 2ac2bf6ff7..63a7cd7c6b 100644
--- a/meta/lib/oeqa/sdkext/context.py
+++ b/meta/lib/oeqa/sdkext/context.py
@@ -7,6 +7,7 @@
import os
from oeqa.sdk.context import OESDKTestContext, OESDKTestContextExecutor
+
class OESDKExtTestContext(OESDKTestContext):
esdk_files_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), \
"files")
@@ -18,6 +19,7 @@ class OESDKExtTestContext(OESDKTestContext):
return True
return self._hasPackage(self.host_pkg_manifest, pkg)
+
class OESDKExtTestContextExecutor(OESDKTestContextExecutor):
_context_class = OESDKExtTestContext
@@ -29,4 +31,5 @@ class OESDKExtTestContextExecutor(OESDKTestContextExecutor):
[os.path.join(os.path.abspath(os.path.dirname(__file__)), 'cases')]
default_test_data = None
+
_executor_class = OESDKExtTestContextExecutor
diff --git a/meta/lib/oeqa/sdkext/testsdk.py b/meta/lib/oeqa/sdkext/testsdk.py
index 963531dfc6..6d552a8edf 100644
--- a/meta/lib/oeqa/sdkext/testsdk.py
+++ b/meta/lib/oeqa/sdkext/testsdk.py
@@ -6,6 +6,7 @@
from oeqa.sdk.testsdk import TestSDKBase
+
class TestSDKExt(TestSDKBase):
def run(self, d):
import os
diff --git a/meta/lib/oeqa/selftest/case.py b/meta/lib/oeqa/selftest/case.py
index 3d30618b97..b084831e0d 100644
--- a/meta/lib/oeqa/selftest/case.py
+++ b/meta/lib/oeqa/selftest/case.py
@@ -16,6 +16,7 @@ from oeqa.core.case import OETestCase
import bb.utils
+
class OESelftestTestCase(OETestCase):
def __init__(self, methodName="runTest"):
self._extra_tear_down_commands = []
@@ -229,6 +230,7 @@ class OESelftestTestCase(OETestCase):
except OSError as e:
if e.errno != errno.ENOENT:
raise
+
def write_bblayers_config(self, data):
"""Write to <builddir>/conf/bblayers.inc"""
self.logger.debug("Writing to: %s\n%s\n" % (self.testinc_bblayers_path, \
data))
diff --git a/meta/lib/oeqa/selftest/cases/archiver.py \
b/meta/lib/oeqa/selftest/cases/archiver.py index dce77281c9..e283163dc9 100644
--- a/meta/lib/oeqa/selftest/cases/archiver.py
+++ b/meta/lib/oeqa/selftest/cases/archiver.py
@@ -7,6 +7,7 @@ import glob
from oeqa.utils.commands import bitbake, get_bb_vars
from oeqa.selftest.case import OESelftestTestCase
+
class Archiver(OESelftestTestCase):
def test_archiver_allows_to_filter_on_recipe_name(self):
@@ -117,8 +118,6 @@ class Archiver(OESelftestTestCase):
excluded_present = len(glob.glob(src_path_target + '/%s-*' % \
target_recipes[1]))
self.assertFalse(excluded_present, 'Recipe %s was not excluded.' % \
target_recipes[1])
-
-
def test_archiver_srpm_mode(self):
"""
Test that in srpm mode, the added recipe dependencies at least exist/work \
[YOCTO #11121]
diff --git a/meta/lib/oeqa/selftest/cases/bblayers.py \
b/meta/lib/oeqa/selftest/cases/bblayers.py index 139c65978f..0fe0971193 100644
--- a/meta/lib/oeqa/selftest/cases/bblayers.py
+++ b/meta/lib/oeqa/selftest/cases/bblayers.py
@@ -10,6 +10,7 @@ from oeqa.utils.commands import runCmd, get_bb_var, get_bb_vars
from oeqa.selftest.case import OESelftestTestCase
+
class BitbakeLayers(OESelftestTestCase):
def test_bitbakelayers_layerindexshowdepends(self):
diff --git a/meta/lib/oeqa/selftest/cases/bbtests.py \
b/meta/lib/oeqa/selftest/cases/bbtests.py index d196bb16cf..4eb5cb1cad 100644
--- a/meta/lib/oeqa/selftest/cases/bbtests.py
+++ b/meta/lib/oeqa/selftest/cases/bbtests.py
@@ -10,6 +10,7 @@ from oeqa.utils.commands import runCmd, bitbake, get_bb_var, \
get_bb_vars
from oeqa.selftest.case import OESelftestTestCase
+
class BitbakeTests(OESelftestTestCase):
def getline(self, res, line):
@@ -36,7 +37,6 @@ class BitbakeTests(OESelftestTestCase):
os.chdir("/tmp/")
self.assertEqual(bitbake('-e', env=my_env).status, 0, msg="bitbake couldn't \
run from /tmp/")
-
def test_event_handler(self):
self.write_config("INHERIT += \"test_events\"")
result = bitbake('m4-native')
diff --git a/meta/lib/oeqa/selftest/cases/binutils.py \
b/meta/lib/oeqa/selftest/cases/binutils.py index 2f6aeadffc..87b0e8b438 100644
--- a/meta/lib/oeqa/selftest/cases/binutils.py
+++ b/meta/lib/oeqa/selftest/cases/binutils.py
@@ -8,6 +8,7 @@ from oeqa.core.case import OEPTestResultTestCase
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars
+
def parse_values(content):
for i in content:
for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", \
"UNTESTED", "ERROR", "WARNING"]: @@ -15,6 +16,7 @@ def parse_values(content):
yield i[len(v) + 2:].strip(), v
break
+
@OETestTag("toolchain-user", "toolchain-system")
class BinutilsCrossSelfTest(OESelftestTestCase, OEPTestResultTestCase):
def test_binutils(self):
diff --git a/meta/lib/oeqa/selftest/cases/buildoptions.py \
b/meta/lib/oeqa/selftest/cases/buildoptions.py index dcc95e38ff..77740d98e8 100644
--- a/meta/lib/oeqa/selftest/cases/buildoptions.py
+++ b/meta/lib/oeqa/selftest/cases/buildoptions.py
@@ -12,6 +12,7 @@ from oeqa.selftest.cases.buildhistory import BuildhistoryBase
from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
import oeqa.utils.ftools as ftools
+
class ImageOptionsTests(OESelftestTestCase):
def test_incremental_image_generation(self):
@@ -55,6 +56,7 @@ class ImageOptionsTests(OESelftestTestCase):
bitbake("core-image-sato core-image-weston")
# do_image will fail if there are any pending postinsts
+
class DiskMonTest(OESelftestTestCase):
def test_stoptask_behavior(self):
@@ -70,6 +72,7 @@ class DiskMonTest(OESelftestTestCase):
res = bitbake("delay -c delay")
self.assertTrue('WARNING: The free space' in res.output, msg="A warning \
should have been displayed for disk monitor is set to WARN: %s" % res.output)
+
class SanityOptionsTest(OESelftestTestCase):
def getline(self, res, line):
for l in res.output.split('\n'):
@@ -148,6 +151,7 @@ class BuildhistoryTests(BuildhistoryBase):
self.run_buildhistory_operation(target, target_config="PR = \"r1\"", \
change_bh_location=True)
self.run_buildhistory_operation(target, target_config="PR = \"r0\"", \
change_bh_location=False, expect_error=True, error_regex=error)
+
class ArchiverTest(OESelftestTestCase):
def test_arch_work_dir_and_export_source(self):
"""
@@ -162,6 +166,7 @@ class ArchiverTest(OESelftestTestCase):
tar_file_glob = str(pkgs_path[0]) + "/xcursor*.tar.gz"
self.assertTrue((g.glob(src_file_glob) and g.glob(tar_file_glob)), "Couldn't \
find .src.rpm and .tar.gz files under %s/allarch*/xcursor*" % deploy_dir_src)
+
class ToolchainOptions(OESelftestTestCase):
def test_toolchain_fortran(self):
"""
@@ -172,6 +177,7 @@ class ToolchainOptions(OESelftestTestCase):
self.write_config(features)
bitbake('fortran-helloworld')
+
class SourceMirroring(OESelftestTestCase):
# Can we download everything from the Yocto Sources Mirror over http only
def test_yocto_source_mirror(self):
diff --git a/meta/lib/oeqa/selftest/cases/containerimage.py \
b/meta/lib/oeqa/selftest/cases/containerimage.py index 730ffe42c9..9911b19d2e 100644
--- a/meta/lib/oeqa/selftest/cases/containerimage.py
+++ b/meta/lib/oeqa/selftest/cases/containerimage.py
@@ -20,6 +20,8 @@ from oeqa.utils.commands import bitbake, get_bb_vars, runCmd
# of them, but this test is more to catch if other packages get added by
# default other than what is in ROOTFS_BOOTSTRAP_INSTALL.
#
+
+
class ContainerImageTests(OESelftestTestCase):
# Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that
diff --git a/meta/lib/oeqa/selftest/cases/cve_check.py \
b/meta/lib/oeqa/selftest/cases/cve_check.py index bd89e9335f..c843b19d04 100644
--- a/meta/lib/oeqa/selftest/cases/cve_check.py
+++ b/meta/lib/oeqa/selftest/cases/cve_check.py
@@ -1,6 +1,7 @@
from oe.cve_check import Version
from oeqa.selftest.case import OESelftestTestCase
+
class CVECheck(OESelftestTestCase):
def test_version_compare(self):
diff --git a/meta/lib/oeqa/selftest/cases/devtool.py \
b/meta/lib/oeqa/selftest/cases/devtool.py index b90aac72bd..d79e705963 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -16,6 +16,7 @@ from oeqa.utils.commands import get_bb_vars, runqemu, \
get_test_layer
oldmetapath = None
+
def setUpModule():
import bb.utils
@@ -67,9 +68,11 @@ def setUpModule():
return layerpath
bb.utils.edit_bblayers_conf(bblayers_conf, None, None, bblayers_edit_cb)
+
def tearDownModule():
if oldmetapath:
edited_layers = []
+
def bblayers_edit_cb(layerpath, canonical_layerpath):
if not edited_layers and canonical_layerpath.endswith('/meta'):
edited_layers.append(layerpath)
@@ -80,6 +83,7 @@ def tearDownModule():
bb.utils.edit_bblayers_conf(bblayers_conf, None, None, bblayers_edit_cb)
shutil.rmtree(templayerdir)
+
class DevtoolBase(OESelftestTestCase):
@classmethod
@@ -173,7 +177,6 @@ class DevtoolBase(OESelftestTestCase):
value = set(value.split())
self.assertEqual(value, needvalue, 'values for %s do not match' \
% var)
-
missingvars = {}
for var, value in checkvars.items():
if value is not None:
@@ -261,6 +264,7 @@ class DevtoolTests(DevtoolBase):
self.assertNotIn(tempdir, result.output)
self.assertIn(self.workspacedir, result.output)
+
class DevtoolAddTests(DevtoolBase):
def test_devtool_add(self):
@@ -536,6 +540,7 @@ class DevtoolAddTests(DevtoolBase):
# Test devtool build
result = runCmd('devtool build %s' % pn)
+
class DevtoolModifyTests(DevtoolBase):
def test_devtool_modify(self):
@@ -599,6 +604,7 @@ class DevtoolModifyTests(DevtoolBase):
def assertFile(path, *paths):
f = os.path.join(path, *paths)
self.assertExists(f)
+
def assertNoFile(path, *paths):
f = os.path.join(path, *paths)
self.assertNotExists(f)
@@ -697,6 +703,7 @@ class DevtoolModifyTests(DevtoolBase):
self.assertTrue(bbclassextended, 'None of these recipes are BBCLASSEXTENDed \
to native - need to adjust testrecipes list: %s' % ', \
'.join(testrecipes))
self.assertTrue(inheritnative, 'None of these recipes do "inherit native" - \
need to adjust testrecipes list: %s' % ', '.join(testrecipes)) +
def test_devtool_modify_localfiles_only(self):
# Check preconditions
testrecipe = 'base-files'
@@ -824,6 +831,7 @@ class DevtoolModifyTests(DevtoolBase):
self._check_src_repo(tempdir)
source = os.path.join(tempdir, "source")
+
def check(branch, expected):
runCmd('git -C %s checkout %s' % (tempdir, branch))
with open(source, "rt") as f:
@@ -834,6 +842,7 @@ class DevtoolModifyTests(DevtoolBase):
check('devtool-override-qemuarm', 'This is a test for qemuarm\n')
check('devtool-override-qemux86', 'This is a test for qemux86\n')
+
class DevtoolUpdateTests(DevtoolBase):
def test_devtool_update_recipe(self):
@@ -1295,6 +1304,7 @@ class DevtoolUpdateTests(DevtoolBase):
expected_status = []
self._check_repo_status(os.path.dirname(recipefile), expected_status)
+
class DevtoolExtractTests(DevtoolBase):
def test_devtool_extract(self):
@@ -1461,6 +1471,7 @@ class DevtoolExtractTests(DevtoolBase):
if reqpkgs:
self.fail('The following packages were not present in the image as \
expected: %s' % ', '.join(reqpkgs))
+
class DevtoolUpgradeTests(DevtoolBase):
def test_devtool_upgrade(self):
@@ -1667,7 +1678,6 @@ class DevtoolUpgradeTests(DevtoolBase):
self.assertIn("0002-Add-a-comment-to-the-code.patch", newcontent, "New patch \
should have been added to the recipe but wasn't")
self.assertIn("http://www.ivarch.com/programs/sources/pv-${PV}.tar.gz", \
newcontent, "New recipe no longer has upstream source in SRC_URI")
-
def test_devtool_finish_upgrade_otherlayer(self):
recipe, oldrecipefile, recipedir, olddir, newversion, patchfn, \
backportedpatchfn = self._setup_test_devtool_finish_upgrade()
# Ensure the recipe is where we think it should be (so that cleanup doesn't \
trash things) @@ -1789,6 +1799,7 @@ class DevtoolUpgradeTests(DevtoolBase):
recipever = '3.1.2'
recipefile = os.path.join(self.workspacedir, 'recipes', recipename, \
'%s_%s.bb' % (recipename, recipever))
url = 'http://downloads.yoctoproject.org/mirror/sources/i2c-tools-%s.tar.bz2' \
% recipever +
def add_recipe():
result = runCmd('devtool add %s' % url)
self.assertExists(recipefile, 'Expected recipe file not created')
diff --git a/meta/lib/oeqa/selftest/cases/distrodata.py \
b/meta/lib/oeqa/selftest/cases/distrodata.py index 0ad6e1ef91..186b3e19e7 100644
--- a/meta/lib/oeqa/selftest/cases/distrodata.py
+++ b/meta/lib/oeqa/selftest/cases/distrodata.py
@@ -9,6 +9,7 @@ from oeqa.utils.ftools import write_file
import oe.recipeutils
+
class Distrodata(OESelftestTestCase):
def test_checkpkg(self):
diff --git a/meta/lib/oeqa/selftest/cases/eSDK.py \
b/meta/lib/oeqa/selftest/cases/eSDK.py index 1d185935e4..d40ff86c4a 100644
--- a/meta/lib/oeqa/selftest/cases/eSDK.py
+++ b/meta/lib/oeqa/selftest/cases/eSDK.py
@@ -10,6 +10,7 @@ import time
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
+
class oeSDKExtSelfTest(OESelftestTestCase):
"""
# Bugzilla Test Plan: 6033
diff --git a/meta/lib/oeqa/selftest/cases/efibootpartition.py \
b/meta/lib/oeqa/selftest/cases/efibootpartition.py index a61cf9bcb3..189f5193cb \
100644
--- a/meta/lib/oeqa/selftest/cases/efibootpartition.py
+++ b/meta/lib/oeqa/selftest/cases/efibootpartition.py
@@ -10,6 +10,7 @@ import re
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, runqemu, get_bb_var
+
class GenericEFITest(OESelftestTestCase):
"""EFI booting test class"""
diff --git a/meta/lib/oeqa/selftest/cases/fetch.py \
b/meta/lib/oeqa/selftest/cases/fetch.py index cd15f65129..561b581618 100644
--- a/meta/lib/oeqa/selftest/cases/fetch.py
+++ b/meta/lib/oeqa/selftest/cases/fetch.py
@@ -9,6 +9,7 @@ import oe.path
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake
+
class Fetch(OESelftestTestCase):
def test_git_mirrors(self):
"""
diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py \
b/meta/lib/oeqa/selftest/cases/fitimage.py index 67000bb1c1..42f6756996 100644
--- a/meta/lib/oeqa/selftest/cases/fitimage.py
+++ b/meta/lib/oeqa/selftest/cases/fitimage.py
@@ -8,6 +8,7 @@ import os
import json
import re
+
class FitImageTests(OESelftestTestCase):
def test_fit_image(self):
@@ -87,7 +88,6 @@ FIT_DESC = "A model description"
"Fields in Image Tree Source File %s did not match, error in finding \
%s" % (fitimage_its_path, its_field_check[field_index]))
-
def test_sign_fit_image(self):
"""
Summary: Check if FIT image and Image Tree Source (its) are created
@@ -397,7 +397,6 @@ UBOOT_MKIMAGE_SIGN_ARGS = "-c 'a smart U-Boot comment'"
"Fields in Image Tree Source File %s did not match, error in finding \
%s" % (fitimage_its_path, its_field_check[field_index]))
-
def test_sign_standalone_uboot_fit_image(self):
"""
Summary: Check if U-Boot FIT image and Image Tree Source (its) are
@@ -697,8 +696,6 @@ FIT_SIGN_INDIVIDUAL = "1"
result = runCmd('grep "### uboot-mkimage signing wrapper message" \
%s/log.do_uboot_assemble_fitimage' % tempdir, ignore_status=True)
self.assertEqual(result.status, 0, 'UBOOT_MKIMAGE_SIGN did not work')
-
-
def test_initramfs_bundle(self):
"""
Summary: Verifies the content of the initramfs bundle node in the FIT \
Image Tree Source (its)
diff --git a/meta/lib/oeqa/selftest/cases/gcc.py \
b/meta/lib/oeqa/selftest/cases/gcc.py index 46fd9813d6..843746418f 100644
--- a/meta/lib/oeqa/selftest/cases/gcc.py
+++ b/meta/lib/oeqa/selftest/cases/gcc.py
@@ -5,6 +5,7 @@ from oeqa.core.case import OEPTestResultTestCase
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu, Command
+
def parse_values(content):
for i in content:
for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", \
"UNTESTED", "ERROR", "WARNING"]: @@ -12,6 +13,7 @@ def parse_values(content):
yield i[len(v) + 2:].strip(), v
break
+
class GccSelfTestBase(OESelftestTestCase, OEPTestResultTestCase):
def check_skip(self, suite):
targets = get_bb_var("RUNTIMETARGET", "gcc-runtime").split()
@@ -76,74 +78,88 @@ class GccSelfTestBase(OESelftestTestCase, OEPTestResultTestCase):
return self.run_check(*args, ssh=qemu.ip, **kwargs)
+
@OETestTag("toolchain-user")
class GccCrossSelfTest(GccSelfTestBase):
def test_cross_gcc(self):
self.run_check("gcc")
+
@OETestTag("toolchain-user")
class GxxCrossSelfTest(GccSelfTestBase):
def test_cross_gxx(self):
self.run_check("g++")
+
@OETestTag("toolchain-user")
class GccLibAtomicSelfTest(GccSelfTestBase):
def test_libatomic(self):
self.run_check("libatomic")
+
@OETestTag("toolchain-user")
class GccLibGompSelfTest(GccSelfTestBase):
def test_libgomp(self):
self.run_check("libgomp")
+
@OETestTag("toolchain-user")
class GccLibStdCxxSelfTest(GccSelfTestBase):
def test_libstdcxx(self):
self.run_check("libstdc++-v3")
+
@OETestTag("toolchain-user")
class GccLibSspSelfTest(GccSelfTestBase):
def test_libssp(self):
self.check_skip("libssp")
self.run_check("libssp")
+
@OETestTag("toolchain-user")
class GccLibItmSelfTest(GccSelfTestBase):
def test_libitm(self):
self.check_skip("libitm")
self.run_check("libitm")
+
@OETestTag("toolchain-system")
class GccCrossSelfTestSystemEmulated(GccSelfTestBase):
def test_cross_gcc(self):
self.run_check_emulated("gcc")
+
@OETestTag("toolchain-system")
class GxxCrossSelfTestSystemEmulated(GccSelfTestBase):
def test_cross_gxx(self):
self.run_check_emulated("g++")
+
@OETestTag("toolchain-system")
class GccLibAtomicSelfTestSystemEmulated(GccSelfTestBase):
def test_libatomic(self):
self.run_check_emulated("libatomic")
+
@OETestTag("toolchain-system")
class GccLibGompSelfTestSystemEmulated(GccSelfTestBase):
def test_libgomp(self):
self.run_check_emulated("libgomp")
+
@OETestTag("toolchain-system")
class GccLibStdCxxSelfTestSystemEmulated(GccSelfTestBase):
def test_libstdcxx(self):
self.run_check_emulated("libstdc++-v3")
+
@OETestTag("toolchain-system")
class GccLibSspSelfTestSystemEmulated(GccSelfTestBase):
def test_libssp(self):
self.check_skip("libssp")
self.run_check_emulated("libssp")
+
@OETestTag("toolchain-system")
class GccLibItmSelfTestSystemEmulated(GccSelfTestBase):
def test_libitm(self):
diff --git a/meta/lib/oeqa/selftest/cases/glibc.py \
b/meta/lib/oeqa/selftest/cases/glibc.py index 852c8635df..842b663bdc 100644
--- a/meta/lib/oeqa/selftest/cases/glibc.py
+++ b/meta/lib/oeqa/selftest/cases/glibc.py
@@ -7,6 +7,7 @@ from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu, Command
from oeqa.utils.nfs import unfs_server
+
def parse_values(content):
for i in content:
for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", \
"UNTESTED", "ERROR", "WARNING"]: @@ -14,6 +15,7 @@ def parse_values(content):
yield i[len(v) + 2:].strip(), v
break
+
class GlibcSelfTestBase(OESelftestTestCase, OEPTestResultTestCase):
def run_check(self, ssh=None):
# configure ssh target
@@ -77,11 +79,13 @@ class GlibcSelfTestBase(OESelftestTestCase, \
OEPTestResultTestCase):
self.run_check(ssh=qemu.ip)
+
@OETestTag("toolchain-user")
class GlibcSelfTest(GlibcSelfTestBase):
def test_glibc(self):
self.run_check()
+
@OETestTag("toolchain-system")
class GlibcSelfTestSystemEmulated(GlibcSelfTestBase):
def test_glibc(self):
diff --git a/meta/lib/oeqa/selftest/cases/image_typedep.py \
b/meta/lib/oeqa/selftest/cases/image_typedep.py index 269fd556b7..13bddd10d2 100644
--- a/meta/lib/oeqa/selftest/cases/image_typedep.py
+++ b/meta/lib/oeqa/selftest/cases/image_typedep.py
@@ -7,6 +7,7 @@ import os
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake
+
class ImageTypeDepTests(OESelftestTestCase):
# Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that
diff --git a/meta/lib/oeqa/selftest/cases/imagefeatures.py \
b/meta/lib/oeqa/selftest/cases/imagefeatures.py index 07e46d5cfd..6f982b52c2 100644
--- a/meta/lib/oeqa/selftest/cases/imagefeatures.py
+++ b/meta/lib/oeqa/selftest/cases/imagefeatures.py
@@ -9,6 +9,7 @@ import glob
import os
import json
+
class ImageFeatures(OESelftestTestCase):
test_user = 'tester'
@@ -67,7 +68,6 @@ class ImageFeatures(OESelftestTestCase):
else:
self.assertEqual(status, 0, 'ssh to user tester failed with %s' \
% output)
-
def test_wayland_support_in_image(self):
"""
Summary: Check Wayland support in image
diff --git a/meta/lib/oeqa/selftest/cases/incompatible_lic.py \
b/meta/lib/oeqa/selftest/cases/incompatible_lic.py index 152da6332a..22a38a3f1a \
100644
--- a/meta/lib/oeqa/selftest/cases/incompatible_lic.py
+++ b/meta/lib/oeqa/selftest/cases/incompatible_lic.py
@@ -1,6 +1,7 @@
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake
+
class IncompatibleLicenseTests(OESelftestTestCase):
def lic_test(self, pn, pn_lic, lic):
@@ -82,6 +83,7 @@ class IncompatibleLicenseTests(OESelftestTestCase):
def test_incompatible_nonspdx_license(self):
self.lic_test('incompatible-nonspdx-license', 'FooLicense', 'FooLicense')
+
class IncompatibleLicensePerImageTests(OESelftestTestCase):
def default_config(self):
return """
@@ -115,6 +117,7 @@ INCOMPATIBLE_LICENSE_pn-core-image-minimal = "GPL-3.0 LGPL-3.0"
bitbake('core-image-minimal')
+
class NoGPL3InImagesTests(OESelftestTestCase):
def test_core_image_minimal(self):
self.write_config("""
diff --git a/meta/lib/oeqa/selftest/cases/kerneldevelopment.py \
b/meta/lib/oeqa/selftest/cases/kerneldevelopment.py index 697f6a94a5..5e35a0ba82 \
100644
--- a/meta/lib/oeqa/selftest/cases/kerneldevelopment.py
+++ b/meta/lib/oeqa/selftest/cases/kerneldevelopment.py
@@ -3,6 +3,7 @@ from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, get_bb_var
from oeqa.utils.git import GitRepo
+
class KernelDev(OESelftestTestCase):
@classmethod
diff --git a/meta/lib/oeqa/selftest/cases/layerappend.py \
b/meta/lib/oeqa/selftest/cases/layerappend.py index 05e9426fc6..96f02f38d5 100644
--- a/meta/lib/oeqa/selftest/cases/layerappend.py
+++ b/meta/lib/oeqa/selftest/cases/layerappend.py
@@ -8,6 +8,7 @@ from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, bitbake, get_bb_var
import oeqa.utils.ftools as ftools
+
class LayerAppendTests(OESelftestTestCase):
layerconf = """
# We have a conf and classes directory, append to BBPATH
diff --git a/meta/lib/oeqa/selftest/cases/liboe.py \
b/meta/lib/oeqa/selftest/cases/liboe.py index afe8f8809f..40b049782d 100644
--- a/meta/lib/oeqa/selftest/cases/liboe.py
+++ b/meta/lib/oeqa/selftest/cases/liboe.py
@@ -7,6 +7,7 @@ from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake, \
runCmd import oe.path
import os
+
class LibOE(OESelftestTestCase):
@classmethod
diff --git a/meta/lib/oeqa/selftest/cases/lic_checksum.py \
b/meta/lib/oeqa/selftest/cases/lic_checksum.py index bae935d697..9264ab048b 100644
--- a/meta/lib/oeqa/selftest/cases/lic_checksum.py
+++ b/meta/lib/oeqa/selftest/cases/lic_checksum.py
@@ -9,6 +9,7 @@ from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake
from oeqa.utils import CommandError
+
class LicenseTests(OESelftestTestCase):
# Verify that changing a license file that has an absolute path causes
diff --git a/meta/lib/oeqa/selftest/cases/manifest.py \
b/meta/lib/oeqa/selftest/cases/manifest.py index c7ba0ae5b7..f29cf4ae91 100644
--- a/meta/lib/oeqa/selftest/cases/manifest.py
+++ b/meta/lib/oeqa/selftest/cases/manifest.py
@@ -7,12 +7,15 @@ import os
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake
+
class ManifestEntry:
'''A manifest item of a collection able to list missing packages'''
+
def __init__(self, entry):
self.file = entry
self.missing = []
+
class VerifyManifest(OESelftestTestCase):
'''Tests for the manifest files and contents of an image'''
@@ -77,7 +80,6 @@ class VerifyManifest(OESelftestTestCase):
self.skipTest("{}: Cannot setup testing scenario"
.format(self.classname))
-
pkgdata_dir = reverse_dir = {}
mfilename = mpath = m_entry = {}
# get manifest location based on target to query about
diff --git a/meta/lib/oeqa/selftest/cases/meta_ide.py \
b/meta/lib/oeqa/selftest/cases/meta_ide.py index 3c6371fba8..cf111fa781 100644
--- a/meta/lib/oeqa/selftest/cases/meta_ide.py
+++ b/meta/lib/oeqa/selftest/cases/meta_ide.py
@@ -9,6 +9,7 @@ from oeqa.core.decorator import OETestTag
import tempfile
import shutil
+
@OETestTag("machine")
class MetaIDE(OESelftestTestCase):
diff --git a/meta/lib/oeqa/selftest/cases/multiconfig.py \
b/meta/lib/oeqa/selftest/cases/multiconfig.py index 39b92f2439..0b95cbc7ff 100644
--- a/meta/lib/oeqa/selftest/cases/multiconfig.py
+++ b/meta/lib/oeqa/selftest/cases/multiconfig.py
@@ -7,6 +7,7 @@ import textwrap
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake
+
class MultiConfig(OESelftestTestCase):
def test_multiconfig(self):
diff --git a/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py \
b/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py index ad4ae8ccef..18a877ee72 \
100644
--- a/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
@@ -8,6 +8,7 @@ import tempfile
import operator
from oeqa.utils.commands import get_bb_var
+
class TestBlobParsing(OESelftestTestCase):
def setUp(self):
@@ -99,6 +100,7 @@ class TestBlobParsing(OESelftestTestCase):
self.assertEqual(defaultmap, var_changes, "Defaults not set properly")
+
class TestFileListCompare(OESelftestTestCase):
def test_compare_file_lists(self):
diff --git a/meta/lib/oeqa/selftest/cases/oelib/elf.py \
b/meta/lib/oeqa/selftest/cases/oelib/elf.py index 5a5f9b4fdf..7788e82fd7 100644
--- a/meta/lib/oeqa/selftest/cases/oelib/elf.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/elf.py
@@ -5,6 +5,7 @@
from unittest.case import TestCase
import oe.qa
+
class TestElf(TestCase):
def test_machine_name(self):
"""
diff --git a/meta/lib/oeqa/selftest/cases/oelib/license.py \
b/meta/lib/oeqa/selftest/cases/oelib/license.py index 6ebbee589f..8536a80bfe 100644
--- a/meta/lib/oeqa/selftest/cases/oelib/license.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/license.py
@@ -5,6 +5,7 @@
from unittest.case import TestCase
import oe.license
+
class SeenVisitor(oe.license.LicenseVisitor):
def __init__(self):
self.seen = []
@@ -13,6 +14,7 @@ class SeenVisitor(oe.license.LicenseVisitor):
def visit_Str(self, node):
self.seen.append(node.s)
+
class TestSingleLicense(TestCase):
licenses = [
"GPLv2",
@@ -41,6 +43,7 @@ class TestSingleLicense(TestCase):
self.parse(license)
self.assertEqual(cm.exception.license, license)
+
class TestSimpleCombinations(TestCase):
tests = {
"FOO&BAR": ["FOO", "BAR"],
@@ -62,6 +65,7 @@ class TestSimpleCombinations(TestCase):
licenses = oe.license.flattened_licenses(license, choose)
self.assertListEqual(licenses, expected)
+
class TestComplexCombinations(TestSimpleCombinations):
tests = {
"FOO & (BAR | BAZ)&MOO": ["FOO", "BAR", "MOO"],
@@ -71,6 +75,7 @@ class TestComplexCombinations(TestSimpleCombinations):
}
preferred = ["BAR", "OMEGA", "BETA", "GPL-2.0"]
+
class TestIsIncluded(TestCase):
tests = {
("FOO | BAR", None, None):
diff --git a/meta/lib/oeqa/selftest/cases/oelib/path.py \
b/meta/lib/oeqa/selftest/cases/oelib/path.py index 5cfacfbd35..b5c8ea9ff4 100644
--- a/meta/lib/oeqa/selftest/cases/oelib/path.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/path.py
@@ -10,6 +10,7 @@ import os
import errno
import shutil
+
class TestRealPath(TestCase):
DIRS = ["a", "b", "etc", "sbin", "usr", "usr/bin", "usr/binX", "usr/sbin", \
"usr/include", "usr/include/gdbm"] FILES = ["etc/passwd", "b/file"]
diff --git a/meta/lib/oeqa/selftest/cases/oelib/types.py \
b/meta/lib/oeqa/selftest/cases/oelib/types.py index 7eb49e6f95..edaf7a3e01 100644
--- a/meta/lib/oeqa/selftest/cases/oelib/types.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/types.py
@@ -5,6 +5,7 @@
from unittest.case import TestCase
from oe.maketype import create
+
class TestBooleanType(TestCase):
def test_invalid(self):
self.assertRaises(ValueError, create, '', 'boolean')
@@ -35,6 +36,7 @@ class TestBooleanType(TestCase):
self.assertEqual(create('y', 'boolean'), True)
self.assertNotEqual(create('y', 'boolean'), False)
+
class TestList(TestCase):
def assertListEqual(self, value, valid, sep=None):
obj = create(value, 'list', separator=sep)
diff --git a/meta/lib/oeqa/selftest/cases/oelib/utils.py \
b/meta/lib/oeqa/selftest/cases/oelib/utils.py index a7214beb4c..426f94b258 100644
--- a/meta/lib/oeqa/selftest/cases/oelib/utils.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/utils.py
@@ -8,6 +8,7 @@ from contextlib import contextmanager
from io import StringIO
from oe.utils import packages_filter_out_system, trim_version, multiprocess_launch
+
class TestPackagesFilterOutSystem(TestCase):
def test_filter(self):
"""
@@ -70,6 +71,7 @@ class TestMultiprocessLaunch(TestCase):
def dummyerror(msg):
print("ERROR: %s" % msg)
+
def dummyfatal(msg):
print("ERROR: %s" % msg)
raise bb.BBHandledException()
diff --git a/meta/lib/oeqa/selftest/cases/oescripts.py \
b/meta/lib/oeqa/selftest/cases/oescripts.py index 7b20d374dd..cf432d9d35 100644
--- a/meta/lib/oeqa/selftest/cases/oescripts.py
+++ b/meta/lib/oeqa/selftest/cases/oescripts.py
@@ -11,6 +11,7 @@ from oeqa.selftest.cases.buildhistory import BuildhistoryBase
from oeqa.utils.commands import Command, runCmd, bitbake, get_bb_var, get_test_layer
from oeqa.utils import CommandError
+
class BuildhistoryDiffTests(BuildhistoryBase):
def test_buildhistory_diff(self):
@@ -34,6 +35,7 @@ class BuildhistoryDiffTests(BuildhistoryBase):
if expected_endlines:
self.fail('Missing expected line endings:\n %s' % '\n \
'.join(expected_endlines))
+
@unittest.skipUnless(importlib.util.find_spec("cairo"), "Python cairo module is not \
present") class OEScriptTests(OESelftestTestCase):
@@ -47,6 +49,7 @@ class OEScriptTests(OESelftestTestCase):
scripts_dir = os.path.join(get_bb_var('COREBASE'), 'scripts')
+
class OEPybootchartguyTests(OEScriptTests):
def test_pybootchartguy_help(self):
@@ -122,12 +125,14 @@ class OEGitproxyTests(OESelftestTestCase):
self.skipTest("No \"dash\" found on test system.")
self.run_oegitproxy(custom_shell=dash)
+
class OeRunNativeTest(OESelftestTestCase):
def test_oe_run_native(self):
bitbake("qemu-helper-native -c addto_recipe_sysroot")
result = runCmd("oe-run-native qemu-helper-native tunctl -h")
self.assertIn("Delete: tunctl -d device-name [-f tun-clone-device]", \
result.output)
+
class OEListPackageconfigTests(OEScriptTests):
#oe-core.scripts.List_all_the_PACKAGECONFIG's_flags
def check_endlines(self, results, expected_endlines):
@@ -140,8 +145,8 @@ class OEListPackageconfigTests(OEScriptTests):
if expected_endlines:
self.fail('Missing expected listings:\n %s' % '\n \
'.join(expected_endlines))
-
#oe-core.scripts.List_all_the_PACKAGECONFIG's_flags
+
def test_packageconfig_flags_help(self):
runCmd('%s/contrib/list-packageconfig-flags.py -h' % self.scripts_dir)
@@ -154,7 +159,6 @@ class OEListPackageconfigTests(OEScriptTests):
self.check_endlines(results, expected_endlines)
-
def test_packageconfig_flags_option_flags(self):
results = runCmd('%s/contrib/list-packageconfig-flags.py -f' % \
self.scripts_dir) expected_endlines = []
diff --git a/meta/lib/oeqa/selftest/cases/package.py \
b/meta/lib/oeqa/selftest/cases/package.py index eb39136b43..6770dcaea1 100644
--- a/meta/lib/oeqa/selftest/cases/package.py
+++ b/meta/lib/oeqa/selftest/cases/package.py
@@ -10,6 +10,7 @@ import os
import oe.path
import re
+
class VersionOrdering(OESelftestTestCase):
# version1, version2, sort order
tests = (
@@ -88,6 +89,7 @@ class VersionOrdering(OESelftestTestCase):
self.assertIn(status, (99, 100, 101))
self.assertEqual(status - 100, sort, "%s %s (%d) failed" % (ver1, ver2, \
sort))
+
class PackageTests(OESelftestTestCase):
# Verify that a recipe which sets up hardlink files has those preserved into \
split packages # Also test file sparseness is preserved
@@ -159,6 +161,7 @@ class PackageTests(OESelftestTestCase):
bitbake("core-image-minimal")
sysconfdir = get_bb_var('sysconfdir', 'selftest-chown')
+
def check_ownership(qemu, gid, uid, path):
self.logger.info("Check ownership of %s", path)
status, output = qemu.run_serial(r'/bin/stat -c "%U %G" ' + path, \
timeout=60)
diff --git a/meta/lib/oeqa/selftest/cases/pkgdata.py \
b/meta/lib/oeqa/selftest/cases/pkgdata.py index fb8b412848..c1a12cb438 100644
--- a/meta/lib/oeqa/selftest/cases/pkgdata.py
+++ b/meta/lib/oeqa/selftest/cases/pkgdata.py
@@ -9,6 +9,7 @@ import fnmatch
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
+
class OePkgdataUtilTests(OESelftestTestCase):
@classmethod
diff --git a/meta/lib/oeqa/selftest/cases/prservice.py \
b/meta/lib/oeqa/selftest/cases/prservice.py index 578b2b4dd9..0b248addda 100644
--- a/meta/lib/oeqa/selftest/cases/prservice.py
+++ b/meta/lib/oeqa/selftest/cases/prservice.py
@@ -12,6 +12,7 @@ from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, bitbake, get_bb_var
from oeqa.utils.network import get_free_port
+
class BitbakePrTests(OESelftestTestCase):
@classmethod
diff --git a/meta/lib/oeqa/selftest/cases/pseudo.py \
b/meta/lib/oeqa/selftest/cases/pseudo.py index 33593d5ce9..6b705d6261 100644
--- a/meta/lib/oeqa/selftest/cases/pseudo.py
+++ b/meta/lib/oeqa/selftest/cases/pseudo.py
@@ -8,6 +8,7 @@ import shutil
from oeqa.utils.commands import bitbake, get_test_layer
from oeqa.selftest.case import OESelftestTestCase
+
class Pseudo(OESelftestTestCase):
def test_pseudo_pyc_creation(self):
diff --git a/meta/lib/oeqa/selftest/cases/recipetool.py \
b/meta/lib/oeqa/selftest/cases/recipetool.py index 9d56e9e1e3..679a3b61dc 100644
--- a/meta/lib/oeqa/selftest/cases/recipetool.py
+++ b/meta/lib/oeqa/selftest/cases/recipetool.py
@@ -13,6 +13,7 @@ from oeqa.selftest.cases import devtool
templayerdir = None
+
def setUpModule():
global templayerdir
templayerdir = tempfile.mkdtemp(prefix='recipetoolqa')
@@ -652,8 +653,6 @@ class RecipetoolAppendsrcBase(RecipetoolBase):
self.assertIn(filesdir, filesextrapaths)
-
-
class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
def test_recipetool_appendsrcfile_basic(self):
diff --git a/meta/lib/oeqa/selftest/cases/recipeutils.py \
b/meta/lib/oeqa/selftest/cases/recipeutils.py index 747870383b..4883d15b51 100644
--- a/meta/lib/oeqa/selftest/cases/recipeutils.py
+++ b/meta/lib/oeqa/selftest/cases/recipeutils.py
@@ -61,7 +61,6 @@ class RecipeUtilsTests(OESelftestTestCase):
self.maxDiff = None
self.assertEqual(''.join(patchlines).strip(), expected_patch.strip())
-
def test_patch_recipe_singleappend(self):
import oe.recipeutils
rd = tinfoil.parse_recipe('recipeutils-test')
@@ -88,7 +87,6 @@ class RecipeUtilsTests(OESelftestTestCase):
patchlines.append(line)
self.assertEqual(''.join(patchlines).strip(), expected_patch.strip())
-
def test_patch_recipe_appends(self):
import oe.recipeutils
rd = tinfoil.parse_recipe('recipeutils-test')
@@ -113,7 +111,6 @@ class RecipeUtilsTests(OESelftestTestCase):
patchlines.append(line)
self.assertEqual(''.join(patchlines).strip(), expected_patch.strip())
-
def test_validate_pn(self):
import oe.recipeutils
expected_results = {
diff --git a/meta/lib/oeqa/selftest/cases/reproducible.py \
b/meta/lib/oeqa/selftest/cases/reproducible.py index a62757399b..d2053b1473 100644
--- a/meta/lib/oeqa/selftest/cases/reproducible.py
+++ b/meta/lib/oeqa/selftest/cases/reproducible.py
@@ -36,6 +36,7 @@ exclude_packages = [
'ruby-ri-docs'
]
+
def is_excluded(package):
package_name = os.path.basename(package)
for i in exclude_packages:
@@ -43,10 +44,12 @@ def is_excluded(package):
return i
return None
+
MISSING = 'MISSING'
DIFFERENT = 'DIFFERENT'
SAME = 'SAME'
+
@functools.total_ordering
class CompareResult(object):
def __init__(self):
@@ -60,6 +63,7 @@ class CompareResult(object):
def __lt__(self, other):
return (self.status, self.test) < (other.status, other.test)
+
class PackageCompareResults(object):
def __init__(self):
self.total = []
@@ -96,6 +100,7 @@ class PackageCompareResults(object):
def unused_exclusions(self):
return sorted(set(exclude_packages) - self.active_exclusions)
+
def compare_file(reference, test, diffutils_sysroot):
result = CompareResult()
result.reference = reference
@@ -114,10 +119,12 @@ def compare_file(reference, test, diffutils_sysroot):
result.status = SAME
return result
+
def run_diffoscope(a_dir, b_dir, html_dir, **kwargs):
return runCmd(['diffoscope', '--no-default-limits', \
'--exclude-directory-metadata', 'yes', '--html-dir', html_dir, a_dir, \
b_dir],
**kwargs)
+
class DiffoscopeTests(OESelftestTestCase):
diffoscope_test_files = os.path.join(os.path.dirname(os.path.abspath(__file__)), \
"diffoscope")
@@ -140,6 +147,7 @@ class DiffoscopeTests(OESelftestTestCase):
self.assertNotEqual(r.status, 0, msg="diffoscope was successful when an \
error was expected")
self.assertTrue(os.path.exists(os.path.join(tmpdir, 'index.html')), \
"HTML index not found!")
+
class ReproducibleTests(OESelftestTestCase):
# Test the reproducibility of whatever is built between sstate_targets and \
targets
diff --git a/meta/lib/oeqa/selftest/cases/resulttooltests.py \
b/meta/lib/oeqa/selftest/cases/resulttooltests.py index dac5c46801..aa3b87c031 100644
--- a/meta/lib/oeqa/selftest/cases/resulttooltests.py
+++ b/meta/lib/oeqa/selftest/cases/resulttooltests.py
@@ -12,6 +12,7 @@ from resulttool import regression as regression
from resulttool import resultutils as resultutils
from oeqa.selftest.case import OESelftestTestCase
+
class ResultToolTests(OESelftestTestCase):
base_results_data = {'base_result1': {'configuration': {"TEST_TYPE": "runtime",
"TESTSERIES": "series1",
diff --git a/meta/lib/oeqa/selftest/cases/runcmd.py \
b/meta/lib/oeqa/selftest/cases/runcmd.py index fa6113d7fa..bef723c588 100644
--- a/meta/lib/oeqa/selftest/cases/runcmd.py
+++ b/meta/lib/oeqa/selftest/cases/runcmd.py
@@ -11,6 +11,7 @@ import threading
import time
import signal
+
class MemLogger(object):
def __init__(self):
self.info_msgs = []
@@ -22,6 +23,7 @@ class MemLogger(object):
def error(self, msg):
self.error_msgs.append(msg)
+
class RunCmdTests(OESelftestTestCase):
""" Basic tests for runCmd() utility function """
diff --git a/meta/lib/oeqa/selftest/cases/runqemu.py \
b/meta/lib/oeqa/selftest/cases/runqemu.py index b7656296f2..0b2ed88a1a 100644
--- a/meta/lib/oeqa/selftest/cases/runqemu.py
+++ b/meta/lib/oeqa/selftest/cases/runqemu.py
@@ -12,6 +12,7 @@ from oeqa.core.decorator import OETestTag
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, runqemu, get_bb_var, runCmd
+
class RunqemuTests(OESelftestTestCase):
"""Runqemu test class"""
@@ -72,7 +73,6 @@ SYSLINUX_TIMEOUT = "10"
with open(qemu.qemurunnerlog) as f:
self.assertTrue(qemu.runner.logged, "Failed: %s, %s" % (cmd, \
f.read()))
-
def test_boot_recipe_image_vmdk(self):
"""Test runqemu recipe-image vmdk"""
cmd = "%s %s wic.vmdk" % (self.cmd_common, self.recipe)
@@ -94,7 +94,6 @@ SYSLINUX_TIMEOUT = "10"
with open(qemu.qemurunnerlog) as f:
self.assertTrue(qemu.runner.logged, "Failed: %s, %s" % (cmd, \
f.read()))
-
def test_boot_deploy_hddimg(self):
"""Test runqemu deploy_dir_image hddimg"""
cmd = "%s %s hddimg" % (self.cmd_common, self.deploy_dir_image)
diff --git a/meta/lib/oeqa/selftest/cases/runtime_test.py \
b/meta/lib/oeqa/selftest/cases/runtime_test.py index 02eaf213cb..95c37e2ec9 100644
--- a/meta/lib/oeqa/selftest/cases/runtime_test.py
+++ b/meta/lib/oeqa/selftest/cases/runtime_test.py
@@ -12,6 +12,7 @@ import shutil
import oe.lsb
from oeqa.core.decorator.data import skipIfNotQemu
+
class TestExport(OESelftestTestCase):
def test_testexport_basic(self):
@@ -235,6 +236,7 @@ class TestImage(OESelftestTestCase):
bitbake('core-image-minimal')
bitbake('-c testimage core-image-minimal')
+
class Postinst(OESelftestTestCase):
def init_manager_loop(self, init_manager):
@@ -273,8 +275,6 @@ class Postinst(OESelftestTestCase):
status, output = qemu.run_serial("test -f %s && echo found" \
% os.path.join(targettestdir, filename))
self.assertIn("found", output, "%s was not present on boot" \
% filename)
-
-
@skipIfNotQemu('qemuall', 'Test only runs in qemu')
def test_postinst_rootfs_and_boot_sysvinit(self):
"""
@@ -295,7 +295,6 @@ class Postinst(OESelftestTestCase):
"""
self.init_manager_loop("sysvinit")
-
@skipIfNotQemu('qemuall', 'Test only runs in qemu')
def test_postinst_rootfs_and_boot_systemd(self):
"""
@@ -317,7 +316,6 @@ class Postinst(OESelftestTestCase):
self.init_manager_loop("systemd")
-
def test_failing_postinst(self):
"""
Summary: The purpose of this test case is to verify that \
post-installation @@ -352,6 +350,7 @@ class Postinst(OESelftestTestCase):
self.assertFalse(os.path.isfile(os.path.join(hosttestdir, \
"rootfs-after-failure")),
"rootfs-after-failure file was created")
+
class SystemTap(OESelftestTestCase):
"""
Summary: The purpose of this test case is to verify native crosstap
diff --git a/meta/lib/oeqa/selftest/cases/selftest.py \
b/meta/lib/oeqa/selftest/cases/selftest.py index af080dcf03..a5d9a06d36 100644
--- a/meta/lib/oeqa/selftest/cases/selftest.py
+++ b/meta/lib/oeqa/selftest/cases/selftest.py
@@ -7,6 +7,7 @@ from oeqa.utils.commands import runCmd
import oeqa.selftest
from oeqa.selftest.case import OESelftestTestCase
+
class ExternalLayer(OESelftestTestCase):
def test_list_imported(self):
@@ -33,6 +34,7 @@ class ExternalLayer(OESelftestTestCase):
found_method = search_method(test_module, method_name)
self.assertTrue(method_name, msg="Can't find %s method" % method_name)
+
def search_test_file(file_name):
for layer_path in oeqa.selftest.__path__:
for _, _, files in os.walk(layer_path):
@@ -41,6 +43,7 @@ def search_test_file(file_name):
return True
return False
+
def search_method(module, method):
modlib = importlib.import_module(module)
for var in vars(modlib):
diff --git a/meta/lib/oeqa/selftest/cases/signing.py \
b/meta/lib/oeqa/selftest/cases/signing.py index a28c7eb19a..865a71e93e 100644
--- a/meta/lib/oeqa/selftest/cases/signing.py
+++ b/meta/lib/oeqa/selftest/cases/signing.py
@@ -34,7 +34,6 @@ class Signing(OESelftestTestCase):
runCmd('gpg --agent-program=`which gpg-agent`\|--auto-expand-secmem --batch \
--homedir %s --import %s %s' % (self.gpg_dir, self.pub_key_path, \
self.secret_key_path), native_sysroot=nsysroot) return nsysroot + \
get_bb_var("bindir_native")
-
@contextmanager
def create_new_builddir(self, builddir, newbuilddir):
bb.utils.mkdirhier(newbuilddir)
@@ -120,7 +119,6 @@ class Signing(OESelftestTestCase):
bitbake('-c clean core-image-minimal')
bitbake('core-image-minimal')
-
def test_signing_sstate_archive(self):
"""
Summary: Test that sstate archives can be signed
diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py \
b/meta/lib/oeqa/selftest/cases/sstatetests.py index c3846f6771..175ce6a26d 100644
--- a/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -14,6 +14,7 @@ from oeqa.selftest.cases.sstate import SStateBase
import bb.siggen
+
class SStateTests(SStateBase):
def test_autorev_sstate_works(self):
# Test that a git repository which changes is correctly handled by SRCREV = \
${AUTOREV} @@ -53,8 +54,8 @@ class SStateTests(SStateBase):
result = runCmd('git add bar.txt; git commit -asm "add bar"', cwd=srcdir)
bitbake("dbus-wait-test -c unpack")
-
# Test sstate files creation and their location
+
def run_test_sstate_creation(self, targets, distro_specific=True, \
distro_nonspecific=True, temp_sstate_location=True, should_pass=True): \
self.config_sstate(temp_sstate_location, [self.sstate_path])
@@ -121,8 +122,8 @@ class SStateTests(SStateBase):
targets.append('linux-libc-headers')
self.run_test_cleansstate_task(targets, distro_specific=True, \
distro_nonspecific=False, temp_sstate_location=True)
-
# Test rebuilding of distro-specific sstate files
+
def run_test_rebuild_distro_specific_sstate(self, targets, \
temp_sstate_location=True): self.config_sstate(temp_sstate_location, \
[self.sstate_path])
@@ -163,9 +164,9 @@ class SStateTests(SStateBase):
def test_rebuild_distro_specific_sstate_native_target(self):
self.run_test_rebuild_distro_specific_sstate(['binutils-native'], \
temp_sstate_location=True)
-
# Test the sstate-cache-management script. Each element in the global_config \
list is used with the corresponding element in the target_config list # \
global_config elements are expected to not generate any sstate files that would be \
removed by sstate-cache-management.sh (such as changing the value of MACHINE) +
def run_test_sstate_cache_management_script(self, target, global_config=[''], \
target_config=[''], ignore_patterns=[]): self.assertTrue(global_config)
self.assertTrue(target_config)
@@ -291,7 +292,6 @@ BB_SIGNATURE_HANDLER = "OEBasicHash"
self.maxDiff = None
self.assertCountEqual(files1, files2)
-
def test_sstate_nativelsbstring_same_hash(self):
"""
The sstate checksums should be independent of whichever NATIVELSBSTRING is
@@ -448,7 +448,6 @@ BB_SIGNATURE_HANDLER = "OEBasicHash"
self.maxDiff = None
self.assertCountEqual(files1, files2)
-
def test_sstate_multilib_or_not_native_samesigs(self):
"""The sstate checksums of two native recipes (and their dependencies)
where the target is using multilib in one but not the other
@@ -488,7 +487,6 @@ BB_SIGNATURE_HANDLER = "OEBasicHash"
self.maxDiff = None
self.assertCountEqual(files1, files2)
-
def test_sstate_noop_samesigs(self):
"""
The sstate checksums of two builds with these variables changed or
diff --git a/meta/lib/oeqa/selftest/cases/sysroot.py \
b/meta/lib/oeqa/selftest/cases/sysroot.py index c884488025..937bc49af6 100644
--- a/meta/lib/oeqa/selftest/cases/sysroot.py
+++ b/meta/lib/oeqa/selftest/cases/sysroot.py
@@ -7,6 +7,7 @@ import uuid
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake
+
class SysrootTests(OESelftestTestCase):
def test_sysroot_cleanup(self):
"""
diff --git a/meta/lib/oeqa/selftest/cases/tinfoil.py \
b/meta/lib/oeqa/selftest/cases/tinfoil.py index a51c6048d3..01c2ffe5ee 100644
--- a/meta/lib/oeqa/selftest/cases/tinfoil.py
+++ b/meta/lib/oeqa/selftest/cases/tinfoil.py
@@ -11,6 +11,7 @@ import bb.tinfoil
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd
+
class TinfoilTests(OESelftestTestCase):
""" Basic tests for the tinfoil API """
diff --git a/meta/lib/oeqa/selftest/cases/wic.py \
b/meta/lib/oeqa/selftest/cases/wic.py index e2b2d28b25..36ab91c4f2 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -44,6 +44,7 @@ def only_for_arch(archs, image='core-image-minimal'):
return wrapped_f
return wrapper
+
def extract_files(debugfs_output):
"""
extract file names from the output of debugfs -R 'ls -p',
@@ -62,6 +63,7 @@ def extract_files(debugfs_output):
return [line.split('/')[5].strip() for line in
debugfs_output.strip().split('/\n')]
+
def files_own_by_root(debugfs_output):
for line in debugfs_output.strip().split('/\n'):
if line.split('/')[3:5] != ['0', '0']:
@@ -69,6 +71,7 @@ def files_own_by_root(debugfs_output):
return False
return True
+
class WicTestCase(OESelftestTestCase):
"""Wic test class."""
@@ -110,6 +113,7 @@ class WicTestCase(OESelftestTestCase):
WicTestCase.wicenv_cache[image] = os.path.join(stdir, machine, \
'imgdata') return WicTestCase.wicenv_cache[image]
+
class Wic(WicTestCase):
def test_version(self):
@@ -685,6 +689,7 @@ part /etc --source rootfs --fstype=ext4 --change-directory=etc
% (wks_file, self.resultdir), \
ignore_status=True).status) os.remove(wks_file)
+
class Wic2(WicTestCase):
def test_bmap_short(self):
@@ -1220,7 +1225,6 @@ class Wic2(WicTestCase):
os.path.basename(testfile.name), dest, sysroot))
self.assertTrue(os.path.exists(dest))
-
def test_wic_rm(self):
"""Test removing files and directories from the the wic image."""
runCmd("wic create mkefidisk "
@@ -1369,7 +1373,6 @@ class Wic2(WicTestCase):
runCmd("wic cp %s:2/etc/fstab %s -n %s" % (images[0], testfile.name, \
sysroot)) self.assertTrue(os.stat(testfile.name).st_size > 0)
-
def test_wic_rm_ext(self):
"""Test removing files from the ext partition."""
runCmd("wic create mkefidisk "
diff --git a/meta/lib/oeqa/selftest/context.py b/meta/lib/oeqa/selftest/context.py
index 21c5004ad7..e4d3d88b54 100644
--- a/meta/lib/oeqa/selftest/context.py
+++ b/meta/lib/oeqa/selftest/context.py
@@ -22,6 +22,7 @@ from oeqa.core.exception import OEQAPreRun, OEQATestNotFound
from oeqa.utils.commands import runCmd, get_bb_vars, get_test_layer
+
class NonConcurrentTestSuite(unittest.TestSuite):
def __init__(self, suite, processes, setupfunc, removefunc):
super().__init__([suite])
@@ -37,6 +38,7 @@ class NonConcurrentTestSuite(unittest.TestSuite):
if newbuilddir and ret.wasSuccessful() and self.removefunc:
self.removefunc(newbuilddir)
+
def removebuilddir(d):
delay = 5
while delay and os.path.exists(d + "/bitbake.lock"):
@@ -53,6 +55,7 @@ def removebuilddir(d):
pass
bb.utils.prunedir(d, ionice=True)
+
class OESelftestTestContext(OETestContext):
def __init__(self, td=None, logger=None, machines=None, config_paths=None, \
newbuilddir=None, keep_builddir=None): super(OESelftestTestContext, \
self).__init__(td, logger) @@ -140,6 +143,7 @@ class \
OESelftestTestContext(OETestContext): def listTests(self, display_type, \
machine=None): return super(OESelftestTestContext, self).listTests(display_type)
+
class OESelftestTestContextExecutor(OETestContextExecutor):
_context_class = OESelftestTestContext
_script_executor = 'oe-selftest'
@@ -409,4 +413,5 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
return rc
+
_executor_class = OESelftestTestContextExecutor
diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py
index 49c9f5ad92..ab0dd3fac3 100644
--- a/meta/lib/oeqa/targetcontrol.py
+++ b/meta/lib/oeqa/targetcontrol.py
@@ -21,6 +21,7 @@ from oeqa.utils.dump import MonitorDumper
from oeqa.controllers.testtargetloader import TestTargetLoader
from abc import ABCMeta, abstractmethod
+
class BaseTarget(object, metaclass=ABCMeta):
supported_image_fstypes = []
@@ -87,7 +88,6 @@ class BaseTarget(object, metaclass=ABCMeta):
return self.connection.copy_from(remotepath, localpath)
-
class QemuTarget(BaseTarget):
supported_image_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic']
diff --git a/meta/lib/oeqa/utils/__init__.py b/meta/lib/oeqa/utils/__init__.py
index fb81c136f0..40af6e73f8 100644
--- a/meta/lib/oeqa/utils/__init__.py
+++ b/meta/lib/oeqa/utils/__init__.py
@@ -7,14 +7,17 @@ __path__ = extend_path(__path__, __name__)
# Borrowed from CalledProcessError
+
class CommandError(Exception):
def __init__(self, retcode, cmd, output=None):
self.retcode = retcode
self.cmd = cmd
self.output = output
+
def __str__(self):
return "Command '%s' returned non-zero exit status %d with output: %s" % \
(self.cmd, self.retcode, self.output)
+
def avoid_paths_in_environ(paths):
"""
Searches for every path in os.environ['PATH']
@@ -39,6 +42,7 @@ def avoid_paths_in_environ(paths):
new_path = new_path[:-1]
return new_path
+
def make_logger_bitbake_compatible(logger):
import logging
@@ -53,6 +57,7 @@ def make_logger_bitbake_compatible(logger):
return logger
+
def load_test_components(logger, executor):
import sys
import os
diff --git a/meta/lib/oeqa/utils/buildproject.py \
b/meta/lib/oeqa/utils/buildproject.py index e6d80cc8dc..1bea6057b9 100644
--- a/meta/lib/oeqa/utils/buildproject.py
+++ b/meta/lib/oeqa/utils/buildproject.py
@@ -14,6 +14,7 @@ import tempfile
from abc import ABCMeta, abstractmethod
+
class BuildProject(metaclass=ABCMeta):
def __init__(self, uri, foldername=None, tmpdir=None, dl_dir=None):
self.uri = uri
diff --git a/meta/lib/oeqa/utils/commands.py b/meta/lib/oeqa/utils/commands.py
index 3f297967ab..1b13c5df22 100644
--- a/meta/lib/oeqa/utils/commands.py
+++ b/meta/lib/oeqa/utils/commands.py
@@ -9,7 +9,6 @@
# It provides a class and methods for running commands on the host in a convienent \
way for tests.
-
import os
import sys
import signal
@@ -27,6 +26,7 @@ try:
except ImportError:
pass
+
class Command(object):
def __init__(self, command, bg=False, timeout=None, data=None, output_log=None, \
**options):
@@ -238,6 +238,7 @@ def get_bb_env(target=None, postconfig=None):
else:
return bitbake("-e", postconfig=postconfig).output
+
def get_bb_vars(variables=None, target=None, postconfig=None):
"""Get values of multiple bitbake variables"""
bbenv = get_bb_env(target, postconfig=postconfig)
@@ -277,9 +278,11 @@ def get_bb_vars(variables=None, target=None, postconfig=None):
values[var] = None
return values
+
def get_bb_var(var, target=None, postconfig=None):
return get_bb_vars([var], target, postconfig)[var]
+
def get_test_layer():
layers = get_bb_var("BBLAYERS").split()
testlayer = None
@@ -291,6 +294,7 @@ def get_test_layer():
break
return testlayer
+
def create_temp_layer(templayerdir, templayername, priority=999, \
recipepathspec='recipes-*/*'): os.makedirs(os.path.join(templayerdir, 'conf'))
with open(os.path.join(templayerdir, 'conf', 'layer.conf'), 'w') as f:
@@ -303,6 +307,7 @@ def create_temp_layer(templayerdir, templayername, priority=999, \
recipepathspec= f.write('BBFILE_PATTERN_IGNORE_EMPTY_%s = "1"\n' % templayername)
f.write('LAYERSERIES_COMPAT_%s = "${LAYERSERIES_COMPAT_core}"\n' % \
templayername)
+
@contextlib.contextmanager
def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, \
qemuparams=None, overrides={}, discard_writes=True): """
@@ -361,6 +366,7 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, \
launch_cmd=None, targetlogger.removeHandler(handler)
qemu.stop()
+
def updateEnv(env_file):
"""
Source a file and update environment.
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py
index 752e4e6208..498b41dced 100644
--- a/meta/lib/oeqa/utils/decorators.py
+++ b/meta/lib/oeqa/utils/decorators.py
@@ -17,6 +17,8 @@ import signal
from functools import wraps
#get the "result" object from one of the upper frames provided that one of these \
upper frames is a unittest.case frame +
+
class getResults(object):
def __init__(self):
#dynamically determine the unittest.case frame and use it to get the name of \
the test method @@ -53,6 +55,7 @@ class getResults(object):
def getSkipList(self):
return self.skiplist
+
class skipIfFailure(object):
def __init__(self, testcase):
@@ -68,6 +71,7 @@ class skipIfFailure(object):
wrapped_f.__name__ = f.__name__
return wrapped_f
+
class skipIfSkipped(object):
def __init__(self, testcase):
@@ -83,6 +87,7 @@ class skipIfSkipped(object):
wrapped_f.__name__ = f.__name__
return wrapped_f
+
class skipUnlessPassed(object):
def __init__(self, testcase):
@@ -101,6 +106,7 @@ class skipUnlessPassed(object):
wrapped_f._depends_on = self.testcase
return wrapped_f
+
class testcase(object):
def __init__(self, test_case):
self.test_case = test_case
@@ -113,12 +119,15 @@ class testcase(object):
wrapped_f.__name__ = func.__name__
return wrapped_f
+
class NoParsingFilter(logging.Filter):
def filter(self, record):
return record.levelno == 100
+
import inspect
+
def LogResults(original_class):
orig_method = original_class.run
@@ -215,15 +224,18 @@ def LogResults(original_class):
return original_class
+
class TimeOut(BaseException):
pass
+
def timeout(seconds):
def decorator(fn):
if hasattr(signal, 'alarm'):
@wraps(fn)
def wrapped_f(*args, **kw):
current_frame = sys._getframe()
+
def raiseTimeOut(signal, frame):
if frame is not current_frame:
raise TimeOut('%s seconds' % seconds)
@@ -239,7 +251,10 @@ def timeout(seconds):
return fn
return decorator
+
__tag_prefix = "tag__"
+
+
def tag(*args, **kwargs):
"""Decorator that adds attributes to classes or functions
for use with the Attribute (-a) plugin.
@@ -252,6 +267,7 @@ def tag(*args, **kwargs):
return ob
return wrap_ob
+
def gettag(obj, key, default=None):
key = __tag_prefix + key
if not isinstance(obj, unittest.TestCase):
@@ -260,6 +276,7 @@ def gettag(obj, key, default=None):
ret = getattr(tc_method, key, getattr(obj, key, default))
return ret
+
def getAllTags(obj):
def __gettags(o):
r = {k[len(__tag_prefix):]: getattr(o, k) for k in dir(o) if \
k.startswith(__tag_prefix)} @@ -271,12 +288,14 @@ def getAllTags(obj):
ret.update(__gettags(tc_method))
return ret
+
def timeout_handler(seconds):
def decorator(fn):
if hasattr(signal, 'alarm'):
@wraps(fn)
def wrapped_f(self, *args, **kw):
current_frame = sys._getframe()
+
def raiseTimeOut(signal, frame):
if frame is not current_frame:
try:
diff --git a/meta/lib/oeqa/utils/dump.py b/meta/lib/oeqa/utils/dump.py
index 843e19fe8a..5d195dd50c 100644
--- a/meta/lib/oeqa/utils/dump.py
+++ b/meta/lib/oeqa/utils/dump.py
@@ -10,6 +10,7 @@ import datetime
import itertools
from .commands import runCmd
+
class BaseDumper(object):
""" Base class to dump commands from host/target """
@@ -68,6 +69,7 @@ class BaseDumper(object):
with open(fullname, 'w') as dump_file:
dump_file.write(output)
+
class HostDumper(BaseDumper):
""" Class to get dumps from the host running the tests """
@@ -84,6 +86,7 @@ class HostDumper(BaseDumper):
result = runCmd(cmd, ignore_status=True, env=env)
self._write_dump(cmd.split()[0], result.output)
+
class TargetDumper(BaseDumper):
""" Class to get dumps from target, it only works with QemuRunner """
@@ -104,6 +107,7 @@ class TargetDumper(BaseDumper):
"serial console failed")
print("Failed CMD: %s" % (cmd))
+
class MonitorDumper(BaseDumper):
""" Class to get dumps via the Qemu Monitor, it only works with QemuRunner """
diff --git a/meta/lib/oeqa/utils/ftools.py b/meta/lib/oeqa/utils/ftools.py
index 3093419cc7..d5f9ce2f59 100644
--- a/meta/lib/oeqa/utils/ftools.py
+++ b/meta/lib/oeqa/utils/ftools.py
@@ -6,6 +6,7 @@ import os
import re
import errno
+
def write_file(path, data):
# In case data is None, return immediately
if data is None:
@@ -14,6 +15,7 @@ def write_file(path, data):
with open(path, "w") as f:
f.write(wdata)
+
def append_file(path, data):
# In case data is None, return immediately
if data is None:
@@ -22,12 +24,14 @@ def append_file(path, data):
with open(path, "a") as f:
f.write(wdata)
+
def read_file(path):
data = None
with open(path) as f:
data = f.read()
return data
+
def remove_from_file(path, data):
# In case data is None, return immediately
if data is None:
diff --git a/meta/lib/oeqa/utils/git.py b/meta/lib/oeqa/utils/git.py
index ea35a766eb..b3d96d1562 100644
--- a/meta/lib/oeqa/utils/git.py
+++ b/meta/lib/oeqa/utils/git.py
@@ -13,8 +13,10 @@ class GitError(Exception):
"""Git error handling"""
pass
+
class GitRepo(object):
"""Class representing a Git repository clone"""
+
def __init__(self, path, is_topdir=False):
git_dir = self._run_git_cmd_at(['rev-parse', '--git-dir'], path)
git_dir = git_dir if os.path.isabs(git_dir) else os.path.join(path, git_dir)
diff --git a/meta/lib/oeqa/utils/gitarchive.py b/meta/lib/oeqa/utils/gitarchive.py
index 271f42770c..13713d9eca 100644
--- a/meta/lib/oeqa/utils/gitarchive.py
+++ b/meta/lib/oeqa/utils/gitarchive.py
@@ -14,9 +14,11 @@ from operator import attrgetter
from collections import namedtuple
from oeqa.utils.git import GitRepo, GitError
+
class ArchiveError(Exception):
"""Internal error handling of this script"""
+
def format_str(string, fields):
"""Format string using the given fields (dict)"""
try:
@@ -127,6 +129,7 @@ def expand_tag_strings(repo, name_pattern, msg_subj_pattern, \
msg_body_pattern, msg_body = format_str(msg_body_pattern, keyws)
return tag_name, msg_subj + '\n\n' + msg_body
+
def gitarchive(data_dir, git_dir, no_create, bare, commit_msg_subject, \
commit_msg_body, branch_name, no_tag, tagname, tag_msg_subject, tag_msg_body, \
exclude, notes, push, keywords, log):
if not os.path.isdir(data_dir):
@@ -166,9 +169,11 @@ def gitarchive(data_dir, git_dir, no_create, bare, \
commit_msg_subject, commit_ms log.info("Pushing data to remote")
data_repo.run_cmd(cmd)
+
# Container class for tester revisions
TestedRev = namedtuple('TestedRev', 'commit commit_number tags')
+
def get_test_runs(log, repo, tag_name, **kwargs):
"""Get a sorted list of test runs, matching given pattern"""
# First, get field names from the tag name pattern
@@ -205,6 +210,7 @@ def get_test_runs(log, repo, tag_name, **kwargs):
# Return field names and a sorted list of revs
return undef_fields, sorted(revs)
+
def get_test_revs(log, repo, tag_name, **kwargs):
"""Get list of all tested revisions"""
fields, runs = get_test_runs(log, repo, tag_name, **kwargs)
@@ -228,6 +234,7 @@ def get_test_revs(log, repo, tag_name, **kwargs):
"\n ".join(['{} ({})'.format(rev.commit_number, rev.commit) for rev \
in revs])) return revs
+
def rev_find(revs, attr, val):
"""Search from a list of TestedRev"""
for i, rev in enumerate(revs):
diff --git a/meta/lib/oeqa/utils/httpserver.py b/meta/lib/oeqa/utils/httpserver.py
index 58d3c3b3f8..3bdccbf2ed 100644
--- a/meta/lib/oeqa/utils/httpserver.py
+++ b/meta/lib/oeqa/utils/httpserver.py
@@ -9,17 +9,20 @@ import traceback
import signal
from socketserver import ThreadingMixIn
+
class HTTPServer(ThreadingMixIn, http.server.HTTPServer):
def server_start(self, root_dir, logger):
os.chdir(root_dir)
self.serve_forever()
+
class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def log_message(self, format_str, *args):
pass
+
class HTTPService(object):
def __init__(self, root_dir, host='', port=0, logger=None):
@@ -49,7 +52,6 @@ class HTTPService(object):
if self.logger:
self.logger.info("Started HTTPService on %s:%s" % (self.host, \
self.port))
-
def stop(self):
if hasattr(self, "server"):
self.server.server_close()
diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py
index 6da2f6945a..7e78ef74c0 100644
--- a/meta/lib/oeqa/utils/logparser.py
+++ b/meta/lib/oeqa/utils/logparser.py
@@ -7,6 +7,8 @@ import os
import re
# A parser that can be used to identify weather a line is a test result or a section \
statement. +
+
class PtestParser(object):
def __init__(self):
self.results = {}
diff --git a/meta/lib/oeqa/utils/metadata.py b/meta/lib/oeqa/utils/metadata.py
index 8013aa684d..32f85410fe 100644
--- a/meta/lib/oeqa/utils/metadata.py
+++ b/meta/lib/oeqa/utils/metadata.py
@@ -47,6 +47,7 @@ def metadata_from_bb():
info_dict['config'][var] = data_dict[var]
return info_dict
+
def metadata_from_data_store(d):
""" Returns test's metadata as OrderedDict.
@@ -56,6 +57,7 @@ def metadata_from_data_store(d):
# be useful when running within bitbake.
pass
+
def git_rev_info(path):
"""Get git revision information as a dict"""
info = OrderedDict()
@@ -89,6 +91,7 @@ def git_rev_info(path):
info['branch'] = '(nobranch)'
return info
+
def get_layers(layers):
"""Returns layer information in dict format"""
layer_dict = OrderedDict()
@@ -97,6 +100,7 @@ def get_layers(layers):
layer_dict[layer_name] = git_rev_info(layer)
return layer_dict
+
def write_metadata_file(file_path, metadata):
""" Writes metadata to a XML file in directory. """
@@ -105,6 +109,7 @@ def write_metadata_file(file_path, metadata):
with open(file_path, 'w') as f:
f.write(xml_doc.toprettyxml())
+
def dict_to_XML(tag, dictionary, **kwargs):
""" Return XML element converting dicts recursively. """
diff --git a/meta/lib/oeqa/utils/network.py b/meta/lib/oeqa/utils/network.py
index 0436d27582..5bf2c68c18 100644
--- a/meta/lib/oeqa/utils/network.py
+++ b/meta/lib/oeqa/utils/network.py
@@ -4,6 +4,7 @@
import socket
+
def get_free_port(udp=False):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM if not udp else \
socket.SOCK_DGRAM) s.bind(('', 0))
diff --git a/meta/lib/oeqa/utils/nfs.py b/meta/lib/oeqa/utils/nfs.py
index 1dd65588bb..745168985f 100644
--- a/meta/lib/oeqa/utils/nfs.py
+++ b/meta/lib/oeqa/utils/nfs.py
@@ -7,6 +7,7 @@ import socket
from oeqa.utils.commands import bitbake, get_bb_var, Command
from oeqa.utils.network import get_free_port
+
@contextlib.contextmanager
def unfs_server(directory, logger=None):
unfs_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "unfs3-native")
diff --git a/meta/lib/oeqa/utils/package_manager.py \
b/meta/lib/oeqa/utils/package_manager.py index e763d93c43..8d5e0682d7 100644
--- a/meta/lib/oeqa/utils/package_manager.py
+++ b/meta/lib/oeqa/utils/package_manager.py
@@ -8,6 +8,7 @@ import shutil
from oeqa.core.utils.test import getCaseFile, getCaseMethod
+
def get_package_manager(d, root_path):
"""
Returns an OE package manager that can install packages in root_path.
@@ -43,6 +44,7 @@ def get_package_manager(d, root_path):
return pm
+
def find_packages_to_extract(test_suite):
"""
Returns packages to extract required by runtime tests.
@@ -59,6 +61,7 @@ def find_packages_to_extract(test_suite):
return needed_packages
+
def _get_json_file(module_path):
"""
Returns the path of the JSON file for a module, empty if doesn't exitst.
@@ -70,6 +73,7 @@ def _get_json_file(module_path):
else:
return ''
+
def _get_needed_packages(json_file, test=None):
"""
Returns a dict with needed packages based on a JSON file.
@@ -91,6 +95,7 @@ def _get_needed_packages(json_file, test=None):
return needed_packages
+
def extract_packages(d, needed_packages):
"""
Extract packages that will be needed during runtime.
@@ -133,6 +138,7 @@ def extract_packages(d, needed_packages):
#logger.debug('Copying %s' % pkg)
_copy_package(d, pkg)
+
def _extract_in_tmpdir(d, pkg):
""""
Returns path to a temp directory where the package was
@@ -148,6 +154,7 @@ def _extract_in_tmpdir(d, pkg):
return extract_dir
+
def _copy_package(d, pkg):
"""
Copy the RPM, DEB or IPK package to dst_dir
@@ -163,6 +170,7 @@ def _copy_package(d, pkg):
shutil.copy2(file_path, dst_dir)
shutil.rmtree(pkg_path)
+
def install_package(test_case):
"""
Installs package in DUT if required.
@@ -171,6 +179,7 @@ def install_package(test_case):
if needed_packages:
_install_uninstall_packages(needed_packages, test_case, True)
+
def uninstall_package(test_case):
"""
Uninstalls package in DUT if required.
@@ -179,6 +188,7 @@ def uninstall_package(test_case):
if needed_packages:
_install_uninstall_packages(needed_packages, test_case, False)
+
def test_needs_package(test_case):
"""
Checks if a test case requires to install/uninstall packages.
@@ -194,6 +204,7 @@ def test_needs_package(test_case):
return None
+
def _install_uninstall_packages(needed_packages, test_case, install=True):
"""
Install/Uninstall packages in the DUT without using a package manager
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index 0e4fff2346..59caf5b1fc 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -31,6 +31,7 @@ control_chars = [chr(x) for x in control_range
if chr(x) not in string.printable]
re_control_char = re.compile('[%s]' % re.escape("".join(control_chars)))
+
class QemuRunner:
def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, \
boottime, dump_dir, dump_host_cmds, @@ -125,7 +126,6 @@ class QemuRunner:
fcntl.fcntl(o, fcntl.F_SETFL, fl | os.O_NONBLOCK)
return os.read(o.fileno(), 1000000).decode("utf-8")
-
def handleSIGCHLD(self, signum, frame):
if self.runqemu and self.runqemu.poll():
if self.runqemu.returncode:
@@ -653,7 +653,6 @@ class QemuRunner:
status = 1
return (status, str(data))
-
def _dump_host(self):
self.host_dumper.create_dir("qemu")
self.logger.warning("Qemu ended unexpectedly, dump data from host"
@@ -664,6 +663,8 @@ class QemuRunner:
# to be processed. It's completely event driven and has a straightforward
# event loop. The mechanism for stopping the thread is a simple pipe which
# will wake up the poll and allow for tearing everything down.
+
+
class LoggingThread(threading.Thread):
def __init__(self, logfunc, sock, logger):
self.connection_established = threading.Event()
diff --git a/meta/lib/oeqa/utils/qemutinyrunner.py \
b/meta/lib/oeqa/utils/qemutinyrunner.py index dc4efae9a0..e77fdd24eb 100644
--- a/meta/lib/oeqa/utils/qemutinyrunner.py
+++ b/meta/lib/oeqa/utils/qemutinyrunner.py
@@ -17,6 +17,7 @@ import select
import bb
from .qemurunner import QemuRunner
+
class QemuTinyRunner(QemuRunner):
def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, \
kernel, boottime, logger, tmpfsdir=None): @@ -45,7 +46,6 @@ class \
QemuTinyRunner(QemuRunner): self.kernel = kernel
self.logger = logger
-
def create_socket(self):
tries = 3
while tries > 0:
@@ -87,7 +87,6 @@ class QemuTinyRunner(QemuRunner):
if self.tmpfsdir:
env["RUNQEMU_TMPFS_DIR"] = self.tmpfsdir
-
# Set this flag so that Qemu doesn't do any grabs as SDL grabs interact
# badly with screensavers.
os.environ["QEMU_DONT_GRAB"] = "1"
diff --git a/meta/lib/oeqa/utils/sshcontrol.py b/meta/lib/oeqa/utils/sshcontrol.py
index a1f71a8d38..4c5f883c56 100644
--- a/meta/lib/oeqa/utils/sshcontrol.py
+++ b/meta/lib/oeqa/utils/sshcontrol.py
@@ -97,6 +97,7 @@ class SSHProcess(object):
raise
return (self.status, self.output)
+
class SSHControl(object):
def __init__(self, ip, logfile=None, timeout=300, user='root', port=None):
self.ip = ip
@@ -179,7 +180,6 @@ class SSHControl(object):
src_file = os.path.join(root, f)
self.copy_to(src_file, dst_file)
-
def delete_files(self, remotepath, files):
"""
Delete files in target's remote path.
@@ -194,7 +194,6 @@ class SSHControl(object):
self.run(cmd)
-
def delete_dir(self, remotepath):
"""
Delete remotepath directory in target.
@@ -203,7 +202,6 @@ class SSHControl(object):
cmd = "rmdir %s" % remotepath
self.run(cmd)
-
def delete_dir_structure(self, localpath, remotepath):
"""
Delete recursively localpath structure directory in target's remotepath.
diff --git a/meta/lib/oeqa/utils/subprocesstweak.py \
b/meta/lib/oeqa/utils/subprocesstweak.py index b47975a4bc..c5e20c8e5d 100644
--- a/meta/lib/oeqa/utils/subprocesstweak.py
+++ b/meta/lib/oeqa/utils/subprocesstweak.py
@@ -3,6 +3,7 @@
#
import subprocess
+
class OETestCalledProcessError(subprocess.CalledProcessError):
def __str__(self):
def strify(o):
@@ -18,5 +19,6 @@ class OETestCalledProcessError(subprocess.CalledProcessError):
s = s + "\nStandard Error: " + strify(self.stderr)
return s
+
def errors_have_output():
subprocess.CalledProcessError = OETestCalledProcessError
diff --git a/meta/lib/oeqa/utils/targetbuild.py b/meta/lib/oeqa/utils/targetbuild.py
index 1055810ca3..0ba14ce0d3 100644
--- a/meta/lib/oeqa/utils/targetbuild.py
+++ b/meta/lib/oeqa/utils/targetbuild.py
@@ -13,6 +13,7 @@ import subprocess
import tempfile
from abc import ABCMeta, abstractmethod
+
class BuildProject(metaclass=ABCMeta):
def __init__(self, d, uri, foldername=None, tmpdir=None):
@@ -75,6 +76,7 @@ class BuildProject(metaclass=ABCMeta):
subprocess.check_call('rm -f %s' % self.localarchive, shell=True)
pass
+
class TargetBuildProject(BuildProject):
def __init__(self, target, d, uri, foldername=None):
diff --git a/meta/lib/oeqa/utils/testexport.py b/meta/lib/oeqa/utils/testexport.py
index 141ba2e25a..ae95ecd34a 100644
--- a/meta/lib/oeqa/utils/testexport.py
+++ b/meta/lib/oeqa/utils/testexport.py
@@ -21,12 +21,15 @@ except ImportError:
class my_log():
def __init__(self):
pass
+
def plain(self, msg):
if msg:
print(msg)
+
def warn(self, msg):
if msg:
print("WARNING: " + msg)
+
def fatal(self, msg):
if msg:
print("FATAL:" + msg)
diff --git a/meta/lib/rootfspostcommands.py b/meta/lib/rootfspostcommands.py
index fdb9f5b850..29c611a5d5 100644
--- a/meta/lib/rootfspostcommands.py
+++ b/meta/lib/rootfspostcommands.py
@@ -4,6 +4,7 @@
import os
+
def sort_file(filename, mapping):
"""
Sorts a passwd or group file based on the numeric ID in the third column.
@@ -33,6 +34,7 @@ def sort_file(filename, mapping):
f.write(b''.join(lines))
return new_mapping
+
def remove_backup(filename):
"""
Removes the backup file for files like /etc/passwd.
@@ -41,6 +43,7 @@ def remove_backup(filename):
if os.path.exists(backup_filename):
os.unlink(backup_filename)
+
def sort_passwd(sysconfdir):
"""
Sorts passwd and group files in a rootfs /etc directory by ID.
diff --git a/meta/recipes-core/systemd/systemd-systemctl/systemctl \
b/meta/recipes-core/systemd/systemd-systemctl/systemctl index e8c3d2d1ee..00ccbcd1b8 \
100755
--- a/meta/recipes-core/systemd/systemd-systemctl/systemctl
+++ b/meta/recipes-core/systemd/systemd-systemctl/systemctl
@@ -25,6 +25,7 @@ locations = list()
class SystemdFile():
"""Class representing a single systemd configuration file"""
+
def __init__(self, root, path):
self.sections = dict()
self._parse(root, path)
@@ -95,6 +96,7 @@ class SystemdFile():
class Presets():
"""Class representing all systemd presets"""
+
def __init__(self, scope, root):
self.directives = list()
self._collect_presets(scope, root)
diff --git a/meta/recipes-devtools/meson/meson/meson-setup.py \
b/meta/recipes-devtools/meson/meson/meson-setup.py index 7ac4e3ad47..292c95be9b \
100755
--- a/meta/recipes-devtools/meson/meson/meson-setup.py
+++ b/meta/recipes-devtools/meson/meson/meson-setup.py
@@ -4,9 +4,11 @@ import os
import string
import sys
+
class Template(string.Template):
delimiter = "@"
+
class Environ():
def __getitem__(self, name):
val = os.environ[name]
@@ -19,6 +21,7 @@ class Environ():
val = "'%s'" % val.pop()
return val
+
try:
sysroot = os.environ['OECORE_NATIVE_SYSROOT']
except KeyError:
diff --git a/meta/recipes-devtools/python/python3/create_manifest3.py \
b/meta/recipes-devtools/python/python3/create_manifest3.py index \
9a76e86d47..b936d8406e 100644
--- a/meta/recipes-devtools/python/python3/create_manifest3.py
+++ b/meta/recipes-devtools/python/python3/create_manifest3.py
@@ -70,6 +70,7 @@ wildcards = []
hasfolders = []
allfolders = []
+
def isFolder(value):
value = value.replace('${PYTHON_MAJMIN}', pyversion)
if os.path.isdir(value.replace('${libdir}', nativelibfolder + '/usr/lib')) or \
os.path.isdir(value.replace('${libdir}', nativelibfolder + '/usr/lib64')) or \
os.path.isdir(value.replace('${libdir}', nativelibfolder + '/usr/lib32')): @@ -77,18 \
+78,21 @@ def isFolder(value): else:
return False
+
def isCached(item):
if '__pycache__' in item:
return True
else:
return False
+
def prepend_comments(comments, json_manifest):
with open(json_manifest, 'r+') as manifest:
json_contents = manifest.read()
manifest.seek(0, 0)
manifest.write(comments + json_contents)
+
def print_indent(msg, offset):
for l in msg.splitlines():
msg = ' ' * offset + l
@@ -171,7 +175,6 @@ for filedep in old_manifest['core']['files']:
print_indent('The following dependencies were found for module %s:\n' % \
pymodule, 4) print_indent(output, 6)
-
for pymodule_dep in output.split():
pymodule_dep = pymodule_dep.replace(pyversion, '${PYTHON_MAJMIN}')
@@ -201,7 +204,6 @@ for pypkg in old_manifest:
allfolders.append(filedep)
-
# This is the main loop that will handle each package.
# It works in a similar fashion than the step before, but
# we will now be updating a new dictionary that will eventually
@@ -282,8 +284,6 @@ for pypkg in old_manifest:
else:
pymodule = path
-
-
# We now know that were dealing with a python module, so we can import it
# and check what its dependencies are.
# We launch a separate task for each module for deterministic behavior.
@@ -347,8 +347,6 @@ for pypkg in old_manifest:
if inFolders:
continue
-
-
# No directories beyond this point
# We might already have this module on the dictionary since it could \
depend on a (previously checked) module
if pymodule_dep not in new_manifest[pypkg]['files'] and pymodule_dep not \
in new_manifest[pypkg]['cached']: @@ -370,7 +368,6 @@ for pypkg in old_manifest:
repeated.append(pymodule_dep)
else:
-
# Last step: Figure out if we this belongs to FILES or RDEPENDS
# We check if this module is already contained on another \
package, so we add that one
# as an RDEPENDS, or if its not, it means it should be contained \
on the current
diff --git a/meta/recipes-devtools/python/python3/get_module_deps3.py \
b/meta/recipes-devtools/python/python3/get_module_deps3.py index \
62629c6870..b9cf5068df 100644
--- a/meta/recipes-devtools/python/python3/get_module_deps3.py
+++ b/meta/recipes-devtools/python/python3/get_module_deps3.py
@@ -25,6 +25,7 @@ import importlib
core_deps = set(sys.modules)
+
def fix_path(dep_path):
import os
# We DONT want the path on our HOST system
@@ -140,7 +141,6 @@ for item in dif:
# Prints out result, which is what will be used by create_manifest
print(dep_path)
-
cpython_tag = sys.implementation.cache_tag
cached = ''
# Theres no naive way to find *.pyc files on python3
diff --git a/meta/recipes-rt/rt-tests/files/rt_bmark.py \
b/meta/recipes-rt/rt-tests/files/rt_bmark.py index 0b7dff1712..1980872817 100755
--- a/meta/recipes-rt/rt-tests/files/rt_bmark.py
+++ b/meta/recipes-rt/rt-tests/files/rt_bmark.py
@@ -88,6 +88,7 @@ has_hung_task_detection = True
#-------------------------------------------------------------------------------
+
class TestFail(Exception):
def __init__(self, msg):
self.msg = msg
@@ -97,6 +98,7 @@ class TestFail(Exception):
#-------------------------------------------------------------------------------
+
def tc_name(sub_name):
return "rt_bmark.intlat." + sub_name
@@ -104,6 +106,7 @@ def tc_name(sub_name):
# log() does the same job as print except that a '#' is added at the beginning
# of each line. This causes TEFEL to ignore it
+
def log(*msg):
tmp = "".join(map(str, msg)) # 'map(str, ...' allows numbers
for line in tmp.splitlines():
@@ -112,6 +115,7 @@ def log(*msg):
#-------------------------------------------------------------------------------
# Like log(), but with a timestamp added
+
def log_ts(*msg):
ts = time.localtime()
stamp = "%2d:%02d:%02d: " % (ts.tm_hour, ts.tm_min, ts.tm_sec)
@@ -119,6 +123,7 @@ def log_ts(*msg):
#-------------------------------------------------------------------------------
+
def log_test_header(seq_no, nr_of_tests, name):
log("=" * 78)
log()
@@ -129,6 +134,7 @@ def log_test_header(seq_no, nr_of_tests, name):
#-------------------------------------------------------------------------------
+
def start_stress(*args):
stress_cmd = ["stress-ng"]
added_stress_types = []
@@ -177,6 +183,7 @@ def start_stress(*args):
#-------------------------------------------------------------------------------
+
def end_stress(p):
if p is None:
# The value None indicates that no stress scenario was started
@@ -190,6 +197,7 @@ def end_stress(p):
#-------------------------------------------------------------------------------
+
def us2hms_str(us):
s = (us + 500000) // 1000000 # Round microseconds to s
m = s // 60
@@ -204,6 +212,7 @@ def us2hms_str(us):
# cyclictest (cyclictest starves stress). To avoid that, the supervision
# is temporarily disabled
+
def set_hung_tmo(new_tmo):
global has_hung_task_detection
@@ -229,6 +238,7 @@ def set_hung_tmo(new_tmo):
#-------------------------------------------------------------------------------
+
def gen_minmax_list(max_list):
res = [min(max_list)]
@@ -253,6 +263,7 @@ def gen_minmax_list(max_list):
# -t: (without argument) Set number of threads to the number
# of cpus
+
interval_core_0 = 100 # Timer interval on core 0 [us]
interval_delta = 20 # Interval increment for each core [us]
loop_count = 30000 # Number of loops (on core 0).
@@ -267,6 +278,7 @@ cmd = ("cyclictest",
)
rex = re.compile(b"C:\s*(\d+).*Min:\s*(\d+).*Avg:\s*(\d+).*Max:\s*(\d+)")
+
def run_cyclictest_once():
res = subprocess.check_output(cmd)
@@ -298,12 +310,14 @@ def run_cyclictest_once():
# A precondition for the tracking of min-max values is that
# the suite size os a power of 2.
+
N = 5
suite_size = 2**N
est_exec_time_once = interval_core_0 * loop_count
est_exec_time_suite = suite_size * est_exec_time_once
+
def run_cyclictest_suite():
log("Starting cyclictest")
log(" Command : ", " ".join(cmd))
@@ -353,6 +367,7 @@ def run_cyclictest_suite():
#-------------------------------------------------------------------------------
+
class cyclictest_runner:
def run_test(self, seq_no, nr_of_tests, name, stressparams):
@@ -397,6 +412,7 @@ class cyclictest_runner:
#-------------------------------------------------------------------------------
+
runner = cyclictest_runner()
tests = (("no_stress", []),
diff --git a/scripts/bitbake-whatchanged b/scripts/bitbake-whatchanged
index 8c4486ee62..51d824c033 100755
--- a/scripts/bitbake-whatchanged
+++ b/scripts/bitbake-whatchanged
@@ -41,6 +41,7 @@ import bb.process
stamp_re = re.compile("(?P<pv>.*)-(?P<pr>r\d+)\.(?P<task>do_\w+)\.(?P<hash>[^\.]*)")
sigdata_re = re.compile(".*\.sigdata\..*")
+
def gen_dict(stamps):
"""
Generate the dict from the stamps dir.
@@ -73,6 +74,8 @@ def gen_dict(stamps):
return d
# Re-construct the dict
+
+
def recon_dict(dict_in):
"""
The output dict format is:
@@ -96,6 +99,7 @@ def recon_dict(dict_in):
return dict_out
+
def split_pntask(s):
"""
Split the pn_task in to (pn, task) and return it
@@ -137,6 +141,7 @@ def print_added(d_new=None, d_old=None):
return counter
+
def print_vrchanged(d_new=None, d_old=None, vr=None):
"""
Print the pv or pr changed tasks.
@@ -165,6 +170,7 @@ def print_vrchanged(d_new=None, d_old=None, vr=None):
return counter
+
def print_depchanged(d_new=None, d_old=None, verbose=False):
"""
Print the dependency changes
@@ -316,5 +322,6 @@ Note:
print("Removing the newly generated stamps dir ...")
shutil.rmtree(new_stampsdir)
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/scripts/buildhistory-collect-srcrevs \
b/scripts/buildhistory-collect-srcrevs index 653972a969..c3bf13abbe 100755
--- a/scripts/buildhistory-collect-srcrevs
+++ b/scripts/buildhistory-collect-srcrevs
@@ -14,6 +14,7 @@ import sys
import optparse
import logging
+
def logger_create():
logger = logging.getLogger("buildhistory")
loggerhandler = logging.StreamHandler()
@@ -22,8 +23,10 @@ def logger_create():
logger.setLevel(logging.INFO)
return logger
+
logger = logger_create()
+
def main():
parser = optparse.OptionParser(
description="Collects the recorded SRCREV values from buildhistory and \
reports on them.",
diff --git a/scripts/buildhistory-diff b/scripts/buildhistory-diff
index 025243ea6e..5c9dee6fad 100755
--- a/scripts/buildhistory-diff
+++ b/scripts/buildhistory-diff
@@ -20,6 +20,7 @@ except ImportError:
print("Please install GitPython (python3-git) 0.3.4 or later in order to use \
this script") sys.exit(1)
+
def get_args_parser():
description = "Reports significant differences in the buildhistory repository."
@@ -68,6 +69,7 @@ def get_args_parser():
help=argparse.SUPPRESS)
return parser
+
def main():
parser = get_args_parser()
@@ -135,5 +137,6 @@ def main():
sys.exit(0)
+
if __name__ == "__main__":
main()
diff --git a/scripts/buildstats-diff b/scripts/buildstats-diff
index bef1cf9cd7..d304b8a1b7 100755
--- a/scripts/buildstats-diff
+++ b/scripts/buildstats-diff
@@ -269,6 +269,7 @@ Script for comparing buildstats of two separate builds."""
return args
+
def main(argv=None):
"""Script entry point"""
args = parse_args(argv)
@@ -298,5 +299,6 @@ def main(argv=None):
return 1
return 0
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/scripts/combo-layer b/scripts/combo-layer
index 81d9badbc0..4b44a0d7b4 100755
--- a/scripts/combo-layer
+++ b/scripts/combo-layer
@@ -28,6 +28,7 @@ from functools import reduce
__version__ = "0.2.1"
+
def logger_create():
logger = logging.getLogger("")
loggerhandler = logging.StreamHandler()
@@ -36,8 +37,10 @@ def logger_create():
logger.setLevel(logging.INFO)
return logger
+
logger = logger_create()
+
def get_current_branch(repodir=None):
try:
if not os.path.exists(os.path.join(repodir if repodir else '', ".git")):
@@ -50,6 +53,7 @@ def get_current_branch(repodir=None):
except subprocess.CalledProcessError:
return ""
+
class Configuration(object):
"""
Manages the configuration
@@ -57,6 +61,7 @@ class Configuration(object):
For an example config file, see combo-layer.conf.example
"""
+
def __init__(self, options):
for key, val in options.__dict__.items():
setattr(self, key, val)
@@ -169,6 +174,7 @@ class Configuration(object):
logger.error("ERROR: patchutils package is missing, please install it \
(e.g. # apt-get install patchutils)") sys.exit(1)
+
def runcmd(cmd, destdir=None, printerr=True, out=None, env=None):
"""
execute command, raise CalledProcessError if fail
@@ -193,6 +199,7 @@ def runcmd(cmd, destdir=None, printerr=True, out=None, env=None):
logger.debug("output: %s" % output.replace(chr(0), '\\0'))
return output
+
def action_init(conf, args):
"""
Clone component repositories
@@ -253,6 +260,7 @@ def action_init(conf, args):
extract_dir = os.getcwd()
file_filter = repo.get('file_filter', "")
exclude_patterns = repo.get('file_exclude', '').split()
+
def copy_selected_files(initialrev, extract_dir, file_filter, \
exclude_patterns, ldir, subdir=""):
# When working inside a filtered branch which had the
@@ -474,6 +482,7 @@ def check_repo_clean(repodir):
logger.error("git repo %s is dirty, please fix it first", repodir)
sys.exit(1)
+
def check_patch(patchfile):
f = open(patchfile, 'rb')
ln = f.readline()
@@ -511,6 +520,7 @@ def check_patch(patchfile):
of.close()
bb.utils.rename(patchfile + '.tmp', patchfile)
+
def drop_to_shell(workdir=None):
if not sys.stdin.isatty():
print("Not a TTY so can't drop to shell for resolution, exiting.")
@@ -528,6 +538,7 @@ def drop_to_shell(workdir=None):
else:
return True
+
def check_rev_branch(component, repodir, rev, branch):
try:
actualbranch = runcmd("git branch --contains %s" % rev, repodir, \
printerr=False) @@ -551,6 +562,7 @@ def check_rev_branch(component, repodir, rev, \
branch): return False
return True
+
def get_repos(conf, repo_names):
repos = []
for name in repo_names:
@@ -568,6 +580,7 @@ def get_repos(conf, repo_names):
return repos
+
def action_pull(conf, args):
"""
update the component repos only
@@ -604,6 +617,7 @@ def action_pull(conf, args):
runcmd("git checkout %s" % branch, ldir)
runcmd("git reset --hard FETCH_HEAD", ldir)
+
def action_update(conf, args):
"""
update the component repos
@@ -653,6 +667,7 @@ def action_update(conf, args):
else:
update_with_patches(conf, components, revisions, repos)
+
def update_with_patches(conf, components, revisions, repos):
import uuid
patch_dir = "patch-%s" % uuid.uuid4()
@@ -737,6 +752,7 @@ def update_with_patches(conf, components, revisions, repos):
# Step 7: commit the updated config file if it's being tracked
commit_conf_file(conf, components)
+
def conf_commit_msg(conf, components):
# create the "components" string
component_str = "all components"
@@ -749,6 +765,7 @@ def conf_commit_msg(conf, components):
msg = template.substitute(components=component_str)
return msg
+
def commit_conf_file(conf, components, commit=True):
relpath = os.path.relpath(conf.conffile)
try:
@@ -767,6 +784,7 @@ def commit_conf_file(conf, components, commit=True):
return True
return False
+
def apply_patchlist(conf, repos):
"""
apply the generated patch list to combo repo
@@ -844,6 +862,7 @@ def apply_patchlist(conf, repos):
if lastrev != repo['last_revision']:
conf.update(name, "last_revision", lastrev)
+
def action_splitpatch(conf, args):
"""
generate the commit patch and
@@ -883,6 +902,7 @@ def action_splitpatch(conf, args):
else:
logger.info(patch_filename)
+
def update_with_history(conf, components, revisions, repos):
'''Update all components with full history.
@@ -998,7 +1018,6 @@ def update_with_history(conf, components, revisions, repos):
else:
index += 1
-
# Generate the revision list.
logger.info("Analyzing commits from %s..." % name)
top_revision = revision or branch
@@ -1046,6 +1065,7 @@ def update_with_history(conf, components, revisions, repos):
# Now import each revision.
logger.info("Importing commits from %s..." % name)
+
def import_rev(rev):
global scanned_revs
@@ -1198,6 +1218,8 @@ def update_with_history(conf, components, revisions, repos):
scanned_revs = False
+
+
def find_revs(old2new, head):
'''Construct mapping from original commit hash to commit hash in
combined repo by looking at the commit messages. Depends on the
@@ -1295,9 +1317,11 @@ def apply_commit(parent, rev, largs, wargs, dest_dir, \
file_filter=None): path = os.path.join(dest_dir, path)
runcmd("git rm -f --ignore-unmatch".split() + [os.path.join(dest_dir, x) for \
x in delete], **wargs)
+
def action_error(conf, args):
logger.info("invalid action %s" % args[0])
+
actions = {
"init": action_init,
"update": action_update,
@@ -1305,6 +1329,7 @@ actions = {
"splitpatch": action_splitpatch,
}
+
def main():
parser = optparse.OptionParser(
version="Combo Layer Repo Tool version %s" % __version__,
@@ -1357,6 +1382,7 @@ Action:
confdata.sanity_check(initmode)
actions.get(args[1], action_error)(confdata, args[1:])
+
if __name__ == "__main__":
try:
ret = main()
diff --git a/scripts/contrib/bbvars.py b/scripts/contrib/bbvars.py
index 090133600b..bc518198dc 100755
--- a/scripts/contrib/bbvars.py
+++ b/scripts/contrib/bbvars.py
@@ -19,6 +19,7 @@ import scriptpath
scriptpath.add_bitbake_lib_path()
import bb.tinfoil
+
def usage():
print('Usage: %s -d FILENAME [-d FILENAME]*' % os.path.basename(sys.argv[0]))
print(' -d FILENAME documentation file to search')
@@ -26,6 +27,7 @@ def usage():
print(' -t FILENAME documentation config file (for doc tags)')
print(' -T Only display variables with doc tags (requires \
-t)')
+
def bbvar_is_documented(var, documented_vars):
''' Check if variable (var) is in the list of documented \
variables(documented_vars) ''' if var in documented_vars:
@@ -33,6 +35,7 @@ def bbvar_is_documented(var, documented_vars):
else:
return False
+
def collect_documented_vars(docfiles):
''' Walk the docfiles and collect the documented variables '''
documented_vars = []
@@ -44,6 +47,7 @@ def collect_documented_vars(docfiles):
return documented_vars
+
def bbvar_doctag(var, docconf):
prog = re.compile('^%s\[doc\] *= *"(.*)"' % (var))
if docconf == "":
@@ -62,6 +66,7 @@ def bbvar_doctag(var, docconf):
f.close()
return ""
+
def main():
docfiles = []
bbvars = set()
diff --git a/scripts/contrib/devtool-stress.py b/scripts/contrib/devtool-stress.py
index 81046ecf49..35fdf4e10a 100755
--- a/scripts/contrib/devtool-stress.py
+++ b/scripts/contrib/devtool-stress.py
@@ -27,6 +27,7 @@ import scriptutils
import argparse_oe
logger = scriptutils.logger_create('devtool-stress')
+
def select_recipes(args):
import bb.tinfoil
tinfoil = bb.tinfoil.Tinfoil()
@@ -241,5 +242,6 @@ def main():
ret = args.func(args)
+
if __name__ == "__main__":
main()
diff --git a/scripts/contrib/graph-tool b/scripts/contrib/graph-tool
index 26488930e0..96cb9f26d1 100755
--- a/scripts/contrib/graph-tool
+++ b/scripts/contrib/graph-tool
@@ -27,6 +27,7 @@ def get_path_networkx(dotfile, fromnode, tonode):
sys.exit(1)
graph = networkx.DiGraph(networkx.nx_pydot.read_dot(dotfile))
+
def node_missing(node):
import difflib
close_matches = difflib.get_close_matches(node, graph.nodes(), cutoff=0.7)
diff --git a/scripts/contrib/image-manifest b/scripts/contrib/image-manifest
index f342e6b5dd..6868de1dc6 100755
--- a/scripts/contrib/image-manifest
+++ b/scripts/contrib/image-manifest
@@ -39,6 +39,7 @@ import bb.utils
import oe.utils
import oe.recipeutils
+
def get_pkg_list(manifest):
pkglist = []
with open(manifest, 'r') as f:
@@ -52,11 +53,13 @@ def get_pkg_list(manifest):
pkglist.append(linesplit[0])
return sorted(pkglist)
+
def list_packages(args):
pkglist = get_pkg_list(args.manifest)
for pkg in pkglist:
print('%s' % pkg)
+
def pkg2recipe(tinfoil, pkg):
if "-native" in pkg:
logger.info('skipping %s' % pkg)
@@ -75,6 +78,7 @@ def pkg2recipe(tinfoil, pkg):
logger.warning('%s is missing' % pkgdatafile)
return None
+
def get_recipe_list(manifest, tinfoil):
pkglist = get_pkg_list(manifest)
recipelist = []
@@ -86,6 +90,7 @@ def get_recipe_list(manifest, tinfoil):
return sorted(recipelist)
+
def list_recipes(args):
import bb.tinfoil
with bb.tinfoil.Tinfoil() as tinfoil:
@@ -95,6 +100,7 @@ def list_recipes(args):
for recipe in sorted(recipelist):
print('%s' % recipe)
+
def list_layers(args):
def find_git_repo(pth):
@@ -173,6 +179,7 @@ def list_layers(args):
json.dump(layers, args.output, indent=2)
+
def get_recipe(args):
with bb.tinfoil.Tinfoil() as tinfoil:
tinfoil.logger.setLevel(logger.getEffectiveLevel())
@@ -181,6 +188,7 @@ def get_recipe(args):
recipe = pkg2recipe(tinfoil, args.package)
print(' %s package provided by %s' % (args.package, recipe))
+
def pkg_dependencies(args):
def get_recipe_info(tinfoil, recipe):
try:
@@ -262,6 +270,7 @@ def pkg_dependencies(args):
if "cross" in data.pn:
print(" %s(%s)" % (data.pn, p))
+
def default_config():
vlist = OrderedDict()
vlist['PV'] = 'yes'
@@ -295,12 +304,14 @@ def default_config():
clist['packagedir'] = 'no'
return clist
+
def dump_config(args):
config = default_config()
f = open('default_config.json', 'w')
json.dump(config, f, indent=2)
logger.info('Default config list dumped to default_config.json')
+
def export_manifest_info(args):
def handle_value(value):
diff --git a/scripts/contrib/list-packageconfig-flags.py \
b/scripts/contrib/list-packageconfig-flags.py index fda0b35e9d..5e018b8e7d 100755
--- a/scripts/contrib/list-packageconfig-flags.py
+++ b/scripts/contrib/list-packageconfig-flags.py
@@ -30,6 +30,7 @@ import bb.cooker
import bb.providers
import bb.tinfoil
+
def get_fnlist(bbhandler, pkg_pn, preferred):
''' Get all recipe file names '''
if preferred:
@@ -44,6 +45,7 @@ def get_fnlist(bbhandler, pkg_pn, preferred):
return fn_list
+
def get_recipesdata(bbhandler, preferred):
''' Get data of all available recipes which have PACKAGECONFIG flags '''
pkg_pn = bbhandler.cooker.recipecaches[''].pkg_pn
@@ -58,6 +60,7 @@ def get_recipesdata(bbhandler, preferred):
return data_dict
+
def collect_pkgs(data_dict):
''' Collect available pkgs in which have PACKAGECONFIG flags '''
# pkg_dict = {'pkg1': ['flag1', 'flag2',...]}
@@ -70,6 +73,7 @@ def collect_pkgs(data_dict):
return pkg_dict
+
def collect_flags(pkg_dict):
''' Collect available PACKAGECONFIG flags and all affected pkgs '''
# flag_dict = {'flag': ['pkg1', 'pkg2',...]}
@@ -83,6 +87,7 @@ def collect_flags(pkg_dict):
return flag_dict
+
def display_pkgs(pkg_dict):
''' Display available pkgs which have PACKAGECONFIG flags '''
pkgname_len = len("RECIPE NAME") + 1
@@ -109,6 +114,7 @@ def display_flags(flag_dict):
for flag in sorted(flag_dict):
print('%-*s%s' % (flag_len, flag, ' '.join(sorted(flag_dict[flag]))))
+
def display_all(data_dict):
''' Display all pkgs and PACKAGECONFIG information '''
print(str("").ljust(50, '='))
@@ -126,6 +132,7 @@ def display_all(data_dict):
print('PACKAGECONFIG[%s] %s' % (flag, flag_val))
print('')
+
def main():
pkg_dict = {}
flag_dict = {}
@@ -163,5 +170,6 @@ def main():
elif options.listtype == 'all':
display_all(data_dict)
+
if __name__ == "__main__":
main()
diff --git a/scripts/contrib/oe-build-perf-report-email.py \
b/scripts/contrib/oe-build-perf-report-email.py index de3862c897..81594309bc 100755
--- a/scripts/contrib/oe-build-perf-report-email.py
+++ b/scripts/contrib/oe-build-perf-report-email.py
@@ -177,6 +177,7 @@ def scrape_html_report(report, outdir, \
phantomjs_extra_args=None): finally:
shutil.rmtree(tmpdir)
+
def send_email(text_fn, html_fn, image_fns, subject, recipients, copy=[],
blind_copy=[]):
"""Send email"""
diff --git a/scripts/contrib/patchreview.py b/scripts/contrib/patchreview.py
index b987374d57..879814d437 100755
--- a/scripts/contrib/patchreview.py
+++ b/scripts/contrib/patchreview.py
@@ -10,6 +10,7 @@
status_values = ("accepted", "pending", "inappropriate", "backport", "submitted", \
"denied")
+
class Result:
# Whether the patch has an Upstream-Status or not
missing_upstream_status = False
@@ -28,6 +29,7 @@ class Result:
# Whether a patch looks like a CVE but doesn't have a CVE tag
missing_cve = False
+
def blame_patch(patch):
"""
From a patch filename, return a list of "commit summary (author name <author
@@ -39,6 +41,7 @@ def blame_patch(patch):
"--format=%s (%aN <%aE>)",
"--", patch)).decode("utf-8").splitlines()
+
def patchreview(path, patches):
import re
import os.path
@@ -71,7 +74,6 @@ def patchreview(path, patches):
else:
result.missing_sob = True
-
# Find the Upstream-Status tag
match = status_re.search(content)
if match:
@@ -188,7 +190,6 @@ Patches in Pending state: %s""" % (total_patches,
percent(pending_patches)))
-
def histogram(results):
from toolz import recipes, dicttoolz
import math
diff --git a/scripts/contrib/verify-homepage.py b/scripts/contrib/verify-homepage.py
index 84503b84d1..e2f8cbccc7 100755
--- a/scripts/contrib/verify-homepage.py
+++ b/scripts/contrib/verify-homepage.py
@@ -26,6 +26,7 @@ import bb.tinfoil
logger = scriptutils.logger_create('verify_homepage')
+
def wgetHomepage(pn, homepage):
result = subprocess.call('wget ' + '-q -T 5 -t 1 --spider ' + homepage, \
shell=True) if result:
@@ -34,6 +35,7 @@ def wgetHomepage(pn, homepage):
else:
return 0
+
def verifyHomepage(bbhandler):
pkg_pn = bbhandler.cooker.recipecaches[''].pkg_pn
pnlist = sorted(pkg_pn)
@@ -55,6 +57,7 @@ def verifyHomepage(bbhandler):
checked.append(realfn)
return count
+
if __name__ == '__main__':
with bb.tinfoil.Tinfoil() as bbhandler:
bbhandler.prepare()
diff --git a/scripts/cp-noerror b/scripts/cp-noerror
index ab617c5d35..99fce16a10 100755
--- a/scripts/cp-noerror
+++ b/scripts/cp-noerror
@@ -11,6 +11,7 @@ import sys
import os
import shutil
+
def copytree(src, dst, symlinks=False, ignore=None):
"""Based on shutil.copytree"""
names = os.listdir(src)
@@ -46,6 +47,7 @@ def copytree(src, dst, symlinks=False, ignore=None):
if errors:
raise shutil.Error(errors)
+
try:
copytree(sys.argv[1], sys.argv[2])
except shutil.Error:
diff --git a/scripts/crosstap b/scripts/crosstap
index b8c3923793..d6d366600b 100755
--- a/scripts/crosstap
+++ b/scripts/crosstap
@@ -27,6 +27,7 @@ import subprocess
import os
import optparse
+
class Stap(object):
def __init__(self, script, module, remote):
self.script = script
@@ -111,10 +112,12 @@ class Stap(object):
print("export %s=\"%s\"" % (e, additional_env[e]))
print(" ".join(command))
+
class BitbakeEnvInvocationException(Exception):
def __init__(self, message):
self.message = message
+
class BitbakeEnv(object):
BITBAKE = "bitbake"
@@ -169,6 +172,7 @@ class BitbakeEnv(object):
return ret
+
class ParamDiscovery(object):
SYMBOLS_CHECK_MESSAGE = """
WARNING: image '%s' does not have dbg-pkgs IMAGE_FEATURES enabled and no
@@ -455,4 +459,5 @@ IMAGE_INSTALL_append = " systemtap"
os.execve(cmd[0], cmd, env)
+
main()
diff --git a/scripts/devtool b/scripts/devtool
index 8a4f41bc37..588d9195b1 100755
--- a/scripts/devtool
+++ b/scripts/devtool
@@ -69,7 +69,6 @@ class ConfigHandler(object):
self.workspace_path = self.get('General', 'workspace_path', \
os.path.join(basepath, 'workspace')) return True
-
def write(self):
logger.debug('writing to config file %s' % self.config_file)
self.config_obj.set('General', 'workspace_path', self.workspace_path)
@@ -81,6 +80,7 @@ class ConfigHandler(object):
self.config_obj.add_section(section)
self.config_obj.set(section, option, value)
+
class Context:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
@@ -128,6 +128,7 @@ def read_workspace():
logger.debug('Found recipe %s' % pnvalues)
workspace[pn] = pnvalues
+
def create_workspace(args, config, basepath, workspace):
if args.layerpath:
workspacedir = os.path.abspath(args.layerpath)
@@ -137,6 +138,7 @@ def create_workspace(args, config, basepath, workspace):
if not args.create_only:
_enable_workspace_layer(workspacedir, config, basepath)
+
def _create_workspace(workspacedir, config, basepath):
import bb
@@ -174,6 +176,7 @@ def _create_workspace(workspacedir, config, basepath):
f.write('layer. If you prefer it to be elsewhere you can specify the \
source\n') f.write('tree path on the command line.\n')
+
def _enable_workspace_layer(workspacedir, config, basepath):
"""Ensure the workspace layer is in bblayers.conf"""
import bb
diff --git a/scripts/gen-lockedsig-cache b/scripts/gen-lockedsig-cache
index cd8f9a4356..c1054ebbbf 100755
--- a/scripts/gen-lockedsig-cache
+++ b/scripts/gen-lockedsig-cache
@@ -9,6 +9,7 @@ import shutil
import errno
import time
+
def mkdir(d):
try:
os.makedirs(d)
@@ -17,11 +18,15 @@ def mkdir(d):
raise e
# extract the hash from past the last colon to last underscore
+
+
def extract_sha(filename):
return filename.split(':')[7].split('_')[0]
# get all files in a directory, extract hash and make
# a map from hash to list of file with that hash
+
+
def map_sha_to_files(dir_, prefix, sha_map):
sstate_prefix_path = dir_ + '/' + prefix + '/'
if not os.path.exists(sstate_prefix_path):
@@ -37,6 +42,8 @@ def map_sha_to_files(dir_, prefix, sha_map):
continue
# given a prefix build a map of hash to list of files
+
+
def build_sha_cache(prefix):
sha_map = {}
@@ -48,6 +55,7 @@ def build_sha_cache(prefix):
return sha_map
+
if len(sys.argv) < 5:
print("Incorrect number of arguments specified")
print("syntax: gen-lockedsig-cache <locked-sigs.inc> <input-cachedir> \
<output-cachedir> <nativelsbstring> [filterfile]")
diff --git a/scripts/install-buildtools b/scripts/install-buildtools
index 213edb5b15..8571505d65 100755
--- a/scripts/install-buildtools
+++ b/scripts/install-buildtools
@@ -73,6 +73,7 @@ if not (sys.version_info.major == 3 and sys.version_info.minor >= \
4): # to run on versions of python earlier than what bitbake
# supports (e.g. less than Python 3.5 for YP 3.1 release)
+
def _hasher(method, filename):
import mmap
@@ -94,6 +95,7 @@ def md5_file(filename):
import hashlib
return _hasher(hashlib.md5(), filename)
+
def sha256_file(filename):
"""
Return the hex string representation of the 256-bit SHA checksum of
diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py
index 94a4ac5011..2f72954690 100644
--- a/scripts/lib/argparse_oe.py
+++ b/scripts/lib/argparse_oe.py
@@ -6,14 +6,18 @@ import sys
import argparse
from collections import defaultdict, OrderedDict
+
class ArgumentUsageError(Exception):
"""Exception class you can raise (and catch) in order to show the help"""
+
def __init__(self, message, subcommand=None):
self.message = message
self.subcommand = subcommand
+
class ArgumentParser(argparse.ArgumentParser):
"""Our own version of argparse's ArgumentParser"""
+
def __init__(self, *args, **kwargs):
kwargs.setdefault('formatter_class', OeHelpFormatter)
self._subparser_groups = OrderedDict()
@@ -172,6 +176,7 @@ class OeHelpFormatter(argparse.HelpFormatter):
else:
return super(OeHelpFormatter, self)._format_action(action)
+
def int_positive(value):
ivalue = int(value)
if ivalue <= 0:
diff --git a/scripts/lib/build_perf/__init__.py b/scripts/lib/build_perf/__init__.py
index dcbb78042d..0bc0d74206 100644
--- a/scripts/lib/build_perf/__init__.py
+++ b/scripts/lib/build_perf/__init__.py
@@ -5,6 +5,7 @@
#
"""Build performance test library functions"""
+
def print_table(rows, row_fmt=None):
"""Print data table"""
if not rows:
diff --git a/scripts/lib/build_perf/report.py b/scripts/lib/build_perf/report.py
index dde4616974..fc8bba7cd7 100644
--- a/scripts/lib/build_perf/report.py
+++ b/scripts/lib/build_perf/report.py
@@ -293,6 +293,7 @@ class SizeVal(MeasurementVal):
return "null"
return self / 1024
+
def measurement_stats(meas, prefix=''):
"""Get statistics of a measurement"""
if not meas:
diff --git a/scripts/lib/buildstats.py b/scripts/lib/buildstats.py
index 3b251a697b..6dbcefab04 100644
--- a/scripts/lib/buildstats.py
+++ b/scripts/lib/buildstats.py
@@ -144,6 +144,7 @@ class BSTaskAggregate(object):
class BSRecipe(object):
"""Class representing buildstats of one recipe"""
+
def __init__(self, name, epoch, version, revision):
self.name = name
self.epoch = epoch
@@ -209,7 +210,6 @@ class BuildStats(dict):
bs_json = json.load(fobj)
return BuildStats.from_json(bs_json)
-
@staticmethod
def split_nevr(nevr):
"""Split name and version information from recipe "nevr" string"""
@@ -312,6 +312,7 @@ def diff_buildstats(bs1, bs2, stat_attr, min_val=None, \
min_absdiff=None, only_ta
class BSVerDiff(object):
"""Class representing recipe version differences between two buildstats"""
+
def __init__(self, bs1, bs2):
RecipeVerDiff = namedtuple('RecipeVerDiff', 'left right')
diff --git a/scripts/lib/checklayer/__init__.py b/scripts/lib/checklayer/__init__.py
index b849843154..2817b168d1 100644
--- a/scripts/lib/checklayer/__init__.py
+++ b/scripts/lib/checklayer/__init__.py
@@ -12,6 +12,7 @@ from enum import Enum
import bb.tinfoil
+
class LayerType(Enum):
BSP = 0
DISTRO = 1
@@ -19,6 +20,7 @@ class LayerType(Enum):
ERROR_NO_LAYER_CONF = 98
ERROR_BSP_DISTRO = 99
+
def _get_configurations(path):
configs = []
@@ -28,6 +30,7 @@ def _get_configurations(path):
configs.append(f[:-5]) # strip .conf
return configs
+
def _get_layer_collections(layer_path, lconf=None, data=None):
import bb.parse
import bb.data
@@ -71,6 +74,7 @@ def _get_layer_collections(layer_path, lconf=None, data=None):
return collections
+
def _detect_layer(layer_path):
"""
Scans layer directory to detect what type of layer
@@ -121,6 +125,7 @@ def _detect_layer(layer_path):
return layer
+
def detect_layers(layer_directories, no_auto):
layers = []
@@ -146,6 +151,7 @@ def detect_layers(layer_directories, no_auto):
return layers
+
def _find_layer_depends(depend, layers):
for layer in layers:
if 'collections' not in layer:
@@ -156,6 +162,7 @@ def _find_layer_depends(depend, layers):
return layer
return None
+
def add_layer_dependencies(bblayersconf, layer, layers, logger):
def recurse_dependencies(depends, layer, layers, logger, ret=[]):
logger.debug('Processing dependencies %s for layer %s.' %
@@ -210,6 +217,7 @@ def add_layer_dependencies(bblayersconf, layer, layers, logger):
return True
+
def add_layers(bblayersconf, layers, logger):
# Don't add a layer that is already present.
added = set()
@@ -229,6 +237,7 @@ def add_layers(bblayersconf, layers, logger):
f.write("\nBBLAYERS += \"%s\"\n" % path)
return True
+
def check_bblayers(bblayersconf, layer_path, logger):
'''
If layer_path found in BBLAYERS return True
@@ -243,6 +252,7 @@ def check_bblayers(bblayersconf, layer_path, logger):
return False
+
def check_command(error_msg, cmd, cwd=None):
'''
Run a command under a shell, capture stdout and stderr in a single stream,
@@ -256,6 +266,7 @@ def check_command(error_msg, cmd, cwd=None):
raise RuntimeError(msg)
return output
+
def get_signatures(builddir, failsafe=False, machine=None):
import re
@@ -318,6 +329,7 @@ def get_signatures(builddir, failsafe=False, machine=None):
return (sigs, tune2tasks)
+
def get_depgraph(targets=['world'], failsafe=False):
'''
Returns the dependency graph for the given target(s).
@@ -353,6 +365,7 @@ def get_depgraph(targets=['world'], failsafe=False):
raise RuntimeError('Could not retrieve the depgraph.')
return depgraph
+
def compare_signatures(old_sigs, curr_sigs):
'''
Compares the result of two get_signatures() calls. Returns None if no
@@ -376,6 +389,7 @@ def compare_signatures(old_sigs, curr_sigs):
def sig2graph(task):
pn, taskname = task.rsplit(':', 1)
return pn + '.' + taskname
+
def graph2sig(task):
pn, taskname = task.rsplit('.', 1)
return pn + ':' + taskname
diff --git a/scripts/lib/checklayer/case.py b/scripts/lib/checklayer/case.py
index fa9dee384e..aad22efd0c 100644
--- a/scripts/lib/checklayer/case.py
+++ b/scripts/lib/checklayer/case.py
@@ -5,5 +5,6 @@
from oeqa.core.case import OETestCase
+
class OECheckLayerTestCase(OETestCase):
pass
diff --git a/scripts/lib/checklayer/cases/bsp.py \
b/scripts/lib/checklayer/cases/bsp.py index bd80f1132a..c80200426d 100644
--- a/scripts/lib/checklayer/cases/bsp.py
+++ b/scripts/lib/checklayer/cases/bsp.py
@@ -8,6 +8,7 @@ import unittest
from checklayer import LayerType, get_signatures, check_command, get_depgraph
from checklayer.case import OECheckLayerTestCase
+
class BSPCheckLayer(OECheckLayerTestCase):
@classmethod
def setUpClass(self):
@@ -27,7 +28,6 @@ class BSPCheckLayer(OECheckLayerTestCase):
msg="Layer %s modified machine %s -> %s" %
(self.tc.layer['name'], self.td['bbvars']['MACHINE'], machine))
-
def test_machine_world(self):
'''
"bitbake world" is expected to work regardless which machine is selected.
@@ -111,6 +111,7 @@ class BSPCheckLayer(OECheckLayerTestCase):
BLACK = 3
color = {}
found = set()
+
def visit(task):
color[task] = GRAY
for dep in depends.get(task, ()):
@@ -126,6 +127,7 @@ class BSPCheckLayer(OECheckLayerTestCase):
visit(task)
taskname_order = dict([(task, index) for index, task in \
enumerate(taskname_list)]) +
def task_key(task):
pn, taskname = task.rsplit(':', 1)
return (pn, taskname_order.get(taskname, len(taskname_list)), taskname)
diff --git a/scripts/lib/checklayer/cases/common.py \
b/scripts/lib/checklayer/cases/common.py index 3c3562c931..5562835ba2 100644
--- a/scripts/lib/checklayer/cases/common.py
+++ b/scripts/lib/checklayer/cases/common.py
@@ -9,6 +9,7 @@ import unittest
from checklayer import get_signatures, LayerType, check_command, get_depgraph, \
compare_signatures from checklayer.case import OECheckLayerTestCase
+
class CommonCheckLayer(OECheckLayerTestCase):
def test_readme(self):
# The top-level README file may have a suffix (like README.rst or \
README.txt).
diff --git a/scripts/lib/checklayer/cases/distro.py \
b/scripts/lib/checklayer/cases/distro.py index 4efde4b44a..decac32ffd 100644
--- a/scripts/lib/checklayer/cases/distro.py
+++ b/scripts/lib/checklayer/cases/distro.py
@@ -8,6 +8,7 @@ import unittest
from checklayer import LayerType
from checklayer.case import OECheckLayerTestCase
+
class DistroCheckLayer(OECheckLayerTestCase):
@classmethod
def setUpClass(self):
diff --git a/scripts/lib/checklayer/context.py b/scripts/lib/checklayer/context.py
index 4de8f668fd..460557f747 100644
--- a/scripts/lib/checklayer/context.py
+++ b/scripts/lib/checklayer/context.py
@@ -10,6 +10,7 @@ import re
from oeqa.core.context import OETestContext
+
class CheckLayerTestContext(OETestContext):
def __init__(self, td=None, logger=None, layer=None, \
test_software_layer_signatures=True): super(CheckLayerTestContext, \
self).__init__(td, logger)
diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
index 702db669de..beb61a3705 100644
--- a/scripts/lib/devtool/__init__.py
+++ b/scripts/lib/devtool/__init__.py
@@ -17,8 +17,10 @@ import codecs
logger = logging.getLogger('devtool')
+
class DevtoolError(Exception):
"""Exception for handling devtool errors"""
+
def __init__(self, message, exitcode=1):
super(DevtoolError, self).__init__(message)
self.exitcode = exitcode
@@ -48,6 +50,7 @@ def exec_build_env_command(init_path, builddir, cmd, watch=False, \
**options): else:
return bb.process.run('%s%s' % (init_prefix, cmd), **options)
+
def exec_watch(cmd, **options):
"""Run program with stdout shown on sys.stdout"""
import bb
@@ -74,6 +77,7 @@ def exec_watch(cmd, **options):
return buf, None
+
def exec_fakeroot(d, cmd, **kwargs):
"""Run a command under fakeroot (pseudo, in fact) so that it picks up the \
appropriate file permissions""" # Grab the command and check it actually exists
@@ -90,6 +94,7 @@ def exec_fakeroot(d, cmd, **kwargs):
newenv[splitval[0]] = splitval[1]
return subprocess.call("%s %s" % (fakerootcmd, cmd), env=newenv, **kwargs)
+
def setup_tinfoil(config_only=False, basepath=None, tracking=False):
"""Initialize tinfoil api from bitbake"""
import scriptpath
@@ -117,6 +122,7 @@ def setup_tinfoil(config_only=False, basepath=None, \
tracking=False): os.chdir(orig_cwd)
return tinfoil
+
def parse_recipe(config, tinfoil, pn, appends, filter_workspace=True):
"""Parse the specified recipe"""
try:
@@ -139,6 +145,7 @@ def parse_recipe(config, tinfoil, pn, appends, \
filter_workspace=True): return None
return rd
+
def check_workspace_recipe(workspace, pn, checksrc=True, bbclassextend=False):
"""
Check that a recipe is in the workspace and (optionally) that source
@@ -169,6 +176,7 @@ def check_workspace_recipe(workspace, pn, checksrc=True, \
bbclassextend=False):
return workspacepn
+
def use_external_build(same_dir, no_same_dir, d):
"""
Determine if we should use B!=S (separate build and source directories) or not
@@ -187,6 +195,7 @@ def use_external_build(same_dir, no_same_dir, d):
b_is_s = False
return b_is_s
+
def setup_git_repo(repodir, version, devbranch, basetag='devtool-base', d=None):
"""
Set up the git repository for the source tree
@@ -233,6 +242,7 @@ def setup_git_repo(repodir, version, devbranch, \
basetag='devtool-base', d=None): bb.process.run('git checkout -b %s' % devbranch, \
cwd=repodir) bb.process.run('git tag -f %s' % basetag, cwd=repodir)
+
def recipe_to_append(recipefile, config, wildcard=False):
"""
Convert a recipe file to a bbappend file path within the workspace.
@@ -247,6 +257,7 @@ def recipe_to_append(recipefile, config, wildcard=False):
appendfile = os.path.join(appendpath, appendname + '.bbappend')
return appendfile
+
def get_bbclassextend_targets(recipefile, pn):
"""
Cheap function to get BBCLASSEXTEND and then convert that to the
@@ -255,6 +266,7 @@ def get_bbclassextend_targets(recipefile, pn):
import bb.utils
values = {}
+
def get_bbclassextend_varfunc(varname, origvalue, op, newlines):
values[varname] = origvalue
return origvalue, None, 0, True
@@ -271,6 +283,7 @@ def get_bbclassextend_targets(recipefile, pn):
targets.append('%s-%s' % (pn, variant))
return targets
+
def replace_from_file(path, old, new):
"""Replace strings on a file"""
@@ -325,6 +338,7 @@ def update_unlockedsigs(basepath, workspace, fixed_setup, \
extra=None):
# Get current unlocked list if any
values = {}
+
def get_unlockedsigs_varfunc(varname, origvalue, op, newlines):
values[varname] = origvalue
return origvalue, None, 0, True
@@ -348,6 +362,7 @@ def update_unlockedsigs(basepath, workspace, fixed_setup, \
extra=None): f.write(' ' + pn)
f.write('"')
+
def check_prerelease_version(ver, operation):
if 'pre' in ver or 'rc' in ver:
logger.warning('Version "%s" looks like a pre-release version. '
@@ -361,11 +376,13 @@ def check_prerelease_version(ver, operation):
'the version after %s succeeds using "devtool rename" '
'with -V/--version.' % (ver, operation))
+
def check_git_repo_dirty(repodir):
"""Check if a git repository is clean or not"""
stdout, _ = bb.process.run('git status --porcelain', cwd=repodir)
return stdout
+
def check_git_repo_op(srctree, ignoredirs=None):
"""Check if a git repository is in the middle of a rebase"""
stdout, _ = bb.process.run('git rev-parse --show-toplevel', cwd=srctree)
diff --git a/scripts/lib/devtool/build.py b/scripts/lib/devtool/build.py
index 935ffab46c..cc38846222 100644
--- a/scripts/lib/devtool/build.py
+++ b/scripts/lib/devtool/build.py
@@ -37,10 +37,12 @@ def _set_file_values(fn, values):
f.writelines(newlines)
return updated
+
def _get_build_tasks(config):
tasks = config.get('Build', 'build_task', \
'populate_sysroot,packagedata').split(',') return ['do_%s' % task.strip() for task \
in tasks]
+
def build(args, config, basepath, workspace):
"""Entry point for the devtool 'build' subcommand"""
workspacepn = check_workspace_recipe(workspace, args.recipename, \
bbclassextend=True) @@ -81,6 +83,7 @@ def build(args, config, basepath, workspace):
return 0
+
def register_commands(subparsers, context):
"""Register devtool subcommands from this plugin"""
parser_build = subparsers.add_parser('build', help='Build a recipe',
diff --git a/scripts/lib/devtool/build_image.py b/scripts/lib/devtool/build_image.py
index 9388abbacf..dd5d59f7a6 100644
--- a/scripts/lib/devtool/build_image.py
+++ b/scripts/lib/devtool/build_image.py
@@ -16,9 +16,11 @@ from devtool import exec_build_env_command, setup_tinfoil, \
parse_recipe, Devtool
logger = logging.getLogger('devtool')
+
class TargetNotImageError(Exception):
pass
+
def _get_packages(tinfoil, workspace, config):
"""Get list of packages from recipes in the workspace."""
result = []
@@ -32,6 +34,7 @@ def _get_packages(tinfoil, workspace, config):
"package with the same name", recipe)
return result
+
def build_image(args, config, basepath, workspace):
"""Entry point for the devtool 'build-image' subcommand."""
@@ -62,6 +65,7 @@ def build_image(args, config, basepath, workspace):
% (image, outputdir))
return result
+
def build_image_task(config, basepath, workspace, image, add_packages=None, \
task=None, extra_append=None): # remove <image>.bbappend to make sure setup_tinfoil \
doesn't # break because of it
diff --git a/scripts/lib/devtool/deploy.py b/scripts/lib/devtool/deploy.py
index 31b029eaf8..ba2ecd68e4 100644
--- a/scripts/lib/devtool/deploy.py
+++ b/scripts/lib/devtool/deploy.py
@@ -22,6 +22,7 @@ logger = logging.getLogger('devtool')
deploylist_path = '/.devtool'
+
def _prepare_remote_script(deploy, verbose=False, dryrun=False, undeployall=False, \
nopreserve=False, nocheckspace=False): """
Prepare a shell script for running on the target to
@@ -134,7 +135,6 @@ def _prepare_remote_script(deploy, verbose=False, dryrun=False, \
undeployall=Fals return '\n'.join(lines)
-
def deploy(args, config, basepath, workspace):
"""Entry point for the devtool 'deploy' subcommand"""
import math
@@ -267,6 +267,7 @@ def deploy(args, config, basepath, workspace):
return 0
+
def undeploy(args, config, basepath, workspace):
"""Entry point for the devtool 'undeploy' subcommand"""
if args.all and args.recipename:
diff --git a/scripts/lib/devtool/export.py b/scripts/lib/devtool/export.py
index 8e8800c0aa..39ab29beca 100644
--- a/scripts/lib/devtool/export.py
+++ b/scripts/lib/devtool/export.py
@@ -19,6 +19,7 @@ logger = logging.getLogger('devtool')
default_arcname_prefix = "workspace-export"
metadata = '.export_metadata'
+
def export(args, config, basepath, workspace):
"""Entry point for the devtool 'export' subcommand"""
@@ -46,7 +47,6 @@ def export(args, config, basepath, workspace):
for name, arcname in arcnames:
tar.add(name, arcname=arcname)
-
# Make sure workspace is non-empty and possible listed include/excluded recipes \
are in workspace if not workspace:
logger.info('Workspace contains no recipes, nothing to export')
@@ -94,6 +94,7 @@ def export(args, config, basepath, workspace):
logger.info('Tar archive created at %s with the following recipes: %s' % (name, \
', '.join(exported))) return 0
+
def register_commands(subparsers, context):
"""Register devtool export subcommands"""
parser = subparsers.add_parser('export',
diff --git a/scripts/lib/devtool/import.py b/scripts/lib/devtool/import.py
index 6829851669..a74fa4daa8 100644
--- a/scripts/lib/devtool/import.py
+++ b/scripts/lib/devtool/import.py
@@ -18,6 +18,7 @@ from devtool import export
logger = logging.getLogger('devtool')
+
def devimport(args, config, basepath, workspace):
"""Entry point for the devtool 'import' subcommand"""
@@ -123,6 +124,7 @@ def devimport(args, config, basepath, workspace):
return 0
+
def register_commands(subparsers, context):
"""Register devtool import subcommands"""
parser = subparsers.add_parser('import',
diff --git a/scripts/lib/devtool/menuconfig.py b/scripts/lib/devtool/menuconfig.py
index 9275ba7c52..d32a347371 100644
--- a/scripts/lib/devtool/menuconfig.py
+++ b/scripts/lib/devtool/menuconfig.py
@@ -28,6 +28,7 @@ from devtool import setup_tinfoil, parse_recipe, DevtoolError, \
standard, exec_bu from devtool import check_workspace_recipe
logger = logging.getLogger('devtool')
+
def menuconfig(args, config, basepath, workspace):
"""Entry point for the devtool 'menuconfig' subcommand"""
@@ -72,6 +73,7 @@ def menuconfig(args, config, basepath, workspace):
return 0
+
def register_commands(subparsers, context):
"""register devtool subcommands from this plugin"""
parser_menuconfig = subparsers.add_parser('menuconfig', help='Alter build-time \
configuration for a recipe', description='Launches the make menuconfig command (for \
recipes where do_menuconfig is available), allowing users to make changes to the \
build-time configuration. Creates a config fragment corresponding to changes made.', \
group='advanced')
diff --git a/scripts/lib/devtool/package.py b/scripts/lib/devtool/package.py
index c2367342c3..af40b2630a 100644
--- a/scripts/lib/devtool/package.py
+++ b/scripts/lib/devtool/package.py
@@ -14,6 +14,7 @@ from devtool import exec_build_env_command, setup_tinfoil, \
check_workspace_recip
logger = logging.getLogger('devtool')
+
def package(args, config, basepath, workspace):
"""Entry point for the devtool 'package' subcommand"""
check_workspace_recipe(workspace, args.recipename)
@@ -39,6 +40,7 @@ def package(args, config, basepath, workspace):
return 0
+
def register_commands(subparsers, context):
"""Register devtool subcommands from the package plugin"""
if context.fixed_setup:
diff --git a/scripts/lib/devtool/runqemu.py b/scripts/lib/devtool/runqemu.py
index ead978aabc..91956beee7 100644
--- a/scripts/lib/devtool/runqemu.py
+++ b/scripts/lib/devtool/runqemu.py
@@ -16,6 +16,7 @@ from devtool import exec_build_env_command, setup_tinfoil, \
DevtoolError
logger = logging.getLogger('devtool')
+
def runqemu(args, config, basepath, workspace):
"""Entry point for the devtool 'runqemu' subcommand"""
@@ -52,6 +53,7 @@ def runqemu(args, config, basepath, workspace):
return 0
+
def register_commands(subparsers, context):
"""Register devtool subcommands from this plugin"""
if context.fixed_setup:
diff --git a/scripts/lib/devtool/sdk.py b/scripts/lib/devtool/sdk.py
index 5e22f91507..bbe9560a04 100644
--- a/scripts/lib/devtool/sdk.py
+++ b/scripts/lib/devtool/sdk.py
@@ -18,6 +18,7 @@ from devtool import exec_build_env_command, setup_tinfoil, \
parse_recipe, Devtool
logger = logging.getLogger('devtool')
+
def parse_locked_sigs(sigfile_path):
"""Return <pn:task>:<hash> dictionary"""
sig_dict = {}
@@ -29,6 +30,7 @@ def parse_locked_sigs(sigfile_path):
sig_dict[taskkey.strip()] = hashval.split()[0]
return sig_dict
+
def generate_update_dict(sigfile_new, sigfile_old):
"""Return a dict containing <pn:task>:<hash> which indicates what need to be \
updated""" update_dict = {}
@@ -43,6 +45,7 @@ def generate_update_dict(sigfile_new, sigfile_old):
continue
return update_dict
+
def get_sstate_objects(update_dict, sstate_dir):
"""Return a list containing sstate objects which are to be installed"""
sstate_objects = []
@@ -61,6 +64,7 @@ def get_sstate_objects(update_dict, sstate_dir):
return sstate_objects
+
def mkdir(d):
try:
os.makedirs(d)
@@ -68,6 +72,7 @@ def mkdir(d):
if e.errno != errno.EEXIST:
raise e
+
def install_sstate_objects(sstate_objects, src_sdk, dest_sdk):
"""Install sstate objects into destination SDK"""
sstate_dir = os.path.join(dest_sdk, 'sstate-cache')
@@ -81,6 +86,7 @@ def install_sstate_objects(sstate_objects, src_sdk, dest_sdk):
logger.debug("Copying %s to %s" % (sb, dst))
shutil.copy(sb, dst)
+
def check_manifest(fn, basepath):
import bb.utils
changedfiles = []
@@ -96,6 +102,7 @@ def check_manifest(fn, basepath):
changedfiles.append(fpath)
return changedfiles
+
def sdk_update(args, config, basepath, workspace):
"""Entry point for devtool sdk-update command"""
updateserver = args.updateserver
@@ -238,6 +245,7 @@ def sdk_update(args, config, basepath, workspace):
return -1
return 0
+
def sdk_install(args, config, basepath, workspace):
"""Entry point for the devtool sdk-install command"""
@@ -250,6 +258,7 @@ def sdk_install(args, config, basepath, workspace):
tasks = ['do_populate_sysroot', 'do_packagedata']
stampprefixes = {}
+
def checkstamp(recipe):
stampprefix = stampprefixes[recipe]
stamps = glob.glob(stampprefix + '*')
diff --git a/scripts/lib/devtool/search.py b/scripts/lib/devtool/search.py
index d24040df37..c66e7e41d4 100644
--- a/scripts/lib/devtool/search.py
+++ b/scripts/lib/devtool/search.py
@@ -16,6 +16,7 @@ from devtool import setup_tinfoil, parse_recipe, DevtoolError
logger = logging.getLogger('devtool')
+
def search(args, config, basepath, workspace):
"""Entry point for the devtool 'search' subcommand"""
@@ -35,7 +36,6 @@ def search(args, config, basepath, workspace):
summary = ''
print("%s %s" % (pn.ljust(20), summary))
-
matches = []
if os.path.exists(pkgdata_dir):
for fn in os.listdir(pkgdata_dir):
@@ -99,6 +99,7 @@ def search(args, config, basepath, workspace):
return 0
+
def register_commands(subparsers, context):
"""Register devtool subcommands from this plugin"""
parser_search = subparsers.add_parser('search', help='Search available recipes',
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index 27f50b7ab1..0f6d60a860 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -329,6 +329,7 @@ def _check_compatible_recipe(pn, d):
"from working. You will need to disable this "
"first." % pn)
+
def _dry_run_copy(src, dst, dry_run_outdir, base_outdir):
"""Common function for copying a file to the dry run output directory"""
relpath = os.path.relpath(dst, base_outdir)
@@ -344,6 +345,7 @@ def _dry_run_copy(src, dst, dry_run_outdir, base_outdir):
if not os.path.exists(dst):
shutil.copy(src, dst)
+
def _move_file(src, dst, dry_run_outdir=None, base_outdir=None):
"""Move a file. Creates all the directory components of destination path."""
dry_run_suffix = ' (dry-run)' if dry_run_outdir else ''
@@ -357,6 +359,7 @@ def _move_file(src, dst, dry_run_outdir=None, base_outdir=None):
bb.utils.mkdirhier(dst_d)
shutil.move(src, dst)
+
def _copy_file(src, dst, dry_run_outdir=None):
"""Copy a file. Creates all the directory components of destination path."""
dry_run_suffix = ' (dry-run)' if dry_run_outdir else ''
@@ -369,6 +372,7 @@ def _copy_file(src, dst, dry_run_outdir=None):
bb.utils.mkdirhier(dst_d)
shutil.copy(src, dst)
+
def _git_ls_tree(repodir, treeish='HEAD', recursive=False):
"""List contents of a git treeish"""
import bb
@@ -384,6 +388,7 @@ def _git_ls_tree(repodir, treeish='HEAD', recursive=False):
ret[split[3]] = split[0:3]
return ret
+
def _git_exclude_path(srctree, path):
"""Return pathspec (list of paths) that excludes certain path"""
# NOTE: "Filtering out" files/paths in this way is not entirely reliable -
@@ -400,6 +405,7 @@ def _git_exclude_path(srctree, path):
else:
return ['.']
+
def _ls_tree(directory):
"""Recursive listing of files in a directory"""
ret = []
@@ -433,6 +439,7 @@ def extract(args, config, basepath, workspace):
finally:
tinfoil.shutdown()
+
def sync(args, config, basepath, workspace):
"""Entry point for the devtool 'sync' subcommand"""
import bb
@@ -457,6 +464,7 @@ def sync(args, config, basepath, workspace):
finally:
tinfoil.shutdown()
+
def symlink_oelocal_files_srctree(rd, srctree):
import oe.patch
if os.path.abspath(rd.getVar('S')) == os.path.abspath(rd.getVar('WORKDIR')):
@@ -697,6 +705,7 @@ def _extract_source(srctree, keep_temp, devbranch, sync, config, \
basepath, works shutil.rmtree(tempdir)
return initial_rev, srcsubdir_rel
+
def _add_md5(config, recipename, filename):
"""Record checksum of a file (or recursively for a directory) to the md5-file of \
the workspace""" import bb.utils
@@ -716,6 +725,7 @@ def _add_md5(config, recipename, filename):
else:
addfile(filename)
+
def _check_preserve(config, recipename):
"""Check if a file was manually changed and needs to be saved in 'attic'
directory"""
@@ -748,6 +758,7 @@ def _check_preserve(config, recipename):
tf.write(line)
bb.utils.rename(newfile, origfile)
+
def get_staging_kver(srcdir):
# Kernel version from work-shared
kerver = []
@@ -760,6 +771,7 @@ def get_staging_kver(srcdir):
staging_kerVer = ".".join(kerver)
return staging_kerVer
+
def get_staging_kbranch(srcdir):
staging_kbranch = ""
if os.path.exists(srcdir) and os.listdir(srcdir):
@@ -767,6 +779,7 @@ def get_staging_kbranch(srcdir):
staging_kbranch = "".join(branch.split('\n')[0])
return staging_kbranch
+
def modify(args, config, basepath, workspace):
"""Entry point for the devtool 'modify' subcommand"""
import bb
@@ -1236,6 +1249,7 @@ def _get_patchset_revs(srctree, recipe_path, initial_rev=None, \
force_patch_refre
return initial_rev, update_rev, changed_revs, patches
+
def _remove_file_entries(srcuri, filelist):
"""Remove file:// entries from SRC_URI"""
remaining = filelist[:]
@@ -1251,6 +1265,7 @@ def _remove_file_entries(srcuri, filelist):
break
return entries, remaining
+
def _replace_srcuri_entry(srcuri, filename, newentry):
"""Replace entry corresponding to specified file with a new entry"""
basename = os.path.basename(filename)
@@ -1260,6 +1275,7 @@ def _replace_srcuri_entry(srcuri, filename, newentry):
srcuri.insert(i, newentry)
break
+
def _remove_source_files(append, files, destpath, no_report_remove=False, \
dry_run=False): """Unlink existing patch files"""
@@ -1597,6 +1613,7 @@ def _update_recipe_srcrev(recipename, workspace, srctree, rd, \
appendlayerdir, wi
_remove_source_files(appendlayerdir, remove_files, destpath, no_report_remove, \
dry_run=dry_run_outdir) return True, appendfile, remove_files
+
def _update_recipe_patch(recipename, workspace, srctree, rd, appendlayerdir, \
wildcard_version, no_remove, no_report_remove, initial_rev, dry_run_outdir=None, \
force_patch_refresh=False): """Implement the 'patch' mode of update-recipe"""
import bb
@@ -1739,6 +1756,7 @@ def _update_recipe_patch(recipename, workspace, srctree, rd, \
appendlayerdir, wil
_remove_source_files(appendlayerdir, remove_files, destpath, no_report_remove, \
dry_run=dry_run_outdir) return True, appendfile, remove_files
+
def _guess_recipe_update_mode(srctree, rdata):
"""Guess the recipe update mode to use"""
src_uri = (rdata.getVar('SRC_URI') or '').split()
@@ -1761,6 +1779,7 @@ def _guess_recipe_update_mode(srctree, rdata):
return 'patch'
+
def _update_recipe(recipename, workspace, rd, mode, appendlayerdir, \
wildcard_version, no_remove, initial_rev, no_report_remove=False, \
dry_run_outdir=None, no_overrides=False, force_patch_refresh=False): srctree = \
workspace[recipename]['srctree'] if mode == 'auto':
@@ -1829,6 +1848,7 @@ def _update_recipe(recipename, workspace, rd, mode, \
appendlayerdir, wildcard_ver
return anyupdated, appendfile, allremoved
+
def update_recipe(args, config, basepath, workspace):
"""Entry point for the devtool 'update-recipe' subcommand"""
check_workspace_recipe(workspace, args.recipename)
@@ -1937,6 +1957,7 @@ def _reset(recipes, no_clean, remove_work, config, basepath, \
workspace): os.remove(appendfile)
preservepath = os.path.join(config.workspace_path, 'attic', pn, pn)
+
def preservedir(origdir):
if os.path.exists(origdir):
for root, dirs, files in os.walk(origdir):
@@ -1973,6 +1994,7 @@ def _reset(recipes, no_clean, remove_work, config, basepath, \
workspace):
clean_preferred_provider(pn, config.workspace_path)
+
def reset(args, config, basepath, workspace):
"""Entry point for the devtool 'reset' subcommand"""
import bb
@@ -2211,6 +2233,7 @@ def get_default_srctree(config, recipename=''):
else:
return os.path.join(srctreeparent, 'sources')
+
def register_commands(subparsers, context):
"""Register devtool subcommands from this plugin"""
diff --git a/scripts/lib/devtool/upgrade.py b/scripts/lib/devtool/upgrade.py
index 0605a01f87..d5ed52be33 100644
--- a/scripts/lib/devtool/upgrade.py
+++ b/scripts/lib/devtool/upgrade.py
@@ -26,10 +26,12 @@ from devtool import exec_build_env_command, setup_tinfoil, \
DevtoolError, parse_r
logger = logging.getLogger('devtool')
+
def _run(cmd, cwd=''):
logger.debug("Running command %s> %s" % (cwd, cmd))
return bb.process.run('%s' % cmd, cwd=cwd)
+
def _get_srctree(tmpdir):
srctree = tmpdir
dirs = scriptutils.filter_src_subdirs(tmpdir)
@@ -37,6 +39,7 @@ def _get_srctree(tmpdir):
srctree = os.path.join(tmpdir, dirs[0])
return srctree
+
def _copy_source_code(orig, dest):
for path in standard._ls_tree(orig):
dest_dir = os.path.join(dest, os.path.dirname(path))
@@ -44,11 +47,13 @@ def _copy_source_code(orig, dest):
dest_path = os.path.join(dest, path)
shutil.move(os.path.join(orig, path), dest_path)
+
def _remove_patch_dirs(recipefolder):
for root, dirs, files in os.walk(recipefolder):
for d in dirs:
shutil.rmtree(os.path.join(root, d))
+
def _recipe_contains(rd, var):
rf = rd.getVar('FILE')
varfiles = oe.recipeutils.get_var_files(rf, [var], rd)
@@ -57,6 +62,7 @@ def _recipe_contains(rd, var):
return True
return False
+
def _rename_recipe_dirs(oldpv, newpv, path):
for root, dirs, files in os.walk(path):
# Rename directories with the version in their name
@@ -74,6 +80,7 @@ def _rename_recipe_dirs(oldpv, newpv, path):
bb.utils.rename(os.path.join(path, oldfile),
os.path.join(path, newfile))
+
def _rename_recipe_file(oldrecipe, bpn, oldpv, newpv, path):
oldrecipe = os.path.basename(oldrecipe)
if oldrecipe.endswith('_%s.bb' % oldpv):
@@ -84,10 +91,12 @@ def _rename_recipe_file(oldrecipe, bpn, oldpv, newpv, path):
newrecipe = oldrecipe
return os.path.join(path, newrecipe)
+
def _rename_recipe_files(oldrecipe, bpn, oldpv, newpv, path):
_rename_recipe_dirs(oldpv, newpv, path)
return _rename_recipe_file(oldrecipe, bpn, oldpv, newpv, path)
+
def _write_append(rc, srctree, same_dir, no_same_dir, rev, copied, workspace, d):
"""Writes an append file"""
if not os.path.exists(rc):
@@ -119,6 +128,7 @@ def _write_append(rc, srctree, same_dir, no_same_dir, rev, \
copied, workspace, d) f.write('# original_files: %s\n' % ' '.join(copied))
return af
+
def _cleanup_on_error(rf, srctree):
rfp = os.path.split(rf)[0] # recipe folder
rfpp = os.path.split(rfp)[0] # recipes folder
@@ -130,6 +140,7 @@ def _cleanup_on_error(rf, srctree):
if os.path.exists(srctree):
shutil.rmtree(srctree)
+
def _upgrade_error(e, rf, srctree, keep_failure=False, extramsg=None):
if rf and not keep_failure:
_cleanup_on_error(rf, srctree)
@@ -140,6 +151,7 @@ def _upgrade_error(e, rf, srctree, keep_failure=False, \
extramsg=None): logger.info('Preserving failed upgrade files (--keep-failure)')
sys.exit(1)
+
def _get_uri(rd):
srcuris = rd.getVar('SRC_URI').split()
if not len(srcuris):
@@ -163,6 +175,7 @@ def _get_uri(rd):
srcuri = rev_re.sub('', srcuri)
return srcuri, srcrev
+
def _extract_new_source(newpv, srctree, no_patch, srcrev, srcbranch, branch, \
keep_temp, tinfoil, rd): """Extract sources of a recipe with a new version"""
@@ -286,6 +299,7 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, \
srcbranch, branch, kee
return (rev, md5, sha256, srcbranch, srcsubdir_rel)
+
def _add_license_diff_to_recipe(path, diff):
notice_text = """# FIXME: the LIC_FILES_CHKSUM values have been updated by \
'devtool upgrade'. # The following is the difference between the old and the new \
license text. @@ -305,6 +319,7 @@ def _add_license_diff_to_recipe(path, diff):
f.write("\n#\n\n".encode())
f.write(orig_content)
+
def _create_new_recipe(newpv, md5, sha256, srcrev, srcbranch, srcsubdir_old, \
srcsubdir_new, workspace, tinfoil, rd, license_diff, new_licenses, srctree, \
keep_failure): """Creates the new recipe under workspace"""
@@ -452,6 +467,7 @@ def _check_git_config():
if configerr:
raise DevtoolError('Your git configuration is incomplete which will prevent \
rebases from working:\n' + '\n'.join(configerr))
+
def _extract_licenses(srcpath, recipe_licenses):
licenses = []
for url in recipe_licenses.split():
@@ -478,6 +494,7 @@ def _extract_licenses(srcpath, recipe_licenses):
licenses.append(license)
return licenses
+
def _generate_license_diff(old_licenses, new_licenses):
need_diff = False
for l in new_licenses:
@@ -494,6 +511,7 @@ def _generate_license_diff(old_licenses, new_licenses):
diff = diff + line
return diff
+
def upgrade(args, config, basepath, workspace):
"""Entry point for the devtool 'upgrade' subcommand"""
@@ -578,6 +596,7 @@ def upgrade(args, config, basepath, workspace):
tinfoil.shutdown()
return 0
+
def latest_version(args, config, basepath, workspace):
"""Entry point for the devtool 'latest_version' subcommand"""
tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
@@ -598,6 +617,7 @@ def latest_version(args, config, basepath, workspace):
tinfoil.shutdown()
return 0
+
def check_upgrade_status(args, config, basepath, workspace):
if not args.recipe:
logger.info("Checking the upstream status for all recipes may take a few \
minutes") @@ -612,6 +632,7 @@ def check_upgrade_status(args, config, basepath, \
workspace):
result[5] if \
result[5] != 'N/A' else "",
"cannot be updated \
due to: %s" % (result[6]) if result[6] else ""))
+
def register_commands(subparsers, context):
"""Register devtool subcommands from this plugin"""
diff --git a/scripts/lib/devtool/utilcmds.py b/scripts/lib/devtool/utilcmds.py
index 964817766b..dbe69b03b2 100644
--- a/scripts/lib/devtool/utilcmds.py
+++ b/scripts/lib/devtool/utilcmds.py
@@ -20,6 +20,7 @@ from devtool import parse_recipe
logger = logging.getLogger('devtool')
+
def _find_recipe_path(args, config, basepath, workspace):
if args.any_recipe:
logger.warning('-a/--any-recipe option is now always active, and thus the \
option will be removed in a future release')
diff --git a/scripts/lib/recipetool/append.py b/scripts/lib/recipetool/append.py
index ce91c3713c..8955664706 100644
--- a/scripts/lib/recipetool/append.py
+++ b/scripts/lib/recipetool/append.py
@@ -23,6 +23,7 @@ logger = logging.getLogger('recipetool')
tinfoil = None
+
def tinfoil_init(instance):
global tinfoil
tinfoil = instance
@@ -34,6 +35,7 @@ def tinfoil_init(instance):
class InvalidTargetFileError(Exception):
pass
+
def find_target_file(targetpath, d, pkglist=None):
"""Find the recipe installing the specified target path, optionally limited to a \
select list of packages""" import json
@@ -87,6 +89,7 @@ def find_target_file(targetpath, d, pkglist=None):
recipes[targetpath].append('!%s' % pn)
return recipes
+
def _parse_recipe(pn, tinfoil):
try:
rd = tinfoil.parse_recipe(pn)
@@ -95,6 +98,7 @@ def _parse_recipe(pn, tinfoil):
return None
return rd
+
def determine_file_source(targetpath, rd):
"""Assuming we know a file came from a specific recipe, figure out exactly where \
it came from""" import oe.recipeutils
@@ -144,6 +148,7 @@ def determine_file_source(targetpath, rd):
return (srcfile, elements, modpatches)
+
def get_source_path(cmdelements):
"""Find the source path specified within a command"""
command = cmdelements[0]
@@ -178,6 +183,7 @@ def get_source_path(cmdelements):
else:
raise Exception('get_source_path: no handling for command "%s"')
+
def get_func_deps(func, d):
"""Find the function dependencies of a shell function"""
deps = bb.codeparser.ShellParser(func, logger).parse_shell(d.getVar(func))
@@ -188,6 +194,7 @@ def get_func_deps(func, d):
funcdeps.append(dep)
return funcdeps
+
def check_do_install(rd, targetpath):
"""Look at do_install for a command that installs/copies the specified target \
path"""
instpath = os.path.abspath(os.path.join(rd.getVar('D'), targetpath.lstrip('/')))
diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py
index 9d531948e5..cd8ac24af4 100644
--- a/scripts/lib/recipetool/create.py
+++ b/scripts/lib/recipetool/create.py
@@ -22,27 +22,32 @@ logger = logging.getLogger('recipetool')
tinfoil = None
plugins = None
+
def log_error_cond(message, debugonly):
if debugonly:
logger.debug(message)
else:
logger.error(message)
+
def log_info_cond(message, debugonly):
if debugonly:
logger.debug(message)
else:
logger.info(message)
+
def plugin_init(pluginlist):
# Take a reference to the list so we can use it later
global plugins
plugins = pluginlist
+
def tinfoil_init(instance):
global tinfoil
tinfoil = instance
+
class RecipeHandler(object):
recipelibmap = {}
recipeheadermap = {}
@@ -264,6 +269,7 @@ def validate_pv(pv):
return False
return True
+
def determine_from_filename(srcfile):
"""Determine name and version from a filename"""
if is_package(srcfile):
@@ -311,6 +317,7 @@ def determine_from_filename(srcfile):
logger.debug('determine_from_filename: name = "%s" version = "%s"' % (pn, pv))
return (pn, pv)
+
def determine_from_url(srcuri):
"""Determine name and version from a URL"""
pn = None
@@ -345,6 +352,7 @@ def determine_from_url(srcuri):
logger.debug('Determined from source URL: name = "%s", version = "%s"' % (pn, \
pv)) return (pn, pv)
+
def supports_srcrev(uri):
localdata = bb.data.createCopy(tinfoil.config_data)
# This is a bit sad, but if you don't have this set there can be some
@@ -363,6 +371,7 @@ def supports_srcrev(uri):
return True
return False
+
def reformat_git_uri(uri):
'''Convert any http[s]://....git URI into git://...;protocol=http[s]'''
checkuri = uri.split(';', 1)[0]
@@ -395,6 +404,7 @@ def reformat_git_uri(uri):
else:
return uri
+
def is_package(url):
'''Check if a URL points to a package'''
checkurl = url.split(';', 1)[0]
@@ -402,6 +412,7 @@ def is_package(url):
return True
return False
+
def create_recipe(args):
import bb.process
import tempfile
@@ -904,6 +915,7 @@ def create_recipe(args):
return 0
+
def check_single_file(fn, fetchuri):
"""Determine if a single downloaded file is something we can't handle"""
with open(fn, 'r', errors='surrogateescape') as f:
@@ -911,12 +923,14 @@ def check_single_file(fn, fetchuri):
logger.error('Fetching "%s" returned a single HTML page - check the URL \
is correct and functional' % fetchuri) sys.exit(1)
+
def split_value(value):
if isinstance(value, str):
return value.split()
else:
return value
+
def handle_license_vars(srctree, lines_before, handled, extravalues, d):
lichandled = [x for x in handled if x[0] == 'license']
if lichandled:
@@ -1002,6 +1016,7 @@ def handle_license_vars(srctree, lines_before, handled, \
extravalues, d): handled.append(('license', licvalues))
return licvalues
+
def get_license_md5sums(d, static_only=False):
import bb.utils
md5sums = {}
@@ -1053,6 +1068,7 @@ def get_license_md5sums(d, static_only=False):
md5sums['bfe1f75d606912a4111c90743d6c7325'] = 'MPL-1.1'
return md5sums
+
def crunch_license(licfile):
'''
Remove non-material text from a license file and then check
@@ -1127,6 +1143,7 @@ def crunch_license(licfile):
license = crunched_md5sums.get(md5val, None)
return license, md5val, lictext
+
def guess_license(srctree, d):
import bb
md5sums = get_license_md5sums(d)
@@ -1154,6 +1171,7 @@ def guess_license(srctree, d):
return licenses
+
def split_pkg_licenses(licvalues, packages, outlines, fallback_licenses=None, \
pn='${PN}'): """
Given a list of (license, path, md5sum) as returned by guess_license(),
@@ -1181,6 +1199,7 @@ def split_pkg_licenses(licvalues, packages, outlines, \
fallback_licenses=None, pn outlicenses[pkgname] = license.split()
return outlicenses
+
def read_pkgconfig_provides(d):
pkgdatadir = d.getVar('PKGDATA_DIR')
pkgmap = {}
@@ -1198,6 +1217,7 @@ def read_pkgconfig_provides(d):
recipemap[pc] = line.split(':', 1)[1].strip()
return recipemap
+
def convert_debian(debpath):
value_map = {'Package': 'PN',
'Version': 'PV',
@@ -1268,6 +1288,7 @@ def convert_debian(debpath):
return values
+
def convert_rpm_xml(xmlfile):
'''Converts the output from rpm -qp --xml to a set of variable values'''
import xml.etree.ElementTree as ElementTree
diff --git a/scripts/lib/recipetool/create_buildsys.py \
b/scripts/lib/recipetool/create_buildsys.py index 44b398d792..3a040b74be 100644
--- a/scripts/lib/recipetool/create_buildsys.py
+++ b/scripts/lib/recipetool/create_buildsys.py
@@ -15,11 +15,13 @@ logger = logging.getLogger('recipetool')
tinfoil = None
plugins = None
+
def plugin_init(pluginlist):
# Take a reference to the list so we can use it later
global plugins
plugins = pluginlist
+
def tinfoil_init(instance):
global tinfoil
tinfoil = instance
@@ -279,6 +281,7 @@ class CmakeRecipeHandler(RecipeHandler):
class CmakeExtensionHandler(object):
'''Base class for CMake extension handlers'''
+
def process_line(self, srctree, fn, line, libdeps, pcdeps, deps, outlines, \
inherits, values): '''
Handle a line parsed out of an CMake file.
@@ -300,7 +303,6 @@ class CmakeExtensionHandler(object):
return
-
class SconsRecipeHandler(RecipeHandler):
def process(self, srctree, classes, lines_before, lines_after, handled, \
extravalues): if 'buildsystem' in handled:
@@ -435,6 +437,7 @@ class AutotoolsRecipeHandler(RecipeHandler):
version_re = re.compile('([0-9.]+)')
defines = {}
+
def subst_defines(value):
newvalue = value
for define, defval in defines.items():
@@ -703,6 +706,7 @@ class AutotoolsRecipeHandler(RecipeHandler):
class AutotoolsExtensionHandler(object):
'''Base class for Autotools extension handlers'''
+
def process_macro(self, srctree, keyword, value, process_value, libdeps, pcdeps, \
deps, outlines, inherits, values): '''
Handle a macro parsed out of an autotools file. Note that if you want this \
to be called @@ -862,6 +866,7 @@ class SpecFileRecipeHandler(RecipeHandler):
lines_before.append(liccomment)
extravalues.update(foundvalues)
+
def register_recipe_handlers(handlers):
# Set priorities with some gaps so that other plugins can insert
# their own handlers (so avoid changing these numbers)
diff --git a/scripts/lib/recipetool/create_kernel.py \
b/scripts/lib/recipetool/create_kernel.py index 5740589a68..a1fa5e6247 100644
--- a/scripts/lib/recipetool/create_kernel.py
+++ b/scripts/lib/recipetool/create_kernel.py
@@ -13,6 +13,7 @@ logger = logging.getLogger('recipetool')
tinfoil = None
+
def tinfoil_init(instance):
global tinfoil
tinfoil = instance
@@ -32,6 +33,7 @@ class KernelRecipeHandler(RecipeHandler):
del lines_after[:]
del classes[:]
template = os.path.join(tinfoil.config_data.getVar('COREBASE'), \
'meta-skeleton', 'recipes-kernel', 'linux', 'linux-yocto-custom.bb') +
def handle_var(varname, origvalue, op, newlines):
if varname in ['SRCREV', 'SRCREV_machine']:
while newlines[-1].startswith('#'):
@@ -85,5 +87,6 @@ class KernelRecipeHandler(RecipeHandler):
return True
+
def register_recipe_handlers(handlers):
handlers.append((KernelRecipeHandler(), 100))
diff --git a/scripts/lib/recipetool/create_kmod.py \
b/scripts/lib/recipetool/create_kmod.py index 85b5c48e53..3e8217561e 100644
--- a/scripts/lib/recipetool/create_kmod.py
+++ b/scripts/lib/recipetool/create_kmod.py
@@ -13,6 +13,7 @@ logger = logging.getLogger('recipetool')
tinfoil = None
+
def tinfoil_init(instance):
global tinfoil
tinfoil = instance
@@ -138,5 +139,6 @@ class KernelModuleRecipeHandler(RecipeHandler):
return False
+
def register_recipe_handlers(handlers):
handlers.append((KernelModuleRecipeHandler(), 15))
diff --git a/scripts/lib/recipetool/create_npm.py \
b/scripts/lib/recipetool/create_npm.py index 4f24d621a7..448081735f 100644
--- a/scripts/lib/recipetool/create_npm.py
+++ b/scripts/lib/recipetool/create_npm.py
@@ -19,11 +19,13 @@ from recipetool.create import split_pkg_licenses
TINFOIL = None
+
def tinfoil_init(instance):
"""Initialize tinfoil"""
global TINFOIL
TINFOIL = instance
+
class NpmRecipeHandler(RecipeHandler):
"""Class to handle the npm recipe creation"""
@@ -254,6 +256,7 @@ class NpmRecipeHandler(RecipeHandler):
return True
+
def register_recipe_handlers(handlers):
"""Register the npm handler"""
handlers.append((NpmRecipeHandler(), 60))
diff --git a/scripts/lib/recipetool/setvar.py b/scripts/lib/recipetool/setvar.py
index f8e2ee75fb..b789254793 100644
--- a/scripts/lib/recipetool/setvar.py
+++ b/scripts/lib/recipetool/setvar.py
@@ -19,10 +19,12 @@ logger = logging.getLogger('recipetool')
tinfoil = None
plugins = None
+
def tinfoil_init(instance):
global tinfoil
tinfoil = instance
+
def setvar(args):
import oe.recipeutils
diff --git a/scripts/lib/resulttool/log.py b/scripts/lib/resulttool/log.py
index eb3927ec82..c46d5b4b5c 100644
--- a/scripts/lib/resulttool/log.py
+++ b/scripts/lib/resulttool/log.py
@@ -7,6 +7,7 @@
import os
import resulttool.resultutils as resultutils
+
def show_ptest(result, ptest, logger):
logdata = resultutils.ptestresult_get_log(result, ptest)
if logdata is not None:
@@ -16,6 +17,7 @@ def show_ptest(result, ptest, logger):
print("ptest '%s' log not found" % ptest)
return 1
+
def show_reproducible(result, reproducible, logger):
try:
print(result['reproducible'][reproducible]['diffoscope.text'])
@@ -25,6 +27,7 @@ def show_reproducible(result, reproducible, logger):
print("reproducible '%s' not found" % reproducible)
return 1
+
def log(args, logger):
results = resultutils.load_resultsdata(args.source)
@@ -78,6 +81,7 @@ def log(args, logger):
if not show_reproducible(r, reproducible, logger):
return 1
+
def register_commands(subparsers):
"""Register subcommands from this plugin"""
parser = subparsers.add_parser('log', help='show logs',
diff --git a/scripts/lib/resulttool/manualexecution.py \
b/scripts/lib/resulttool/manualexecution.py index 2bd4f6f136..9bf51dd047 100755
--- a/scripts/lib/resulttool/manualexecution.py
+++ b/scripts/lib/resulttool/manualexecution.py
@@ -19,11 +19,13 @@ def load_json_file(f):
with open(f, "r") as filedata:
return json.load(filedata)
+
def write_json_file(f, json_data):
os.makedirs(os.path.dirname(f), exist_ok=True)
with open(f, 'w') as filedata:
filedata.write(json.dumps(json_data, sort_keys=True, indent=4))
+
class ManualTestRunner(object):
def _get_test_module(self, case_file):
@@ -205,6 +207,7 @@ class ManualTestRunner(object):
write_json_file(testcase_config_file, new_testcase_config)
logger.info('Testcase Configuration file created at %s' % \
testcase_config_file)
+
def manualexecution(args, logger):
testrunner = ManualTestRunner()
if args.make_config_options_file:
@@ -218,6 +221,7 @@ def manualexecution(args, logger):
resultjsonhelper.dump_testresult_file(write_dir, configurations, result_id, \
test_results) return 0
+
def register_commands(subparsers):
"""Register subcommands from this plugin"""
parser_build = subparsers.add_parser('manualexecution', help='helper script for \
results populating during manual test execution.',
diff --git a/scripts/lib/resulttool/merge.py b/scripts/lib/resulttool/merge.py
index 18b4825a18..05d0b0ed13 100644
--- a/scripts/lib/resulttool/merge.py
+++ b/scripts/lib/resulttool/merge.py
@@ -10,6 +10,7 @@ import os
import json
import resulttool.resultutils as resultutils
+
def merge(args, logger):
configvars = {}
if not args.not_add_testseries:
@@ -30,6 +31,7 @@ def merge(args, logger):
return 0
+
def register_commands(subparsers):
"""Register subcommands from this plugin"""
parser_build = subparsers.add_parser('merge', help='merge test result \
files/directories/URLs',
diff --git a/scripts/lib/resulttool/regression.py \
b/scripts/lib/resulttool/regression.py index 9f952951b3..c1f9460f2e 100644
--- a/scripts/lib/resulttool/regression.py
+++ b/scripts/lib/resulttool/regression.py
@@ -12,6 +12,7 @@ import json
from oeqa.utils.git import GitRepo
import oeqa.utils.gitarchive as gitarchive
+
def compare_result(logger, base_name, target_name, base_result, target_result):
base_result = base_result.get('result')
target_result = target_result.get('result')
@@ -35,15 +36,18 @@ def compare_result(logger, base_name, target_name, base_result, \
target_result): resultstring = "Match: %s\n %s" % (base_name, target_name)
return result, resultstring
+
def get_results(logger, source):
return resultutils.load_resultsdata(source, \
configmap=resultutils.regression_map)
+
def regression(args, logger):
base_results = get_results(logger, args.base_result)
target_results = get_results(logger, args.target_result)
regression_common(args, logger, base_results, target_results)
+
def regression_common(args, logger, base_results, target_results):
if args.base_result_id:
base_results = resultutils.filter_resultsdata(base_results, \
args.base_result_id) @@ -82,6 +86,7 @@ def regression_common(args, logger, \
base_results, target_results):
return 0
+
def regression_git(args, logger):
base_results = {}
target_results = {}
@@ -147,6 +152,7 @@ def regression_git(args, logger):
return 0
+
def register_commands(subparsers):
"""Register subcommands from this plugin"""
diff --git a/scripts/lib/resulttool/report.py b/scripts/lib/resulttool/report.py
index a4f1d11bef..8c74f51b58 100644
--- a/scripts/lib/resulttool/report.py
+++ b/scripts/lib/resulttool/report.py
@@ -23,7 +23,6 @@ class ResultsTextReport(object):
'failed': ['FAILED', 'failed', 'FAIL', 'ERROR', \
'error', 'UNKNOWN', 'XPASS'],
'skipped': ['SKIPPED', 'skipped', 'UNSUPPORTED', \
'UNTESTED', 'UNRESOLVED']}
-
def handle_ptest_result(self, k, status, result, machine):
if machine not in self.ptests:
self.ptests[machine] = {}
@@ -284,12 +283,14 @@ class ResultsTextReport(object):
test_count_reports.append(test_count_report)
self.print_test_report('test_report_full_text.txt', test_count_reports)
+
def report(args, logger):
report = ResultsTextReport()
report.view_test_report(logger, args.source_dir, args.branch, args.commit, \
args.tag, args.use_regression_map,
args.raw_test_only, args.selected_test_case_only)
return 0
+
def register_commands(subparsers):
"""Register subcommands from this plugin"""
parser_build = subparsers.add_parser('report', help='summarise test results',
diff --git a/scripts/lib/resulttool/resultutils.py \
b/scripts/lib/resulttool/resultutils.py index 8917022d36..d882b6d322 100644
--- a/scripts/lib/resulttool/resultutils.py
+++ b/scripts/lib/resulttool/resultutils.py
@@ -38,17 +38,21 @@ store_map = {
"manual": ['TEST_TYPE', 'TEST_MODULE', 'MACHINE', 'IMAGE_BASENAME']
}
+
def is_url(p):
"""
Helper for determining if the given path is a URL
"""
return p.startswith('http://') or p.startswith('https://')
+
extra_configvars = {'TESTSERIES': ''}
#
# Load the json file and append the results data into the provided results dict
#
+
+
def append_resultsdata(results, f, configmap=store_map, \
configvars=extra_configvars): if type(f) is str:
if is_url(f):
@@ -83,6 +87,8 @@ def append_resultsdata(results, f, configmap=store_map, \
configvars=extra_configv # Walk a directory and find/load results data
# or load directly from a file
#
+
+
def load_resultsdata(source, configmap=store_map, configvars=extra_configvars):
results = {}
if is_url(source) or os.path.isfile(source):
@@ -95,6 +101,7 @@ def load_resultsdata(source, configmap=store_map, \
configvars=extra_configvars): append_resultsdata(results, f, configmap, configvars)
return results
+
def filter_resultsdata(results, resultid):
newresults = {}
for r in results:
@@ -104,6 +111,7 @@ def filter_resultsdata(results, resultid):
newresults[r][i] = results[r][i]
return newresults
+
def strip_ptestresults(results):
newresults = copy.deepcopy(results)
#for a in newresults2:
@@ -119,6 +127,7 @@ def strip_ptestresults(results):
del newresults[res]['result']['ptestresult.sections'][i]['log']
return newresults
+
def decode_log(logdata):
if isinstance(logdata, str):
return logdata
@@ -130,6 +139,7 @@ def decode_log(logdata):
return data.decode("utf-8", errors='ignore')
return None
+
def generic_get_log(sectionname, results, section):
if sectionname not in results:
return None
@@ -141,9 +151,11 @@ def generic_get_log(sectionname, results, section):
return None
return decode_log(ptest['log'])
+
def ptestresult_get_log(results, section):
return generic_get_log('ptestresuls.sections', results, section)
+
def generic_get_rawlogs(sectname, results):
if sectname not in results:
return None
@@ -151,9 +163,11 @@ def generic_get_rawlogs(sectname, results):
return None
return decode_log(results[sectname]['log'])
+
def ptestresult_get_rawlogs(results):
return generic_get_rawlogs('ptestresult.rawlogs', results)
+
def save_resultsdata(results, destdir, fn="testresults.json", ptestjson=False, \
ptestlogs=False): for res in results:
if res:
@@ -180,6 +194,7 @@ def save_resultsdata(results, destdir, fn="testresults.json", \
ptestjson=False, p
with open(dst.replace(fn, "ptest-%s.log" % i), "w+") as \
f: f.write(sectionlog)
+
def git_get_result(repo, tags, configmap=store_map):
git_objs = []
for tag in tags:
@@ -207,6 +222,7 @@ def git_get_result(repo, tags, configmap=store_map):
return results
+
def test_run_results(results):
"""
Convenient generator function that iterates over all test runs that have a
diff --git a/scripts/lib/resulttool/store.py b/scripts/lib/resulttool/store.py
index baec9e27f9..f082b0ef77 100644
--- a/scripts/lib/resulttool/store.py
+++ b/scripts/lib/resulttool/store.py
@@ -82,6 +82,7 @@ def store(args, logger):
return 0
+
def register_commands(subparsers):
"""Register subcommands from this plugin"""
parser_build = subparsers.add_parser('store', help='store test results into a \
git repository',
diff --git a/scripts/lib/scriptpath.py b/scripts/lib/scriptpath.py
index f32326db3a..e8eb458290 100644
--- a/scripts/lib/scriptpath.py
+++ b/scripts/lib/scriptpath.py
@@ -10,11 +10,13 @@ import sys
import os
import os.path
+
def add_oe_lib_path():
basepath = os.path.abspath(os.path.dirname(__file__) + '/../..')
newpath = basepath + '/meta/lib'
sys.path.insert(0, newpath)
+
def add_bitbake_lib_path():
basepath = os.path.abspath(os.path.dirname(__file__) + '/../..')
bitbakepath = None
diff --git a/scripts/lib/scriptutils.py b/scripts/lib/scriptutils.py
index 50c9c95cd6..3e0415ae10 100644
--- a/scripts/lib/scriptutils.py
+++ b/scripts/lib/scriptutils.py
@@ -20,6 +20,7 @@ import threading
import importlib
from importlib import machinery
+
class KeepAliveStreamHandler(logging.StreamHandler):
def __init__(self, keepalive=True, **kwargs):
super().__init__(**kwargs)
@@ -55,6 +56,7 @@ class KeepAliveStreamHandler(logging.StreamHandler):
with self._timeout:
self._timeout.notify()
+
def logger_create(name, stream=None, keepalive=None):
logger = logging.getLogger(name)
if keepalive is not None:
@@ -66,6 +68,7 @@ def logger_create(name, stream=None, keepalive=None):
logger.setLevel(logging.INFO)
return logger
+
def logger_setup_color(logger, color='auto'):
from bb.msg import BBLogFormatter
@@ -109,6 +112,7 @@ def git_convert_standalone_clone(repodir):
bb.process.run('git repack -a', cwd=repodir)
os.remove(alternatesfile)
+
def _get_temp_recipe_dir(d):
# This is a little bit hacky but we need to find a place where we can put
# the recipe so that bitbake can find it. We're going to delete it at the
@@ -125,12 +129,15 @@ def _get_temp_recipe_dir(d):
break
return fetchrecipedir
+
class FetchUrlFailure(Exception):
def __init__(self, url):
self.url = url
+
def __str__(self):
return "Failed to fetch URL %s" % self.url
+
def fetch_url(tinfoil, srcuri, srcrev, destdir, logger, preserve_tmp=False, \
mirrors=False): """
Fetch the specified URL using normal do_fetch and do_unpack tasks, i.e.
@@ -255,6 +262,7 @@ def run_editor(fn, logger=None):
logger.error("Execution of '%s' failed: %s" % (editor, exc))
return 1
+
def is_src_url(param):
"""
Check if a parameter is a URL and return True if so
@@ -268,6 +276,7 @@ def is_src_url(param):
return True
return False
+
def filter_src_subdirs(pth):
"""
Filter out subdirectories of initial unpacked source trees that we do not care \
about.
diff --git a/scripts/lib/wic/__init__.py b/scripts/lib/wic/__init__.py
index 85567934ae..d54a0e886d 100644
--- a/scripts/lib/wic/__init__.py
+++ b/scripts/lib/wic/__init__.py
@@ -6,5 +6,6 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+
class WicError(Exception):
pass
diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index cef201aec8..c3e9a5d408 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -31,6 +31,7 @@ from wic.misc import get_bitbake_var, exec_cmd
logger = logging.getLogger('wic')
+
def verify_build_env():
"""
Verify that the build environment is sane.
@@ -47,6 +48,7 @@ CANNED_IMAGE_DIR = "lib/wic/canned-wks" # relative to scripts
SCRIPTS_CANNED_IMAGE_DIR = "scripts/" + CANNED_IMAGE_DIR
WIC_DIR = "wic"
+
def build_canned_image_list(path):
layers_path = get_bitbake_var("BBLAYERS")
canned_wks_layer_dirs = []
@@ -63,6 +65,7 @@ def build_canned_image_list(path):
return canned_wks_layer_dirs
+
def find_canned_image(scripts_path, wks_file):
"""
Find a .wks file with the given name in the canned files dir.
@@ -553,6 +556,7 @@ class Disk:
elif part['type'] != 'f':
logger.warning("skipping partition {}: unsupported fstype \
{}".format(pnum, fstype))
+
def wic_ls(args, native_sysroot):
"""List contents of partitioned image or vfat partition."""
disk = Disk(args.path.image, native_sysroot)
@@ -567,6 +571,7 @@ def wic_ls(args, native_sysroot):
path = args.path.path or '/'
print(disk.dir(args.path.part, path))
+
def wic_cp(args, native_sysroot):
"""
Copy file or directory to/from the vfat/ext partition of
@@ -587,6 +592,7 @@ def wic_rm(args, native_sysroot):
disk = Disk(args.path.image, native_sysroot)
disk.remove(args.path.part, args.path.path, args.recursive_delete)
+
def wic_write(args, native_sysroot):
"""
Write image to a target device.
@@ -594,6 +600,7 @@ def wic_write(args, native_sysroot):
disk = Disk(args.image, native_sysroot, ('fat', 'ext', 'linux-swap'))
disk.write(args.target, args.expand)
+
def find_canned(scripts_path, file_name):
"""
Find a file either by its path or by name in the canned files dir.
@@ -611,6 +618,7 @@ def find_canned(scripts_path, file_name):
fullpath = os.path.join(canned_wks_dir, fname)
return fullpath
+
def get_custom_config(boot_file):
"""
Get the custom configuration to be used for the bootloader.
diff --git a/scripts/lib/wic/filemap.py b/scripts/lib/wic/filemap.py
index 6f733d5365..e25c66a223 100644
--- a/scripts/lib/wic/filemap.py
+++ b/scripts/lib/wic/filemap.py
@@ -25,6 +25,7 @@ import fcntl
import tempfile
import logging
+
def get_block_size(file_obj):
"""
Returns block size for file object 'file_obj'. Errors are indicated by the
@@ -48,6 +49,7 @@ def get_block_size(file_obj):
raise IOError("Unable to determine block size")
return bsize
+
class ErrorNotSupp(Exception):
"""
An exception of this type is raised when the 'FIEMAP' or 'SEEK_HOLE' feature
@@ -55,6 +57,7 @@ class ErrorNotSupp(Exception):
"""
pass
+
class Error(Exception):
"""A class for all the other exceptions raised by this module."""
pass
@@ -160,6 +163,7 @@ class _FilemapBase(object):
_SEEK_DATA = 3
_SEEK_HOLE = 4
+
def _lseek(file_obj, offset, whence):
"""This is a helper function which invokes 'os.lseek' for file object
'file_obj' and with specified 'offset' and 'whence'. The 'whence'
@@ -180,6 +184,7 @@ def _lseek(file_obj, offset, whence):
else:
raise
+
class FilemapSeek(_FilemapBase):
"""
This class uses the 'SEEK_HOLE' and 'SEEK_DATA' to find file block mapping.
@@ -304,6 +309,7 @@ _FIEMAP_FLAG_SYNC = 0x00000001
# FIEMAP ioctl will be invoked.
_FIEMAP_BUFFER_SIZE = 256 * 1024
+
class FilemapFiemap(_FilemapBase):
"""
This class provides API to the FIEMAP ioctl. Namely, it allows to iterate
@@ -469,6 +475,7 @@ class FilemapFiemap(_FilemapBase):
% (first_prev, last_prev))
yield (first_prev, last_prev)
+
class FilemapNobmap(_FilemapBase):
"""
This class is used when both the 'SEEK_DATA/HOLE' and FIEMAP are not
@@ -492,6 +499,7 @@ class FilemapNobmap(_FilemapBase):
% (start, count, start + count - 1))
yield (start, start + count - 1)
+
def filemap(image, log=None):
"""
Create and return an instance of a Filemap class - 'FilemapFiemap' or
@@ -510,6 +518,7 @@ def filemap(image, log=None):
except ErrorNotSupp:
return FilemapNobmap(image, log)
+
def sparse_copy(src_fname, dst_fname, skip=0, seek=0,
length=0, api=None):
"""
diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py
index 991e5094bb..30c6c0e8d5 100644
--- a/scripts/lib/wic/help.py
+++ b/scripts/lib/wic/help.py
@@ -17,6 +17,7 @@ from wic.pluginbase import PluginMgr, PLUGIN_TYPES
logger = logging.getLogger('wic')
+
def subcommand_error(args):
logger.info("invalid subcommand %s", args[0])
diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
index b644e68da3..866aab371e 100644
--- a/scripts/lib/wic/ksparser.py
+++ b/scripts/lib/wic/ksparser.py
@@ -27,6 +27,7 @@ logger = logging.getLogger('wic')
__expand_var_regexp__ = re.compile(r"\${[^{}@\n\t :]+}")
+
def expand_line(line):
while True:
m = __expand_var_regexp__.search(line)
@@ -39,18 +40,22 @@ def expand_line(line):
return line
line = line[:m.start()] + val + line[m.end():]
+
class KickStartError(Exception):
"""Custom exception."""
pass
+
class KickStartParser(ArgumentParser):
"""
This class overwrites error method to throw exception
instead of producing usage message(default argparse behavior).
"""
+
def error(self, message):
raise ArgumentError(None, message)
+
def sizetype(default, size_in_bytes=False):
def f(arg):
"""
@@ -67,7 +72,6 @@ def sizetype(default, size_in_bytes=False):
except ValueError:
raise ArgumentTypeError("Invalid size: %r" % arg)
-
if size_in_bytes:
if suffix == 's' or suffix == 'S':
return size * 512
@@ -85,6 +89,7 @@ def sizetype(default, size_in_bytes=False):
raise ArgumentTypeError("Invalid size: %r" % arg)
return f
+
def overheadtype(arg):
"""
Custom type for ArgumentParser
@@ -100,6 +105,7 @@ def overheadtype(arg):
return result
+
def cannedpathtype(arg):
"""
Custom type for ArgumentParser
@@ -111,6 +117,7 @@ def cannedpathtype(arg):
raise ArgumentTypeError("file not found: %s" % arg)
return result
+
def systemidtype(arg):
"""
Custom type for ArgumentParser
@@ -129,6 +136,7 @@ def systemidtype(arg):
return arg
+
class KickStart():
"""Kickstart parser implementation."""
diff --git a/scripts/lib/wic/misc.py b/scripts/lib/wic/misc.py
index 92d289fbf6..786457bd7f 100644
--- a/scripts/lib/wic/misc.py
+++ b/scripts/lib/wic/misc.py
@@ -50,6 +50,7 @@ NATIVE_RECIPES = {"bmaptool": "bmap-tools",
"tar": "tar"
}
+
def runtool(cmdln_or_args):
""" wrapper for most of the subprocess calls
input:
@@ -83,6 +84,7 @@ def runtool(cmdln_or_args):
return process.returncode, out
+
def _exec_cmd(cmd_and_args, as_shell=False):
"""
Execute command, catching stderr, stdout
@@ -114,6 +116,7 @@ def exec_cmd(cmd_and_args, as_shell=False):
"""
return _exec_cmd(cmd_and_args, as_shell)[1]
+
def find_executable(cmd, paths):
recipe = cmd
if recipe in NATIVE_RECIPES:
@@ -124,6 +127,7 @@ def find_executable(cmd, paths):
return spawn.find_executable(cmd, paths)
+
def exec_native_cmd(cmd_and_args, native_sysroot, pseudo=""):
"""
Execute native command, catching stderr, stdout
@@ -174,12 +178,15 @@ def exec_native_cmd(cmd_and_args, native_sysroot, pseudo=""):
return ret, out
+
BOOTDD_EXTRA_SPACE = 16384
+
class BitbakeVars(defaultdict):
"""
Container for Bitbake variables.
"""
+
def __init__(self):
defaultdict.__init__(self, dict)
@@ -253,9 +260,11 @@ class BitbakeVars(defaultdict):
return result
+
# Create BB_VARS singleton
BB_VARS = BitbakeVars()
+
def get_bitbake_var(var, image=None, cache=True):
"""
Provide old get_bitbake_var API by wrapping
diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
index d4ca39a09e..5f5af5f70c 100644
--- a/scripts/lib/wic/partition.py
+++ b/scripts/lib/wic/partition.py
@@ -20,6 +20,7 @@ from wic.pluginbase import PluginMgr
logger = logging.getLogger('wic')
+
class Partition():
def __init__(self, args, lineno):
diff --git a/scripts/lib/wic/pluginbase.py b/scripts/lib/wic/pluginbase.py
index d9b4e57747..621fcaf66b 100644
--- a/scripts/lib/wic/pluginbase.py
+++ b/scripts/lib/wic/pluginbase.py
@@ -24,6 +24,7 @@ logger = logging.getLogger('wic')
PLUGINS = defaultdict(dict)
+
class PluginMgr:
_plugin_dirs = []
@@ -58,6 +59,7 @@ class PluginMgr:
return PLUGINS.get(ptype)
+
class PluginMeta(type):
def __new__(cls, name, bases, attrs):
class_type = type.__new__(cls, name, bases, attrs)
@@ -66,6 +68,7 @@ class PluginMeta(type):
return class_type
+
class ImagerPlugin(metaclass=PluginMeta):
wic_plugin_type = "imager"
@@ -73,6 +76,7 @@ class ImagerPlugin(metaclass=PluginMeta):
raise WicError("Method %s.do_create is not implemented" %
self.__class__.__name__)
+
class SourcePlugin(metaclass=PluginMeta):
wic_plugin_type = "source"
"""
diff --git a/scripts/lib/wic/plugins/imager/direct.py \
b/scripts/lib/wic/plugins/imager/direct.py index 9ae3f52dea..ea5f542be6 100644
--- a/scripts/lib/wic/plugins/imager/direct.py
+++ b/scripts/lib/wic/plugins/imager/direct.py
@@ -29,6 +29,7 @@ from wic.misc import get_bitbake_var, exec_cmd, exec_native_cmd
logger = logging.getLogger('wic')
+
class DirectPlugin(ImagerPlugin):
"""
Install a system into a file containing a partitioned disk image.
@@ -279,6 +280,7 @@ class DirectPlugin(ImagerPlugin):
if not self.debug:
shutil.rmtree(self.workdir, ignore_errors=True)
+
# Overhead of the MBR partitioning scheme (just one sector)
MBR_OVERHEAD = 1
@@ -288,6 +290,7 @@ GPT_OVERHEAD = 34
# Size of a sector in bytes
SECTOR_SIZE = 512
+
class PartitionedImage():
"""
Partitioned image in a file.
diff --git a/scripts/lib/wic/plugins/source/bootimg-biosplusefi.py \
b/scripts/lib/wic/plugins/source/bootimg-biosplusefi.py index 8c6c645c39..c097181f8c \
100644
--- a/scripts/lib/wic/plugins/source/bootimg-biosplusefi.py
+++ b/scripts/lib/wic/plugins/source/bootimg-biosplusefi.py
@@ -23,6 +23,7 @@ import types
from wic.pluginbase import SourcePlugin
from importlib.machinery import SourceFileLoader
+
class BootimgBiosPlusEFIPlugin(SourcePlugin):
"""
Create MBR + EFI boot partition
diff --git a/scripts/lib/wic/plugins/source/bootimg-efi.py \
b/scripts/lib/wic/plugins/source/bootimg-efi.py index d4f2f928d9..fc980a20eb 100644
--- a/scripts/lib/wic/plugins/source/bootimg-efi.py
+++ b/scripts/lib/wic/plugins/source/bootimg-efi.py
@@ -25,6 +25,7 @@ from wic.misc import (exec_cmd, exec_native_cmd,
logger = logging.getLogger('wic')
+
class BootimgEFIPlugin(SourcePlugin):
"""
Create EFI boot partition.
@@ -189,7 +190,6 @@ class BootimgEFIPlugin(SourcePlugin):
cfg.write(boot_conf)
cfg.close()
-
@classmethod
def do_configure_partition(cls, part, source_params, creator, cr_workdir,
oe_builddir, bootimg_dir, kernel_dir,
diff --git a/scripts/lib/wic/plugins/source/bootimg-partition.py \
b/scripts/lib/wic/plugins/source/bootimg-partition.py index c59b476661..27745357c5 \
100644
--- a/scripts/lib/wic/plugins/source/bootimg-partition.py
+++ b/scripts/lib/wic/plugins/source/bootimg-partition.py
@@ -23,6 +23,7 @@ from wic.misc import exec_cmd, get_bitbake_var
logger = logging.getLogger('wic')
+
class BootimgPartitionPlugin(SourcePlugin):
"""
Create an image of boot partition, copying over files
@@ -159,7 +160,6 @@ class BootimgPartitionPlugin(SourcePlugin):
cfg.write(extlinux_conf)
cfg.close()
-
@classmethod
def do_prepare_partition(cls, part, source_params, cr, cr_workdir,
oe_builddir, bootimg_dir, kernel_dir,
@@ -180,7 +180,6 @@ class BootimgPartitionPlugin(SourcePlugin):
logger.debug('Kernel dir: %s', bootimg_dir)
-
for task in cls.install_task:
src_path, dst_path = task
logger.debug('Install %s as %s', src_path, dst_path)
diff --git a/scripts/lib/wic/plugins/source/bootimg-pcbios.py \
b/scripts/lib/wic/plugins/source/bootimg-pcbios.py index f2639e7004..ad9d9e36e8 \
100644
--- a/scripts/lib/wic/plugins/source/bootimg-pcbios.py
+++ b/scripts/lib/wic/plugins/source/bootimg-pcbios.py
@@ -22,6 +22,7 @@ from wic.misc import (exec_cmd, exec_native_cmd,
logger = logging.getLogger('wic')
+
class BootimgPcbiosPlugin(SourcePlugin):
"""
Create MBR boot partition and install syslinux on it.
diff --git a/scripts/lib/wic/plugins/source/empty.py \
b/scripts/lib/wic/plugins/source/empty.py index 041617d648..7cae4ba82a 100644
--- a/scripts/lib/wic/plugins/source/empty.py
+++ b/scripts/lib/wic/plugins/source/empty.py
@@ -14,6 +14,7 @@ from wic.pluginbase import SourcePlugin
logger = logging.getLogger('wic')
+
class EmptyPartitionPlugin(SourcePlugin):
"""
Populate unformatted empty partition.
diff --git a/scripts/lib/wic/plugins/source/isoimage-isohybrid.py \
b/scripts/lib/wic/plugins/source/isoimage-isohybrid.py index 3645d07990..21e66a8a03 \
100644
--- a/scripts/lib/wic/plugins/source/isoimage-isohybrid.py
+++ b/scripts/lib/wic/plugins/source/isoimage-isohybrid.py
@@ -20,6 +20,7 @@ from wic.misc import exec_cmd, exec_native_cmd, get_bitbake_var
logger = logging.getLogger('wic')
+
class IsoImagePlugin(SourcePlugin):
"""
Create a bootable ISO image
diff --git a/scripts/lib/wic/plugins/source/rawcopy.py \
b/scripts/lib/wic/plugins/source/rawcopy.py index fa7b1eb8ac..a8f4c884ce 100644
--- a/scripts/lib/wic/plugins/source/rawcopy.py
+++ b/scripts/lib/wic/plugins/source/rawcopy.py
@@ -12,6 +12,7 @@ from wic.filemap import sparse_copy
logger = logging.getLogger('wic')
+
class RawCopyPlugin(SourcePlugin):
"""
Populate partition content from raw image file.
diff --git a/scripts/lib/wic/plugins/source/rootfs.py \
b/scripts/lib/wic/plugins/source/rootfs.py index 03b642f4fa..176902f39b 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -25,6 +25,7 @@ from wic.misc import get_bitbake_var, exec_native_cmd
logger = logging.getLogger('wic')
+
class RootfsPlugin(SourcePlugin):
"""
Populate partition content from a rootfs directory.
diff --git a/scripts/oe-build-perf-report b/scripts/oe-build-perf-report
index 7812ea4540..4595ae0fc0 100755
--- a/scripts/oe-build-perf-report
+++ b/scripts/oe-build-perf-report
@@ -38,6 +38,7 @@ import oeqa.utils.gitarchive as gitarchive
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
log = logging.getLogger('oe-build-perf-report')
+
def list_test_revs(repo, tag_name, verbosity, **kwargs):
"""Get list of all tested revisions"""
valid_kwargs = dict([(k, v) for k, v in kwargs.items() if v is not None])
@@ -63,7 +64,6 @@ def list_test_revs(repo, tag_name, verbosity, **kwargs):
# Only use fields that we want to print
cols = [rev[i] for i in print_fields]
-
if cols != prev:
commit_cnt = 1
test_run_cnt = 1
@@ -87,6 +87,7 @@ def list_test_revs(repo, tag_name, verbosity, **kwargs):
print_table(rows)
+
def is_xml_format(repo, commit):
"""Check if the commit contains xml (or json) data"""
if repo.rev_parse(commit + ':results.xml'):
@@ -96,6 +97,7 @@ def is_xml_format(repo, commit):
log.debug("No xml report in %s, assuming json formatted results", commit)
return False
+
def read_results(repo, tags, xml=True):
"""Read result files from repo"""
@@ -195,7 +197,6 @@ def print_diff_report(metadata_l, data_l, metadata_r, data_r):
rows.append([val['title'] + ':', val['value'], val['value_old']])
print_table(rows, row_fmt)
-
# Print test results
print("\nTEST RESULTS:\n=============")
@@ -316,7 +317,6 @@ def print_html_report(data, id_comp, buildstats):
else:
new_test['message'] = test_r['message']
-
# Generate the list of measurements
for meas in test_r['measurements'].keys():
meas_r = test_r['measurements'][meas]
@@ -358,7 +358,6 @@ def print_html_report(data, id_comp, buildstats):
new_meas['buildstats'] = BSSummary(buildstats[comp_rev][bs_key],
buildstats[rev][bs_key])
-
new_test['measurements'].append(new_meas)
tests.append(new_test)
@@ -611,5 +610,6 @@ def main(argv=None):
return 0
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/scripts/oe-build-perf-test b/scripts/oe-build-perf-test
index 00e00b4ce9..280eef261d 100755
--- a/scripts/oe-build-perf-test
+++ b/scripts/oe-build-perf-test
@@ -66,6 +66,7 @@ def pre_run_sanity_check():
return False
return True
+
def setup_file_logging(log_file):
"""Setup loggin to file"""
log_dir = os.path.dirname(log_file)
diff --git a/scripts/oe-depends-dot b/scripts/oe-depends-dot
index 15620240c4..a0b57f0fb0 100755
--- a/scripts/oe-depends-dot
+++ b/scripts/oe-depends-dot
@@ -11,6 +11,7 @@ import argparse
import logging
import re
+
class Dot(object):
def __init__(self):
parser = argparse.ArgumentParser(
@@ -146,6 +147,7 @@ class Dot(object):
print('Because: %s' % ' '.join(reverse_deps))
Dot.print_dep_chains(self.args.key, reverse_deps, depends)
+
if __name__ == "__main__":
try:
dot = Dot()
diff --git a/scripts/oe-git-archive b/scripts/oe-git-archive
index 9305ed0b0f..9fd0942358 100755
--- a/scripts/oe-git-archive
+++ b/scripts/oe-git-archive
@@ -81,6 +81,7 @@ def parse_args(argv):
help="Data to commit")
return parser.parse_args(argv)
+
def get_nested(d, list_of_keys):
try:
for k in list_of_keys:
@@ -89,6 +90,7 @@ def get_nested(d, list_of_keys):
except KeyError:
return ""
+
def main(argv=None):
args = parse_args(argv)
if args.debug:
@@ -114,5 +116,6 @@ def main(argv=None):
return 0
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/scripts/oe-pkgdata-browser b/scripts/oe-pkgdata-browser
index dc6178beb4..2c8b20ac44 100755
--- a/scripts/oe-pkgdata-browser
+++ b/scripts/oe-pkgdata-browser
@@ -25,6 +25,8 @@ PackageColumns = enum.IntEnum("PackageColumns", {"Package": 0, \
"Size": 1}) FileColumns = enum.IntEnum("FileColumns", {"Filename": 0, "Size": 1})
import time
+
+
def timeit(f):
def timed(*args, **kw):
ts = time.time()
@@ -36,6 +38,7 @@ def timeit(f):
return result
return timed
+
def human_size(nbytes):
import math
suffixes = ['B', 'kB', 'MB', 'GB', 'TB', 'PB']
@@ -48,6 +51,7 @@ def human_size(nbytes):
f = ('%.2f' % human).rstrip('0').rstrip('.')
return '%s %s' % (f, suffixes[rank])
+
def load(filename, suffix=None):
from configparser import ConfigParser
from itertools import chain
@@ -63,6 +67,7 @@ def load(filename, suffix=None):
# values to ints?
return parser["fake"]
+
def find_pkgdata():
import subprocess
output = subprocess.check_output(("bitbake", "-e"), universal_newlines=True)
@@ -72,6 +77,7 @@ def find_pkgdata():
# TODO exception or something
return None
+
def packages_in_recipe(pkgdata, recipe):
"""
Load the recipe pkgdata to determine the list of runtime packages.
@@ -80,13 +86,16 @@ def packages_in_recipe(pkgdata, recipe):
packages = data["PACKAGES"].split()
return packages
+
def load_runtime_package(pkgdata, package):
return load(os.path.join(pkgdata, "runtime", package), suffix=package)
+
def recipe_from_package(pkgdata, package):
data = load(os.path.join(pkgdata, "runtime", package), suffix=package)
return data["PN"]
+
def summary(data):
s = ""
s += "{0[PKG]} {0[PKGV]}-{0[PKGR]}\n{0[LICENSE]}\n{0[SUMMARY]}\n".format(data)
@@ -243,6 +252,7 @@ class PkgUi():
if os.path.isfile(os.path.join(pkgdata, recipe)):
self.recipe_iters[recipe] = self.recipe_store.append([recipe])
+
if __name__ == "__main__":
import argparse
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util
index aef04a18c0..fa107843d5 100755
--- a/scripts/oe-pkgdata-util
+++ b/scripts/oe-pkgdata-util
@@ -25,6 +25,7 @@ import scriptutils
import argparse_oe
logger = scriptutils.logger_create('pkgdatautil')
+
def tinfoil_init():
import bb.tinfoil
import logging
@@ -82,8 +83,10 @@ def glob(args):
# Define some functions
def revpkgdata(pkgn):
return os.path.join(args.pkgdata_dir, "runtime-reverse", pkgn)
+
def fwdpkgdata(pkgn):
return os.path.join(args.pkgdata_dir, "runtime", pkgn)
+
def readpn(pkgdata_file):
pn = ""
with open(pkgdata_file, 'r') as f:
@@ -91,6 +94,7 @@ def glob(args):
if line.startswith("PN:"):
pn = line.split(': ')[1].rstrip()
return pn
+
def readrenamed(pkgdata_file):
renamed = ""
pn = os.path.basename(pkgdata_file)
@@ -146,6 +150,7 @@ def glob(args):
print("\n".join(mappedpkgs - skippedpkgs))
+
def read_value(args):
# Handle both multiple arguments and multiple values within an arg (old syntax)
packages = []
@@ -197,6 +202,7 @@ def read_value(args):
else:
logger.debug("revlink %s does not exist", revlink)
+
def lookup_pkglist(pkgs, pkgdata_dir, reverse):
if reverse:
mappings = OrderedDict()
@@ -218,6 +224,7 @@ def lookup_pkglist(pkgs, pkgdata_dir, reverse):
break
return mappings
+
def lookup_pkg(args):
# Handle both multiple arguments and multiple values within an arg (old syntax)
pkgs = []
@@ -240,6 +247,7 @@ def lookup_pkg(args):
print('\n'.join(items))
+
def lookup_recipe(args):
def parse_pkgdatafile(pkgdatafile):
with open(pkgdatafile, 'r') as f:
@@ -277,6 +285,7 @@ def lookup_recipe(args):
logger.error("The following packages could not be found: %s" % pkg)
sys.exit(1)
+
def package_info(args):
def parse_pkgdatafile(pkgdatafile):
vars = ['PKGV', 'PKGE', 'PKGR', 'PN', 'PV', 'PE', 'PR', 'PKGSIZE']
@@ -339,6 +348,7 @@ def package_info(args):
sys.exit(1)
parse_pkgdatafile(pkgdatafile)
+
def get_recipe_pkgs(pkgdata_dir, recipe, unpackaged):
recipedatafile = os.path.join(pkgdata_dir, recipe)
if not os.path.exists(recipedatafile):
@@ -361,6 +371,7 @@ def get_recipe_pkgs(pkgdata_dir, recipe, unpackaged):
else:
return packages
+
def list_pkgs(args):
found = False
@@ -423,8 +434,10 @@ def list_pkgs(args):
logger.error("No packages found")
sys.exit(1)
+
def list_pkg_files(args):
import json
+
def parse_pkgdatafile(pkgdatafile, long=False):
with open(pkgdatafile, 'r') as f:
found = False
@@ -445,7 +458,6 @@ def list_pkg_files(args):
logger.error("Unable to find FILES_INFO entry in %s" % pkgdatafile)
sys.exit(1)
-
if args.recipe:
if args.pkg:
logger.error("list-pkg-files: If -p/--recipe is specified then a package \
name cannot be specified") @@ -491,6 +503,7 @@ def list_pkg_files(args):
sys.exit(1)
parse_pkgdatafile(pkgdatafile, args.long)
+
def find_path(args):
import json
@@ -585,7 +598,6 @@ def main():
parser_glob.add_argument('-x', '--exclude', help='Exclude packages matching \
specified regex from the glob operation') parser_glob.set_defaults(func=glob)
-
args = parser.parse_args()
if args.debug:
diff --git a/scripts/oe-publish-sdk b/scripts/oe-publish-sdk
index deb8ae1807..44dbbe5da1 100755
--- a/scripts/oe-publish-sdk
+++ b/scripts/oe-publish-sdk
@@ -24,6 +24,7 @@ import scriptutils
import argparse_oe
logger = scriptutils.logger_create('sdktool')
+
def mkdir(d):
try:
os.makedirs(d)
@@ -31,6 +32,7 @@ def mkdir(d):
if e.errno != errno.EEXIST:
raise e
+
def publish(args):
logger.debug("In publish function")
target_sdk = args.sdk
@@ -139,6 +141,7 @@ def main():
ret = args.func(args)
return ret
+
if __name__ == "__main__":
try:
ret = main()
diff --git a/scripts/oe-selftest b/scripts/oe-selftest
index 18ac0f5869..bde1c8b5e8 100755
--- a/scripts/oe-selftest
+++ b/scripts/oe-selftest
@@ -15,7 +15,6 @@
# E.g: "oe-selftest -r bblayers.BitbakeLayers" will run just the BitbakeLayers class \
from meta/lib/oeqa/selftest/bblayers.py
-
import os
import sys
import argparse
@@ -35,6 +34,7 @@ from oeqa.core.exception import OEQAPreRun
logger = scriptutils.logger_create('oe-selftest', stream=sys.stdout, keepalive=True)
+
def main():
description = "Script that runs unit tests against bitbake and other Yocto \
related tools. The goal is to validate tools functionality and metadata integrity. \
Refer to https://wiki.yoctoproject.org/wiki/Oe-selftest for more information." \
parser = argparse_oe.ArgumentParser(description=description) @@ -55,6 +55,7 @@ def \
main():
return ret
+
if __name__ == '__main__':
try:
ret = main()
diff --git a/scripts/oe-test b/scripts/oe-test
index 55985b0b24..9fea769ff2 100755
--- a/scripts/oe-test
+++ b/scripts/oe-test
@@ -31,6 +31,7 @@ from oeqa.core.exception import OEQAPreRun
logger = scriptutils.logger_create('oe-test', stream=sys.stdout)
+
def main():
parser = argparse_oe.ArgumentParser(description="OpenEmbedded test tool",
add_help=False,
@@ -73,6 +74,7 @@ def main():
return ret
+
if __name__ == '__main__':
try:
ret = main()
diff --git a/scripts/oe-trim-schemas b/scripts/oe-trim-schemas
index 596da2d849..7bf5b7bdeb 100755
--- a/scripts/oe-trim-schemas
+++ b/scripts/oe-trim-schemas
@@ -9,18 +9,21 @@ try:
except:
import xml.etree.ElementTree as etree
+
def child(elem, name):
for e in elem.getchildren():
if e.tag == name:
return e
return None
+
def children(elem, name=None):
l = elem.getchildren()
if name:
l = [e for e in l if e.tag == name]
return l
+
if len(sys.argv) < 2 or sys.argv[1] in ('-h', '--help'):
print('oe-trim-schemas: error: the following arguments are required: schema\n'
'Usage: oe-trim-schemas schema\n\n'
diff --git a/scripts/oepydevshell-internal.py b/scripts/oepydevshell-internal.py
index 7fcc4043d2..e54d84982b 100755
--- a/scripts/oepydevshell-internal.py
+++ b/scripts/oepydevshell-internal.py
@@ -12,19 +12,23 @@ import termios
import readline
import signal
+
def nonblockingfd(fd):
fcntl.fcntl(fd, fcntl.F_SETFL, fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK)
+
def echonocbreak(fd):
old = termios.tcgetattr(fd)
old[3] = old[3] | termios.ECHO | termios.ICANON
termios.tcsetattr(fd, termios.TCSADRAIN, old)
+
def cbreaknoecho(fd):
old = termios.tcgetattr(fd)
old[3] = old[3] & ~ termios.ECHO & ~ termios.ICANON
termios.tcsetattr(fd, termios.TCSADRAIN, old)
+
if len(sys.argv) != 3 or sys.argv[1] in ('-h', '--help'):
print('oepydevshell-internal.py: error: the following arguments are required: \
pty, pid\n' 'Usage: oepydevshell-internal.py pty pid\n\n'
diff --git a/scripts/pybootchartgui/pybootchartgui/batch.py \
b/scripts/pybootchartgui/pybootchartgui/batch.py index 1b9df3c1cd..6d9fbce830 100644
--- a/scripts/pybootchartgui/pybootchartgui/batch.py
+++ b/scripts/pybootchartgui/pybootchartgui/batch.py
@@ -17,6 +17,7 @@ import cairo
from . import draw
from .draw import RenderOptions
+
def render(writer, trace, app_options, filename):
handlers = {
"png": (lambda w, h: cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h),
diff --git a/scripts/pybootchartgui/pybootchartgui/draw.py \
b/scripts/pybootchartgui/pybootchartgui/draw.py index 7572b59b8d..e2ece14faf 100644
--- a/scripts/pybootchartgui/pybootchartgui/draw.py
+++ b/scripts/pybootchartgui/pybootchartgui/draw.py
@@ -22,6 +22,7 @@ import colorsys
import functools
from operator import itemgetter
+
class RenderOptions:
def __init__(self, app_options):
@@ -37,6 +38,7 @@ class RenderOptions:
else:
return trace.proc_tree
+
# Process tree background color.
BACK_COLOR = (1.0, 1.0, 1.0, 1.0)
@@ -160,35 +162,43 @@ STAT_TYPE_CPU = 0
STAT_TYPE_IO = 1
# Convert ps process state to an int
+
+
def get_proc_state(flag):
return "RSDTZXW".find(flag) + 1
+
def draw_text(ctx, text, color, x, y):
ctx.set_source_rgba(*color)
ctx.move_to(x, y)
ctx.show_text(text)
+
def draw_fill_rect(ctx, color, rect):
ctx.set_source_rgba(*color)
ctx.rectangle(*rect)
ctx.fill()
+
def draw_rect(ctx, color, rect):
ctx.set_source_rgba(*color)
ctx.rectangle(*rect)
ctx.stroke()
+
def draw_legend_box(ctx, label, fill_color, x, y, s):
draw_fill_rect(ctx, fill_color, (x, y - s, s, s))
draw_rect(ctx, PROC_BORDER_COLOR, (x, y - s, s, s))
draw_text(ctx, label, TEXT_COLOR, x + s + 5, y)
+
def draw_legend_line(ctx, label, fill_color, x, y, s):
draw_fill_rect(ctx, fill_color, (x, y - s / 2, s + 1, 3))
ctx.arc(x + (s + 1) / 2.0, y - (s - 3) / 2.0, 2.5, 0, 2.0 * math.pi)
ctx.fill()
draw_text(ctx, label, TEXT_COLOR, x + s + 5, y)
+
def draw_label_in_box(ctx, color, label, x, y, w, maxx):
label_w = ctx.text_extents(label)[2]
label_x = x + w / 2 - label_w / 2
@@ -198,6 +208,7 @@ def draw_label_in_box(ctx, color, label, x, y, w, maxx):
label_x = x - label_w - 5
draw_text(ctx, label, color, label_x, y)
+
def draw_sec_labels(ctx, options, rect, sec_w, nsecs):
ctx.set_font_size(AXIS_FONT_SIZE)
prev_x = 0
@@ -213,6 +224,7 @@ def draw_sec_labels(ctx, options, rect, sec_w, nsecs):
draw_text(ctx, label, TEXT_COLOR, x, rect[1] - 2)
prev_x = x + label_w
+
def draw_box_ticks(ctx, rect, sec_w):
draw_rect(ctx, BORDER_COLOR, tuple(rect))
@@ -236,6 +248,7 @@ def draw_box_ticks(ctx, rect, sec_w):
ctx.set_line_cap(cairo.LINE_CAP_BUTT)
+
def draw_annotations(ctx, proc_tree, times, rect):
ctx.set_line_cap(cairo.LINE_CAP_SQUARE)
ctx.set_source_rgba(*ANNOTATION_COLOR)
@@ -252,6 +265,7 @@ def draw_annotations(ctx, proc_tree, times, rect):
ctx.set_line_cap(cairo.LINE_CAP_BUTT)
ctx.set_dash([])
+
def draw_chart(ctx, color, fill, chart_bounds, data, proc_tree, data_range):
ctx.set_line_width(0.5)
x_shift = proc_tree.start_time
@@ -299,6 +313,7 @@ def draw_chart(ctx, color, fill, chart_bounds, data, proc_tree, \
data_range): ctx.stroke()
ctx.set_line_width(1.0)
+
bar_h = 55
meminfo_bar_h = 2 * bar_h
header_h = 60
@@ -311,6 +326,7 @@ MIN_IMG_W = 800
CUML_HEIGHT = 2000 # Increased value to accommodate CPU and I/O Graphs
OPTIONS = None
+
def extents(options, xscale, trace):
start = min(trace.start.keys())
end = start
@@ -348,6 +364,7 @@ def extents(options, xscale, trace):
return (w, h)
+
def clip_visible(clip, rect):
xmax = max(clip[0], rect[0])
ymax = max(clip[1], rect[1])
@@ -355,6 +372,7 @@ def clip_visible(clip, rect):
ymin = min(clip[1] + clip[3], rect[1] + rect[3])
return (xmin > xmax and ymin > ymax)
+
def render_charts(ctx, options, clip, trace, curr_y, w, h, sec_w):
proc_tree = options.proc_tree(trace)
@@ -493,6 +511,7 @@ def render_charts(ctx, options, clip, trace, curr_y, w, h, \
sec_w):
return curr_y
+
def render_processes_chart(ctx, options, trace, curr_y, w, h, sec_w):
chart_rect = [off_x, curr_y + header_h, w, h - curr_y - 1 * off_y - header_h]
@@ -562,6 +581,8 @@ def render_processes_chart(ctx, options, trace, curr_y, w, h, \
sec_w): #
# Render the chart.
#
+
+
def render(ctx, options, xscale, trace):
(w, h) = extents(options, xscale, trace)
global OPTIONS
@@ -621,6 +642,7 @@ def render(ctx, options, xscale, trace):
if clip_visible(clip, cuml_rect):
draw_cuml_graph(ctx, proc_tree, cuml_rect, duration, sec_w, \
STAT_TYPE_IO)
+
def draw_process_bar_chart(ctx, clip, options, proc_tree, times, curr_y, w, h, \
sec_w): header_size = 0
if not options.kernel_only:
@@ -684,6 +706,7 @@ def draw_header(ctx, headers, duration):
return header_y
+
def draw_processes_recursively(ctx, proc, proc_tree, y, proc_h, rect, clip):
x = rect[0] + ((proc.start_time - proc_tree.start_time) * rect[2] / \
proc_tree.duration) w = ((proc.duration) * rect[2] / proc_tree.duration)
@@ -752,6 +775,7 @@ def draw_process_activity_colors(ctx, proc, proc_tree, x, y, w, \
proc_h, rect, cl
draw_fill_rect(ctx, color, (tx, y, tw, proc_h))
+
def draw_process_connecting_lines(ctx, px, py, x, y, proc_h):
ctx.set_source_rgba(*DEP_COLOR)
ctx.set_dash([2, 2])
@@ -770,9 +794,12 @@ def draw_process_connecting_lines(ctx, px, py, x, y, proc_h):
ctx.set_dash([])
# elide the bootchart collector - it is quite distorting
+
+
def elide_bootchart(proc):
return proc.cmd == 'bootchartd' or proc.cmd == 'bootchart-colle'
+
class CumlSample:
def __init__(self, proc):
self.cmd = proc.cmd
diff --git a/scripts/pybootchartgui/pybootchartgui/gui.py \
b/scripts/pybootchartgui/pybootchartgui/gui.py index b1a399240a..6a59b2f222 100644
--- a/scripts/pybootchartgui/pybootchartgui/gui.py
+++ b/scripts/pybootchartgui/pybootchartgui/gui.py
@@ -24,6 +24,7 @@ from gi.repository import GObject
from . import draw
from .draw import RenderOptions
+
class PyBootchartWidget(gtk.DrawingArea, gtk.Scrollable):
__gsignals__ = {
'clicked': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, \
(gobject.TYPE_STRING, Gdk.Event)), @@ -237,6 +238,7 @@ class \
PyBootchartWidget(gtk.DrawingArea, gtk.Scrollable): #self.hadj.value_changed()
self.vadj.set_value(y * self.zoom_ratio)
+
class PyBootchartShell(gtk.VBox):
ui = '''
<ui>
@@ -251,6 +253,7 @@ class PyBootchartShell(gtk.VBox):
</toolbar>
</ui>
'''
+
def __init__(self, window, trace, options, xscale):
gtk.VBox.__init__(self)
diff --git a/scripts/pybootchartgui/pybootchartgui/main.py.in \
b/scripts/pybootchartgui/pybootchartgui/main.py.in index c905205c8e..cc9471dc21 \
100644
--- a/scripts/pybootchartgui/pybootchartgui/main.py.in
+++ b/scripts/pybootchartgui/pybootchartgui/main.py.in
@@ -23,6 +23,7 @@ import optparse
from . import parsing
from . import batch
+
def _mk_options_parser():
"""Make an options parser."""
usage = "%prog [options] /path/to/tmp/buildstats/<recipe-machine>/<BUILDNAME>/"
@@ -67,6 +68,7 @@ def _mk_options_parser():
help="display the full time regardless of which processes are currently shown")
return parser
+
class Writer:
def __init__(self, write, options):
self.write = write
@@ -87,11 +89,13 @@ class Writer:
if not self.options.quiet:
self.write(msg)
+
def _mk_writer(options):
def write(s):
print(s)
return Writer(write, options)
+
def _get_filename(path):
"""Construct a usable filename for outputs"""
dname = "."
@@ -103,6 +107,7 @@ def _get_filename(path):
fname = path
return os.path.join(dname, fname)
+
def main(argv=None):
try:
if argv is None:
@@ -161,6 +166,7 @@ def main(argv=None):
else:
f = filename + s % n + options.format
n = n + 1
+
def render():
batch.render(writer, r, options, f)
if options.profile:
diff --git a/scripts/pybootchartgui/pybootchartgui/parsing.py \
b/scripts/pybootchartgui/pybootchartgui/parsing.py index 2de03937ce..937bd89f2f \
100644
--- a/scripts/pybootchartgui/pybootchartgui/parsing.py
+++ b/scripts/pybootchartgui/pybootchartgui/parsing.py
@@ -30,6 +30,7 @@ if sys.version_info >= (3, 0):
# Parsing produces as its end result a 'Trace'
+
class Trace:
def __init__(self, writer, paths, options):
self.processes = {}
@@ -60,10 +61,10 @@ class Trace:
self.min = min(self.start.keys())
self.max = max(self.end.keys())
-
# Rendering system charts depends on start and end
# time. Provide them where the original drawing code expects
# them, i.e. in proc_tree.
+
class BitbakeProcessTree:
def __init__(self, start_time, end_time):
self.start_time = start_time
@@ -72,7 +73,6 @@ class Trace:
self.proc_tree = BitbakeProcessTree(min(self.start.keys()),
max(self.end.keys()))
-
return
# Turn that parsed information into something more useful
@@ -187,6 +187,7 @@ class Trace:
return True
else:
return False
+
def is_idle(util, start):
for j in range(0, len(util)):
if util[j][0] < start:
@@ -204,7 +205,6 @@ class Trace:
if proc is None:
writer.warn("no selected crop proc '%s' in list" % crop_after)
-
cpu_util = [(sample.time, sample.user + sample.sys + sample.io) for sample \
in self.cpu_stats]
disk_util = [(sample.time, sample.util) for sample in self.disk_stats]
@@ -248,15 +248,16 @@ class Trace:
return idle
-
class ParseError(Exception):
"""Represents errors during parse of the bootchart."""
+
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
+
def _parse_headers(file):
"""Parses the headers of the bootchart."""
def parse(acc, line):
@@ -269,6 +270,7 @@ def _parse_headers(file):
return headers, last
return reduce(parse, file.read().split('\n'), (defaultdict(str), ''))[0]
+
def _parse_timed_blocks(file):
"""Parses (ie., splits) a file into so-called timed-blocks. A
timed-block consists of a timestamp on a line by itself followed
@@ -284,6 +286,7 @@ def _parse_timed_blocks(file):
blocks = file.read().split('\n\n')
return [parse(block) for block in blocks if block.strip() and not \
block.endswith(' not running\n')]
+
def _parse_proc_ps_log(writer, file):
"""
* See proc(5) for details.
@@ -334,6 +337,7 @@ def _parse_proc_ps_log(writer, file):
return ProcessStats(writer, processMap, len(timed_blocks), avgSampleLength, \
startTime, ltime)
+
def _parse_taskstats_log(writer, file):
"""
* See bootchart-collector.c for details.
@@ -421,6 +425,7 @@ def _parse_taskstats_log(writer, file):
return ProcessStats(writer, processMap, len(timed_blocks), avgSampleLength, \
startTime, ltime)
+
def _parse_proc_stat_log(file):
samples = []
ltimes = None
@@ -444,12 +449,14 @@ def _parse_proc_stat_log(file):
# skip the rest of statistics lines
return samples
+
def _parse_reduced_log(file, sample_class):
samples = []
for time, lines in _parse_timed_blocks(file):
samples.append(sample_class(time, *[float(x) for x in lines[0].split()]))
return samples
+
def _parse_proc_disk_stat_log(file):
"""
Parse file for disk stats, but only look at the whole device, eg. sda,
@@ -491,6 +498,7 @@ def _parse_proc_disk_stat_log(file):
return disk_stats
+
def _parse_reduced_proc_meminfo_log(file):
"""
Parse file for global memory statistics with
@@ -510,6 +518,7 @@ def _parse_reduced_proc_meminfo_log(file):
return mem_stats
+
def _parse_proc_meminfo_log(file):
"""
Parse file for global memory statistics.
@@ -534,6 +543,7 @@ def _parse_proc_meminfo_log(file):
return mem_stats
+
def _parse_monitor_disk_log(file):
"""
Parse file with information about amount of diskspace used.
@@ -640,6 +650,8 @@ def _parse_dmesg(writer, file):
# Parse binary pacct accounting file output if we have one
# cf. /usr/include/linux/acct.h
#
+
+
def _parse_pacct(writer, file):
# read LE int32
def _read_le_int32(file):
@@ -664,6 +676,7 @@ def _parse_pacct(writer, file):
file.seek(16, 1) # acct_comm
return parent_map
+
def _parse_paternity_log(writer, file):
parent_map = {}
parent_map[0] = 0
@@ -678,6 +691,7 @@ def _parse_paternity_log(writer, file):
print("Odd paternity line '%s'" % (line))
return parent_map
+
def _parse_cmdline_log(writer, file):
cmdLines = {}
for block in file.read().split('\n\n'):
@@ -693,6 +707,7 @@ def _parse_cmdline_log(writer, file):
cmdLines[pid] = values
return cmdLines
+
def _parse_bitbake_buildstats(writer, state, filename, file):
paths = filename.split("/")
task = paths[-1]
@@ -707,6 +722,7 @@ def _parse_bitbake_buildstats(writer, state, filename, file):
if start and end:
state.add_process(pn + ":" + task, start, end)
+
def get_num_cpus(headers):
"""Get the number of CPUs from the system.cpu header property. As the
CPU utilization graphs are relative, the number of CPUs currently makes
@@ -723,6 +739,7 @@ def get_num_cpus(headers):
return 1
return max(int(mat.group(1)), 1)
+
def _do_parse(writer, state, filename, file):
writer.info("parsing '%s'" % filename)
t1 = time.process_time()
@@ -749,6 +766,7 @@ def _do_parse(writer, state, filename, file):
writer.info(" %s seconds" % str(t2 - t1))
return state
+
def parse_file(writer, state, filename):
if state.filename is None:
state.filename = filename
@@ -756,6 +774,7 @@ def parse_file(writer, state, filename):
with open(filename, "r") as file:
return _do_parse(writer, state, filename, file)
+
def parse_paths(writer, state, paths):
for path in paths:
if state.filename is None:
@@ -789,6 +808,7 @@ def parse_paths(writer, state, paths):
state = parse_file(writer, state, path)
return state
+
def split_res(res, options):
""" Split the res into n pieces """
res_list = []
diff --git a/scripts/pybootchartgui/pybootchartgui/process_tree.py \
b/scripts/pybootchartgui/pybootchartgui/process_tree.py index 3e94db3f3a..35ee8f080c \
100644
--- a/scripts/pybootchartgui/pybootchartgui/process_tree.py
+++ b/scripts/pybootchartgui/pybootchartgui/process_tree.py
@@ -13,6 +13,7 @@
# You should have received a copy of the GNU General Public License
# along with pybootchartgui. If not, see <http://www.gnu.org/licenses/>.
+
class ProcessTree:
"""ProcessTree encapsulates a process tree. The tree is built from log files
retrieved during the boot process. When building the process tree, it is
diff --git a/scripts/pybootchartgui/pybootchartgui/samples.py \
b/scripts/pybootchartgui/pybootchartgui/samples.py index 301583e9aa..2b4cf15cb4 \
100644
--- a/scripts/pybootchartgui/pybootchartgui/samples.py
+++ b/scripts/pybootchartgui/pybootchartgui/samples.py
@@ -18,9 +18,11 @@ class DiskStatSample:
def __init__(self, time):
self.time = time
self.diskdata = [0, 0, 0]
+
def add_diskdata(self, new_diskdata):
self.diskdata = [a + b for a, b in zip(self.diskdata, new_diskdata)]
+
class CPUSample:
def __init__(self, time, user, sys, io=0.0, swap=0.0):
self.time = time
@@ -37,6 +39,7 @@ class CPUSample:
return str(self.time) + "\t" + str(self.user) + "\t" + \
str(self.sys) + "\t" + str(self.io) + "\t" + str(self.swap)
+
class MemSample:
used_values = ('MemTotal', 'MemFree', 'Buffers', 'Cached', 'SwapTotal', \
'SwapFree',)
@@ -53,12 +56,14 @@ class MemSample:
# discard incomplete samples
return [v for v in MemSample.used_values if v not in keys] == []
+
class DrawMemSample:
"""
Condensed version of a MemSample with exactly the values used by the drawing \
code. Initialized either from a valid MemSample or
a tuple/list of buffer/used/cached/swap values.
"""
+
def __init__(self, mem_sample):
self.time = mem_sample.time
if isinstance(mem_sample, MemSample):
@@ -69,6 +74,7 @@ class DrawMemSample:
else:
self.buffers, self.used, self.cached, self.swap = mem_sample
+
class DiskSpaceSample:
def __init__(self, time):
self.time = time
@@ -80,6 +86,7 @@ class DiskSpaceSample:
def valid(self):
return bool(self.records)
+
class ProcessSample:
def __init__(self, time, state, cpu_sample):
self.time = time
@@ -89,6 +96,7 @@ class ProcessSample:
def __str__(self):
return str(self.time) + "\t" + str(self.state) + "\t" + str(self.cpu_sample)
+
class ProcessStats:
def __init__(self, writer, process_map, sample_count, sample_period, start_time, \
end_time): self.process_map = process_map
@@ -99,6 +107,7 @@ class ProcessStats:
writer.info("%d samples, avg. sample length %f" % (self.sample_count, \
self.sample_period))
writer.info("process list size: %d" % len(self.process_map.values()))
+
class Process:
def __init__(self, writer, pid, cmd, ppid, start_time):
self.writer = writer
@@ -166,6 +175,7 @@ class Process:
def get_end_time(self):
return self.start_time + self.duration
+
class DiskSample:
def __init__(self, time, read, write, util):
self.time = time
diff --git a/scripts/pybootchartgui/pybootchartgui/tests/parser_test.py \
b/scripts/pybootchartgui/pybootchartgui/tests/parser_test.py index \
3ea3592441..2890091488 100644
--- a/scripts/pybootchartgui/pybootchartgui/tests/parser_test.py
+++ b/scripts/pybootchartgui/pybootchartgui/tests/parser_test.py
@@ -14,14 +14,17 @@ import pybootchartgui.main as main
debug = False
+
def floatEq(f1, f2):
return math.fabs(f1 - f2) < 0.00001
+
bootchart_dir = os.path.join(os.path.dirname(sys.argv[0]), '../../examples/1/')
parser = main._mk_options_parser()
options, args = parser.parse_args(['--q', bootchart_dir])
writer = main._mk_writer(options)
+
class TestBCParser(unittest.TestCase):
def setUp(self):
@@ -105,6 +108,7 @@ class TestBCParser(unittest.TestCase):
self.assert_(floatEq(float(tokens[3]), sample.io))
stat_data.close()
+
if __name__ == '__main__':
unittest.main()
diff --git a/scripts/pybootchartgui/pybootchartgui/tests/process_tree_test.py \
b/scripts/pybootchartgui/pybootchartgui/tests/process_tree_test.py index \
f9f49cc340..03cde2ef32 100644
--- a/scripts/pybootchartgui/pybootchartgui/tests/process_tree_test.py
+++ b/scripts/pybootchartgui/pybootchartgui/tests/process_tree_test.py
@@ -11,6 +11,7 @@ import pybootchartgui.main as main
if sys.version_info >= (3, 0):
long = int
+
class TestProcessTree(unittest.TestCase):
def setUp(self):
@@ -88,5 +89,6 @@ class TestProcessTree(unittest.TestCase):
process_tree = self.processtree.process_tree
self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.3e.log'), \
process_tree)
+
if __name__ == '__main__':
unittest.main()
diff --git a/scripts/pythondeps b/scripts/pythondeps
index 7b41c336a1..eb36abdd2e 100755
--- a/scripts/pythondeps
+++ b/scripts/pythondeps
@@ -22,6 +22,7 @@ logger = logging.getLogger('pythondeps')
suffixes = importlib.machinery.all_suffixes()
+
class PythonDepError(Exception):
pass
diff --git a/scripts/recipetool b/scripts/recipetool
index e2d585d2c5..79d82c954e 100755
--- a/scripts/recipetool
+++ b/scripts/recipetool
@@ -22,6 +22,7 @@ logger = scriptutils.logger_create('recipetool')
plugins = []
+
def tinfoil_init(parserecipes):
import bb.tinfoil
import logging
@@ -30,6 +31,7 @@ def tinfoil_init(parserecipes):
tinfoil.prepare(not parserecipes)
return tinfoil
+
def main():
if not os.environ.get('BUILDDIR', ''):
diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py
index 4269eacb34..b4a46a8d51 100755
--- a/scripts/relocate_sdk.py
+++ b/scripts/relocate_sdk.py
@@ -29,6 +29,7 @@ else:
old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##"))
+
def get_arch():
f.seek(0)
e_ident = f.read(16)
@@ -42,6 +43,7 @@ def get_arch():
elif ei_class == 2:
return 64
+
def parse_elf_header():
global e_type, e_machine, e_version, e_entry, e_phoff, e_shoff, e_flags,\
e_ehsize, e_phentsize, e_phnum, e_shentsize, e_shnum, e_shstrndx
@@ -62,6 +64,7 @@ def parse_elf_header():
e_ehsize, e_phentsize, e_phnum, e_shentsize, e_shnum, e_shstrndx =\
struct.unpack(hdr_fmt, elf_header[16:hdr_size])
+
def change_interpreter(elf_file_name):
if arch == 32:
ph_fmt = "<IIIIIIII"
@@ -103,6 +106,7 @@ def change_interpreter(elf_file_name):
f.write(dl_path)
break
+
def change_dl_sysdirs(elf_file_name):
if arch == 32:
sh_fmt = "<IIIIIIIIII"
@@ -200,6 +204,7 @@ def change_dl_sysdirs(elf_file_name):
f.seek(sysdirslen_off)
f.write(sysdirslen)
+
# MAIN
if len(sys.argv) < 4:
sys.exit(-1)
diff --git a/scripts/resulttool b/scripts/resulttool
index fc282bda6c..b0ba87df95 100755
--- a/scripts/resulttool
+++ b/scripts/resulttool
@@ -45,6 +45,7 @@ import resulttool.manualexecution
import resulttool.log
logger = scriptutils.logger_create('resulttool')
+
def main():
parser = argparse_oe.ArgumentParser(description="OEQA test result manipulation \
tool.",
epilog="Use %(prog)s <subcommand> --help to \
get help on a specific command") @@ -74,5 +75,6 @@ def main():
parser.error_subcommand(ae.message, ae.subcommand)
return ret
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/scripts/runqemu b/scripts/runqemu
index 259d32cd2a..c5fc7fcf5a 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -20,12 +20,15 @@ import configparser
import signal
import time
+
class RunQemuError(Exception):
"""Custom exception to raise on known errors."""
pass
+
class OEPathError(RunQemuError):
"""Custom Exception to give better guidance on missing binaries"""
+
def __init__(self, message):
super().__init__("In order for this script to dynamically infer paths\n \
kernels or filesystem images, you either need bitbake in your PATH\n \
@@ -53,8 +56,10 @@ def create_logger():
return logger
+
logger = create_logger()
+
def print_usage():
print("""
Usage: you can run this script with any valid combination
@@ -105,6 +110,7 @@ Examples:
runqemu path/to/<image>-<machine>.wic.vhd
""")
+
def check_tun():
"""Check /dev/net/tun"""
dev_tun = '/dev/net/tun'
@@ -114,6 +120,7 @@ def check_tun():
if not os.access(dev_tun, os.W_OK):
raise RunQemuError("TUN control device %s is not writable, please fix (e.g. \
sudo chmod 666 %s)" % (dev_tun, dev_tun))
+
def get_first_file(cmds):
"""Return first file found in wildcard cmds"""
for cmd in cmds:
@@ -124,6 +131,7 @@ def get_first_file(cmds):
return f
return ''
+
class BaseConfig(object):
def __init__(self):
# The self.d saved vars from self.set(), part of them are from qemuboot.conf
@@ -769,7 +777,6 @@ class BaseConfig(object):
if not os.path.exists(self.bios):
raise RunQemuError("KERNEL %s not found" % self.bios)
-
def check_mem(self):
"""
Both qemu and kernel needs memory settings, so check QB_MEM and set it
@@ -1595,5 +1602,6 @@ def main():
# Deliberately ignore the return code of 'tput smam'.
subprocess.call(["tput", "smam"])
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/scripts/send-error-report b/scripts/send-error-report
index 3fa03af2cf..39b3fbd576 100755
--- a/scripts/send-error-report
+++ b/scripts/send-error-report
@@ -28,6 +28,7 @@ version = "0.3"
log = logging.getLogger("send-error-report")
logging.basicConfig(format='%(levelname)s: %(message)s')
+
def getPayloadLimit(url):
req = urllib.request.Request(url, None)
try:
@@ -46,12 +47,14 @@ def getPayloadLimit(url):
return 0
+
def ask_for_contactdetails():
print("Please enter your name and your email (optionally), they'll be saved in \
the file you send.") username = input("Name (required): ")
email = input("E-mail (not required): ")
return username, email
+
def edit_content(json_file_path):
edit = input("Review information before sending? (y/n): ")
if 'y' in edit or 'Y' in edit:
@@ -64,6 +67,7 @@ def edit_content(json_file_path):
return True
return False
+
def prepare_data(args):
# attempt to get the max_log_size from the server's settings
max_log_size = getPayloadLimit(args.protocol + args.server + "/ClientPost/JSON")
@@ -123,7 +127,6 @@ def prepare_data(args):
if data:
json_fp.write(data)
-
if args.assume_yes == False and edit_content(args.error_file):
#We'll need to re-read the content if we edited it
with open(args.error_file, 'r') as json_fp:
@@ -196,8 +199,6 @@ if __name__ == '__main__':
dest="protocol",
action="store_const", const="http://", \
default="https://")
-
-
args = arg_parse.parse_args()
if (args.json == False):
diff --git a/scripts/sysroot-relativelinks.py b/scripts/sysroot-relativelinks.py
index 667d95404b..a28acb7e4e 100755
--- a/scripts/sysroot-relativelinks.py
+++ b/scripts/sysroot-relativelinks.py
@@ -16,6 +16,7 @@ if len(sys.argv) != 2:
topdir = sys.argv[1]
topdir = os.path.abspath(topdir)
+
def handlelink(filep, subdir):
link = os.readlink(filep)
if link[0] != "/":
@@ -27,6 +28,7 @@ def handlelink(filep, subdir):
os.unlink(filep)
os.symlink(os.path.relpath(topdir + link, subdir), filep)
+
for subdir, dirs, files in os.walk(topdir):
for f in dirs + files:
filep = os.path.join(subdir, f)
diff --git a/scripts/task-time b/scripts/task-time
index a008a0ea3d..ece4f3d898 100755
--- a/scripts/task-time
+++ b/scripts/task-time
@@ -51,6 +51,7 @@ field_regexes = (("elapsed", ".*Elapsed time: ([0-9.]+)"),
# buildstat file and <dict> maps fields from the file to their values
task_infos = []
+
def save_times_for_task(path):
"""Saves information for the buildstat file 'path' in 'task_infos'."""
@@ -77,6 +78,7 @@ def save_times_for_task(path):
task_infos.append((path, fields))
+
def save_times_for_dir(path):
"""Runs save_times_for_task() for each file in path and its subdirs, \
recursively."""
@@ -88,21 +90,26 @@ def save_times_for_dir(path):
for fname in files:
save_times_for_task(os.path.join(root, fname))
+
for path in args.paths:
if os.path.isfile(path):
save_times_for_task(path)
else:
save_times_for_dir(path)
+
def elapsed_time(task_info):
return task_info[1]["elapsed"]
+
def tot_user_time(task_info):
return task_info[1]["user"] + task_info[1]["child user"]
+
def tot_sys_time(task_info):
return task_info[1]["sys"] + task_info[1]["child sys"]
+
if args.sort != "none":
sort_fn = {"real": elapsed_time, "user": tot_user_time, "sys": tot_sys_time}
task_infos.sort(key=sort_fn[args.sort], reverse=True)
diff --git a/scripts/test-remote-image b/scripts/test-remote-image
index d209d22854..35e388c598 100755
--- a/scripts/test-remote-image
+++ b/scripts/test-remote-image
@@ -47,6 +47,8 @@ if not bitbakepath:
sys.exit(1)
# create a logger
+
+
def logger_create():
log = logging.getLogger('hwauto')
log.setLevel(logging.DEBUG)
@@ -66,6 +68,7 @@ def logger_create():
return log
+
# instantiate the logger
log = logger_create()
@@ -82,6 +85,7 @@ def get_args_parser():
parser.add_argument('--skip-download', required=False, action="store_true", \
dest="skip_download", default=False, help='Skip downloading the images completely. \
This needs the correct files to be present in the directory specified by the target \
profile.') return parser
+
class BaseTargetProfile(object, metaclass=ABCMeta):
"""
This class defines the meta profile for a specific target (MACHINE type + image \
type). @@ -123,6 +127,7 @@ class BaseTargetProfile(object, metaclass=ABCMeta):
return files_dict
+
class AutoTargetProfile(BaseTargetProfile):
def __init__(self, image_type):
@@ -201,6 +206,7 @@ class BaseRepoProfile(object, metaclass=ABCMeta):
def fetch(self, file_name, localname=None):
pass
+
class PublicAB(BaseRepoProfile):
def __init__(self, repolink, localdir=None):
@@ -225,7 +231,6 @@ class PublicAB(BaseRepoProfile):
path += distro.replace('poky', machine) + '/'
return path
-
def fetch(self, file_name, localname=None):
repo_path = self.get_repo_path()
link = self.repolink + repo_path + file_name
@@ -244,6 +249,7 @@ class PublicAB(BaseRepoProfile):
wget_cmd += " -P %s '%s'" % (localdir, link)
runCmd(wget_cmd)
+
class HwAuto():
def __init__(self, image_types, repolink, required_packages, targetprofile, \
repoprofile, skip_download): @@ -327,7 +333,6 @@ class HwAuto():
sys.exit(1)
-
def main():
parser = get_args_parser()
@@ -337,6 +342,7 @@ def main():
hwauto.run()
+
if __name__ == "__main__":
try:
ret = main()
diff --git a/scripts/tiny/dirsize.py b/scripts/tiny/dirsize.py
index 8e41126183..c37b9499b3 100755
--- a/scripts/tiny/dirsize.py
+++ b/scripts/tiny/dirsize.py
@@ -14,6 +14,7 @@ import os
import sys
import stat
+
class Record:
def create(path):
r = Record(path)
diff --git a/scripts/tiny/ksize.py b/scripts/tiny/ksize.py
index dbdff0714f..f122b892c7 100755
--- a/scripts/tiny/ksize.py
+++ b/scripts/tiny/ksize.py
@@ -15,6 +15,7 @@ import getopt
import os
from subprocess import *
+
def usage():
prog = os.path.basename(sys.argv[0])
print('Usage: %s [OPTION]...' % prog)
diff --git a/scripts/tiny/ksum.py b/scripts/tiny/ksum.py
index e1ca4033f5..fb96e1910d 100755
--- a/scripts/tiny/ksum.py
+++ b/scripts/tiny/ksum.py
@@ -23,6 +23,7 @@ import sys
import getopt
from subprocess import *
+
def usage():
prog = os.path.basename(sys.argv[0])
print('Usage: %s [OPTION]...' % prog)
@@ -31,6 +32,7 @@ def usage():
print('')
print('Run %s from the top-level Linux kernel build directory.' % prog)
+
verbose = False
n_ko_files = 0
@@ -49,6 +51,7 @@ vmlinux_data = 0
vmlinux_bss = 0
vmlinux_total = 0
+
def is_vmlinux_file(filename):
global vmlinux_level
if filename == ("vmlinux") and vmlinux_level == 0:
@@ -56,11 +59,13 @@ def is_vmlinux_file(filename):
return True
return False
+
def is_ko_file(filename):
if filename.endswith(".ko"):
return True
return False
+
def collect_object_files():
print("Collecting object files recursively from %s..." % os.getcwd())
for dirpath, dirs, files in os.walk(os.getcwd()):
@@ -72,6 +77,7 @@ def collect_object_files():
vmlinux_file = os.path.join(dirpath, filename)
print("Collecting object files [DONE]")
+
def add_ko_file(filename):
p = Popen("size -t " + filename, shell=True, stdout=PIPE, stderr=PIPE)
output = p.communicate()[0].splitlines()
@@ -88,6 +94,7 @@ def add_ko_file(filename):
ko_total += int(sizes[3])
n_ko_files += 1
+
def get_vmlinux_totals():
p = Popen("size -t " + vmlinux_file, shell=True, stdout=PIPE, stderr=PIPE)
output = p.communicate()[0].splitlines()
@@ -103,10 +110,12 @@ def get_vmlinux_totals():
vmlinux_bss += int(sizes[2])
vmlinux_total += int(sizes[3])
+
def sum_ko_files():
for ko_file in ko_file_list:
add_ko_file(ko_file)
+
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "vh", ["help"])
@@ -144,6 +153,7 @@ def main():
(vmlinux_text + ko_text, vmlinux_data + ko_data,
vmlinux_bss + ko_bss, vmlinux_total + ko_total))
+
if __name__ == "__main__":
try:
ret = main()
diff --git a/scripts/verify-bashisms b/scripts/verify-bashisms
index 7e44af3410..8f6a2abf1b 100755
--- a/scripts/verify-bashisms
+++ b/scripts/verify-bashisms
@@ -23,15 +23,18 @@ whitelist = (
'. $target_sdk_dir/${oe_init_build_env_path} $target_sdk_dir >> $LOGFILE'
)
+
def is_whitelisted(s):
for w in whitelist:
if w in s:
return True
return False
+
SCRIPT_LINENO_RE = re.compile(r' line (\d+) ')
BASHISM_WARNING = re.compile(r'^(possible bashism in.*)$', re.MULTILINE)
+
def process(filename, function, lineno, script):
import tempfile
@@ -83,6 +86,7 @@ def process(filename, function, lineno, script):
else:
return None
+
def get_tinfoil():
scripts_path = os.path.dirname(os.path.realpath(__file__))
lib_path = scripts_path + '/lib'
@@ -95,6 +99,7 @@ def get_tinfoil():
# tinfoil.logger.setLevel(logging.WARNING)
return tinfoil
+
if __name__ == '__main__':
import argparse
import shutil
@@ -155,7 +160,6 @@ if __name__ == '__main__':
attributes = (filename or realfn, key, lineno)
scripts.setdefault(attributes, script)
-
print("Scanning scripts...\n")
for result in pool.imap(func, scripts.items()):
if result:
diff --git a/scripts/wic b/scripts/wic
index 6c62f9e84e..ccfd61cea8 100755
--- a/scripts/wic
+++ b/scripts/wic
@@ -72,8 +72,10 @@ def wic_logger():
return logger
+
logger = wic_logger()
+
def rootfs_dir_to_args(krootfs_dir):
"""
Get a rootfs_dir dict and serialize to string
@@ -236,6 +238,7 @@ def wic_ls_subcommand(args, usage_str):
"""
engine.wic_ls(args, args.native_sysroot)
+
def wic_cp_subcommand(args, usage_str):
"""
Command-line handling for copying files/dirs to images.
@@ -243,6 +246,7 @@ def wic_cp_subcommand(args, usage_str):
"""
engine.wic_cp(args, args.native_sysroot)
+
def wic_rm_subcommand(args, usage_str):
"""
Command-line handling for removing files/dirs from images.
@@ -250,6 +254,7 @@ def wic_rm_subcommand(args, usage_str):
"""
engine.wic_rm(args, args.native_sysroot)
+
def wic_write_subcommand(args, usage_str):
"""
Command-line handling for writing images.
@@ -257,6 +262,7 @@ def wic_write_subcommand(args, usage_str):
"""
engine.wic_write(args, args.native_sysroot)
+
def wic_help_subcommand(args, usage_str):
"""
Command-line handling for help subcommand to keep the current
@@ -360,6 +366,7 @@ def wic_init_parser_list(subparser):
"defined inside the .wks file")
return
+
def imgtype(arg):
"""
Custom type for ArgumentParser
@@ -380,18 +387,21 @@ def imgtype(arg):
return namedtuple('ImgType', 'image part path')(image, part, path)
+
def wic_init_parser_ls(subparser):
subparser.add_argument("path", type=imgtype,
help="image spec: <image>[:<vfat partition>[<path>]]")
subparser.add_argument("-n", "--native-sysroot",
help="path to the native sysroot containing the tools")
+
def imgpathtype(arg):
img = imgtype(arg)
if img.part is None:
raise argparse.ArgumentTypeError("partition number is not specified")
return img
+
def wic_init_parser_cp(subparser):
subparser.add_argument("src",
help="image spec: <image>:<vfat partition>[<path>] or \
<file>") @@ -400,6 +410,7 @@ def wic_init_parser_cp(subparser):
subparser.add_argument("-n", "--native-sysroot",
help="path to the native sysroot containing the tools")
+
def wic_init_parser_rm(subparser):
subparser.add_argument("path", type=imgpathtype,
help="path: <image>:<vfat partition><path>")
@@ -409,6 +420,7 @@ def wic_init_parser_rm(subparser):
help="remove directories and their contents recursively, "
" this only applies to ext* partition")
+
def expandtype(rules):
"""
Custom type for ArgumentParser
@@ -440,6 +452,7 @@ def expandtype(rules):
return result
+
def wic_init_parser_write(subparser):
subparser.add_argument("image",
help="path to the wic image")
@@ -450,6 +463,7 @@ def wic_init_parser_write(subparser):
subparser.add_argument("-n", "--native-sysroot",
help="path to the native sysroot containing the tools")
+
def wic_init_parser_help(subparser):
helpparsers = subparser.add_subparsers(dest='help_topic', help=hlp.wic_usage)
for helptopic in helptopics:
@@ -500,10 +514,12 @@ def init_parser(parser):
subparser = subparsers.add_parser(subcmd, help=subcommands[subcmd][2])
subcommands[subcmd][3](subparser)
+
class WicArgumentParser(argparse.ArgumentParser):
def format_help(self):
return hlp.wic_help
+
def main(argv):
parser = WicArgumentParser(
description="wic version %s" % __version__)
diff --git a/scripts/yocto-check-layer b/scripts/yocto-check-layer
index 58f180e889..fd68c1a230 100755
--- a/scripts/yocto-check-layer
+++ b/scripts/yocto-check-layer
@@ -32,6 +32,7 @@ CASES_PATHS = \
[os.path.join(os.path.abspath(os.path.dirname(__file__)), 'lib', 'checklayer', \
'cases')] logger = scriptutils.logger_create(PROGNAME, stream=sys.stdout)
+
def test_layer(td, layer, test_software_layer_signatures):
from checklayer.context import CheckLayerTestContext
logger.info("Starting to analyze: %s" % layer['name'])
@@ -41,6 +42,7 @@ def test_layer(td, layer, test_software_layer_signatures):
tc.loadTests(CASES_PATHS)
return tc.runTests()
+
def main():
parser = argparse.ArgumentParser(
description="Yocto Project layer checking tool",
@@ -122,6 +124,7 @@ def main():
return 1
shutil.copyfile(bblayersconf, bblayersconf + '.backup')
+
def cleanup_bblayers(signum, frame):
shutil.copyfile(bblayersconf + '.backup', bblayersconf)
os.unlink(bblayersconf + '.backup')
@@ -217,6 +220,7 @@ def main():
return ret
+
if __name__ == '__main__':
try:
ret = main()
--
2.17.1
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#153420): https://lists.openembedded.org/g/openembedded-core/message/153420
Mute This Topic: https://lists.openembedded.org/mt/83869198/4454766
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [openembedded-core@marc.info]
-=-=-=-=-=-=-=-=-=-=-=-
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic