On Fri, Dec 10, 2021 at 09:01:18AM -0500, Bruce Ashfield wrote:
> On Fri, Dec 10, 2021 at 8:29 AM Konrad Weihmann <kweihm...@outlook.com> wrote:
> >
> >
> >
> > On 10.12.21 14:04, Max Krummenacher wrote:
> > > 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.krummenac...@toradex.com>
> > > ---
> > >   meta/lib/oe/patch.py | 98 ++++++++++++++++++++++++++------------------
> > >   1 file changed, 59 insertions(+), 39 deletions(-)
> > >
> > > diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
> > > index 950fe723dc..0d2afab2f9 100644
> > > --- a/meta/lib/oe/patch.py
> > > +++ b/meta/lib/oe/patch.py
> > > @@ -794,68 +794,88 @@ 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]
> > >
> > > -    urldata = fetch.ud[url]
> > > +    if ext in (".diff", ".patch") or apply_all:
> > > +        return True
> > > +    return False
> > > +
> > > +def patch_path(local, urldata, fetch, workdir, expand=True):
> > > +    """Return a list of local paths of patches or return an empty list 
> > > if there are no patches"""
> > > +    patches = []
> > > +
> > > +    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
> > > +
> > > +    if os.path.isdir(local) and apply_all:
> > > +        for f in sorted(os.listdir(local)):
> >
> > This assumes that patches can be ordered (in here alphabetically) -
> > which isn't the case for most of the projects I worked with - I think it
> > was also a reason why one has to specify the order and inclusion in SRC_URI.
> 
> This was immediately my concern as well when I read the 0/N for the series.
> 
> I'd be more inclined to remove the documentation, rather than trying
> to deal with sorting and sequencing issues. Since it hasn't been
> working until now, there wouldn't be any users to annoy with dropped
> functionality.
> 
> (That being said, we could make the argument that anyone attempting to
> just point at a directory full of patches knows enough that they need
> to have them named in a way to keep them sorted and applied in order).
> 

First, I'd very much welcome a patch for the documentation since I
assume if this gets merged it does not get backported, so currently
maintained but not master branches would have the old behavior,
warranting a fix in the documentation.

I would assume that this can break kernel-yocto and the KERNEL_FEATURES
with optional patching if .scc and .patch files are in the same
directory which is added to SRC_URI with apply=True.

On a slightly different topic, I personally think that including directories
in SRC_URI should be discouraged because overriding a directory from a
bbappend is completely replacing it and not doing a mergeof both
directories.

i.e.

some-dir/a
some-dir/b
some-dir/c

bbappend/some-dir/b

The result is the only file fetched by the recipe is b from the
bbappend. So it makes it much harder to override only one file from
within a directory which is included in SRC_URI.

Cheers,
Quentin

> Cheers,
> 
> Bruce
> 
> 
> >
> > > +            sublocal = local + '/' + f
> >
> > Wouldn't be a sorted glob be more suitable here?
> >
> > > +            # Also search in subdirs
> > > +            if os.path.isdir(sublocal):
> > > +                patches = patches + patch_path(sublocal, urldata, fetch, 
> > > workdir, expand)
> > > +            else:
> > > +                if is_patch(sublocal, workdir, apply_all, expand):
> > > +                    patches.append(sublocal)
> > > +    else:
> > > +        if is_patch(local, workdir, apply_all, expand):
> > > +            patches.append(local)
> > >
> > > -    return 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:
> > > -            if all:
> > > -                local = fetch.localpath(url)
> > > -                sources.append(local)
> > > -            continue
> > >
> > > +    for url in fetch.urls:
> > > +        local = fetch.localpath(url)
> > >           urldata = fetch.ud[url]
> > > -        parm = urldata.parm
> > > -        patchname = parm.get('pname') or os.path.basename(local)
> > > +        locals = []
> > > +        locals = locals + patch_path(local, urldata, fetch, workdir, 
> > > expand)
> > >
> > > -        apply, reason = should_apply(parm, d)
> > > -        if not apply:
> > > -            if reason:
> > > -                bb.note("Patch %s %s" % (patchname, reason))
> > > +        if not locals:
> > > +            if all:
> > > +                sources.append(local)
> > >               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 = urldata.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
> > >
> > >
> > >
> > >
> > >
> >
> > 
> >
> 
> 
> --
> - Thou shalt not follow the NULL pointer, for chaos and madness await
> thee at its end
> - "Use the force Harry" - Gandalf, Star Trek II

> 
> 
> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#159527): 
https://lists.openembedded.org/g/openembedded-core/message/159527
Mute This Topic: https://lists.openembedded.org/mt/87635233/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to