poky: subtree update:a616ffebdc..9052e5b32a

Adrian Bunk (1):
      bind: Whitelist CVE-2019-6470

Alexander Kanavin (13):
      python: update to 2.7.17
      tiff: update to 4.1.0
      librepo: upgrade 1.10.6 -> 1.11.0
      btrfs-tools: upgrade 5.3 -> 5.3.1
      psmisc: update to 23.3
      libxslt: update to 1.1.34
      Revert "devtool/standard.py: Not filtering devtool workspace for devtool finish"
      mpg123: upgrade 1.25.12 -> 1.25.13
      vala: upgrade 0.46.3 -> 0.46.4
      sysstat: upstream version check is working again
      cairo: the component is dual licensed
      selftest: check that 'devtool upgrade' correctly drops backported patches
      runqemu: add options that enable virgl with the SDL frontend

Alistair Francis (1):
      mesa: Upgrade to 19.2.4

Anuj Mittal (7):
      boost: fix build for x32
      rng-tools: upgrade 6.7 -> 6.8
      harfbuzz: upgrade 2.6.1 -> 2.6.4
      libsolv: upgrade 0.7.6 -> 0.7.8
      sqlite3: upgrade 3.30.0 -> 3.30.1
      stress-ng: upgrade 0.10.08 -> 0.10.10
      glib-2.0: upgrade 2.62.1 -> 2.62.2

Armin Kuster (9):
      oeqa/manual/bsp-hw: remove rpm -ivh test
      oeqa/runtime/boot: add reboot test
      oeqa/manual/bsp-hw: remove reboot test
      oeqa/manual/bsp-hw: move storage tests to runtime
      oeqa/manual/bsp-hw: remove usb and SDmicro tests
      manual/bsd-hw: remove bash tests
      oeqa/manual/compliance-test: remove crashme tests
      oeqa/manual/compliance-test: move crashme to runtime
      /oeqa/manual/compliance-test: remove obsolete test

Chee Yang Lee (2):
      wic: rm with -r flag support
      selftest/wic: test wic rm with -r flag

Denys Dmytriyenko (1):
      distro_features_check: expand with MACHINE_FEATURES and COMBINED_FEATURES, rename

Kai Kang (1):
      systemd: remove ${PN}-xorg-xinitrc

Khem Raj (1):
      webkitgtk: Remove clang specific option

Paul Barker (1):
      cdrtools-native: Don't set uid/gid during install

Paul Eggleton (1):
      devtool: fix devtool upgrade with reproducible_builds class

Richard Purdie (10):
      oeqa/devtool: Avoid unbound variable errors
      recipetool/create: Fix to work with reproducible_builds
      opkg: Add upstream fixes for empty packages
      opkg-utils: Fix silent empty/broken opkg package creation
      core-image-full-cmdline: Add less
      bitbake: fetch2/clearcase: Fix warnings from python 3.8
      bitbake: runqueue: Fix hash equivalence duplicate tasks running
      sanity: Add check for tar older than 1.28
      oeqa/selftest/sstatetests: Ensure we don't use hashequiv for sstatesigs tests
      package_ipk: Remove pointless comment to trigger rebuild

Ross Burton (8):
      cve-update-db-native: don't hardcode the database name
      cve-update-db-native: add an index on the CVE ID column
      cve-update-db-native: clean up proxy handling
      cve-check: rewrite look to fix false negatives
      cve-check: neaten get_cve_info
      cve-check: fetch CVE data once at a time instead of in a single call
      bitbake: tests: add test for the hashing functions
      bitbake: utils: also use mmap for SHA256 and SHA1, for performance

Yi Zhao (1):
      bitbake: contrib/vim/indent/bitbake.vim: move it to correct directory

Change-Id: I526155f21145180c764252a2ae5bfba33def10ff
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/poky/scripts/lib/devtool/standard.py b/poky/scripts/lib/devtool/standard.py
index 8d9c1a3..1c0cd8a 100644
--- a/poky/scripts/lib/devtool/standard.py
+++ b/poky/scripts/lib/devtool/standard.py
@@ -2021,7 +2021,7 @@
     remove_work=args.remove_work
     tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
     try:
-        rd = parse_recipe(config, tinfoil, args.recipename, True, False)
+        rd = parse_recipe(config, tinfoil, args.recipename, True)
         if not rd:
             return 1
 
diff --git a/poky/scripts/lib/devtool/upgrade.py b/poky/scripts/lib/devtool/upgrade.py
index 18c5b66..cb6dce3 100644
--- a/poky/scripts/lib/devtool/upgrade.py
+++ b/poky/scripts/lib/devtool/upgrade.py
@@ -32,7 +32,7 @@
 
 def _get_srctree(tmpdir):
     srctree = tmpdir
-    dirs = os.listdir(tmpdir)
+    dirs = scriptutils.filter_src_subdirs(tmpdir)
     if len(dirs) == 1:
         srctree = os.path.join(tmpdir, dirs[0])
     return srctree
@@ -281,7 +281,8 @@
             logger.info('Preserving temporary directory %s' % tmpsrctree)
         else:
             shutil.rmtree(tmpsrctree)
-            shutil.rmtree(tmpdir)
+            if tmpdir != tmpsrctree:
+                shutil.rmtree(tmpdir)
 
     return (rev, md5, sha256, srcbranch, srcsubdir_rel)
 
diff --git a/poky/scripts/lib/recipetool/create.py b/poky/scripts/lib/recipetool/create.py
index 1fb6b55..4c4bbad 100644
--- a/poky/scripts/lib/recipetool/create.py
+++ b/poky/scripts/lib/recipetool/create.py
@@ -495,9 +495,7 @@
         if ftmpdir and args.keep_temp:
             logger.info('Fetch temp directory is %s' % ftmpdir)
 
-        dirlist = os.listdir(srctree)
-        filterout = ['git.indirectionsymlink']
-        dirlist = [x for x in dirlist if x not in filterout]
+        dirlist = scriptutils.filter_src_subdirs(srctree)
         logger.debug('Directory listing (excluding filtered out):\n  %s' % '\n  '.join(dirlist))
         if len(dirlist) == 1:
             singleitem = os.path.join(srctree, dirlist[0])
diff --git a/poky/scripts/lib/scriptutils.py b/poky/scripts/lib/scriptutils.py
index c573dc7..45bdaf5 100644
--- a/poky/scripts/lib/scriptutils.py
+++ b/poky/scripts/lib/scriptutils.py
@@ -268,3 +268,13 @@
     elif param.startswith('git@') or ('@' in param and param.endswith('.git')):
         return True
     return False
+
+def filter_src_subdirs(pth):
+    """
+    Filter out subdirectories of initial unpacked source trees that we do not care about.
+    Used by devtool and recipetool.
+    """
+    dirlist = os.listdir(pth)
+    filterout = ['git.indirectionsymlink', 'source-date-epoch']
+    dirlist = [x for x in dirlist if x not in filterout]
+    return dirlist
diff --git a/poky/scripts/lib/wic/engine.py b/poky/scripts/lib/wic/engine.py
index 18776fa..7e66207 100644
--- a/poky/scripts/lib/wic/engine.py
+++ b/poky/scripts/lib/wic/engine.py
@@ -19,6 +19,7 @@
 import tempfile
 import json
 import subprocess
+import re
 
 from collections import namedtuple, OrderedDict
 from distutils.spawn import find_executable
@@ -335,25 +336,52 @@
         exec_cmd(cmd, as_shell=True)
         self._put_part_image(pnum)
 
