[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Versioned dependencies with stdeb and pybuild



Am 05.12.2016 um 15:13 schrieb Piotr Ożarowski:
> [Malte Forkel, 2016-12-05]
>> Why do you recommend putting the requirements into Build-Depends? Most
>> of those packages are currently not available on the build system (I'm
>> not pbuilder for this).
> 
> because you most probably need it for tests anyway and if tests work
> with version >= A, you don't need to translate requirements.txt with
> ">A.devRELEASED_TODAY_OR_TOMORROW+post7"
> 
> if they're not packaged, you should start with the ones without
> dependencies, even in your local repository.

It is just too easy to disable the tests with pybuild :-)

>> How do you think about an additional option for pybuild that would tell
>> it to translate all version specifications provided by upstream into
>> Depends?
> 
> pybuild doesn't touch versions at all, you mean dh_python3
> See https://anonscm.debian.org/cgit/dh-python/dh-python.git/tree/README.rst
> (pybuild is an implementation of dh_auto_foo)
> 
> dh_python3 doesn't have such option, but I guess I can add optional
> --assume-upstream-versions-match-debians-and-are-sane (after finding a
> better name for it)

Right. Sometimes coming up with an appropriate name seems to be more
difficult than implementing the functionality in the first place.

I made the following changes to pydist.py to include all upstream
version information with a minimal debian/py3dist-overrides that
only adds missing mappings. Besides implementing a fictional option
'--accept-upstream-versions', the changes allow for a version
interval to be specified and support the operator '==' (and
translate the deprecated operators '<' and '>').

--- pydist.py.orig	2016-08-18 00:27:52.000000000 +0200
+++ pydist.py	2016-12-06 09:19:59.092155732 +0100
@@ -54,9 +54,22 @@ REQUIRES_RE = re.compile(r'''
         (?P<operator><=?|>=?|==|!=)
         \s*
         (?P<version>(\w|[-.])+)
+        (?:  # optional interval minimum/maximum version
+            \s*
+            ,
+            \s*
+            (?P<operator2><=?|>=?|==|!=)
+            \s*
+            (?P<version2>(\w|[-.])+)
+        )?
     )?
     \)?  # optional closing parenthesis
     ''', re.VERBOSE)
+DEB_VERS_OPS = {
+    '==': '=',
+    '<':  '<<',
+    '>':  '>>',
+}
 
 
 def validate(fpath):
@@ -150,9 +163,23 @@ def guess_dependency(impl, req, version=
                 # Debian dependency
                 return item['dependency']
             if req_d['version'] and (item['standard'] or item['rules']) and\
-                    req_d['operator'] not in (None, '==', '!='):
+                    req_d['operator'] not in (None, '!='):
+                o = _translate_op(req_d['operator'])
                 v = _translate(req_d['version'], item['rules'], item['standard'])
-                return "%s (%s %s)" % (item['dependency'], req_d['operator'], v)
+                d = "%s (%s %s)" % (item['dependency'], o, v)
+                if req_d['version2'] and req_d['operator2'] not in (None,'!='):
+                    o2 = _translate_op(req_d['operator2'])
+                    v2 = _translate(req_d['version2'], item['rules'], item['standard'])
+                    d += ", %s (%s %s)" % (item['dependency'], o2, v2)
+                return d
+            elif 'check_accept-upstream-versions_here' and req_d['version'] and \
+                    req_d['operator'] not in (None,'!='):
+                o = _translate_op(req_d['operator'])
+                d = "%s (%s %s)" % (item['dependency'], o, req_d['version'])
+                if req_d['version2'] and req_d['operator2'] not in (None,'!='):
+                    o2 = _translate_op(req_d['operator2'])
+                    d += ", %s (%s %s)" % (item['dependency'], o2, req_d['version2'])
+                return d
             else:
                 if item['dependency'] in bdep:
                     if None in bdep[item['dependency']] and bdep[item['dependency']][None]:
@@ -307,3 +334,16 @@ def _translate(version, rules, standard)
     if standard == 'PEP386':
         version = PRE_VER_RE.sub(r'~\g<1>', version)
     return version
+
+
+def _translate_op(operator):
+    """Translate Python version operator into Debian one.
+
+    >>> _translate_op('==')
+    '='
+    >>> _translate_op('<')
+    '<<'
+    >>> _translate_op('<=')
+    '<='
+    """
+    return DEB_VERS_OPS.get(operator, operator)




Reply to: