master: subtree updates oct 4 2023

poky: 61531cd395..e444d2bed0:
  Adrian Freihofer (3):
        lib/oe/utils: Refactor to make multiprocess_launch callable without d
        lib/oe/package: Refactor to make strip_execs callable without d
        oeqa/selftest/devtool: Refactor runqemu pre-requisites

  Alexander Kanavin (69):
        cargo-c-native: fix version check
        igt-gpu-tools: do not write shortened git commit hash into binaries
        curl: build and run the full set of ptests
        ptest: report tests that were killed on timeout
        perl: use 64 bit integers across all targets
        perl: ensure all failures are caught
        strace: parallelize ptest
        strace: remove from time64.inc exception list
        busybox: enable 64 bit shell arithmetic (via long long type)
        openssl: parallelize tests
        openssl: ensure all ptest fails are caught
        glibc-tests: rename to glibc-y2038-tests
        sysstat: merge .inc into .bb
        sysstat: update 12.6.2 -> 12.7.4
        glib-2.0: update 2.76.4 -> 2.78.0
        ovmf: update edk2-stable202305 -> edk2-stable202308
        libdnf: update 0.70.1 -> 0.71.0
        liburi-perl: update 5.17 -> 5.21
        python3-pygobject: update 3.44.1 -> 3.46.0
        go-helloworld: update to latest revision
        gzip: update 1.12 -> 1.13
        procps: update 4.0.3 -> 4.0.4
        screen: update 4.9.0 -> 4.9.1
        gobject-introspection: update 1.76.1 -> 1.78.0
        igt-gpu-tools: update 1.27.1 -> 1.28
        libva-utils: update 2.19.0 -> 2.20.0
        piglit: update to latest revision
        groff: add a patch to resolve build races
        groff: fix another build race via backport
        systemd: upgrade 254 -> 254.4
        util-linux: upgrade 2.39.1 -> 2.39.2
        cmake: upgrade 3.27.4 -> 3.27.5
        jquery: upgrade 3.7.0 -> 3.7.1
        python3-setuptools-rust: upgrade 1.6.0 -> 1.7.0
        vulkan: upgrade 1.3.250.0 -> 1.3.261.1
        libxcb: upgrade 1.15 -> 1.16
        xcb-proto: upgrade 1.15.2 -> 1.16.0
        boost: upgrade 1.82.0 -> 1.83.0
        btrfs-tools: upgrade 6.3.3 -> 6.5.1
        createrepo-c: upgrade 0.21.1 -> 1.0.0
        debianutils: upgrade 5.12 -> 5.13
        diffoscope: upgrade 244 -> 249
        ethtool: upgrade 6.3 -> 6.5
        font-util: upgrade 1.4.0 -> 1.4.1
        freetype: upgrade 2.13.1 -> 2.13.2
        ghostscript: upgrade 10.01.2 -> 10.02.0
        iproute2: upgrade 6.4.0 -> 6.5.0
        json-c: upgrade 0.16 -> 0.17
        kmscube: upgrade to latest revision
        libarchive: upgrade 3.7.1 -> 3.7.2
        libsdl2: upgrade 2.28.0 -> 2.28.3
        libsolv: upgrade 0.7.24 -> 0.7.25
        man-pages: upgrade 6.04 -> 6.05.01
        meson: upgrade 1.1.1 -> 1.2.1
        mmc-utils: upgrade to latest revision
        mtd-utils: upgrade 2.1.5 -> 2.1.6
        puzzles: upgrade to latest revision
        python3-dtschema: upgrade 2023.6.1 -> 2023.7
        python3-git: upgrade 3.1.35 -> 3.1.36
        python3-libarchive-c: upgrade 4.0 -> 5.0
        python3-setuptools: upgrade 68.2.1 -> 68.2.2
        python3-sphinx: upgrade 7.2.5 -> 7.2.6
        seatd: upgrade 0.7.0 -> 0.8.0
        sqlite3: upgrade 3.43.0 -> 3.43.1
        tiff: upgrade 4.5.1 -> 4.6.0
        vala: upgrade 0.56.8 -> 0.56.13
        xf86-input-libinput: upgrade 1.3.0 -> 1.4.0
        xwayland: upgrade 23.1.2 -> 23.2.1
        python3-setuptools-scm: fix upstream version check

  Alexandre Belloni (1):
        python3: fix SoB on patch

  Antoine Lubineau (1):
        cve-check: add CVSS vector string to CVE database and reports

  Bruce Ashfield (9):
        linux-yocto/6.4: update to v6.4.15
        linux-yocto/6.1: update to v6.1.52
        linux-yocto/6.4: update to v6.4.16
        linux-yocto/6.1: update to v6.1.53
        linux-yocto/6.1: update to v6.1.55
        linux-yocto-dev: update to v6.6-rcX
        linux-yocto: introduce 6.5 reference kernel recipes
        linux-libc-headers: uprev to v6.5
        linux-libc-headers: default to 6.5

  Charles-Antoine Couret (1):
        systemd-boot-cfg: add .conf suffix to default entry label

  Chen Qi (1):
        python3: add cpython to CVE_PRODUCT

  Daniel Semkowicz (2):
        wic: bootimg-partition: Fix file name in debug message
        uboot-extlinux-config.bbclass: Add missing variable descriptions

  Deepthi Hemraj (2):
        binutils: stable 2.41 branch updates.
        glibc: stable 2.38 branch updates.

  Denys Dmytriyenko (2):
        bitbake.conf: add MACHINE to SDK_NAME
        spdx: use TOOLCHAIN_OUTPUTNAME for SDK filename prefix

  Derek Straka (1):
        pypi.bbclass: Update the upstream checks to automatically replace '_' with '-'

  Eilís 'pidge' Ní Fhlannagáin (2):
        lib/oe/package_managegment: Add nativesdk-intercept PATH
        update_mandb: deb fails due to missing man cache

  Etienne Cordonnier (1):
        bitbake: bitbake-worker/runqueue: Avoid unnecessary bytes object copies

  Insu Park (1):
        bitbake: data: Add missing dependency handling of remove operator

  Jan Garcia (1):
        insane.bbclass: Count raw bytes in shebang-size

  Joshua Watt (6):
        classes/create-spdx-2.2: Add extra debugging for missing package files
        nfs-utils: Don't start nfs-statsd.service without exports
        nfs-utils: Add StateDirectory for systemd services
        bitbake: utils: Add path_is_descendant()
        bitbake: fetch2: git: Use path_is_descendant() instead of path for repo check
        classes/create-spdx-2.2: Show error if document is not found

  Julien Stephan (1):
        bitbake: bitbake: cooker: add a new function to retrieve task signatures

  Kai Kang (2):
        goarch.bbclass: not compatible with riscv32
        adwaita-icon-theme: 43 -> 45.0

  Khem Raj (25):
        perl: Add packageconfig for setlocale functionality differences
        libc-test: Run as non-root user
        coreutils: Upgrade to 9.4
        coreutils: Add config.h to ptest package
        gettext: Add missing dependency on gawk autoconf
        util-linux: Disable failing tests on musl
        Revert "util-linux: scanf_cv_alloc_modifier changed from 'as' -> 'ms'"
        util-linux: Fix lscpu on musl
        qemu: Add PACKAGECONFIG for dax
        llvm: Upgrade to 17.0.1
        oeqa: Use 2.14 release of cpio instead of 2.13
        musl: Update to latest
        bsd-headers: Define __CONCAT and __STRING
        mesa: Update clang-17 patch to upstream v2
        musl-legacy-error: Add recipe
        elfutils: Depend on musl-legacy-error for musl targets
        debugedit: Use musl-legacy-error
        systemd: Drop two upstreamed musl patches
        systemd: Refresh patches to avoid patch-fuzz
        glib-2.0: Enable possible locales with musl for ptests
        glib-2.0: Remove failing ptests on musl
        llvm: Upgrade to 17.0.2
        createrepo-c: Fix function declaration bug found with clang
        mesa: Simplify llvm-17 patch
        mesa: Fix native build on hosts with llvm-dev installed

  Lee Chee Yang (2):
        bind: update to 9.18.19
        cups: fix CVE-2023-4504

  Markus Volk (8):
        mesa: upgrade 23.1.3 -> 23.1.7
        libportal: upgrade 0.6 -> 0.7.1
        appstream: import recipe from meta-oe
        libadwaita: upgrade 1.3.4 -> 1.4.0
        maintainers.inc: add missing entries for appstream and libxmlb
        libxmlb: import recipe from meta-oe
        pulseaudio: dont include consolekit for systemd
        mesa: Upgrade 23.1.7 -> 23.1.8

  Marta Rybczynska (3):
        python3-ply: add to nativesdk
        python3-isodate: add homepage
        python3-rdflib: add homepage

  Martin Jansa (3):
        gcc: backport a fix for ICE caused by CVE-2023-4039.patch
        fontcache.bbclass: avoid native recipes depending on target fontconfig
        multilib_script.bbclass: expand script name as well

  Matthias Schnelte (1):
        bitbake: fetch2: Adds vscode devcontainer support

  Michael Opdenacker (18):
        base: add newline before LICENSE_FLAGS_DETAILS
        dev-manual: new-recipe.rst fix inconsistency with contributor guide
        contributor-guide: recipe-style-guide: add Upstream-Status
        dev-manual: licenses: update license manifest location
        dev-manual: licenses: mention SPDX for license compliance
        dev-manual: disk-space: improve wording for obsolete sstate cache files
        sdk-manual: extensible.rst: fix multiple formatting issues
        alsa-lib: upgrade 1.2.9 -> 1.2.10
        alsa-utils: upgrade 1.2.9 -> 1.2.10
        shadow: fix patch Upstream-Status
        libevent: fix patch Upstream-Status
        alsa-utils: update patch Upstream-Status
        alsa-lib: fix patch Upstream-Status
        lib/oe/qa: remove obsolete "Accepted" string for Upstream-Status
        lib/oe/qa: update guidelines link for Upstream-Status
        bsp-guide: bsp.rst: replace reference to wiki
        dev-manual: new-recipe.rst: replace reference to wiki
        maintainers.inc: add self for flac recipe

  Mikko Rapeli (9):
        openssh: update Upstream-Status to Denied in test logging patch
        openssh: improve banner ptest failure logging
        testimage.bbclass: detect slirp from TEST_RUNQEMUPARAMS
        oeqa dnf_runtime.py: fix HTTP server IP address and port
        oeqa selftest runtime_test.py: append to TEST_RUNQEMUPARAMS
        selftest runtime_test.py: add testimage.bbclass slirp test
        openssh: capture logs in run-ptest
        testimage.bbclass: remove QEMU_USE_SLIRP variable
        oeqa/selftest/context.py: check git command return values

  Ninad Palsule (1):
        kernel-fitImage: Strip path component from dtb

  Peter Kjellerstedt (7):
        libsoup-2.4: Only specify --cross-file when building for target
        libsoup: Only specify --cross-file when building for target
        bitbake: tinfoil: Do not fail when logging is disabled and full config is used
        bitbake: bitbake-getvar: Make --quiet work with --recipe
        bitbake: bitbake-getvar: Make --value imply --quiet
        bitbake: bitbake-getvar: Add a (suppressable) error for undefined variables
        bitbake: bitbake-getvar: Treat undefined variables as empty with --value

  Peter Marko (2):
        openssl: Upgrade 3.1.2 -> 3.1.3
        json-c: define CVE_VERSION

  Qiu Tingting (1):
        tar: add ptest support

  Richard Purdie (34):
        bitbake.conf: Add IMAGE_BASENAME to SDK_NAME
        vim: Upgrade 9.0.1664 -> 9.0.1894
        defaultsetup: Inherit create-spdx by default
        oeqa/selftest/runtime_test: No need to use append with TEST_RUNQEMUPARAMS
        devtool/build_sdk: Drop unused imports
        bitbake: lib: Drop inotify support and replace with mtime checks
        bitbake: server/process: Disable the flush() call in server logging
        recipetool/devtool: Ensure server knows about changed files
        lttng-tools: Upgrade 2.13.10 -> 2.13.11
        oeqa/selftest/wic: Improve assertTrue calls
        elfutils: Fix reproducibility issue with bunzip2
        bitbake: cooker: Drop unneeded flush calls
        sstate: Fix nativesdk entry in SSTATE_ARCHS
        multilib: fix SSTATE_ARCHS for multilib usage
        license/license_image: Fix license file layout to avoid overlapping files
        oeqa/selftest/bbtests: Improve and update test_non_gplv3
        create-spdx/sbom: Ensure files don't overlap between machines
        sstate: Stop allowing overlapping symlinks from sstate
        recipes: Drop remaining PR values from recipes
        bitbake.conf: No longer support PR from filename
        oeqa/selftest: Fix broken symlink removal handling
        oeqa/selftest/reproducible: Avoid oe-selftest startup delays
        oeqa: Streamline oe-selftest startup time
        oeqa/selftest/oescripts: Avoid variable access at module load
        bitbake: codeparser: Update debug variable reference
        contributor-guide/style-guide: Refer to recipes, not packages
        contributor-guide/style-guide: Add a note about task idempotence
        lib: Import packagedata oe module by default
        oeqa/runner: Ensure class setup errors are shown to bitbake logging
        create-spdx: Ensure it is clear where the message comes from
        oeqa/utils/gitarchive: Handle broken commit counts in results repo
        python3-numpy: Fix reproducibility issue
        scritps/runqemu: Ensure we only have two serial ports
        glibc: Pull in stable branch fixes

  Robert Joslyn (2):
        curl: Update from 8.2.1 to 8.3.0
        curl: Skip tests marked flaky

  Robert Yang (1):
        libxcrypt-compat: Remove libcrypt.so to fix conflict with libcrypt

  Roland Hieber (7):
        template: fix typo in section header
        ref-manual: point outdated link to the new location
        contributor-guide: recipe-style-guide: add more patch tagging examples
        contributor-guide: recipe-style-guide: add section about CVE patches
        contributor-guide: discourage marking patches as Inappropriate
        contributor-guide: deprecate "Accepted" patch status
        contributor-guide: style-guide: discourage using Pending patch status

  Ross Burton (19):
        packagegroup-core-x11-xserver: add modesetting driver to default XSERVER
        machine/qemu*: add modesetting drivers to XSERVER
        beaglebone-yocto: remove redundant XSERVER assignment
        gcc: Fix -fstack-protector issue on aarch64
        testimage: respect target/server IPs when using slirp
        manuals: document LICENSE_FLAGS_DETAILS
        linux-yocto: update CVE ignores
        libwebp: upgrade to 1.3.2
        oeqa/runtime/parselogs: remove unused imports
        oeqa/runtime/parselogs: don't bother to show target hardware information
        oeqa/runtime/parselogs: remove obsolete LSB testing support
        oeqa/runtime/parselogs: inline single-caller functions
        oeqa/runtime/parselogs: improve find call
        oeqa/runtime/parselogs: don't pass around members
        oeqa/runtime/parselogs: move some variables out of global scope
        oeqa/runtime/parselogs: select the correct machine-specific ignores early
        oeqa/runtime/parselogs: parse the logs with Python, not grep
        webkitgtk: reduce size of -dbg package
        bitbake: bitbake/lib: spawn server/worker using the current Python interpreter

  Samantha Jalabert (14):
        python3-isodate: Copy recipe from meta-python
        python3-booleanpy: Copy recipe from meta-python
        python3-beartype: add recipe
        python3-click: Copy recipe from meta-python
        ptest-packagelists.inc: add python test click
        python3-license-expression: Copy recipe from meta-python
        ptest-packagelists.inc: add python test license-expression
        python3-rdflib: Copy recipe from meta-python
        python3-uritools: add recipe
        python3-xmltodict: Copy recipe from meta-python
        ptest-packagelists.inc: add python test xmltodict
        python3-spdx-tools: add recipe
        qa: Add selftest for python3-spdx-tools
        maintainers.inc: add python3-spdx-tools and dependencies

  Sean Nyekjaer (1):
        gcc: depend on zstd

  Stefan Tauner (1):
        gdb: fix RDEPENDS for PACKAGECONFIG[tui]

  Stephan Wurm (1):
        python3-jsonschema: Update homepage URL

  Tim Orling (1):
        python3-cryptography{-vectors}: upgrade to 41.0.4

  Trevor Gamblin (6):
        patchtest: Add tests from patchtest oe repo
        patchtest/selftest: remove configurable target
        patchtest: add requirements.txt
        patchtest: Add README.md for selftests
        python3-ptest: skip test_input_no_stdout_fileno
        patchtest/selftest: only split resultlines once

  Ulrich Ölmann (1):
        packagegroup-base: clean up setting packagegroup-machine-base's SUMMARY

  Wang Mingyu (36):
        alsa-ucm-conf: upgrade 1.2.9 -> 1.2.10
        at-spi2-core: upgrade 2.48.3 -> 2.48.4
        dbus: upgrade 1.14.8 -> 1.14.10
        debianutils: upgrade 5.8 -> 5.12
        dnf: upgrade 4.16.1 -> 4.17.0
        harfbuzz: upgrade 8.1.1 -> 8.2.0
        kexec-tools: upgrade 2.0.26 -> 2.0.27
        libinput: upgrade 1.23.0 -> 1.24.0
        libnl: upgrade 3.7.0 -> 3.8.0
        nghttp2: upgrade 1.55.1 -> 1.56.0
        ccache: upgrade 4.8.2 -> 4.8.3
        pkgconf: upgrade 2.0.2 -> 2.0.3
        python3-git: upgrade 3.1.34 -> 3.1.35
        python3-hypothesis: upgrade 6.84.0 -> 6.84.3
        python3-pyelftools: upgrade 0.29 -> 0.30
        python3-pytest: upgrade 7.4.1 -> 7.4.2
        python3-setuptools: upgrade 68.1.2 -> 68.2.1
        strace: upgrade 6.4 -> 6.5
        stress-ng: upgrade 0.16.04 -> 0.16.05
        wayland-utils: upgrade 1.1.0 -> 1.2.0
        wireless-regdb: upgrade 2023.05.03 -> 2023.09.01
        at-spi2-core: upgrade 2.48.4 -> 2.50.0
        enchant2: upgrade 2.5.0 -> 2.6.1
        harfbuzz: upgrade 8.2.0 -> 8.2.1
        kbd: upgrade 2.6.2 -> 2.6.3
        libsecret: upgrade 0.21.0 -> 0.21.1
        gobject-introspection: upgrade 1.78.0 -> 1.78.1
        python3-numpy: upgrade 1.25.2 -> 1.26.0
        python3-hypothesis: upgrade 6.84.3 -> 6.86.2
        python3-pycryptodome: upgrade 3.18.0 -> 3.19.0
        python3-pycryptodomex: upgrade 3.18.0 -> 3.19.0
        python3-smmap: upgrade 5.0.0 -> 6.0.0
        python3-trove-classifiers: upgrade 2023.8.7 -> 2023.9.19
        python3-typing-extensions: upgrade 4.7.1 -> 4.8.0
        python3-urllib3: upgrade 2.0.4 -> 2.0.5
        python3-zipp: upgrade 3.16.2 -> 3.17.0

  Yash Shinde (1):
        glibc: fix CVE-2023-4527

  Yogita Urade (2):
        tiff: fix CVE-2023-40745
        tiff: fix CVE-2023-41175

meta-openembedded: eff1b182c1..ea42cec2ec:
  Alex Kiernan (2):
        mdns: Upgrade 1790.80.10 -> 2200.0.8
        jq: Upgrade 1.6+git -> 1.7

  Archana Polampalli (2):
        python3-appdirs: print ptest results in unified format
        nodejs: upgrade 18.17.1 -> 20.5.1

  Armin Kuster (1):
        openldap: update to 2.5.16.

  Bruce Ashfield (2):
        zfs: update to v2.2.0-rc4
        vboxguestdrivers: fix kernel v6.5 build

  Chi Xu (1):
        mariadb: Add ptest support

  Clément Péron (6):
        etcd-cpp-apiv3: upgrade 0.14.3 -> 0.15.3
        devtools: grpc: bump to 1.56.2
        protobuf: upgrade 4.22.2 -> 4.23.4
        protobuf-c: bump to next release to support protobuf 4.23.x
        mariadb: add missing <cstdint> in rocksdb string_util.h
        etcd-cpp-apiv3: fix build when gRPC is cross compiled

  Daniel Semkowicz (2):
        cockpit: Move packagekit to a separate package
        cockpit: Move apps to a separate package

  Derek Straka (54):
        python3-absl: Update version 1.4.0 -> 2.0.0
        python3-brotli: Update version 1.0.9 -> 1.1.0
        python3-cachecontrol: Update version 0.13.0 -> 0.13.1
        python3-cantools: Update version 38.0.2 -> 39.2.0
        python3-cerberus: Update version 1.3.4 -> 1.3.5
        python3-configshell-fb: Update version 1.1.29 -> 1.1.30
        python3-custom-inherit: Update version 2.3.1 -> 2.4.1
        python3-distlib: Update version 0.3.6 -> 0.3.7
        python3-fasteners: Update version 0.18 -> 0.19
        python3-filelock: Update version 3.12.0 -> 3.12.4
        python3-bleak: Update version 0.20.2 -> 0.21.1
        python3-dynamic-dispatch: Correct the upstream regex check for version upgrades
        python3-google-api-python-client: Update version 2.99.0 -> 2.100.0
        python3-sqlalchemy: Upgrade 2.0.20 -> 2.0.21
        python3-netaddr: Update version 0.8.0 -> 0.9.0
        python3-msgpack: Update version 1.0.5 -> 1.0.6
        python3-protobuf: Update version 4.24.2 -> 4.24.3
        python3-gevent: Update version 23.7.0 -> 23.9.1
        python3-langtable: Update version 0.0.63 -> 0.0.64
        python3-posix-ipc: Update version 1.0.5 -> 1.1.1
        python3-websocket-client: Update version 1.5.3 -> 1.6.3
        python3-web3: Update version 6.9.0 -> 6.10.0
        python3-apiflask: Update version 2.0.1 -> 2.0.2
        python3-argh: Update version 0.29.3 -> 0.29.4
        python3-async-timeout: remove old version of the library
        python3-pydantic: Update version 1.10.7 -> 2.4.1
        python3-pyhamcrest: Fix upstream check by specifying the UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
        python3-pyasn1-modules: Update version 0.2.8 -> 0.3.0
        python-pyiface: Update version from git -> 0.0.11
        python3-pymysql: Fix upstream check by specifying the UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
        python3-pymysql: update verion 1.0.2 -> 1.1.0
        python3-pyproj: update version 3.6.0 -> 3.6.1
        python3-pyproject-api: update version 1.5.1 -> 1.6.1
        python3-redis: update version 5.0.0 -> 5.0.1
        python3-traitlets: update version 5.9.0 -> 5.10.1
        python3-xxhash: update version 3.2.0 -> 3.3.0
        python3-pyzmq: update version 25.0.0 -> 25.1.1
        python3-cachecontrol: Fix upstream check by specifying the UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
        python3-flask-babel: update version 2.0.0 -> 3.1.0
        python3-idna-ssl: Fix upstream check by specifying the UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
        python3-ninja-syntax: Fix upstream check by specifying the UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
        python3-prettytable: update version 3.6.0 -> 3.9.0
        python3-pytz-deprecation-shim: Remove outdated recipe meant to be a short lived shim
        python3-tzlocal: Remove dependency on pytz_deprecation_shim removed in release 5.0
        python3-astroid: update version 2.16.6 -> 3.0.0
        python3-flask: update version 2.3.2 -> 2.3.3
        python3-google-api-core: update version 2.12.0
        python3-google-api-python-client: update version 2.100.0 -> 2.101.0
        python3-google-auth: update version 2.23.0 -> 2.23.1
        python3-parse-type: update version 0.5.2 -> 0.6.2
        python3-nacl: Add recipe for the latest release of PyNaCl
        python3-botocore: add recipe for latest version of botocore
        python3-boto3: add recipe for latest version of boto3
        python3-flask-cors: add initial version of the recipe for 4.0.0

  Etienne Cordonnier (1):
        uutils-coreutils: upgrade 0.0.20 -> 0.0.21

  Gianfranco Costamagna (3):
        mosquitto: do not automatically depend on dlt-daemon, it's a non-mandatory logging system
        mosquitto: upgrade 2.0.15 -> 2.0.17
        mosquitto: upgrade 2.0.17 -> 2.0.18

  Jeffrey Pautler (1):
        bolt: disable CVE checking for this recipe

  Jonas Gorski (1):
        frr: upgrade 8.4.4 -> 9.0.1

  Julian Haller (1):
        openct: Fix typo in SUMMARY variable

  Kai Kang (1):
        ostree: not compatible with riscv32 when ptest enabled

  Khem Raj (25):
        vlc: Fix build with gettext 0.22+
        usbguard: Enable seccomp if distro features have it
        sharutils: Check for intmax_t using configure
        poco: Add pass/fail ststus into logs
        mongodb: Add rdep on tzdata-core
        mongodb: Upgrade to 4.4.24
        meta-oe-ptest-image-poco: Increase size tp 1G
        poco: Fix ptest runtime errors
        poco: Do not enable MongoDB packageconfig by default
        plocate: Upgrade to 1.1.19 release
        xscreensaver: Add osuosl backup MIRROR
        mozjs-115: Apply autoconf tuple mismatch fix
        cpp-netlib: Fix build with boost 1.80+
        cpp-netlib: Fix buildpaths in generated cmake files
        python3-pybluez: Fix patch upstream-status
        python3-pynetlinux: Fix patch upstream-status
        libnet-idn-encode: Add recipe
        libio-socket-ssl-perl: Change libnet-libidn-perl->libnet-idn-encode rdep for ptests
        libnfs: Drop -Wno-implicit-function-declaration
        webkitgtk3: Do not use musttail with clang on arm
        fftw: Fix ptest result reporting
        nodejs: Fix ptest result reporting
        relayd: Update to latest tip of trunk
        relayd: Fix build with clang
        kernel-selftest: Build headers before compiling tests

  Lee Chee Yang (8):
        libsdl: fix CVE-2022-34568
        keepalived: 2.2.2 -> 2.2.8
        irssi: 1.4.2 -> 1.4.4
        iniparser: Fix CVE-2023-33461
        opensc: fix CVE-2023-2977
        x11vnc: Fix CVE-2020-29074
        libvncserver: update to 0.9.14
        ntpsec: 1.2.2 -> 1.2.2a

  Markus Volk (48):
        libei: add recipe
        libxmlb: update 0.3.10 -> 0.3.14
        appstream: update 0.16.2 -> 0.16.3
        webrtc-audio-processing: add recipe for 1.x
        pipewire: upgrade 0.3.79 -> 0.3.80
        evolution-data-server: upgrade 3.48.3 -> 3.50.0
        appstream: remove workaround for cross-compile
        libxmlb: fix a reproducibility and runtime issue with ptest
        tracker-miners: upgrade 3.5.0 -> 3.6.0
        mozjs: upgrade 102.9.0 -> 102.15.0
        tecla: add recipe
        polkit: upgrade 122 -> 123
        tracker: upgrade 3.5.1 -> 3.6.0
        libxmlb: remove recipe
        appstream: remove recipe
        gvfs: upgrade 1.51.90 -> 1.52.0
        mutter: upgrade 44.3 -> 45.0
        xdg-desktop-portal: upgrade 1.16.0 -> 1.18.0
        gnome-boxes: upgrade 44.2 -> 45.0
        gnome-session: upgrade 44.0 -> 45.0
        gnome-text-editor: upgrade 44.0 -> 45.0
        gnome-shell: upgrade 44.3 -> 45.0
        eog: upgrade 44.3 -> 45.0
        gnome-calculator: upgrade 44.0 -> 45.0
        xdg-desktop-portal-gnome: upgrade 44.1 -> 45.0
        gnome-calendar: upgrade 44.0 -> 45.0
        gnome-software: upgrade 44.4 -> 45.0
        zenity: upgrade 3.44.0 -> 3.44.2
        gnome-system-monitor: upgrade 44.0 -> 45.0
        webkitgtk: upgrade 2.40.5 -> 2.42.0
        gnome-control-center: upgrade 44.3 -> 45.0
        gnome-settings-daemon: upgrade 44.1 -> 45.0
        tracker: add missing Upstream-Status
        gdm: upgrade 44.1 -> 45.0.1
        gnome-calendar: fix reproducibility issue
        exiv2: Upgrade 0.27.6 -> 0.28.0
        gexiv: Upgrade 0.14.0 -> 0.14.2
        gjs: Upgrade 1.76.1 -> 1.78.0
        mozjs: add recipe for v115
        evince: Upgrade 44.2 -> 45.0
        Nautilus: Upgrade 44.2.1 -> 45.0
        gedit: Upgrade 44.2 -> 46.1
        tepl: Upgrade 6.4.0 -> 6.8.0
        libblockdev: Upgrade 2.28 -> 3.03
        udisks2: Upgrade 2.9.4 -> 2.10.1
        mozjs: Upgrade 102.15.0 -> 102.15.1
        libnfs: dont install libnfs-config.cmake
        gnome-remote-desktop: Upgrade 44.2 -> 45.0

  Martin Jansa (20):
        webrtc-audio-processing: Fix build with -Werror=return-type
        freeglut: return x11 to REQUIRED_DISTRO_FEATURES
        packagegroup-meta-multimedia: restore x11 restriction for projucer
        btrfsmaintenance: move btrfs-tools dependency from build-time to run-time
        btrfsmaintenance: drop allarch
        ttf-google-fira: exclude siggen dependency on fontconfig
        cukinia: drop allarch
        mdio-tools: exclude siggen dependency on mdio-netlink
        ot-br-posix: exclude siggen dependency on ipset
        mongodb: add and fix Upstream-Status
        mongodb: Fix build on 32bit
        gupnp: fix build with meson-1.2.0
        minifi-cpp, mozjs-115, redis-7.2.1, pv: add missing Upstream-Status
        mozjs: fix filename in MULTILIB_SCRIPTS
        gupnp-tools: fix build with meson-1.2.0
        gnome-tweaks, networkmanager-fortisslvpn, libesmtp, json-schema-validator, python3-pybluez, python3-pynetlinux, apache2: Fix Malformed Upstream-Status
        mozjs: use PV in MULTILIB_SCRIPTS
        mosquitto, etcd-cpp-apiv3: add missing Upstream-Status
        meta-oe/dynamic-layers: add Upstream-Status where missing
        meta-oe/dynamic-layers: add one more missing Upstream-Status and fix one malformed

  Michał Iwanicki (1):
        python3-pyu2f: add recipe

  Mingli Yu (4):
        minifi-cpp: Remove the buildpath issue
        hdf5: Upgrade to 1.14.2
        vlock: Use EXTRA_CFLAGS
        mozjs-102: Remove the buildpath

  Richard Leitner (2):
        python3-shellingham: add recipe for v1.5.3
        python3-autoflake: add recipe for v2.2.1

  Ross Burton (1):
        webkitgtk3: reduce size of -dbg package

  Sam Van Den Berge (6):
        python3-flask-jwt-extended: add recipe
        python3-flask-marshmallow: add recipe
        python3-apispec: add recipe
        python3-flask-httpauth: add recipe
        python3-webargs: add recipe
        python3-apiflask: add recipe

  Samantha Jalabert (6):
        Remove python3-rdflib
        Remove python3-license-expression
        Remove python3-xmltodict
        Remove python3-booleanpy
        Remove python3-click
        Remove python3-isodate

  Samuli Piippo (1):
        protobuf: stage protoc binary to sysroot

  Sanjay Chitroda (1):
        netkit-telnet: Fix CVE-2022-39028

  Trevor Gamblin (1):
        python3-aiofiles: upgrade 23.1.0 -> 23.2.1

  Vyacheslav Yurkov (3):
        overlayfs-tools: Drop unneeded dependency
        overlayfs-tools: Bump up the version
        overlayfs-tools: Install fsck binary

  Wang Mingyu (42):
        freerdp: upgrade 2.10.0 -> 2.11.0
        boost-sml: upgrade 1.1.8 -> 1.1.9
        ctags: upgrade 6.0.20230827.0 -> 6.0.20230917.0
        dovecot: upgrade 2.3.20 -> 2.3.21
        freerdp: upgrade 2.11.0 -> 2.11.1
        gensio: upgrade 2.7.5 -> 2.7.6
        geoclue: upgrade 2.7.0 -> 2.7.1
        hwloc: upgrade 2.9.2 -> 2.9.3
        iperf3: upgrade 3.14 -> 3.15
        libcloudproviders: upgrade 0.3.2 -> 0.3.4
        libdeflate: upgrade 1.18 -> 1.19
        libglvnd: upgrade 1.6.0 -> 1.7.0
        libtommath: upgrade 1.2.0 -> 1.2.1
        libcoap: upgrade 4.3.1 -> 4.3.3
        python3-antlr4-runtime: upgrade 4.13.0 -> 4.13.1
        python3-lazy: upgrade 1.5 -> 1.6
        python3-pyfanotify: upgrade 0.2.0 -> 0.2.1
        psqlodbc: upgrade 15.00.0000 -> 16.00.0000
        python3-argcomplete: upgrade 3.1.1 -> 3.1.2
        python3-bitstring: upgrade 4.1.1 -> 4.1.2
        python3-cmake: upgrade 3.27.4.1 -> 3.27.5
        python3-coverage: upgrade 7.3.0 -> 7.3.1
        python3-engineio: upgrade 4.7.0 -> 4.7.1
        python3-eth-utils: upgrade 2.2.0 -> 2.2.1
        python3-flask-migrate: upgrade 4.0.4 -> 4.0.5
        python3-flask-socketio: upgrade 5.3.5 -> 5.3.6
        python3-google-api-python-client: upgrade 2.97.0 -> 2.99.0
        python3-google-auth: upgrade 2.22.0 -> 2.23.0
        python3-pillow: upgrade 10.0.0 -> 10.0.1
        python3-pymisp: upgrade 2.4.175 -> 2.4.176
        python3-pymodbus: upgrade 3.5.0 -> 3.5.2
        python3-rapidjson: upgrade 1.10 -> 1.11
        python3-rich: upgrade 13.5.2 -> 13.5.3
        python3-term: upgrade 2.4 -> 2.5
        python3-tox: upgrade 4.11.1 -> 4.11.3
        python3-typeguard: upgrade 4.1.3 -> 4.1.5
        python3-types-setuptools: upgrade 68.1.0.1 -> 68.2.0.0
        python3-virtualenv: upgrade 20.24.4 -> 20.24.5
        python3-xlsxwriter: upgrade 3.1.2 -> 3.1.3
        python3-zeroconf: upgrade 0.97.0 -> 0.112.0
        redis: upgrade 7.2.0 -> 7.2.1
        remmina: upgrade 1.4.31 -> 1.4.32

  Xiangyu Chen (3):
        mosh: add support of protobuf 4.22.x
        protobuf: upgrade 3.21.12 -> 4.22.2
        protobuf-c: add support of protobuf 4.22.x

  Yi Zhao (1):
        audit: upgrade 3.1.1 -> 3.1.2

