[OE-core] [PATCH] patch.bbclass: abstract out logic that determines patches to apply

Saul Wold sgw at linux.intel.com
Tue Dec 27 20:33:05 UTC 2011


On 12/20/2011 09:38 AM, Christopher Larson wrote:
> This is needed by the copyleft_compliance class, so it can emit series
> files
> for the patches, which greatly increases their usefulness to a user
> trying to
> reconstruct the sources outside of OE.
>
> Signed-off-by: Christopher Larson <chris_larson at mentor.com>
> ---
> meta/classes/patch.bbclass | 196
> +++++++++++++++++++++++--------------------
> 1 files changed, 105 insertions(+), 91 deletions(-)
>
> diff --git a/meta/classes/patch.bbclass b/meta/classes/patch.bbclass
> index ac6c1ce..454d9ce 100644
> --- a/meta/classes/patch.bbclass
> +++ b/meta/classes/patch.bbclass
> @@ -7,13 +7,106 @@ PATCHDEPENDENCY =
> "${PATCHTOOL}-native:do_populate_sysroot"
> inherit terminal
> -python patch_do_patch() {
> - import oe.patch
> +def src_patches(d):
> + workdir = d.getVar('WORKDIR', True)
> + fetch = bb.fetch2.Fetch([], d)
> + patches = []
> + for url in fetch.urls:
> + local = patch_path(url, fetch, workdir)
> + if not local:
> + continue
> +
> + urldata = fetch.ud[url]
> + parm = urldata.parm
> + patchname = parm.get('pname') or os.path.basename(local)
> +
> + apply, reason = should_apply(parm)
> + if not apply:
> + if reason:
> + bb.note("Patch %s %s" % (patchname, reason))
> + continue
> - src_uri = (d.getVar('SRC_URI', 1) or '').split()
> - if not src_uri:
> + patchparm = {'patchname': patchname}
> + if "striplevel" in parm:
> + striplevel = parm["striplevel"]
> + elif "pnum" in parm:
> + striplevel = parm["pnum"]
> + else:
> + striplevel = '1'
> + patchparm['striplevel'] = striplevel
> +
> + patchdir = parm.get('patchdir')
> + if patchdir:
> + patchparm['patchdir'] = patchdir
> +
> + localurl = bb.encodeurl(('file', '', local, '', '', patchparm))
> + patches.append(localurl)
> +
> + return patches
> +
> +def patch_path(url, fetch, workdir):
> + """Return the local path of a patch, or None if this isn't a patch"""
> +
> + local = fetch.localpath(url)
> + base, ext = os.path.splitext(os.path.basename(local))
> + if ext in ('.gz', '.bz2', '.Z'):
> + local = os.path.join(workdir, base)
> + ext = os.path.splitext(base)[1]
> +
> + urldata = fetch.ud[url]
> + if "apply" in urldata.parm:
> + apply = oe.types.boolean(urldata.parm["apply"])
> + if not apply:
> + return
> + elif ext not in (".diff", ".patch"):
> return
> + return local
> +
> +def should_apply(parm):

Do you need to pass d here?

I am seeing errors (see 
http://autobuilder.yoctoproject.org:8010/builders/nightly-x86/builds/295/steps/shell_14/logs/stdio)

Sau!

> + """Determine if we should apply the given patch"""
> +
> + if "mindate" in parm or "maxdate" in parm:
> + pn = d.getVar('PN', 1)
> + srcdate = d.getVar('SRCDATE_%s' % pn, 1)
> + if not srcdate:
> + srcdate = d.getVar('SRCDATE', 1)
> +
> + if srcdate == "now":
> + srcdate = d.getVar('DATE', 1)
> +
> + if "maxdate" in parm and parm["maxdate"] < srcdate:
> + return False, 'is outdated'
> +
> + if "mindate" in parm and parm["mindate"] > srcdate:
> + return False, 'is predated'
> +
> +
> + if "minrev" in parm:
> + srcrev = d.getVar('SRCREV', 1)
> + if srcrev and srcrev < parm["minrev"]:
> + return False, 'applies to later revisions'
> +
> + if "maxrev" in parm:
> + srcrev = d.getVar('SRCREV', 1)
> + if srcrev and srcrev > parm["maxrev"]:
> + return False, 'applies to earlier revisions'
> +
> + if "rev" in parm:
> + srcrev = d.getVar('SRCREV', 1)
> + if srcrev and parm["rev"] not in srcrev:
> + return False, "doesn't apply to revision"
> +
> + if "notrev" in parm:
> + srcrev = d.getVar('SRCREV', 1)
> + if srcrev and parm["notrev"] in srcrev:
> + return False, "doesn't apply to revision"
> +
> + return True, None
> +
> +python patch_do_patch() {
> + import oe.patch
> +
> patchsetmap = {
> "patch": oe.patch.PatchTree,
> "quilt": oe.patch.QuiltTree,
> @@ -29,93 +122,15 @@ python patch_do_patch() {
> rcls = resolvermap[d.getVar('PATCHRESOLVE', 1) or 'user']
> + classes = {}
> +
> s = d.getVar('S', 1)
> path = os.getenv('PATH')
> os.putenv('PATH', d.getVar('PATH', 1))
> - classes = {}
> -
> - workdir = d.getVar('WORKDIR', 1)
> - for url in src_uri:
> - (type, host, path, user, pswd, parm) = bb.decodeurl(url)
> -
> - local = None
> - base, ext = os.path.splitext(os.path.basename(path))
> - if ext in ('.gz', '.bz2', '.Z'):
> - local = os.path.join(workdir, base)
> - ext = os.path.splitext(base)[1]
> -
> - if "apply" in parm:
> - apply = parm["apply"]
> - if apply != "yes":
> - if apply != "no":
> - bb.msg.warn(None, "Unsupported value '%s' for 'apply' url param in
> '%s', please use 'yes' or 'no'" % (apply, url))
> - continue
> - #elif "patch" in parm:
> - #bb.msg.warn(None, "Deprecated usage of 'patch' url param in '%s',
> please use 'apply={yes,no}'" % url)
> - elif ext not in (".diff", ".patch"):
> - continue
> -
> - if not local:
> - url = bb.encodeurl((type, host, path, user, pswd, []))
> - local = os.path.join('/', bb.fetch2.localpath(url, d))
> - local = bb.data.expand(local, d)
> -
> - 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'
> -
> - if "pname" in parm:
> - pname = parm["pname"]
> - else:
> - pname = os.path.basename(local)
> -
> - if "mindate" in parm or "maxdate" in parm:
> - pn = d.getVar('PN', 1)
> - srcdate = d.getVar('SRCDATE_%s' % pn, 1)
> - if not srcdate:
> - srcdate = d.getVar('SRCDATE', 1)
> -
> - if srcdate == "now":
> - srcdate = d.getVar('DATE', 1)
> -
> - if "maxdate" in parm and parm["maxdate"] < srcdate:
> - bb.note("Patch '%s' is outdated" % pname)
> - continue
> -
> - if "mindate" in parm and parm["mindate"] > srcdate:
> - bb.note("Patch '%s' is predated" % pname)
> - continue
> -
> -
> - if "minrev" in parm:
> - srcrev = d.getVar('SRCREV', 1)
> - if srcrev and srcrev < parm["minrev"]:
> - bb.note("Patch '%s' applies to later revisions" % pname)
> - continue
> -
> - if "maxrev" in parm:
> - srcrev = d.getVar('SRCREV', 1)
> - if srcrev and srcrev > parm["maxrev"]:
> - bb.note("Patch '%s' applies to earlier revisions" % pname)
> - continue
> -
> - if "rev" in parm:
> - srcrev = d.getVar('SRCREV', 1)
> - if srcrev and parm["rev"] not in srcrev:
> - bb.note("Patch '%s' doesn't apply to revision" % pname)
> - continue
> -
> - if "notrev" in parm:
> - srcrev = d.getVar('SRCREV', 1)
> - if srcrev and parm["notrev"] in srcrev:
> - bb.note("Patch '%s' doesn't apply to revision" % pname)
> - continue
> + for patch in src_patches(d):
> + _, _, local, _, _, parm = bb.decodeurl(patch)
> if "patchdir" in parm:
> patchdir = parm["patchdir"]
> @@ -132,12 +147,11 @@ python patch_do_patch() {
> else:
> patchset, resolver = classes[patchdir]
> - bb.note("Applying patch '%s' (%s)" % (pname,
> oe.path.format_display(local, d)))
> + bb.note("Applying patch '%s' (%s)" % (parm['patchname'],
> oe.path.format_display(local, d)))
> try:
> - patchset.Import({"file":local, "remote":url, "strippath": striplevel},
> True)
> - except Exception:
> - import sys
> - raise bb.build.FuncFailed(str(sys.exc_value))
> + patchset.Import({"file":local, "strippath": parm['striplevel']}, True)
> + except Exception as exc:
> + bb.fatal(str(exc))
> resolver.Resolve()
> }
> patch_do_patch[vardepsexclude] = "DATE SRCDATE PATCHRESOLVE"




More information about the Openembedded-core mailing list