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
