Hello community,

here is the log from the commit of package osc for openSUSE:Factory checked in 
at 2019-02-13 10:06:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/osc (Old)
 and      /work/SRC/openSUSE:Factory/.osc.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "osc"

Wed Feb 13 10:06:58 2019 rev:129 rq:673669 version:0.164.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/osc/osc.changes  2019-01-21 10:59:25.359347688 
+0100
+++ /work/SRC/openSUSE:Factory/.osc.new.28833/osc.changes       2019-02-13 
10:07:24.769530507 +0100
@@ -1,0 +2,10 @@
+Tue Feb 12 08:14:30 UTC 2019 - [email protected]
+
+- 0.164.2
+  - deleterequest for entire projects needs the --all option as additional 
protection
+  - rewrite packagequery to support python3
+  - rewrite oscerr module to support python3
+  - rewrite archqeury and debquery to support python3
+  - Export vc env vars when running a source service 
+
+-------------------------------------------------------------------

Old:
----
  osc-0.164.1.tar.gz

New:
----
  osc-0.164.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ osc.spec ++++++
--- /var/tmp/diff_new_pack.iaWV5A/_old  2019-02-13 10:07:27.893529714 +0100
+++ /var/tmp/diff_new_pack.iaWV5A/_new  2019-02-13 10:07:27.897529714 +0100
@@ -16,12 +16,12 @@
 #
 
 
-%define version_unconverted 0.164.1
+%define version_unconverted 0.164.2
 %define osc_plugin_dir %{_prefix}/lib/osc-plugins
 %define macros_file macros.osc
 
 Name:           osc
-Version:        0.164.1
+Version:        0.164.2
 Release:        0
 Summary:        Open Build Service Commander
 License:        GPL-2.0-or-later

++++++ PKGBUILD ++++++
--- /var/tmp/diff_new_pack.iaWV5A/_old  2019-02-13 10:07:27.921529707 +0100
+++ /var/tmp/diff_new_pack.iaWV5A/_new  2019-02-13 10:07:27.921529707 +0100
@@ -1,5 +1,5 @@
 pkgname=osc
-pkgver=0.164.1
+pkgver=0.164.2
 pkgrel=0
 pkgdesc="Open Build Service client"
 arch=('i686' 'x86_64')

++++++ _service ++++++
--- /var/tmp/diff_new_pack.iaWV5A/_old  2019-02-13 10:07:27.937529704 +0100
+++ /var/tmp/diff_new_pack.iaWV5A/_new  2019-02-13 10:07:27.937529704 +0100
@@ -1,7 +1,7 @@
 <services>
   <service name="tar_scm" mode="disabled">
-    <param name="version">0.164.1</param>
-    <param name="revision">0.164.1</param>
+    <param name="version">0.164.2</param>
+    <param name="revision">0.164.2</param>
     <param name="url">git://github.com/openSUSE/osc.git</param>
     <param name="scm">git</param>
   </service>

++++++ debian.changelog ++++++
--- /var/tmp/diff_new_pack.iaWV5A/_old  2019-02-13 10:07:27.969529695 +0100
+++ /var/tmp/diff_new_pack.iaWV5A/_new  2019-02-13 10:07:27.969529695 +0100
@@ -1,4 +1,4 @@
-osc (0.164.1) unstable; urgency=low
+osc (0.164.2) unstable; urgency=low
   - Update to 0.161.1
 
  -- Marco Strigl <[email protected]>  Thu, 26 Oct 2017 14:42:00 +0200

++++++ debian.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/debian/control new/debian/control
--- old/debian/control  2017-07-09 18:39:33.000000000 +0200
+++ new/debian/control  2019-01-16 17:02:24.000000000 +0100
@@ -8,7 +8,8 @@
 Package: osc
 Section: devel
 Architecture: all
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python (>=2.5) 
| python-celementtree, python-urlgrabber, python-m2crypto, python-rpm, build | 
obs-build
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python (>=2.5) 
| python-celementtree, python-m2crypto, python-rpm, build | obs-build
+Recommends: python-progressbar
 Suggests: python-keyring, sudo
 Description: Open Build Service Commander
   Commandline client for the Open Build Service.