-    def remove(self, pnum, path):
+    def remove_ext(self, pnum, path, recursive):
+        """
+        Remove files/dirs and their contents from the partition.
+        This only applies to ext* partition.
+        """
+        abs_path = re.sub('\/\/+', '/', path)
+        cmd = "{} {} -wR 'rm \"{}\"'".format(self.debugfs,
+                                            self._get_part_image(pnum),
+                                            abs_path)
+        out = exec_cmd(cmd , as_shell=True)
+        for line in out.splitlines():
+            if line.startswith("rm:"):
+                if "file is a directory" in line:
+                    if recursive:
+                        # loop through content and delete them one by one if
+                        # flaged with -r
+                        subdirs = iter(self.dir(pnum, abs_path).splitlines())
+                        next(subdirs)
+                        for subdir in subdirs:
+                            dir = subdir.split(':')[1].split(" ", 1)[1]
+                            if not dir == "." and not dir == "..":
+                                self.remove_ext(pnum, "%s/%s" % (abs_path, dir), recursive)
+
+                    rmdir_out = exec_cmd("{} {} -wR 'rmdir \"{}\"'".format(self.debugfs,
+                                                    self._get_part_image(pnum),
+                                                    abs_path.rstrip('/'))
+                                                    , as_shell=True)
+
+                    for rmdir_line in rmdir_out.splitlines():
+                        if "directory not empty" in rmdir_line:
+                            raise WicError("Could not complete operation: \n%s \n"
+                                            "use -r to remove non-empty directory" % rmdir_line)
+                        if rmdir_line.startswith("rmdir:"):
+                            raise WicError("Could not complete operation: \n%s "
+                                            "\n%s" % (str(line), rmdir_line))
+
+                else:
+                    raise WicError("Could not complete operation: \n%s "
+                                    "\nUnable to remove %s" % (str(line), abs_path))
+
+    def remove(self, pnum, path, recursive):
         """Remove files/dirs from the partition."""
         partimg = self._get_part_image(pnum)
         if self.partitions[pnum].fstype.startswith('ext'):
-            cmd = "{} {} -wR 'rm {}'".format(self.debugfs,
-                                                self._get_part_image(pnum),
-                                                path)
-            out = exec_cmd(cmd , as_shell=True)
-            for line in out.splitlines():
-                if line.startswith("rm:"):
-                    if "file is a directory" in line:
-                        # Try rmdir to see if this is an empty directory. This won't delete
-                        # any non empty directory so let user know about any error that this might
-                        # generate.
-                        print(exec_cmd("{} {} -wR 'rmdir {}'".format(self.debugfs,
-                                                    self._get_part_image(pnum),
-                                                    path), as_shell=True))
-                    else:
-                        raise WicError("Could not complete operation: wic %s" % str(line))
+            self.remove_ext(pnum, path, recursive)
+
         else: # fat
             cmd = "{} -i {} ::{}".format(self.mdel, partimg, path)
             try:
@@ -535,7 +563,7 @@
     partitioned image.
     """
     disk = Disk(args.path.image, native_sysroot)
-    disk.remove(args.path.part, args.path.path)
+    disk.remove(args.path.part, args.path.path, args.recursive_delete)
 
 def wic_write(args, native_sysroot):
     """
diff --git a/poky/scripts/lib/wic/help.py b/poky/scripts/lib/wic/help.py
index 968cc0e..812ebe3 100644
--- a/poky/scripts/lib/wic/help.py
+++ b/poky/scripts/lib/wic/help.py
@@ -422,6 +422,7 @@
 SYNOPSIS
     wic rm <src> <image>:<partition><path>
     wic rm <src> <image>:<partition><path> --native-sysroot <path>
+    wic rm -r <image>:<partition><path>
 
 DESCRIPTION
     This command removes files or directories from the vfat or ext* partition of the
@@ -456,6 +457,9 @@
 
     The -n option is used to specify the path to the native sysroot
     containing the tools(parted and mtools) to use.
+
+    The -r option is used to remove directories and their contents
+    recursively,this only applies to ext* partition.
 """
 
 wic_write_usage = """