meta-arm: bd0953cc60..95789365f7:
  Abdellatif El Khlifi (2):
        arm-bsp/trusted-firmware-a: corstone1000: enable ERRATA_A35_855472
        arm-bsp/u-boot: corstone1000: purge U-Boot specific DT nodes before Linux

  Adam Johnston (1):
        arm-bsp/trusted-firmware-a: Fix BL32 path if usrmerge enabled

  Divin Raj (1):
        ci,doc,kas,arm-bsp,arm: Remove support for fvp-baser-aemv8r64 machine

  Emekcan Aras (6):
        arm-bsp/optee-os: corstone1000: Handling logging syscall correctly
        CI: Add meta-secure-core
        CI: Include meta-secure-core in corstone1000
        kas: corstone1000: add meta-secure-core
        arm-bsp/u-boot: corstone1000: introduce authenticated capsule update
        arm-bsp/trusted-firmware-m: Enable authenticated capsule update

  Javier Tia (2):
        optee-client: start tee-supplicant.service when teeprivX dev is detected
        libts: tee-udev.rules: Change ownership to tee group

  Jon Mason (5):
        arm/edk2: update to edk2-stable202308
        arm/trusted-firmware-m: update to 1.8.1
        arm/opencsd: update to v1.4.1
        arm/scp-firmware: update to v2.13.0
        README: remove reference to meta-arm-autonomy

  Khem Raj (1):
        layer.conf: update LAYERSERIES_COMPAT for nanbield

  Mariam Elshakfy (2):
        arm-bsp/optee-os: N1SDP upgrade optee-os to 3.22
        arm-bsp/optee-os: N1SDP upgrade tadevkit and optee-test to 3.22

  Peter Hoyes (2):
        CI: Allow a GitHub container registry mirror to be specified
        CI: Make update-repos more resilient to network issues

  Ross Burton (15):
        arm/generic-arm64: move SERIAL_CONSOLES to generic-arm64
        arm/qemu-generic-arm64: force off KVM in qemu
        arm/generic-arm64: set XSERVER to install the modesetting driver
        CI: remove redundant variables in testimage.yml
        arm-bsp: change port mapping for SSH to port 2222
        arm/apply_local_src_patches: allow use in multiple directories
        arm/trusted-services: pass through CMake generator
        arm/trusted-services: add missing pkgconfig inherit
        arm/trusted-services/ts-remote-test: move binary to $bindir
        arm/trusted-services/ts-sp-env-test: add missing DEPENDS
        arm/trusted-services/ts-sp-env-test: remove
        arm/trusted-services: use apply_local_src_patches
        arm/trusted-services: upgrade nanopb and fix build races
        CI: use a venv for sphinx
        CI: upgrade to Kas 4 container

  Xueliang Zhong (2):
        arm-bsp/n1sdp: update to linux yocto kernel 6.4
        arm-bsp/corstone1000: bump kernel version to v6.4

