Package: npm2deb
Version: 0.2.8-1
Severity: normal
Tags: patch

The tool used by the JavaScript team to track progress on packaging,
js_task_edit[1], has trouble dealing with binary packages that have a
different name than the source package. For example, in the OpenPGP
packaging page[2], a bunch of babel packages are marked as missing in
Debian even though they are actually present (e.g. babel-code).

This is because of that bit of rmadison code in mapper.py:

        madison = _getstatusoutput(
            'rmadison -u debian "%s" | tac | grep source' % result['name'])

If you look at the output for `babel-core`, you'll see this can't
possibly work:

    $ rmadison -u debian node-babel-core
    node-babel-core | 6.26.0+dfsg-3 | testing    | all
    node-babel-core | 6.26.0+dfsg-3 | unstable   | all

The "-S" does not help here: it would show binary packages if we
somehow magically found the right source package, but not the
reverse. There's no way the commandline rmadison tool can give us that
information, because that's a limitation of the API.

At least that's what I thought at first. As it turns out, there's an
undocumented `python` output format hidden deep in the entrails of
Dak[3] which, in turn, actually indicate the source package associated
with any binary package found. This nasty business requires us to do
an actual HTTP query in Python, but rmadison does that anyways, so
doing so is not really slower.

The attached patch fixes the bug in my tests: return the source
package instead of the binary package and things all fall into
place. As a bonus, we sort the version numbers with Python's distutils
which should be more reliable than `tac` (if that's even what that
thing was doing).

[1]: https://salsa.debian.org/js-team/js-task-wiki-edit
[2]: https://wiki.debian.org/Javascript/Nodejs/Tasks/openpgp
[3]: https://ftp-team.pages.debian.net/dak/epydoc/dak.daklib.ls-pysrc.html#L77

-- System Information:
Debian Release: buster/sid
  APT prefers testing
  APT policy: (500, 'testing'), (1, 'experimental'), (1, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 4.18.0-1-amd64 (SMP w/4 CPU cores)
Locale: LANG=fr_CA.UTF-8, LC_CTYPE=fr_CA.UTF-8 (charmap=UTF-8), 
LANGUAGE=fr_CA.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages npm2deb depends on:
ii  devscripts                2.18.4
ii  node-github-url-from-git  1.4.0-1
ii  npm                       5.8.0+ds5-1
ii  python3                   3.6.6-1
ii  python3-dateutil          2.6.1-1

npm2deb recommends no packages.

npm2deb suggests no packages.

-- debconf-show failed
--- /usr/lib/python3/dist-packages/npm2deb/mapper.py    2018-08-17 
07:53:04.000000000 -0400
+++ /home/anarcat/mapper.py     2018-09-27 12:30:52.010299687 -0400
@@ -4,10 +4,13 @@
 from subprocess import getstatusoutput as _getstatusoutput
 from fnmatch import fnmatch as _fnmatch
 
+import distutils.version
+
 from npm2deb.utils import debug as _debug
 from npm2deb.utils import debianize_name as _debianize_name
 
 DB_URL = 'https://wiki.debian.org/Javascript/Nodejs/Database'
+MADISON_URL = 
'https://api.ftp-master.debian.org/madison?S=true&f=python&package=%s'
 
 
 class Mapper(object):
@@ -68,19 +71,22 @@
         if not result['name']:
             return result
 
-        madison = _getstatusoutput(
-            'rmadison -u debian "%s" | tac | grep source' % result['name'])
-
-        if madison[0] != 0:
+        data = _urlopen(MADISON_URL % result['name']).read().decode('utf-8')
+        packages = _parseJSON(data)
+        if len(packages) < 1:
             result['name'] = None
             return result
-
-        tmp = madison[1].split('|')
-        if len(tmp) >= 2:
-            result['name'] = tmp[0].strip()
-            result['version'] = tmp[1].strip()
-            result['suite'] = tmp[2].strip()
-            result['repr'] = '%s (%s)' % (result['name'], result['version'])
+        result['version'] = distutils.version.LooseVersion('0:0')
+        for suite, versions in packages[0][result['name']]:
+            for vers, source in versions:
+                if distutils.version.LooseVersion(vers) > version:
+                    result['version'] = distutils.version.LooseVersion(vers)
+                    result['suite'] = suite
+                    result['name'] = source['source']
+                    result['repr'] = '%s (%s)' % (result['name'], 
result['version'])
+        result['version'] = str(result['version'])
+        if result['version'] == '0:0':
+            result['version'] = None
 
         return result
 
-- 
Pkg-javascript-devel mailing list
Pkg-javascript-devel@alioth-lists.debian.net
https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/pkg-javascript-devel

Reply via email to