[bitbake-devel] [PATCH] fetch2/npm: fix parsing multiple matching packages

Jean-marie Lemetayer jean-marie.lemetayer at savoirfairelinux.com
Mon Oct 7 12:25:34 UTC 2019


Hi Zoltán,

I am working on the master branch for now. I have several fixes which are under development. When this work will be done, I will consider backporting all of these fixes.

Best regards,
Jean-Marie

----- Mail original -----
> De: "Böszörményi Zoltán" <zboszor at pr.hu>
> À: "Jean-marie Lemetayer" <jean-marie.lemetayer at savoirfairelinux.com>
> Cc: "mpvader" <mvader at victronenergy.com>, "bitbake-devel" <bitbake-devel at lists.openembedded.org>
> Envoyé: Samedi 5 Octobre 2019 08:47:09
> Objet: Re: [bitbake-devel] [PATCH] fetch2/npm: fix parsing multiple matching packages

> Hi,
> 
> 2019. 10. 04. 9:42 keltezéssel, Jean-marie Lemetayer írta:
>> Hi Zoltán,
>> 
>> It seems that this issue have already been fixed by this patch:
>> https://git.openembedded.org/bitbake/commit/?id=3d319c79981811d3cfd4732885057db4fd5afcc2
>> 
>> Not the same implementation as yours, but it fixes the same issue.
> 
> The implementation is not mine, I just tested it back then with Yocto 2.5.
> 
> Will your patch backported to older major versions of Bitbake?
> The issue is present in older Yocto versions.
> 
>> 
>> Best regards,
>> Jean-Marie Lemetayer
>> 
>> ----- Mail original -----
>> De: "bitbake-devel" <bitbake-devel at lists.openembedded.org>
>> À: "mpvader" <mvader at victronenergy.com>, "bitbake-devel"
>> <bitbake-devel at lists.openembedded.org>
>> Envoyé: Vendredi 4 Octobre 2019 07:58:56
>> Objet: Re: [bitbake-devel] [PATCH] fetch2/npm: fix parsing multiple matching
>> packages
>> 
>> Hi Bitbake devs!
>> 
>> The exception with the below "devtool add ..." command still occurs with
>> bvitbake 1.42.0 used in Yocto 2.7 and is fixed with the patch.
>> 
>> Please consider applying/backporting it.
>> 
>> Best regards,
>> Zoltán Böszörményi
>> 
>> 2018. 02. 19. 9:55 keltezéssel, Böszörményi Zoltán írta:
>>> 2018-02-11 23:31 keltezéssel, mpvader írta:
>>>> Replace the self-implemented parser with loading the complete json and then
>>>> taking the last element from it.
>>>>
>>>> This fixes an error fetching the lex-parser package, as a dependency of, for
>>>> example, jison. Reproduce the error with this command:
>>>>
>>>> devtool add "npm://registry.npmjs.org;name=jison;version=0.4.18"
>>>>
>>>> _parse_view() didn't properly parse the npm view result [1], resulting in
>>>> an Exception in the subsequent json.loads() function:
>>>> Exception: ValueError: Extra data: line 57 column 4 - line 296 column 2 (char
>>>> 5874 - 29698)
>>>
>>> I can confirm this problem exists in Bitbake 1.36 and goes away with the patch.
>>>
>>> Also tested the patch for the handful of node module recipes
>>> I have and they still build properly.
>>>
>>>>
>>>> [1] npm view lex-parser@'0.1.x' --json --registry http://registry.npmjs.org
>>>>
>>>> Signed-off-by: mpvader <mvader at victronenergy.com>
>>>
>>> Tested-by: Zoltán Böszörményi <zboszor at pr.hu>
>>>
>>>> ---
>>>>    lib/bb/fetch2/npm.py | 29 ++++++++---------------------
>>>>    1 file changed, 8 insertions(+), 21 deletions(-)
>>>>
>>>> diff --git a/lib/bb/fetch2/npm.py b/lib/bb/fetch2/npm.py
>>>> index b5f148c..e257355 100644
>>>> --- a/lib/bb/fetch2/npm.py
>>>> +++ b/lib/bb/fetch2/npm.py
>>>> @@ -146,25 +146,6 @@ class Npm(FetchMethod):
>>>>            self._unpackdep(ud, ud.pkgname, workobj, unpackdir, dldir, d)
>>>> -    def _parse_view(self, output):
>>>> -        '''
>>>> -        Parse the output of npm view --json; the last JSON result
>>>> -        is assumed to be the one that we're interested in.
>>>> -        '''
>>>> -        pdata = None
>>>> -        outdeps = {}
>>>> -        datalines = []
>>>> -        bracelevel = 0
>>>> -        for line in output.splitlines():
>>>> -            if bracelevel:
>>>> -                datalines.append(line)
>>>> -            elif '{' in line:
>>>> -                datalines = []
>>>> -                datalines.append(line)
>>>> -            bracelevel = bracelevel + line.count('{') - line.count('}')
>>>> -        if datalines:
>>>> -            pdata = json.loads('\n'.join(datalines))
>>>> -        return pdata
>>>>        def _getdependencies(self, pkg, data, version, d, ud, optional=False,
>>>> fetchedlist=None):
>>>>            if fetchedlist is None:
>>>> @@ -175,9 +156,15 @@ class Npm(FetchMethod):
>>>>            logger.debug(2, "Calling getdeps on %s" % pkg)
>>>>            fetchcmd = "npm view %s --json --registry %s" % (pkgfullname, ud.registry)
>>>>            output = runfetchcmd(fetchcmd, d, True)
>>>> -        pdata = self._parse_view(output)
>>>> -        if not pdata:
>>>> +        if not output:
>>>>                raise FetchError("The command '%s' returned no output" % fetchcmd)
>>>> +        pdata = json.loads(output)
>>>> +
>>>> +        # npm registry will return multiple dicts in a list when there is more
>>>> than one
>>>> matching
>>>> +        # version. Take the last one.
>>>> +        if isinstance(pdata, list):
>>>> +            pdata = pdata[-1]
>>>> +
>>>>            if optional:
>>>>                pkg_os = pdata.get('os', None)
>>>>                if pkg_os:
>>>>
>>>


More information about the bitbake-devel mailing list