++++++ osc-0.164.1.tar.gz -> osc-0.164.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/NEWS new/osc-0.164.2/NEWS
--- old/osc-0.164.1/NEWS        2019-01-16 14:02:23.000000000 +0100
+++ new/osc-0.164.2/NEWS        2019-02-12 09:11:43.000000000 +0100
@@ -1,3 +1,10 @@
+0.164.2
+  - deleterequest for entire projects needs the --all option as additional 
protection
+  - rewrite packagequery to support python3
+  - rewrite oscerr module to support python3
+  - rewrite archqeury and debquery to support python3
+  - Export vc env vars when running a source service
+
 0.164.1
   - rewrite cpio handling to support python3
   - rewrite ar module to support python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/commandline.py 
new/osc-0.164.2/osc/commandline.py
--- old/osc-0.164.1/osc/commandline.py  2019-01-16 14:02:23.000000000 +0100
+++ new/osc-0.164.2/osc/commandline.py  2019-02-12 09:11:43.000000000 +0100
@@ -1939,6 +1939,8 @@
                   help='specify message TEXT')
     @cmdln.option('-r', '--repository', metavar='REPOSITORY',
                   help='specify repository')
+    @cmdln.option('--all', action='store_true',
+                        help='deletes entire project with packages inside')
     @cmdln.option('--accept-in-hours', metavar='HOURS',
                   help='specify time when request shall get accepted 
automatically. Only works with write permissions in target.')
     @cmdln.alias("dr")
@@ -1950,8 +1952,8 @@
 
         usage:
             osc deletereq [-m TEXT]                     # works in checked out 
project/package
-            osc deletereq [-m TEXT] PROJECT [PACKAGE]
-            osc deletereq [-m TEXT] PROJECT [--repository REPOSITORY]
+            osc deletereq [-m TEXT] PROJECT PACKAGE
+            osc deletereq [-m TEXT] PROJECT [--all|--repository REPOSITORY]
         ${cmd_option_list}
         """
         import cgi
@@ -1977,6 +1979,9 @@
         else:
             raise oscerr.WrongArgs('Please specify at least a project.')
 
+        if not opts.all and package is None:
+            raise oscerr.WrongOptions('No package name has been provided. Use 
--all option, if you want to request to delete the entire project.')
+
         if opts.repository:
             repository = opts.repository
 
@@ -5203,8 +5208,7 @@
             opts.vertical = None
             opts.show_non_building = None
             opts.show_excluded = None
-            self.do_prjresults('prjresults', opts, *args)
-            return
+            return self.do_prjresults('prjresults', opts, *args)
 
         if opts.xml and opts.csv:
             raise oscerr.WrongOptions("--xml and --csv are mutual exclusive")
@@ -6335,7 +6339,7 @@
 
         if opts.preload:
             opts.nopreinstallimage = True
-        
+
         print('Building %s for %s/%s' % (args[2], args[0], args[1]))
         if not opts.host:
             return osc.build.main(self.get_api_url(), opts, args)
@@ -8850,37 +8854,6 @@
         else:
             apiurl = self.get_api_url()
 
-        # try to set the env variables for the user's realname and email
-        # (the variables are used by the "vc" script)
-        tag2envs = {'realname': ['VC_REALNAME'],
-                    'email': ['VC_MAILADDR', 'mailaddr']}
-        tag2val = {}
-        missing_tags = []
-
-        for (tag, envs) in tag2envs.items():
-            env_present = [env for env in envs if env in os.environ]
-            config_present = tag in conf.config['api_host_options'][apiurl]
-            if not env_present and not config_present:
-                missing_tags.append(tag)
-            elif config_present:
-                tag2val[tag] = conf.config['api_host_options'][apiurl][tag]
-
-        if missing_tags:
-            user = conf.get_apiurl_usr(apiurl)
-            data = get_user_data(apiurl, user, *missing_tags)
-            if data is not None:
-                for tag in missing_tags:
-                    val = data.pop(0)
-                    if val != '-':
-                        tag2val[tag] = val
-                    else:
-                        msg = 'Try env %s=...' % tag2envs[tag][0]
-                        print(msg, file=sys.stderr)
-
-        for (tag, val) in tag2val.items():
-            for env in tag2envs[tag]:
-                os.environ[env] = val
-
         if meego_style:
             if opts.message or opts.just_edit:
                 print('Warning: to edit MeeGo style changelog, opts will be 
ignored.', file=sys.stderr)
@@ -8899,6 +8872,7 @@
 
             cmd_list.extend(args)
 
+        vc_export_env(apiurl)
         vc = Popen(cmd_list)
         vc.wait()
         sys.exit(vc.returncode)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/core.py new/osc-0.164.2/osc/core.py
--- old/osc-0.164.1/osc/core.py 2019-01-16 14:02:23.000000000 +0100
+++ new/osc-0.164.2/osc/core.py 2019-02-12 09:11:43.000000000 +0100
@@ -5,7 +5,7 @@
 
 from __future__ import print_function
 
-__version__ = '0.164.1'
+__version__ = '0.164.2'
 
 # __store_version__ is to be incremented when the format of the working copy
 # "store" changes in an incompatible way. Please add any needed migration
@@ -406,6 +406,12 @@
             data = { 'name' : singleservice, 'command' : [ singleservice ], 
'mode' : '' }
             allservices = [data]
 
+        if not allservices:
+            # short-circuit to avoid a potential http request in vc_export_env
+            # (if there are no services to execute this http request is
+            # useless)
+            return 0
+
         # services can detect that they run via osc this way
         os.putenv("OSC_VERSION", get_osc_version())
 
@@ -415,6 +421,8 @@
             os.putenv("OBS_SERVICE_APIURL",  self.apiurl)
             os.putenv("OBS_SERVICE_PROJECT", self.project)
             os.putenv("OBS_SERVICE_PACKAGE", self.package)
+            # also export vc env vars (some services (like obs_scm) use them)
+            vc_export_env(self.apiurl)
 
         # recreate files
         ret = 0
@@ -7786,4 +7794,37 @@
                 f.write(data)
     print('done.')
 
+def vc_export_env(apiurl, quiet=False):
+        # try to set the env variables for the user's realname and email
+        # (the variables are used by the "vc" script or some source service)
+        tag2envs = {'realname': ['VC_REALNAME'],
+                    'email': ['VC_MAILADDR', 'mailaddr']}
+        tag2val = {}
+        missing_tags = []
+
+        for (tag, envs) in tag2envs.items():
+            env_present = [env for env in envs if env in os.environ]
+            config_present = tag in conf.config['api_host_options'][apiurl]
+            if not env_present and not config_present:
+                missing_tags.append(tag)
+            elif config_present:
+                tag2val[tag] = conf.config['api_host_options'][apiurl][tag]
+
+        if missing_tags:
+            user = conf.get_apiurl_usr(apiurl)
+            data = get_user_data(apiurl, user, *missing_tags)
+            if data is not None:
+                for tag in missing_tags:
+                    val = data.pop(0)
+                    if val != '-':
+                        tag2val[tag] = val
+                    elif not quiet:
+                        msg = 'Try env %s=...' % tag2envs[tag][0]
+                        print(msg, file=sys.stderr)
+
+        for (tag, val) in tag2val.items():
+            for env in tag2envs[tag]:
+                os.environ[env] = val
+
+
 # vim: sw=4 et
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/meter.py new/osc-0.164.2/osc/meter.py
--- old/osc-0.164.1/osc/meter.py        2019-01-16 14:02:23.000000000 +0100
+++ new/osc-0.164.2/osc/meter.py        2019-02-12 09:11:43.000000000 +0100
@@ -17,8 +17,11 @@
             widgets = [basename + ': ', pb.AnimatedMarker(), ' ', pb.Timer()]
             self.bar = pb.ProgressBar(widgets=widgets, maxval=pb.UnknownLength)
         else:
-            widgets = [basename + ': ', pb.Percentage(), pb.Bar(), ' ',
-                       pb.ETA()]
+            widgets = [basename + ': ', pb.Bar(), ' ', pb.ETA()]
+            if size:
+                # if size is 0, using pb.Percentage will result in
+                # a ZeroDivisionException
+                widgets.insert(1, pb.Percentage())
             self.bar = pb.ProgressBar(widgets=widgets, maxval=size)
         self.bar.start()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/oscerr.py 
new/osc-0.164.2/osc/oscerr.py
--- old/osc-0.164.1/osc/oscerr.py       2019-01-16 14:02:23.000000000 +0100
+++ new/osc-0.164.2/osc/oscerr.py       2019-02-12 09:11:43.000000000 +0100
@@ -82,7 +82,7 @@
     def __str__(self):
         return ('Working copy \'%s\' is out of date (rev %s vs rev %s).\n'
                'Looks as if you need to update it first.' \
-                    % (self[0], self[1], self[2]))
+                    % (self.args[0], self.args[1], self.args[2]))
 
 class PackageError(OscBaseError):
     """Base class for all Package related exceptions"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/util/archquery.py 
new/osc-0.164.2/osc/util/archquery.py
--- old/osc-0.164.1/osc/util/archquery.py       2019-01-16 14:02:23.000000000 
+0100
+++ new/osc-0.164.2/osc/util/archquery.py       2019-02-12 09:11:43.000000000 
+0100
@@ -17,7 +17,7 @@
         self.fields = {}
         #self.magic = None
         #self.pkgsuffix = 'pkg.tar.gz'
-        self.pkgsuffix = 'arch'
+        self.pkgsuffix = b'arch'
 
     def read(self, all_tags=True, self_provides=True, *extra_tags):
         # all_tags and *extra_tags are currently ignored
@@ -28,22 +28,21 @@
         fn = open('/dev/null', 'wb')
         pipe = subprocess.Popen(['tar', '-O', '-xf', self.__path, '.PKGINFO'], 
stdout=subprocess.PIPE, stderr=fn).stdout
         for line in pipe.readlines():
-            line = line.rstrip().split(' = ', 2)
+            line = line.rstrip().split(b' = ', 2)
             if len(line) == 2:
-                if not line[0] in self.fields:
-                    self.fields[line[0]] = []
-                self.fields[line[0]].append(line[1])
+                field, value = line[0].decode('ascii'), line[1]
+                self.fields.setdefault(field, []).append(value)
         if self_provides:
-            prv = '%s = %s' % (self.name(), self.fields['pkgver'][0])
+            prv = b'%s = %s' % (self.name(), self.fields['pkgver'][0])
             self.fields.setdefault('provides', []).append(prv)
         return self
 
     def vercmp(self, archq):
-        res = cmp(int(self.epoch()), int(archq.epoch()))
+        res = packagequery.cmp(int(self.epoch()), int(archq.epoch()))
         if res != 0:
             return res
         res = ArchQuery.rpmvercmp(self.version(), archq.version())
-        if res != None:
+        if res != 0:
             return res
         res = ArchQuery.rpmvercmp(self.release(), archq.release())
         return res
@@ -54,25 +53,31 @@
     def version(self):
         pkgver = self.fields['pkgver'][0] if 'pkgver' in self.fields else None
         if pkgver != None:
-            pkgver = re.sub(r'[0-9]+:', '', pkgver, 1)
-            pkgver = re.sub(r'-[^-]*$', '', pkgver)
+            pkgver = re.sub(br'[0-9]+:', b'', pkgver, 1)
+            pkgver = re.sub(br'-[^-]*$', b'', pkgver)
         return pkgver
 
     def release(self):
         pkgver = self.fields['pkgver'][0] if 'pkgver' in self.fields else None
         if pkgver != None:
-            m = re.search(r'-([^-])*$', pkgver)
+            m = re.search(br'-([^-])*$', pkgver)
             if m:
                 return m.group(1)
         return None
 
-    def epoch(self):
-        pkgver = self.fields['pkgver'][0] if 'pkgver' in self.fields else None
-        if pkgver != None:
-            m = re.match(r'([0-9])+:', pkgver)
+    def _epoch(self):
+        pkgver = self.fields.get('pkgver', [b''])[0]
+        if pkgver:
+            m = re.match(br'([0-9])+:', pkgver)
             if m:
                 return m.group(1)
-        return None
+        return b''
+
+    def epoch(self):
+        epoch = self._epoch()
+        if epoch:
+            return epoch
+        return b'0'
 
     def arch(self):
         return self.fields['arch'][0] if 'arch' in self.fields else None
@@ -103,7 +108,7 @@
         # libsolv treats an optdepend as a "suggests", hence we do the same
         if 'optdepend' not in self.fields:
             return []
-        return [re.sub(':.*', '', entry) for entry in self.fields['optdepend']]
+        return [re.sub(b':.*', b'', entry) for entry in 
self.fields['optdepend']]
 
     def supplements(self):
         # a .PKGINFO has no notion of "recommends"
@@ -114,8 +119,17 @@
         return []
 
     def canonname(self):
-        pkgver = self.fields['pkgver'][0] if 'pkgver' in self.fields else None
-        return self.name() + '-' + pkgver + '-' + self.arch() + '.' + 
self.pkgsuffix
+        name = self.name()
+        if name is None:
+            raise ArchError(self.path(), 'package has no name')
+        version = self.version()
+        if version is None:
+            raise ArchError(self.path(), 'package has no version')
+        arch = self.arch()
+        if arch is None:
+            raise ArchError(self.path(), 'package has no arch')
+        return ArchQuery.filename(name, self._epoch(), version, self.release(),
+                                  arch)
 
     def gettag(self, tag):
         # implement me, if needed
@@ -137,20 +151,24 @@
         """
         if ver1 == ver2:
             return 0
+        elif ver1 is None:
+            return -1
+        elif ver2 is None:
+            return 1
         res = 0
         while res == 0:
             # remove all leading non alphanumeric chars
-            ver1 = re.sub('^[^a-zA-Z0-9]*', '', ver1)
-            ver2 = re.sub('^[^a-zA-Z0-9]*', '', ver2)
+            ver1 = re.sub(b'^[^a-zA-Z0-9]*', b'', ver1)
+            ver2 = re.sub(b'^[^a-zA-Z0-9]*', b'', ver2)
             if not (len(ver1) and len(ver2)):
                 break
             # check if we have a digits segment
-            mo1 = re.match('(\d+)', ver1)
-            mo2 = re.match('(\d+)', ver2)
+            mo1 = re.match(b'(\d+)', ver1)
+            mo2 = re.match(b'(\d+)', ver2)
             numeric = True
             if mo1 is None:
-                mo1 = re.match('([a-zA-Z]+)', ver1)
-                mo2 = re.match('([a-zA-Z]+)', ver2)
+                mo1 = re.match(b'([a-zA-Z]+)', ver1)
+                mo2 = re.match(b'([a-zA-Z]+)', ver2)
                 numeric = False
             # check for different types: alpha and numeric
             if mo2 is None:
@@ -163,43 +181,42 @@
             ver2 = ver2[mo2.end(1):]
             if numeric:
                 # remove leading zeros
-                seg1 = re.sub('^0+', '', seg1)
-                seg2 = re.sub('^0+', '', seg2)
+                seg1 = re.sub(b'^0+', b'', seg1)
+                seg2 = re.sub(b'^0+', b'', seg2)
                 # longer digit segment wins - if both have the same length
                 # a simple ascii compare decides
-                res = len(seg1) - len(seg2) or cmp(seg1, seg2)
+                res = len(seg1) - len(seg2) or packagequery.cmp(seg1, seg2)
             else:
-                res = cmp(seg1, seg2)
+                res = packagequery.cmp(seg1, seg2)
         if res > 0:
             return 1
         elif res < 0:
             return -1
-        return cmp(ver1, ver2)
+        return packagequery.cmp(ver1, ver2)
 
     @staticmethod
     def filename(name, epoch, version, release, arch):
         if epoch:
             if release:
-                return '%s-%s:%s-%s-%s.arch' % (name, epoch, version, release, 
arch)
+                return b'%s-%s:%s-%s-%s.arch' % (name, epoch, version, 
release, arch)
             else:
-                return '%s-%s:%s-%s.arch' % (name, epoch, version, arch)
+                return b'%s-%s:%s-%s.arch' % (name, epoch, version, arch)
         if release:
-            return '%s-%s-%s-%s.arch' % (name, version, release, arch)
+            return b'%s-%s-%s-%s.arch' % (name, version, release, arch)
         else:
-            return '%s-%s-%s.arch' % (name, version, arch)
+            return b'%s-%s-%s.arch' % (name, version, arch)
 
 
 if __name__ == '__main__':
     import sys
+    archq = ArchQuery.query(sys.argv[1])
+    print(archq.name(), archq.version(), archq.release(), archq.arch())
     try:
-        archq = ArchQuery.query(sys.argv[1])
+        print(archq.canonname())
     except ArchError as e:
         print(e.msg)
-        sys.exit(2)
-    print(archq.name(), archq.version(), archq.release(), archq.arch())
-    print(archq.canonname())
     print(archq.description())
     print('##########')
-    print('\n'.join(archq.provides()))
+    print(b'\n'.join(archq.provides()))
     print('##########')
-    print('\n'.join(archq.requires()))
+    print(b'\n'.join(archq.requires()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/util/debquery.py 
new/osc-0.164.2/osc/util/debquery.py
--- old/osc-0.164.1/osc/util/debquery.py        2019-01-16 14:02:23.000000000 
+0100
+++ new/osc-0.164.2/osc/util/debquery.py        2019-02-12 09:11:43.000000000 
+0100
@@ -5,8 +5,10 @@
 import os.path
 import re
 import tarfile
-import StringIO
+from io import BytesIO
 from . import packagequery
+import itertools
+
 
 HAVE_LZMA = True
 try:
@@ -14,13 +16,21 @@
 except ImportError:
     HAVE_LZMA = False
 
+
+if (not hasattr(itertools, 'zip_longest')
+    and hasattr(itertools, 'izip_longest')):
+    # python2 case
+    itertools.zip_longest = itertools.izip_longest
+
+
 class DebError(packagequery.PackageError):
     pass
 
 class DebQuery(packagequery.PackageQuery, packagequery.PackageQueryResult):
 
-    default_tags = ('package', 'version', 'release', 'epoch', 'architecture', 
'description',
-        'provides', 'depends', 'pre_depends', 'conflicts', 'breaks')
+    default_tags = (b'package', b'version', b'release', b'epoch',
+        b'architecture', b'description', b'provides', b'depends',
+        b'pre_depends', b'conflicts', b'breaks')
 
     def __init__(self, fh):
         self.__file = fh
@@ -31,24 +41,24 @@
     def read(self, all_tags=False, self_provides=True, *extra_tags):
         arfile = ar.Ar(fh = self.__file)
         arfile.read()
-        debbin = arfile.get_file('debian-binary')
+        debbin = arfile.get_file(b'debian-binary')
         if debbin is None:
             raise DebError(self.__path, 'no debian binary')
-        if debbin.read() != '2.0\n':
+        if debbin.read() != b'2.0\n':
             raise DebError(self.__path, 'invalid debian binary format')
-        control = arfile.get_file('control.tar.gz')
+        control = arfile.get_file(b'control.tar.gz')
         if control is not None:
             # XXX: python2.4 relies on a name
             tar = tarfile.open(name='control.tar.gz', fileobj=control)
         else:
-            control = arfile.get_file('control.tar.xz')
+            control = arfile.get_file(b'control.tar.xz')
             if control is None:
                 raise DebError(self.__path, 'missing control.tar')
             if not HAVE_LZMA:
                 raise DebError(self.__path, 'can\'t open control.tar.xz 
without python-lzma')
             decompressed = lzma.decompress(control.read())
             tar = tarfile.open(name="control.tar.xz",
-                               fileobj=StringIO.StringIO(decompressed))
+                               fileobj=BytesIO(decompressed))
         try:
             name = './control'
             # workaround for python2.4's tarfile module
@@ -64,94 +74,98 @@
     def __parse_control(self, control, all_tags=False, self_provides=True, 
*extra_tags):
         data = control.readline().strip()
         while data:
-            field, val = re.split(':\s*', data.strip(), 1)
+            field, val = re.split(b':\s*', data.strip(), 1)
             data = control.readline()
-            while data and re.match('\s+', data):
-                val += '\n' + data.strip()
+            while data and re.match(b'\s+', data):
+                val += b'\n' + data.strip()
                 data = control.readline().rstrip()
-            field = field.replace('-', '_').lower()
+            field = field.replace(b'-', b'_').lower()
             if field in self.default_tags + extra_tags or all_tags:
                 # a hyphen is not allowed in dict keys
                 self.fields[field] = val
-        versrel = self.fields['version'].rsplit('-', 1)
+        versrel = self.fields[b'version'].rsplit(b'-', 1)
         if len(versrel) == 2:
-            self.fields['version'] = versrel[0]
-            self.fields['release'] = versrel[1]
+            self.fields[b'version'] = versrel[0]
+            self.fields[b'release'] = versrel[1]
         else:
-            self.fields['release'] = None
-        verep = self.fields['version'].split(':', 1)
+            self.fields[b'release'] = None
+        verep = self.fields[b'version'].split(b':', 1)
         if len(verep) == 2:
-            self.fields['epoch'] = verep[0]
-            self.fields['version'] = verep[1]
+            self.fields[b'epoch'] = verep[0]
+            self.fields[b'version'] = verep[1]
         else:
-            self.fields['epoch'] = '0'
-        self.fields['provides'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('provides', '')) if i ]
-        self.fields['depends'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('depends', '')) if i ]
-        self.fields['pre_depends'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('pre_depends', '')) if i ]
-        self.fields['conflicts'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('conflicts', '')) if i ]
-        self.fields['breaks'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('breaks', '')) if i ]
-        self.fields['recommends'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('recommends', '')) if i ]
-        self.fields['suggests'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('suggests', '')) if i ]
-        self.fields['enhances'] = [ i.strip() for i in re.split(',\s*', 
self.fields.get('enhances', '')) if i ]
+            self.fields[b'epoch'] = b'0'
+        self.fields[b'provides'] = self._split_field_value(b'provides')
+        self.fields[b'depends'] = self._split_field_value(b'depends')
+        self.fields[b'pre_depends'] = self._split_field_value(b'pre_depends')
+        self.fields[b'conflicts'] = self._split_field_value(b'conflicts')
+        self.fields[b'breaks'] = self._split_field_value(b'breaks')
+        self.fields[b'recommends'] = self._split_field_value(b'recommends')
+        self.fields[b'suggests'] = self._split_field_value(b'suggests')
+        self.fields[b'enhances'] = self._split_field_value(b'enhances')
         if self_provides:
             # add self provides entry
-            self.fields['provides'].append('%s (= %s)' % (self.name(), 
'-'.join(versrel)))
+            self.fields[b'provides'].append(b'%s (= %s)' % (self.name(), 
b'-'.join(versrel)))
+
+    def _split_field_value(self, field, delimeter=b',\s*'):
+        return [i.strip()
+                for i in re.split(delimeter, self.fields.get(field, b'')) if i]
 
     def vercmp(self, debq):
-        res = cmp(int(self.epoch()), int(debq.epoch()))
+        res = packagequery.cmp(int(self.epoch()), int(debq.epoch()))
         if res != 0:
             return res
         res = DebQuery.debvercmp(self.version(), debq.version())
-        if res != None:
+        if res != 0:
             return res
         res = DebQuery.debvercmp(self.release(), debq.release())
         return res
 
     def name(self):
-        return self.fields['package']
+        return self.fields[b'package']
 
     def version(self):
-        return self.fields['version']
+        return self.fields[b'version']
 
     def release(self):
-        return self.fields['release']
+        return self.fields[b'release']
 
     def epoch(self):
-        return self.fields['epoch']
+        return self.fields[b'epoch']
 
     def arch(self):
-        return self.fields['architecture']
+        return self.fields[b'architecture']
 
     def description(self):
-        return self.fields['description']
+        return self.fields[b'description']
 
     def path(self):
         return self.__path
 
     def provides(self):
-        return self.fields['provides']
+        return self.fields[b'provides']
 
     def requires(self):
-        return self.fields['depends'] + self.fields['pre_depends']
+        return self.fields[b'depends'] + self.fields[b'pre_depends']
 
     def conflicts(self):
-        return self.fields['conflicts'] + self.fields['breaks']
+        return self.fields[b'conflicts'] + self.fields[b'breaks']
 
     def obsoletes(self):
         return []
 
     def recommends(self):
-        return self.fields['recommends']
+        return self.fields[b'recommends']
 
     def suggests(self):
-        return self.fields['suggests']
+        return self.fields[b'suggests']
 
     def supplements(self):
         # a control file has no notion of "supplements"
         return []
 
     def enhances(self):
-        return self.fields['enhances']
+        return self.fields[b'enhances']
 
     def gettag(self, num):
         return self.fields.get(num, None)
@@ -174,20 +188,31 @@
         """
         # 32 is arbitrary - it is needed for the "longer digit string wins" 
handling
         # (found this nice approach in Build/Deb.pm (build package))
-        ver1 = re.sub('(\d+)', lambda m: (32 * '0' + m.group(1))[-32:], ver1)
-        ver2 = re.sub('(\d+)', lambda m: (32 * '0' + m.group(1))[-32:], ver2)
-        vers = map(lambda x, y: (x or '', y or ''), ver1, ver2)
+        ver1 = re.sub(b'(\d+)', lambda m: (32 * b'0' + m.group(1))[-32:], ver1)
+        ver2 = re.sub(b'(\d+)', lambda m: (32 * b'0' + m.group(1))[-32:], ver2)
+        vers = itertools.zip_longest(ver1, ver2, fillvalue=b'')
         for v1, v2 in vers:
             if v1 == v2:
                 continue
+            if not v1:
+                # this makes the corresponding condition in the following
+                # else part superfluous - keep the superfluous condition for
+                # now (just to ease a (hopefully) upcoming refactoring (this
+                # method really deserves a cleanup...))
+                return -1
+            if not v2:
+                # see above
+                return 1
+            v1 = bytes(bytearray([v1]))
+            v2 = bytes(bytearray([v2]))
             if (v1.isalpha() and v2.isalpha()) or (v1.isdigit() and 
v2.isdigit()):
-                res = cmp(v1, v2)
+                res = packagequery.cmp(v1, v2)
                 if res != 0:
                     return res
             else:
-                if v1 == '~' or not v1:
+                if v1 == b'~' or not v1:
                     return -1
-                elif v2 == '~' or not v2:
+                elif v2 == b'~' or not v2:
                     return 1
                 ord1 = ord(v1)
                 if not (v1.isalpha() or v1.isdigit()):
@@ -204,9 +229,9 @@
     @staticmethod
     def filename(name, epoch, version, release, arch):
         if release:
-            return '%s_%s-%s_%s.deb' % (name, version, release, arch)
+            return b'%s_%s-%s_%s.deb' % (name, version, release, arch)
         else:
-            return '%s_%s_%s.deb' % (name, version, arch)
+            return b'%s_%s_%s.deb' % (name, version, arch)
 
 if __name__ == '__main__':
     import sys
@@ -218,6 +243,6 @@
     print(debq.name(), debq.version(), debq.release(), debq.arch())
     print(debq.description())
     print('##########')
-    print('\n'.join(debq.provides()))
+    print(b'\n'.join(debq.provides()))
     print('##########')
-    print('\n'.join(debq.requires()))
+    print(b'\n'.join(debq.requires()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.164.1/osc/util/packagequery.py 
new/osc-0.164.2/osc/util/packagequery.py
--- old/osc-0.164.1/osc/util/packagequery.py    2019-01-16 14:02:23.000000000 
+0100
+++ new/osc-0.164.2/osc/util/packagequery.py    2019-02-12 09:11:43.000000000 
+0100
@@ -60,18 +60,18 @@
         f.seek(0)
         extra_tags = ()
         pkgquery = None
-        if magic[:4] == '\xed\xab\xee\xdb':
+        if magic[:4] == b'\xed\xab\xee\xdb':
             from . import rpmquery
             pkgquery = rpmquery.RpmQuery(f)
             extra_tags = extra_rpmtags
-        elif magic == '!<arch>':
+        elif magic == b'!<arch>':
             from . import debquery
             pkgquery = debquery.DebQuery(f)
             extra_tags = extra_debtags
-        elif magic[:5] == '<?xml':
+        elif magic[:5] == b'<?xml':
             f.close()
             return None
-        elif magic[:5] == '\375\067zXZ' or magic[:2] == '\037\213':
+        elif magic[:5] == b'\375\067zXZ' or magic[:2] == b'\037\213':
             from . import archquery
             pkgquery = archquery.ArchQuery(f)
         else:
@@ -159,6 +159,11 @@
             evr = epoch + ":" + evr 
         return evr 
 
+
+def cmp(a, b):
+    return (a > b) - (a < b)
+
+
 if __name__ == '__main__':
     import sys
     try:

++++++ osc.dsc ++++++
--- /var/tmp/diff_new_pack.iaWV5A/_old  2019-02-13 10:07:28.237529627 +0100
+++ /var/tmp/diff_new_pack.iaWV5A/_new  2019-02-13 10:07:28.241529626 +0100
@@ -1,8 +1,8 @@
 Format: 1.0
 Source: osc
-Version: 0.164.1
+Version: 0.164.2
 Binary: osc
 Maintainer: Adrian Schroeter <[email protected]>
 Architecture: any
 Standards-Version: 3.7.1
-Build-Depends: debhelper (>= 4.0.0), python-dev, python-urlgrabber
+Build-Depends: debhelper (>= 4.0.0), python-dev


Reply via email to