meta-security: 1856a7cf43..aca6d4a9e7:
  Armin Kuster (10):
        suricata: fix build issue.
        suricata: Update to 7.0.0
        sssd: Update to 2.9.2
        openscap: update to 1.3.9
        python3-privacyidea: update to 3.8.1
        lkrg-module: update to 0.9.7
        libhtp: update to 0.5.45
        swtpm: update 0.8.1
        lynis: Update to 3.0.9
        scap-security-guide: Drop Poky patch and update to tip

  John Broadbent (1):
        libhoth: Update

meta-raspberrypi: 6501ec892c..482d864b8f:
  Joshua Watt (1):
        rpi-base: Fix wic image kernel dependency

  Khem Raj (5):
        userland: Update to trunk from 20230419
        linux-raspberrypi: Upgrade 6.1 release to latest point release 6.1.54
        linux-firmware-rpidistro: Update to 20230210-5_bpo11+1
        bluez-firmware-rpidistro: Update to 1.2-4+rpt10
        raspberrypi-firmware: Update to 20230509~buster

  Martin Jansa (1):
        layer.conf: update LAYERSERIES_COMPAT for nanbield

Change-Id: Id75112a3b0be4bd150dc5d9a28c01982ed48200e
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/poky/meta/lib/patchtest/tests/__init__.py b/poky/meta/lib/patchtest/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/__init__.py
diff --git a/poky/meta/lib/patchtest/tests/base.py b/poky/meta/lib/patchtest/tests/base.py
new file mode 100644
index 0000000..27db380
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/base.py
@@ -0,0 +1,239 @@
+# Base class to be used by all test cases defined in the suite
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import unittest
+import logging
+import json
+import unidiff
+from data import PatchTestInput
+import mailbox
+import collections
+import sys
+import os
+import re
+
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'pyparsing'))
+
+logger = logging.getLogger('patchtest')
+debug=logger.debug
+info=logger.info
+warn=logger.warn
+error=logger.error
+
+Commit = collections.namedtuple('Commit', ['author', 'subject', 'commit_message', 'shortlog', 'payload'])
+
+class PatchtestOEError(Exception):
+    """Exception for handling patchtest-oe errors"""
+    def __init__(self, message, exitcode=1):
+        super().__init__(message)
+        self.exitcode = exitcode
+
+class Base(unittest.TestCase):
+    # if unit test fails, fail message will throw at least the following JSON: {"id": <testid>}
+
+    endcommit_messages_regex = re.compile('\(From \w+-\w+ rev:|(?<!\S)Signed-off-by|(?<!\S)---\n')
+    patchmetadata_regex   = re.compile('-{3} \S+|\+{3} \S+|@{2} -\d+,\d+ \+\d+,\d+ @{2} \S+')
+
+
+    @staticmethod
+    def msg_to_commit(msg):
+        payload = msg.get_payload()
+        return Commit(subject=msg['subject'].replace('\n', ' ').replace('  ', ' '),
+                      author=msg.get('From'),
+                      shortlog=Base.shortlog(msg['subject']),
+                      commit_message=Base.commit_message(payload),
+                      payload=payload)
+
+    @staticmethod
+    def commit_message(payload):
+        commit_message = payload.__str__()
+        match = Base.endcommit_messages_regex.search(payload)
+        if match:
+            commit_message = payload[:match.start()]
+        return commit_message
+
+    @staticmethod
+    def shortlog(shlog):
+        # remove possible prefix (between brackets) before colon
+        start = shlog.find(']', 0, shlog.find(':'))
+        # remove also newlines and spaces at both sides
+        return shlog[start + 1:].replace('\n', '').strip()
+
+    @classmethod
+    def setUpClass(cls):
+
+        # General objects: mailbox.mbox and patchset
+        cls.mbox = mailbox.mbox(PatchTestInput.repo.patch)
+
+        # Patch may be malformed, so try parsing it
+        cls.unidiff_parse_error = ''
+        cls.patchset = None
+        try:
+            cls.patchset = unidiff.PatchSet.from_filename(PatchTestInput.repo.patch, encoding=u'UTF-8')
+        except unidiff.UnidiffParseError as upe:
+            cls.patchset = []
+            cls.unidiff_parse_error = str(upe)
+
+        # Easy to iterate list of commits
+        cls.commits = []
+        for msg in cls.mbox:
+            if msg['subject'] and msg.get_payload():
+                cls.commits.append(Base.msg_to_commit(msg))
+
+        cls.setUpClassLocal()
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.tearDownClassLocal()
+
+    @classmethod
+    def setUpClassLocal(cls):
+        pass
+
+    @classmethod
+    def tearDownClassLocal(cls):
+        pass
+
+    def fail(self, issue, fix=None, commit=None, data=None):
+        """ Convert to a JSON string failure data"""
+        value = {'id': self.id(),
+                 'issue': issue}
+
+        if fix:
+            value['fix'] = fix
+        if commit:
+            value['commit'] = {'subject': commit.subject,
+                               'shortlog': commit.shortlog}
+
+        # extend return value with other useful info
+        if data:
+            value['data'] = data
+
+        return super(Base, self).fail(json.dumps(value))
+
+    def skip(self, issue, data=None):
+        """ Convert the skip string to JSON"""
+        value = {'id': self.id(),
+                 'issue': issue}
+
+        # extend return value with other useful info
+        if data:
+            value['data'] = data
+
+        return super(Base, self).skipTest(json.dumps(value))
+
+    def shortid(self):
+        return self.id().split('.')[-1]
+
+    def __str__(self):
+        return json.dumps({'id': self.id()})
+
+class Metadata(Base):
+    @classmethod
+    def setUpClassLocal(cls):
+        cls.tinfoil = cls.setup_tinfoil()
+
+        # get info about added/modified/remove recipes
+        cls.added, cls.modified, cls.removed = cls.get_metadata_stats(cls.patchset)
+
+    @classmethod
+    def tearDownClassLocal(cls):
+        cls.tinfoil.shutdown()
+
+    @classmethod
+    def setup_tinfoil(cls, config_only=False):
+        """Initialize tinfoil api from bitbake"""
+
+        # import relevant libraries
+        try:
+            scripts_path = os.path.join(PatchTestInput.repodir, 'scripts', 'lib')
+            if scripts_path not in sys.path:
+                sys.path.insert(0, scripts_path)
+            import scriptpath
+            scriptpath.add_bitbake_lib_path()
+            import bb.tinfoil
+        except ImportError:
+            raise PatchtestOEError('Could not import tinfoil module')
+
+        orig_cwd = os.path.abspath(os.curdir)
+
+        # Load tinfoil
+        tinfoil = None
+        try:
+            builddir = os.environ.get('BUILDDIR')
+            if not builddir:
+                logger.warn('Bitbake environment not loaded?')
+                return tinfoil
+            os.chdir(builddir)
+            tinfoil = bb.tinfoil.Tinfoil()
+            tinfoil.prepare(config_only=config_only)
+        except bb.tinfoil.TinfoilUIException as te:
+            if tinfoil:
+                tinfoil.shutdown()
+            raise PatchtestOEError('Could not prepare properly tinfoil (TinfoilUIException)')
+        except Exception as e:
+            if tinfoil:
+                tinfoil.shutdown()
+            raise e
+        finally:
+            os.chdir(orig_cwd)
+
+        return tinfoil
+
+    @classmethod
+    def get_metadata_stats(cls, patchset):
+        """Get lists of added, modified and removed metadata files"""
+
+        def find_pn(data, path):
+            """Find the PN from data"""
+            pn = None
+            pn_native = None
+            for _path, _pn in data:
+                if path in _path:
+                    if 'native' in _pn:
+                        # store the native PN but look for the non-native one first
+                        pn_native = _pn
+                    else:
+                        pn = _pn
+                        break
+            else:
+                # sent the native PN if found previously
+                if pn_native:
+                    return pn_native
+
+                # on renames (usually upgrades), we need to check (FILE) base names
+                # because the unidiff library does not provided the new filename, just the modified one
+                # and tinfoil datastore, once the patch is merged, will contain the new filename
+                path_basename = path.split('_')[0]
+                for _path, _pn in data:
+                    _path_basename = _path.split('_')[0]
+                    if path_basename == _path_basename:
+                        pn = _pn
+            return pn
+
+        if not cls.tinfoil:
+            cls.tinfoil = cls.setup_tinfoil()
+
+        added_paths, modified_paths, removed_paths = [], [], []
+        added, modified, removed = [], [], []
+
+        # get metadata filename additions, modification and removals
+        for patch in patchset:
+            if patch.path.endswith('.bb') or patch.path.endswith('.bbappend') or patch.path.endswith('.inc'):
+                if patch.is_added_file:
+                    added_paths.append(os.path.join(os.path.abspath(PatchTestInput.repodir), patch.path))
+                elif patch.is_modified_file:
+                    modified_paths.append(os.path.join(os.path.abspath(PatchTestInput.repodir), patch.path))
+                elif patch.is_removed_file:
+                    removed_paths.append(os.path.join(os.path.abspath(PatchTestInput.repodir), patch.path))
+
+        data = cls.tinfoil.cooker.recipecaches[''].pkg_fn.items()
+
+        added = [find_pn(data,path) for path in added_paths]
+        modified = [find_pn(data,path) for path in modified_paths]
+        removed = [find_pn(data,path) for path in removed_paths]
+
+        return [a for a in added if a], [m for m in modified if m], [r for r in removed if r]
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/common.py b/poky/meta/lib/patchtest/tests/pyparsing/common.py
new file mode 100644
index 0000000..9d37b04
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/pyparsing/common.py
@@ -0,0 +1,26 @@
+# common pyparsing variables
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import pyparsing
+
+# general
+colon = pyparsing.Literal(":")
+start = pyparsing.LineStart()
+end   = pyparsing.LineEnd()
+at = pyparsing.Literal("@")
+lessthan = pyparsing.Literal("<")
+greaterthan = pyparsing.Literal(">")
+opensquare = pyparsing.Literal("[")
+closesquare = pyparsing.Literal("]")
+inappropriate = pyparsing.CaselessLiteral("Inappropriate")
+submitted = pyparsing.CaselessLiteral("Submitted")
+
+# word related
+nestexpr = pyparsing.nestedExpr(opener='[', closer=']')
+inappropriateinfo = pyparsing.Literal("Inappropriate") + nestexpr
+submittedinfo = pyparsing.Literal("Submitted") + nestexpr
+word = pyparsing.Word(pyparsing.alphas)
+worddot = pyparsing.Word(pyparsing.alphas+".")
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py
new file mode 100644
index 0000000..dd7131a
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py
@@ -0,0 +1,18 @@
+# signed-off-by pyparsing definition
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+
+import pyparsing
+import common
+
+name = pyparsing.Regex('\S+.*(?= <)')
+username = pyparsing.OneOrMore(common.worddot)
+domain = pyparsing.OneOrMore(common.worddot)
+cve = pyparsing.Regex('CVE\-\d{4}\-\d+')
+cve_mark = pyparsing.Literal("CVE:")
+
+cve_tag = pyparsing.AtLineStart(cve_mark + cve)
+patch_cve_tag = pyparsing.AtLineStart("+" + cve_mark + cve)
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py
new file mode 100644
index 0000000..26e9612
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py
@@ -0,0 +1,14 @@
+# subject pyparsing definition
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+# NOTE:This is an oversimplified syntax of the mbox's summary
+
+import pyparsing
+import common
+
+target        = pyparsing.OneOrMore(pyparsing.Word(pyparsing.printables.replace(':','')))
+summary       = pyparsing.OneOrMore(pyparsing.Word(pyparsing.printables))
+shortlog       = common.start + target + common.colon + summary + common.end
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py
new file mode 100644
index 0000000..c8a4351
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py
@@ -0,0 +1,22 @@
+# signed-off-by pyparsing definition
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+
+import pyparsing
+import common
+
+name = pyparsing.Regex('\S+.*(?= <)')
+username = pyparsing.OneOrMore(common.worddot)
+domain = pyparsing.OneOrMore(common.worddot)
+
+# taken from https://pyparsing-public.wikispaces.com/Helpful+Expressions
+email = pyparsing.Regex(r"(?P<user>[A-Za-z0-9._%+-]+)@(?P<hostname>[A-Za-z0-9.-]+)\.(?P<domain>[A-Za-z]{2,})")
+
+email_enclosed = common.lessthan + email + common.greaterthan
+
+signed_off_by_mark = pyparsing.Literal("Signed-off-by:")
+signed_off_by = pyparsing.AtLineStart(signed_off_by_mark + name + email_enclosed)
+patch_signed_off_by = pyparsing.AtLineStart("+" + signed_off_by_mark + name + email_enclosed)
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py
new file mode 100644
index 0000000..d63567e
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py
@@ -0,0 +1,24 @@
+# upstream-status pyparsing definition
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+
+import common
+import pyparsing
+
+upstream_status_literal_valid_status = ["Pending", "Backport", "Denied", "Inappropriate", "Submitted"]
+upstream_status_nonliteral_valid_status = ["Pending", "Backport", "Denied", "Inappropriate [reason]", "Submitted [where]"]
+
+upstream_status_valid_status = pyparsing.Or(
+    [pyparsing.Literal(status) for status in upstream_status_literal_valid_status]
+)
+
+upstream_status_mark         = pyparsing.Literal("Upstream-Status")
+inappropriate_status_mark    = common.inappropriate
+submitted_status_mark        = common.submitted
+
+upstream_status              = common.start + upstream_status_mark + common.colon + upstream_status_valid_status
+upstream_status_inappropriate_info = common.start + upstream_status_mark + common.colon + common.inappropriateinfo
+upstream_status_submitted_info = common.start + upstream_status_mark + common.colon + common.submittedinfo
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_author.py b/poky/meta/lib/patchtest/tests/test_mbox_author.py
new file mode 100644
index 0000000..6c79f16
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_author.py
@@ -0,0 +1,29 @@
+# Checks related to the patch's author
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import re
+
+class Author(base.Base):
+
+    auh_email = '<auh@auh.yoctoproject.org>'
+
+    invalids = [re.compile("^Upgrade Helper.+"),
+                re.compile(re.escape(auh_email)),
+                re.compile("uh@not\.set"),
+                re.compile("\S+@example\.com")]
+
+
+    def test_author_valid(self):
+        for commit in self.commits:
+            for invalid in self.invalids:
+                if invalid.search(commit.author):
+                    self.fail('Invalid author %s' % commit.author, 'Resend the series with a valid patch\'s author', commit)
+
+    def test_non_auh_upgrade(self):
+        for commit in self.commits:
+            if self.auh_email in commit.payload:
+                self.fail('Invalid author %s in commit message' % self.auh_email, 'Resend the series with a valid patch\'s author', commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py b/poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py
new file mode 100644
index 0000000..e8de48b
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py
@@ -0,0 +1,22 @@
+# Checks related to the patch's bugzilla tag
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import re
+import base
+
+class Bugzilla(base.Base):
+    rexp_detect     = re.compile("\[\s?YOCTO.*\]", re.IGNORECASE)
+    rexp_validation = re.compile("\[(\s?YOCTO\s?#\s?(\d+)\s?,?)+\]", re.IGNORECASE)
+
+    def test_bugzilla_entry_format(self):
+        for commit in Bugzilla.commits:
+            for line in commit.commit_message.splitlines():
+                if self.rexp_detect.match(line):
+                    if not self.rexp_validation.match(line):
+                        self.fail('Yocto Project bugzilla tag is not correctly formatted',
+                                  'Specify bugzilla ID in commit description with format: "[YOCTO #<bugzilla ID>]"',
+                                  commit)
+
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_cve.py b/poky/meta/lib/patchtest/tests/test_mbox_cve.py
new file mode 100644
index 0000000..f99194c
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_cve.py
@@ -0,0 +1,49 @@
+# Checks related to the patch's CVE lines
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import base
+import os
+import parse_cve_tags
+import re
+
+class CVE(base.Base):
+
+    revert_shortlog_regex = re.compile('Revert\s+".*"')
+    prog = parse_cve_tags.cve_tag
+
+    def setUp(self):
+        if self.unidiff_parse_error:
+            self.skip('Parse error %s' % self.unidiff_parse_error)
+
+        # we are just interested in series that introduce CVE patches, thus discard other
+        # possibilities: modification to current CVEs, patch directly introduced into the
+        # recipe, upgrades already including the CVE, etc.
+        new_cves = [p for p in self.patchset if p.path.endswith('.patch') and p.is_added_file]
+        if not new_cves:
+            self.skip('No new CVE patches introduced')
+
+    def test_cve_presence_in_commit_message(self):
+        for commit in CVE.commits:
+            # skip those patches that revert older commits, these do not required the tag presence
+            if self.revert_shortlog_regex.match(commit.shortlog):
+                continue
+            if not self.prog.search_string(commit.payload):
+                self.fail('Missing or incorrectly formatted CVE tag in mbox',
+                          'Correct or include the CVE tag in the mbox with format: "CVE: CVE-YYYY-XXXX"',
+                          commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_description.py b/poky/meta/lib/patchtest/tests/test_mbox_description.py
new file mode 100644
index 0000000..7addc6b
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_description.py
@@ -0,0 +1,17 @@
+# Checks related to the patch's commit_message
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+
+class CommitMessage(base.Base):
+
+    def test_commit_message_presence(self):
+        for commit in CommitMessage.commits:
+            if not commit.commit_message.strip():
+                self.fail('Patch is missing a descriptive commit message',
+                          'Please include a commit message on your patch explaining the change (most importantly why the change is being made)',
+                          commit)
+
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_format.py b/poky/meta/lib/patchtest/tests/test_mbox_format.py
new file mode 100644
index 0000000..85c452c
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_format.py
@@ -0,0 +1,16 @@
+# Checks correct parsing of mboxes
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import re
+
+class MboxFormat(base.Base):
+
+    def test_mbox_format(self):
+        if self.unidiff_parse_error:
+            self.fail('Series cannot be parsed correctly due to malformed diff lines',
+                      'Create the series again using git-format-patch and ensure it can be applied using git am',
+                      data=[('Diff line', re.sub('^.+:\s(?<!$)','',self.unidiff_parse_error))])
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py b/poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py
new file mode 100644
index 0000000..de38e20
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py
@@ -0,0 +1,64 @@
+# Check if the series was intended for other project (not OE-Core)
+#
+# Copyright (C) 2017 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import subprocess
+import collections
+import base
+import re
+from data import PatchTestInput
+
+class MailingList(base.Base):
+
+    # base paths of main yocto project sub-projects
+    paths = {
+        'oe-core': ['meta-selftest', 'meta-skeleton', 'meta', 'scripts'],
+        'bitbake': ['bitbake'],
+        'documentation': ['documentation'],
+        'poky': ['meta-poky','meta-yocto-bsp'],
+        'oe': ['meta-gpe', 'meta-gnome', 'meta-efl', 'meta-networking', 'meta-multimedia','meta-initramfs', 'meta-ruby', 'contrib', 'meta-xfce', 'meta-filesystems', 'meta-perl', 'meta-webserver', 'meta-systemd', 'meta-oe', 'meta-python']
+        }
+
+    # scripts folder is a mix of oe-core and poky, most is oe-core code except:
+    poky_scripts = ['scripts/yocto-bsp', 'scripts/yocto-kernel', 'scripts/yocto-layer', 'scripts/lib/bsp']
+
+    Project = collections.namedtuple('Project', ['name', 'listemail', 'gitrepo', 'paths'])
+
+    bitbake = Project(name='Bitbake', listemail='bitbake-devel@lists.openembedded.org', gitrepo='http://git.openembedded.org/bitbake/', paths=paths['bitbake'])
+    doc     = Project(name='Documentantion', listemail='yocto@yoctoproject.org', gitrepo='http://git.yoctoproject.org/cgit/cgit.cgi/yocto-docs/', paths=paths['documentation'])
+    poky    = Project(name='Poky', listemail='poky@yoctoproject.org', gitrepo='http://git.yoctoproject.org/cgit/cgit.cgi/poky/', paths=paths['poky'])
+    oe      = Project(name='oe', listemail='openembedded-devel@lists.openembedded.org', gitrepo='http://git.openembedded.org/meta-openembedded/', paths=paths['oe'])
+
+
+    def test_target_mailing_list(self):
+        """In case of merge failure, check for other targeted projects"""
+        if PatchTestInput.repo.ismerged:
+            self.skip('Series merged, no reason to check other mailing lists')
+
+        # a meta project may be indicted in the message subject, if this is the case, just fail
+        # TODO: there may be other project with no-meta prefix, we also need to detect these
+        project_regex = re.compile("\[(?P<project>meta-.+)\]")
+        for commit in MailingList.commits:
+            match = project_regex.match(commit.subject)
+            if match:
+                self.fail('Series sent to the wrong mailing list',
+                          'Check the project\'s README (%s) and send the patch to the indicated list' % match.group('project'),
+                          commit)
+
+        for patch in self.patchset:
+            folders = patch.path.split('/')
+            base_path = folders[0]
+            for project in [self.bitbake, self.doc, self.oe, self.poky]:
+                if base_path in  project.paths:
+                    self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists', 'Send the series again to the correct mailing list (ML)',
+                              data=[('Suggested ML', '%s [%s]' % (project.listemail, project.gitrepo)),
+                                    ('Patch\'s path:', patch.path)])
+
+            # check for poky's scripts code
+            if base_path.startswith('scripts'):
+                for poky_file in self.poky_scripts:
+                    if patch.path.startswith(poky_file):
+                        self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists', 'Send the series again to the correct mailing list (ML)',
+                                  data=[('Suggested ML', '%s [%s]' % (self.poky.listemail, self.poky.gitrepo)),('Patch\'s path:', patch.path)])
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_merge.py b/poky/meta/lib/patchtest/tests/test_mbox_merge.py
new file mode 100644
index 0000000..c8b6718
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_merge.py
@@ -0,0 +1,25 @@
+# Check if mbox was merged by patchtest
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import subprocess
+import base
+from data import PatchTestInput
+
+def headlog():
+    output = subprocess.check_output(
+        "cd %s; git log --pretty='%%h#%%aN#%%cD:#%%s' -1" % PatchTestInput.repodir,
+        universal_newlines=True,
+        shell=True
+        )
+    return output.split('#')
+
+class Merge(base.Base):
+    def test_series_merge_on_head(self):
+        if not PatchTestInput.repo.ismerged:
+            commithash, author, date, shortlog = headlog()
+            self.fail('Series does not apply on top of target branch',
+                      'Rebase your series on top of targeted branch',
+                      data=[('Targeted branch', '%s (currently at %s)' % (PatchTestInput.repo.branch, commithash))])
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_shortlog.py b/poky/meta/lib/patchtest/tests/test_mbox_shortlog.py
new file mode 100644
index 0000000..b6c2a20
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_shortlog.py
@@ -0,0 +1,41 @@
+# Checks related to the patch's  summary
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import parse_shortlog
+import pyparsing
+
+maxlength = 90
+
+class Shortlog(base.Base):
+
+    def test_shortlog_format(self):
+        for commit in Shortlog.commits:
+            shortlog = commit.shortlog
+            if not shortlog.strip():
+                self.skip('Empty shortlog, no reason to execute shortlog format test')
+            else:
+                # no reason to re-check on revert shortlogs
+                if shortlog.startswith('Revert "'):
+                    continue
+                try:
+                    parse_shortlog.shortlog.parseString(shortlog)
+                except pyparsing.ParseException as pe:
+                    self.fail('Shortlog does not follow expected format',
+                              'Commit shortlog (first line of commit message) should follow the format "<target>: <summary>"',
+                              commit)
+
+    def test_shortlog_length(self):
+        for commit in Shortlog.commits:
+            # no reason to re-check on revert shortlogs
+            shortlog = commit.shortlog
+            if shortlog.startswith('Revert "'):
+                continue
+            l = len(shortlog)
+            if l > maxlength:
+                self.fail('Commit shortlog is too long',
+                          'Edit shortlog so that it is %d characters or less (currently %d characters)' % (maxlength, l),
+                          commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py b/poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py
new file mode 100644
index 0000000..6458951
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py
@@ -0,0 +1,28 @@
+# Checks related to the patch's signed-off-by lines
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import parse_signed_off_by
+import re
+
+class SignedOffBy(base.Base):
+
+    revert_shortlog_regex = re.compile('Revert\s+".*"')
+
+    @classmethod
+    def setUpClassLocal(cls):
+        # match self.mark with no '+' preceding it
+        cls.prog = parse_signed_off_by.signed_off_by
+
+    def test_signed_off_by_presence(self):
+        for commit in SignedOffBy.commits:
+            # skip those patches that revert older commits, these do not required the tag presence
+            if self.revert_shortlog_regex.match(commit.shortlog):
+                continue
+            if not SignedOffBy.prog.search_string(commit.payload):
+                self.fail('Patch is missing Signed-off-by',
+                          'Sign off the patch (either manually or with "git commit --amend -s")',
+                          commit)
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py b/poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py
new file mode 100644
index 0000000..e9a5b6b
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py
@@ -0,0 +1,82 @@
+# Checks related to the patch's LIC_FILES_CHKSUM  metadata variable
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import re
+from data import PatchTestInput, PatchTestDataStore
+
+class LicFilesChkSum(base.Metadata):
+    metadata = 'LIC_FILES_CHKSUM'
+    license  = 'LICENSE'
+    closed   = 'CLOSED'
+    lictag   = 'License-Update'
+    lictag_re  = re.compile("^%s:" % lictag, re.MULTILINE)
+
+    def setUp(self):
+        # these tests just make sense on patches that can be merged
+        if not PatchTestInput.repo.canbemerged:
+            self.skip('Patch cannot be merged')
+
+    def test_lic_files_chksum_presence(self):
+        if not self.added:
+            self.skip('No added recipes, skipping test')
+
+        for pn in self.added:
+            rd = self.tinfoil.parse_recipe(pn)
+            pathname = rd.getVar('FILE')
+            # we are not interested in images
+            if '/images/' in pathname:
+                continue
+            lic_files_chksum = rd.getVar(self.metadata)
+            if rd.getVar(self.license) == self.closed:
+                continue
+            if not lic_files_chksum:
+                self.fail('%s is missing in newly added recipe' % self.metadata,
+                          'Specify the variable %s in %s' % (self.metadata, pn))
+
+    def pretest_lic_files_chksum_modified_not_mentioned(self):
+        if not self.modified:
+            self.skip('No modified recipes, skipping pretest')
+        # get the proper metadata values
+        for pn in self.modified:
+            rd = self.tinfoil.parse_recipe(pn)
+            pathname = rd.getVar('FILE')
+            # we are not interested in images
+            if '/images/' in pathname:
+                continue
+            PatchTestDataStore['%s-%s-%s' % (self.shortid(),self.metadata,pn)] = rd.getVar(self.metadata)
+
+    def test_lic_files_chksum_modified_not_mentioned(self):
+        if not self.modified:
+            self.skip('No modified recipes, skipping test')
+
+        # get the proper metadata values
+        for pn in self.modified:
+            rd = self.tinfoil.parse_recipe(pn)
+            pathname = rd.getVar('FILE')
+            # we are not interested in images
+            if '/images/' in pathname:
+                continue
+            PatchTestDataStore['%s-%s-%s' % (self.shortid(),self.metadata,pn)] = rd.getVar(self.metadata)
+        # compare if there were changes between pre-merge and merge
+        for pn in self.modified:
+            pretest = PatchTestDataStore['pre%s-%s-%s' % (self.shortid(),self.metadata, pn)]
+            test    = PatchTestDataStore['%s-%s-%s' % (self.shortid(),self.metadata, pn)]
+
+            # TODO: this is workaround to avoid false-positives when pretest metadata is empty (not reason found yet)
+            # For more info, check bug 12284
+            if not pretest:
+                return
+
+            if pretest != test:
+                # if any patch on the series contain reference on the metadata, fail
+                for commit in self.commits:
+                    if self.lictag_re.search(commit.commit_message):
+                       break
+                else:
+                    self.fail('LIC_FILES_CHKSUM changed on target %s but there is no "%s" tag in commit message' % (pn, self.lictag),
+                              'Include "%s: <description>" into the commit message with a brief description' % self.lictag,
+                              data=[('Current checksum', pretest), ('New checksum', test)])
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_license.py b/poky/meta/lib/patchtest/tests/test_metadata_license.py
new file mode 100644
index 0000000..16604db
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_metadata_license.py
@@ -0,0 +1,55 @@
+# Checks related to the patch's LIC_FILES_CHKSUM  metadata variable
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import os
+from data import PatchTestInput
+
+class License(base.Metadata):
+    metadata = 'LICENSE'
+    invalid_license = 'PATCHTESTINVALID'
+
+    def setUp(self):
+        # these tests just make sense on patches that can be merged
+        if not PatchTestInput.repo.canbemerged:
+            self.skip('Patch cannot be merged')
+
+    def test_license_presence(self):
+        if not self.added:
+            self.skip('No added recipes, skipping test')
+
+        # TODO: this is a workaround so we can parse the recipe not
+        # containing the LICENSE var: add some default license instead
+        # of INVALID into auto.conf, then remove this line at the end
+        auto_conf = os.path.join(os.environ.get('BUILDDIR'), 'conf', 'auto.conf')
+        open_flag = 'w'
+        if os.path.exists(auto_conf):
+            open_flag = 'a'
+        with open(auto_conf, open_flag) as fd:
+            for pn in self.added:
+                fd.write('LICENSE ??= "%s"\n' % self.invalid_license)
+
+        no_license = False
+        for pn in self.added:
+            rd = self.tinfoil.parse_recipe(pn)
+            license = rd.getVar(self.metadata)
+            if license == self.invalid_license:
+                no_license = True
+                break
+
+        # remove auto.conf line or the file itself
+        if open_flag == 'w':
+            os.remove(auto_conf)
+        else:
+            fd = open(auto_conf, 'r')
+            lines = fd.readlines()
+            fd.close()
+            with open(auto_conf, 'w') as fd:
+                fd.write(''.join(lines[:-1]))
+
+        if no_license:
+            self.fail('Recipe does not have the LICENSE field set', 'Include a LICENSE into the new recipe')
+
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_max_length.py b/poky/meta/lib/patchtest/tests/test_metadata_max_length.py
new file mode 100644
index 0000000..04a5e23
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_metadata_max_length.py
@@ -0,0 +1,26 @@
+# Checks related to patch line lengths
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import re
+
+class MaxLength(base.Base):
+    add_mark = re.compile('\+ ')
+    max_length = 200
+
+    def test_max_line_length(self):
+        for patch in self.patchset:
+            # for the moment, we are just interested in metadata
+            if patch.path.endswith('.patch'):
+                continue
+            payload = str(patch)
+            for line in payload.splitlines():
+                if self.add_mark.match(line):
+                    current_line_length = len(line[1:])
+                    if current_line_length > self.max_length:
+                        self.fail('Patch line too long (current length %s)' % current_line_length,
+                                  'Shorten the corresponding patch line (max length supported %s)' % self.max_length,
+                                  data=[('Patch', patch.path), ('Line', '%s ...' % line[0:80])])
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_src_uri.py b/poky/meta/lib/patchtest/tests/test_metadata_src_uri.py
new file mode 100644
index 0000000..718229d
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_metadata_src_uri.py
@@ -0,0 +1,75 @@
+# Checks related to the patch's SRC_URI metadata variable
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import subprocess
+import base
+import re
+import os
+from data import PatchTestInput, PatchTestDataStore
+
+class SrcUri(base.Metadata):
+
+    metadata  = 'SRC_URI'
+    md5sum    = 'md5sum'
+    sha256sum = 'sha256sum'
+    git_regex = re.compile('^git\:\/\/.*')
+
+    def setUp(self):
+        # these tests just make sense on patches that can be merged
+        if not PatchTestInput.repo.canbemerged:
+            self.skip('Patch cannot be merged')
+
+    def pretest_src_uri_left_files(self):
+        if not self.modified:
+            self.skip('No modified recipes, skipping pretest')
+
+        # get the proper metadata values
+        for pn in self.modified:
+            # we are not interested in images
+            if 'core-image' in pn:
+                continue
+            rd = self.tinfoil.parse_recipe(pn)
+            PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)] = rd.getVar(self.metadata)
+
+    def test_src_uri_left_files(self):
+        if not self.modified:
+            self.skip('No modified recipes, skipping pretest')
+
+        # get the proper metadata values
+        for pn in self.modified:
+            # we are not interested in images
+            if 'core-image' in pn:
+                continue
+            rd = self.tinfoil.parse_recipe(pn)
+            PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)] = rd.getVar(self.metadata)
+
+        for pn in self.modified:
+            pretest_src_uri = PatchTestDataStore['pre%s-%s-%s' % (self.shortid(), self.metadata, pn)].split()
+            test_src_uri    = PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)].split()
+
+            pretest_files = set([os.path.basename(patch) for patch in pretest_src_uri if patch.startswith('file://')])
+            test_files    = set([os.path.basename(patch) for patch in test_src_uri    if patch.startswith('file://')])
+
+            # check if files were removed
+            if len(test_files) < len(pretest_files):
+
+                # get removals from patchset
+                filesremoved_from_patchset = set()
+                for patch in self.patchset:
+                    if patch.is_removed_file:
+                        filesremoved_from_patchset.add(os.path.basename(patch.path))
+
+                # get the deleted files from the SRC_URI
+                filesremoved_from_usr_uri = pretest_files - test_files
+
+                # finally, get those patches removed at SRC_URI and not removed from the patchset
+                # TODO: we are not taking into account  renames, so test may raise false positives
+                not_removed = filesremoved_from_usr_uri - filesremoved_from_patchset
+                if not_removed:
+                    self.fail('Patches not removed from tree',
+                              'Amend the patch containing the software patch file removal',
+                              data=[('Patch', f) for f in not_removed])
+
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_summary.py b/poky/meta/lib/patchtest/tests/test_metadata_summary.py
new file mode 100644
index 0000000..931b267
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_metadata_summary.py
@@ -0,0 +1,32 @@
+# Checks related to the patch's summary metadata variable
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+from data import PatchTestInput
+
+class Summary(base.Metadata):
+    metadata = 'SUMMARY'
+
+    def setUp(self):
+        # these tests just make sense on patches that can be merged
+        if not PatchTestInput.repo.canbemerged:
+            self.skip('Patch cannot be merged')
+
+    def test_summary_presence(self):
+        if not self.added:
+            self.skip('No added recipes, skipping test')
+
+        for pn in self.added:
+            # we are not interested in images
+            if 'core-image' in pn:
+                continue
+            rd = self.tinfoil.parse_recipe(pn)
+            summary = rd.getVar(self.metadata)
+
+            # "${PN} version ${PN}-${PR}" is the default, so fail if default
+            if summary.startswith('%s version' % pn):
+                self.fail('%s is missing in newly added recipe' % self.metadata,
+                          'Specify the variable %s in %s' % (self.metadata, pn))
diff --git a/poky/meta/lib/patchtest/tests/test_patch_cve.py b/poky/meta/lib/patchtest/tests/test_patch_cve.py
new file mode 100644
index 0000000..46ed9ef
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_patch_cve.py
@@ -0,0 +1,51 @@
+# Checks related to the patch's CVE lines
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import base
+import os
+import re
+
+class CVE(base.Base):
+
+    re_cve_pattern = re.compile("CVE\-\d{4}\-\d+", re.IGNORECASE)
+    re_cve_payload_tag     = re.compile("\+CVE:(\s+CVE\-\d{4}\-\d+)+")
+
+    def setUp(self):
+        if self.unidiff_parse_error:
+            self.skip('Parse error %s' % self.unidiff_parse_error)
+
+        # we are just interested in series that introduce CVE patches, thus discard other
+        # possibilities: modification to current CVEs, patch directly introduced into the
+        # recipe, upgrades already including the CVE, etc.
+        new_cves = [p for p in self.patchset if p.path.endswith('.patch') and p.is_added_file]
+        if not new_cves:
+            self.skip('No new CVE patches introduced')
+
+    def test_cve_tag_format(self):
+        for commit in CVE.commits:
+            if self.re_cve_pattern.search(commit.shortlog) or self.re_cve_pattern.search(commit.commit_message):
+                tag_found = False
+                for line in commit.payload.splitlines():
+                    if self.re_cve_payload_tag.match(line):
+                        tag_found = True
+                        break
+                if not tag_found:
+                    self.fail('Missing or incorrectly formatted CVE tag in included patch file',
+                              'Correct or include the CVE tag on cve patch with format: "CVE: CVE-YYYY-XXXX"',
+                              commit)
diff --git a/poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py b/poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py
new file mode 100644
index 0000000..4855d6d
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py
@@ -0,0 +1,43 @@
+# Checks related to the patch's signed-off-by lines
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import parse_signed_off_by
+import re
+
+class PatchSignedOffBy(base.Base):
+
+    @classmethod
+    def setUpClassLocal(cls):
+        cls.newpatches = []
+        # get just those relevant patches: new software patches
+        for patch in cls.patchset:
+            if patch.path.endswith('.patch') and patch.is_added_file:
+                cls.newpatches.append(patch)
+
+        cls.mark = str(parse_signed_off_by.signed_off_by_mark).strip('"')
+
+        # match PatchSignedOffBy.mark with '+' preceding it
+        cls.prog = parse_signed_off_by.patch_signed_off_by
+
+    def setUp(self):
+        if self.unidiff_parse_error:
+            self.skip('Parse error %s' % self.unidiff_parse_error)
+
+    def test_signed_off_by_presence(self):
+        if not PatchSignedOffBy.newpatches:
+            self.skip("There are no new software patches, no reason to test %s presence" % PatchSignedOffBy.mark)
+
+        for newpatch in PatchSignedOffBy.newpatches:
+            payload = newpatch.__str__()
+            for line in payload.splitlines():
+                if self.patchmetadata_regex.match(line):
+                    continue
+                if PatchSignedOffBy.prog.search_string(payload):
+                    break
+            else:
+                self.fail('A patch file has been added, but does not have a Signed-off-by tag',
+                          'Sign off the added patch file (%s)' % newpatch.path)
diff --git a/poky/meta/lib/patchtest/tests/test_patch_upstream_status.py b/poky/meta/lib/patchtest/tests/test_patch_upstream_status.py
new file mode 100644
index 0000000..eda5353
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_patch_upstream_status.py
@@ -0,0 +1,64 @@
+# Checks related to the patch's upstream-status lines
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+import parse_upstream_status
+import pyparsing
+import os
+
+class PatchUpstreamStatus(base.Base):
+
+    upstream_status_regex = pyparsing.AtLineStart("+" + "Upstream-Status")
+
+    @classmethod
+    def setUpClassLocal(cls):
+        cls.newpatches = []
+        # get just those relevant patches: new software patches
+        for patch in cls.patchset:
+            if patch.path.endswith('.patch') and patch.is_added_file:
+                cls.newpatches.append(patch)
+
+    def setUp(self):
+        if self.unidiff_parse_error:
+            self.skip('Python-unidiff parse error')
+        self.valid_status    = ', '.join(parse_upstream_status.upstream_status_nonliteral_valid_status)
+        self.standard_format = 'Upstream-Status: <Valid status>'
+
+    def test_upstream_status_presence_format(self):
+        if not PatchUpstreamStatus.newpatches:
+            self.skip("There are no new software patches, no reason to test Upstream-Status presence/format")
+
+        for newpatch in PatchUpstreamStatus.newpatches:
+            payload = newpatch.__str__()
+            if not self.upstream_status_regex.search_string(payload):
+                self.fail('Added patch file is missing Upstream-Status in the header',
+                          'Add Upstream-Status: <Valid status> to the header of %s' % newpatch.path,
+                          data=[('Standard format', self.standard_format), ('Valid status', self.valid_status)])
+            for line in payload.splitlines():
+                if self.patchmetadata_regex.match(line):
+                    continue
+                if self.upstream_status_regex.search_string(line):
+                        if parse_upstream_status.inappropriate_status_mark.searchString(line):
+                            try:
+                                parse_upstream_status.upstream_status_inappropriate_info.parseString(line.lstrip('+'))
+                            except pyparsing.ParseException as pe:
+                                self.fail('Upstream-Status is Inappropriate, but no reason was provided',
+                                          'Include a brief reason why %s is inappropriate' % os.path.basename(newpatch.path),
+                                          data=[('Current', pe.pstr), ('Standard format', 'Upstream-Status: Inappropriate [reason]')])
+                        elif parse_upstream_status.submitted_status_mark.searchString(line):
+                            try:
+                                parse_upstream_status.upstream_status_submitted_info.parseString(line.lstrip('+'))
+                            except pyparsing.ParseException as pe:
+                                self.fail('Upstream-Status is Submitted, but it is not mentioned where',
+                                          'Include where %s was submitted' % os.path.basename(newpatch.path),
+                                          data=[('Current', pe.pstr), ('Standard format', 'Upstream-Status: Submitted [where]')])
+                        else:
+                            try:
+                                parse_upstream_status.upstream_status.parseString(line.lstrip('+'))
+                            except pyparsing.ParseException as pe:
+                                self.fail('Upstream-Status is in incorrect format',
+                                          'Fix Upstream-Status format in %s' % os.path.basename(newpatch.path),
+                                          data=[('Current', pe.pstr), ('Standard format', self.standard_format), ('Valid status', self.valid_status)])
diff --git a/poky/meta/lib/patchtest/tests/test_python_pylint.py b/poky/meta/lib/patchtest/tests/test_python_pylint.py
new file mode 100644
index 0000000..ea8efb7
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_python_pylint.py
@@ -0,0 +1,61 @@
+# Checks related to the python code done with pylint
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import base
+from data import PatchTestInput
+import pylint.epylint as lint
+
+class PyLint(base.Base):
+    pythonpatches  = []
+    pylint_pretest = {}
+    pylint_test    = {}
+    pylint_options = " -E --disable='E0611, E1101, F0401, E0602' --msg-template='L:{line} F:{module} I:{msg}'"
+
+    @classmethod
+    def setUpClassLocal(cls):
+        # get just those patches touching python files
+        cls.pythonpatches = []
+        for patch in cls.patchset:
+            if patch.path.endswith('.py'):
+                if not patch.is_removed_file:
+                    cls.pythonpatches.append(patch)
+
+    def setUp(self):
+        if self.unidiff_parse_error:
+            self.skip('Python-unidiff parse error')
+        if not PatchTestInput.repo.canbemerged:
+            self.skip('Patch cannot be merged, no reason to execute the test method')
+        if not PyLint.pythonpatches:
+            self.skip('No python related patches, skipping test')
+
+    def pretest_pylint(self):
+        for pythonpatch in self.pythonpatches:
+            if pythonpatch.is_modified_file:
+                (pylint_stdout, pylint_stderr) = lint.py_run(command_options = pythonpatch.path + self.pylint_options, return_std=True)
+                for line in pylint_stdout.readlines():
+                    if not '*' in line:
+                        if line.strip():
+                            self.pylint_pretest[line.strip().split(' ',1)[0]] = line.strip().split(' ',1)[1]
+
+    def test_pylint(self):
+        for pythonpatch in self.pythonpatches:
+            # a condition checking whether a file is renamed or not
+            # unidiff doesn't support this yet
+            if pythonpatch.target_file is not pythonpatch.path:
+                path = pythonpatch.target_file[2:]
+            else:
+                path = pythonpatch.path
+            (pylint_stdout, pylint_stderr) = lint.py_run(command_options = path + self.pylint_options, return_std=True)
+            for line in pylint_stdout.readlines():
+                    if not '*' in line:
+                        if line.strip():
+                            self.pylint_test[line.strip().split(' ',1)[0]] = line.strip().split(' ',1)[1]
+
+        for issue in self.pylint_test:
+             if self.pylint_test[issue] not in self.pylint_pretest.values():
+                 self.fail('Errors in your Python code were encountered',
+                           'Correct the lines introduced by your patch',
+                           data=[('Output', 'Please, fix the listed issues:'), ('', issue + ' ' + self.pylint_test[issue])])