@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+import glob
import oe.path
import oe.types
import subprocess
@@ -794,68 +795,85 @@ class UserResolver(Resolver):
raise
os.chdir(olddir)
-
-def patch_path(url, fetch, workdir, expand=True):
- """Return the local path of a patch, or return nothing if this isn't a patch"""
-
- local = fetch.localpath(url)
- if os.path.isdir(local):
- return
+def is_patch(local, workdir, apply_all, expand):
base, ext = os.path.splitext(os.path.basename(local))
if ext in ('.gz', '.bz2', '.xz', '.Z'):
if expand:
local = os.path.join(workdir, base)
ext = os.path.splitext(base)[1]
+ if ext in (".diff", ".patch") or apply_all:
+ return True
+ return False
+
+def patch_path(url, fetch, workdir, expand=True):
+ """Return a list of local paths of patches or return an empty list if there are no patches"""
+ patches = []
+ local = fetch.localpath(url)
urldata = fetch.ud[url]
+
+ apply_all = False
if "apply" in urldata.parm:
apply = oe.types.boolean(urldata.parm["apply"])
if not apply:
- return
- elif ext not in (".diff", ".patch"):
- return
+ return patches
+ else:
+ apply_all = True
- return local
+ if os.path.isdir(local) and apply_all:
+ for f in sorted(glob.glob(local + "/**", recursive=True)):
+ if os.path.isdir(f):
+ continue
+ if is_patch(f, workdir, apply_all, expand):
+ patches.append(f)
+ else:
+ if is_patch(local, workdir, apply_all, expand):
+ patches.append(local)
+
+ return patches
def src_patches(d, all=False, expand=True):
+ """Return a list of local paths from SRC_URI. With all=False all patches targeting do_patch, with all=True all other local paths"""
workdir = d.getVar('WORKDIR')
fetch = bb.fetch2.Fetch([], d)
patches = []
sources = []
for url in fetch.urls:
- local = patch_path(url, fetch, workdir, expand)
- if not local:
+ locals = []
+ locals = locals + patch_path(url, fetch, workdir, expand)
+
+ if not locals:
if all:
local = fetch.localpath(url)
sources.append(local)
continue
-
- urldata = fetch.ud[url]
- parm = urldata.parm
- patchname = parm.get('pname') or os.path.basename(local)
-
- apply, reason = should_apply(parm, d)
- if not apply:
- if reason:
- bb.note("Patch %s %s" % (patchname, reason))
- continue
-
- patchparm = {'patchname': patchname}
- if "striplevel" in parm:
- striplevel = parm["striplevel"]
- elif "pnum" in parm:
- #bb.msg.warn(None, "Deprecated usage of 'pnum' url parameter in '%s', please use 'striplevel'" % url)
- striplevel = parm["pnum"]
else:
- striplevel = '1'
- patchparm['striplevel'] = striplevel
+ for patch in locals:
+ parm = fetch.ud[url].parm
+ patchname = parm.get('pname') or os.path.basename(patch)
+
+ apply, reason = should_apply(parm, d)
+ if not apply:
+ if reason:
+ bb.note("Patch %s %s" % (patchname, reason))
+ continue
+
+ patchparm = {'patchname': patchname}
+ if "striplevel" in parm:
+ striplevel = parm["striplevel"]
+ elif "pnum" in parm:
+ #bb.warn("Deprecated usage of 'pnum' url parameter in '%s', please use 'striplevel'" % url)
+ striplevel = parm["pnum"]
+ else:
+ striplevel = '1'
+ patchparm['striplevel'] = striplevel
- patchdir = parm.get('patchdir')
- if patchdir:
- patchparm['patchdir'] = patchdir
+ patchdir = parm.get('patchdir')
+ if patchdir:
+ patchparm['patchdir'] = patchdir
- localurl = bb.fetch.encodeurl(('file', '', local, '', '', patchparm))
- patches.append(localurl)
+ localurl = bb.fetch.encodeurl(('file', '', patch, '', '', patchparm))
+ patches.append(localurl)
if all:
return sources
The current developer manual specifies that patches that are part of a directory which is given in SRC_URI are applied by the do_patch task. However that is not implemented in the current code. Implement part of it with two differences: - The implementation requires the parameter "apply=yes" and adds all files as patches, not only files ending in .patch and .diff. This keeps recipes which depend on the current implementation working. - The possibility to exclude a file in that directory from being applied by a follow up entry with "apply=no" is dropped. Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> --- meta/lib/oe/patch.py | 92 ++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 37 deletions(-)