Hello community,

here is the log from the commit of package osc for openSUSE:Factory checked in 
at 2020-03-05 23:23:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/osc (Old)
 and      /work/SRC/openSUSE:Factory/.osc.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "osc"

Thu Mar  5 23:23:01 2020 rev:145 rq:781771 version:0.168.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/osc/osc.changes  2020-01-07 23:56:23.960126175 
+0100
+++ /work/SRC/openSUSE:Factory/.osc.new.26092/osc.changes       2020-03-05 
23:23:21.821346599 +0100
@@ -1,0 +2,42 @@
+Thu Mar  5 08:30:46 UTC 2020 - Marco Strigl <[email protected]>
+
+- Spec:
+    * fix destination of fish completion file to 
/usr/share/fish/vendor_completions.d 
+
+-------------------------------------------------------------------
+Wed Mar  4 09:27:41 UTC 2020 - Marco Strigl <[email protected]>
+
+- 0.168.0
+  * MR creation honors orev now (bsc#1160446)
+  * allow "osc r --vertical" for projects
+  * several typo fixes
+  * cleanup old functions and remove python2.6 compat code
+  * support zstd arch linux files in local build
+  * fix deleterequest for repositories
+  * append --norootforbuild as default to build command
+  * fix decoding in interactive request mode
+  * use signdummy for product builds
+  * print release project when creating MR
+  * improve SSLError message for TLSv1 validation
+  * osc maintained --version prints the version of each maintained package
+  * print web url links after creating requests (New general bool option 
'print_web_links' must be set in oscrc)
+  * fix checkout_no_colon on project level
+  * handle empty release number of rpm packages in build.py
+  * handle bytes vs. str error when parsing meta
+  * custom exception if importing m2crypto fails
+  * fix missing oscerr import in util.helper
+  * several fixes for keyring handling
+  * fix arch zst magic in util.packagequery
+
+-------------------------------------------------------------------
+Fri Feb 28 12:27:27 UTC 2020 - Frederic Crozat <[email protected]>
+
+- Ship fish completion file.
+
+-------------------------------------------------------------------
+Tue Feb 11 16:39:17 UTC 2020 - Fabian Vogt <[email protected]>
+
+- Spec:
+    * Recommend python3-keyring when using python3
+
+-------------------------------------------------------------------

Old:
----
  debian.tar.gz
  osc-0.167.2.tar.gz

New:
----
  debian.compat
  debian.control
  debian.copyright
  debian.dirs
  debian.docs
  debian.osc.dirs
  debian.osc.install
  debian.osc.links
  debian.rules
  osc-0.168.0.tar.gz

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

Other differences:
------------------
++++++ osc.spec ++++++
--- /var/tmp/diff_new_pack.gakT2Z/_old  2020-03-05 23:23:23.993347794 +0100
+++ /var/tmp/diff_new_pack.gakT2Z/_new  2020-03-05 23:23:24.005347801 +0100
@@ -27,18 +27,21 @@
 %define use_python python
 %endif
 
-%define version_unconverted 0.167.2
+%define version_unconverted 0.168.0
 %define osc_plugin_dir %{_prefix}/lib/osc-plugins
 %define macros_file macros.osc
 
 Name:           osc
-Version:        0.167.2
+Version:        0.168.0
 Release:        0
 Summary:        Open Build Service Commander
 License:        GPL-2.0-or-later
 Group:          Development/Tools/Other
 URL:            https://github.com/openSUSE/osc
 Source:         %{name}-%{version}.tar.gz
+Source1:        debian.dirs 
+Source2:        debian.docs
+Source3:        debian.osc.links
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  %{use_python}-devel
 BuildRequires:  %{use_python}-setuptools
@@ -90,8 +93,12 @@
 %endif
 # needed for storing credentials in kwallet/gnome-keyring
 %if 0%{?suse_version} > 1000 || 0%{?mandriva_version} || 0%{?mdkversion}
+%if %{with python3}
+Recommends:     python3-keyring
+%else
 Recommends:     python-keyring
 %endif
+%endif
 %if 0%{?rhel_version} && 0%{?rhel_version} < 600
 BuildRequires:  python-elementtree
 Requires:       python-elementtree
@@ -167,6 +174,8 @@
 install -Dm0755 dist/osc.complete %{buildroot}%{_libdir}/osc/complete
 %endif
 
+install -Dm0755 osc.fish 
%{buildroot}%{_datadir}/fish/completions/vendor_completions.d/osc.fish
+
 install -m644 %{macros_file} -D %{buildroot}%{_sysconfdir}/rpm/%{macros_file}
 
 %if 0%{?suse_version} >= 1500
@@ -202,6 +211,7 @@
 %else
 %{_libdir}/osc
 %endif
+%{_datadir}/fish
 %dir %{osc_plugin_dir}
 
 %changelog

++++++ PKGBUILD ++++++
--- /var/tmp/diff_new_pack.gakT2Z/_old  2020-03-05 23:23:24.085347845 +0100
+++ /var/tmp/diff_new_pack.gakT2Z/_new  2020-03-05 23:23:24.085347845 +0100
@@ -1,19 +1,24 @@
 pkgname=osc
-pkgver=0.167.2
+pkgver=0.168.0
 pkgrel=0
 pkgdesc="Open Build Service client"
-arch=('i686' 'x86_64')
+arch=('x86_64')
 url="https://www.github.com/openSUSE/osc";
 license=('GPL-2.0+' 'GPL-2.0')
 groups=('base-devel')
-depends=('python2' 'python2-m2crypto' 'urlgrabber')
+depends=('python-m2crypto')
+makedepends=('python-setuptools')
 source=(osc-${pkgver}.tar.gz)
 md5sums=('SKIP')
 
+build() {
+  cd "${srcdir}"/osc-${pkgver}
+  python setup.py build
+}
+
 package() {
   msg "Installing osc ..."
   cd "${srcdir}"/osc-${pkgver}
-  python2 setup.py build
-  python2 setup.py install --prefix=/usr --root=${pkgdir}
+  python setup.py install --root="${pkgdir}/" --optimize=1 --prefix=/usr
   ln -s osc-wrapper.py ${pkgdir}/usr/bin/osc
 }

++++++ _service ++++++
--- /var/tmp/diff_new_pack.gakT2Z/_old  2020-03-05 23:23:24.125347867 +0100
+++ /var/tmp/diff_new_pack.gakT2Z/_new  2020-03-05 23:23:24.125347867 +0100
@@ -1,7 +1,7 @@
 <services>
   <service name="tar_scm" mode="disabled">
-    <param name="version">0.167.2</param>
-    <param name="revision">0.167.2</param>
+    <param name="version">0.168.0</param>
+    <param name="revision">0.168.0</param>
     <param name="url">git://github.com/openSUSE/osc.git</param>
     <param name="scm">git</param>
   </service>

++++++ debian.changelog ++++++
--- /var/tmp/diff_new_pack.gakT2Z/_old  2020-03-05 23:23:24.173347893 +0100
+++ /var/tmp/diff_new_pack.gakT2Z/_new  2020-03-05 23:23:24.177347896 +0100
@@ -1,7 +1,7 @@
-osc (0.167.2) unstable; urgency=low
-  - Update to 0.161.1
+osc (0.168.0) unstable; urgency=low
+  - Package for Python3
 
- -- Marco Strigl <[email protected]>  Thu, 26 Oct 2017 14:42:00 +0200
+ -- Nick Brown <[email protected]>  Wed, 30 Jan 2020 14:49:30 +0000
 
 osc (0.161.0-0) unstable; urgency=low
   - Install bash completion

++++++ debian.compat ++++++
9
++++++ debian.control ++++++
Source: osc
Priority: extra
Maintainer: Adrian Schroeter <[email protected]>, Rene Engelhard 
<[email protected]>
Build-Depends: debhelper (>= 9), dh-python, python3-all, python3-setuptools
Standards-Version: 3.7.1
Section: devel

Package: osc
Section: devel
Architecture: all
Depends: ${shlibs:Depends},
         ${misc:Depends},
         ${python3:Depends},
         python3,
         build | obs-build
Recommends: python3-progressbar,
            python3-rpm,
            python3-keyring,
            python3-m2crypto,
            bash-completion
Suggests: sudo
Description: Open Build Service Commander
  Commandline client for the Open Build Service.
++++++ debian.copyright ++++++
This package was debianized by J.H.M. Dassen (Ray) <[email protected]> on
Fri, 12 May 2006 14:12:04 +0200.

It was downloaded from www.opensuse.org

Upstream Author: Peter Poeml <[email protected]>

Copyright Holder: Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, 
Germany.

License:

# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.

osc itself is GPL, for the full text of the GPL see 
/usr/share/common-licenses/GPL

++++++ debian.dirs ++++++
usr/bin
usr/sbin
usr/share/man
++++++ debian.docs ++++++
README
TODO
++++++ debian.osc.dirs ++++++
usr/lib
usr/lib/osc
usr/include
etc/bash_completion.d
etc/profile.d
++++++ debian.osc.install ++++++
usr/lib/osc/complete
etc/profile.d/osc.csh
etc/bash_completion.d/osc.sh
++++++ debian.osc.links ++++++
usr/bin/osc-wrapper.py usr/bin/osc
++++++ debian.rules ++++++
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

export PYBUILD_NAME=osc

%:
        dh $@ --with python3 --buildsystem=pybuild

override_dh_auto_install:
        dh_auto_install
        install -Dm0644 dist/complete.csh debian/tmp/etc/profile.d/osc.csh
        install -Dm0644 dist/complete.sh debian/tmp/etc/bash_completion.d/osc.sh
        install -Dm0755 dist/osc.complete debian/tmp/usr/lib/osc/complete
++++++ osc-0.167.2.tar.gz -> osc-0.168.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/NEWS new/osc-0.168.0/NEWS
--- old/osc-0.167.2/NEWS        2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/NEWS        2020-03-04 10:21:17.000000000 +0100
@@ -1,3 +1,25 @@
+0.168.0
+  - MR creation honors orev now (bsc#1160446)
+  - allow "osc r --vertical" for projects
+  - several typo fixes
+  - cleanup old functions and remove python2.6 compat code
+  - support zstd arch linux files in local build
+  - fix deleterequest for repositories
+  - append --norootforbuild as default to build command
+  - fix decoding in interactive request mode
+  - use signdummy for product builds
+  - print release project when creating MR
+  - improve SSLError message for TLSv1 validation
+  - osc maintained --version prints the version of each maintained package
+  - print web url links after creating requests (New general bool option 
'print_web_links' must be set in oscrc)
+  - fix checkout_no_colon on project level
+  - handle empty release number of rpm packages in build.py
+  - handle bytes vs. str error when parsing meta
+  - custom exception if importing m2crypto fails
+  - fix missing oscerr import in util.helper
+  - several fixes for keyring handling
+  - fix arch zst magic in util.packagequery
+
 0.167.2
   - fix regression in osc chroot
   - fix broken importsrcpkg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/OscConfigParser.py 
new/osc-0.168.0/osc/OscConfigParser.py
--- old/osc-0.167.2/osc/OscConfigParser.py      2020-01-07 11:29:52.000000000 
+0100
+++ new/osc-0.168.0/osc/OscConfigParser.py      2020-03-04 10:21:17.000000000 
+0100
@@ -19,9 +19,11 @@
 
 if sys.version_info >= ( 3, ):
     import configparser
+    ConfigParser = configparser.ConfigParser
 else:
     #python 2.x
     import ConfigParser as configparser
+    ConfigParser = configparser.SafeConfigParser
 
 import re
 
@@ -188,7 +190,7 @@
         self.format(line)
 
     def format(self, line):
-        mo = configparser.ConfigParser.OPTCRE.match(line.strip())
+        mo = ConfigParser.OPTCRE.match(line.strip())
         key, val = mo.group('option', 'value')
         self.frmt = line.replace(key.strip(), '%s', 1)
         pos = val.find(' ;')
@@ -201,7 +203,7 @@
         return self.value
 
 
-class OscConfigParser(configparser.SafeConfigParser):
+class OscConfigParser(ConfigParser):
     """
     OscConfigParser() behaves like a normal ConfigParser() object. The
     only differences is that it preserves the order+format of configuration 
entries
@@ -210,7 +212,7 @@
     class.
     """
     def __init__(self, defaults={}):
-        configparser.SafeConfigParser.__init__(self, defaults)
+        ConfigParser.__init__(self, defaults)
         self._sections = ConfigLineOrder()
 
     # XXX: unfortunately we have to override the _read() method from the 
ConfigParser()
@@ -319,7 +321,7 @@
             fp.write(str(self))
             fp.write('\n')
         else:
-            configparser.SafeConfigParser.write(self, fp)
+            ConfigParser.write(self, fp)
 
     def has_option(self, section, option, proper=False, **kwargs):
         """
@@ -329,7 +331,7 @@
         """
         if proper:
             return self.optionxform(option) in self._sections[section].keys()
-        return configparser.SafeConfigParser.has_option(self, section, option, 
**kwargs)
+        return ConfigParser.has_option(self, section, option, **kwargs)
 
     # XXX: simplify!
     def __str__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/babysitter.py 
new/osc-0.168.0/osc/babysitter.py
--- old/osc-0.167.2/osc/babysitter.py   2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/babysitter.py   2020-03-04 10:21:17.000000000 +0100
@@ -22,8 +22,10 @@
     from M2Crypto.SSL.Checker import SSLVerificationError
     from M2Crypto.SSL import SSLError as SSLError
 except:
-    SSLError = None
-    SSLVerificationError = None
+    class SSLError(Exception):
+        pass
+    class SSLVerificationError(Exception):
+        pass
 
 try:
     # import as RPMError because the class "error" is too generic
@@ -172,6 +174,8 @@
     except RPMError as e:
         print(e, file=sys.stderr)
     except SSLError as e:
+        if 'tlsv1' in str(e):
+            print('The python on this system does not support TLSv1.2', 
file=sys.stderr)
         print("SSL Error:", e, file=sys.stderr)
     except SSLVerificationError as e:
         print("Certificate Verification Error:", e, file=sys.stderr)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/build.py new/osc-0.168.0/osc/build.py
--- old/osc-0.167.2/osc/build.py        2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/build.py        2020-03-04 10:21:17.000000000 +0100
@@ -240,7 +240,7 @@
         elif pacsuffix == 'arch':
             canonname = archquery.ArchQuery.filename(self.mp['name'].encode(), 
epoch, self.mp['version'].encode(), release, self.mp['arch'].encode())
         else:
-            canonname = rpmquery.RpmQuery.filename(self.mp['name'].encode(), 
epoch, self.mp['version'].encode(), release, self.mp['arch'].encode())
+            canonname = rpmquery.RpmQuery.filename(self.mp['name'].encode(), 
epoch, self.mp['version'].encode(), release or b'0', self.mp['arch'].encode())
 
         self.mp['canonname'] = decode_it(canonname)
         # maybe we should rename filename key to binary
@@ -424,7 +424,7 @@
     if type == 'dsc' or type == 'collax' or type == 'livebuild':
         suffix = '*.deb'
     elif type == 'arch':
-        suffix = '*.pkg.tar.xz'
+        suffix = '*.pkg.tar.*'
 
     for dir in dirs:
         # check for repodata
@@ -537,7 +537,7 @@
                             % {'repo': repo, 'arch': arch, 'project': prj, 
'package': pac, 'apihost': apihost}
     return buildroot
 
-def run_build(*args):
+def run_build(opts, *args):
     cmd = [config['build-cmd']]
     cmd += args
 
@@ -548,6 +548,8 @@
         cmd = sucmd + ['-s', cmd[0], 'root', '--'] + cmd[1:]
     else:
         cmd = sucmd + cmd
+    if not opts.userootforbuild:
+        cmd.append('--norootforbuild')
     return run_external(cmd[0], *cmd[1:])
 
 def main(apiurl, opts, argv):
@@ -1120,12 +1122,16 @@
         root = tree.getroot()
 
         # product
+        if root.find('instsource'):
+            # leads to unsigned media, but avoids build failure
+            buildargs.append('--signdummy')
+
         for xml in root.findall('instsource'):
             found_obsrepositories = 0
             for node in xml.findall('instrepo'):
                 if node and node.find('source').get('path') == 
'obsrepositories:/':
-                   found_obsrepositories = found_obsrepositories + 1
                    for path in bi.pathes:
+                       found_obsrepositories += 1
                        new_node = ET.SubElement(xml, 'instrepo')
                        new_node.set('name', node.get('name') + "_" + 
str(found_obsrepositories))
                        new_node.set('priority', node.get('priority'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/commandline.py 
new/osc-0.168.0/osc/commandline.py
--- old/osc-0.167.2/osc/commandline.py  2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/commandline.py  2020-03-04 10:21:17.000000000 +0100
@@ -1460,7 +1460,15 @@
                                        dst_project, dst_package,
                                        opts.message, orev=rev,
                                       src_update=src_update, 
dst_updatelink=opts.update_link)
+
         print('created request id', result)
+        if conf.config['print_web_links']:
+            root = ET.fromstring(b''.join(show_configuration(apiurl)))
+            node = root.find('obs_url')
+            if node is None or not node.text:
+                raise oscerr.APIError('obs_url configuration element expected')
+            obs_url = node.text
+            print('%s/request/show/%s' % (obs_url, result))
 
         if supersede_existing:
             for req in reqs:
@@ -2006,7 +2014,7 @@
         else:
             raise oscerr.WrongArgs('Please specify at least a project.')
 
-        if not opts.all and package is None:
+        if not opts.all and package is None and not opts.repository:
             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:
@@ -2191,7 +2199,7 @@
 
             osc request accept [-m TEXT] ID
             osc request approve [-m TEXT] ID
-            osc request cancelapprove [-m TEXT] ID
+            osc request cancelapproval [-m TEXT] ID
             osc request decline [-m TEXT] ID
             osc request revoke [-m TEXT] ID
             osc request reopen [-m TEXT] ID
@@ -3283,7 +3291,10 @@
             target_project = project.get('name')
             if opts.incident:
                 target_project += ":" + opts.incident
-            print('Using target project \'%s\'' % target_project)
+            release_in = ''
+            if release_project is not None:
+                release_in = '. (release in \'%s\')' % release_project
+            print('Using target project \'%s\'%s' % (target_project, 
release_in))
 
         if not opts.message:
             opts.message = edit_message()
@@ -3324,6 +3335,8 @@
     @cmdln.option('--nodevelproject', action='store_true',
                         help='do not follow a defined devel project ' \
                              '(primary project where a package is developed)')
+    @cmdln.option('--version', action='store_true',
+                        help='print version of maintained package')
     @cmdln.alias('sm')
     @cmdln.alias('maintained')
     def do_mbranch(self, subcmd, opts, *args):
@@ -3381,6 +3394,12 @@
         if opts.dryrun:
             for r in result.findall('package'):
                 line="%s/%s"%(r.get('project'), r.get('package'))
+                if opts.version:
+                    sr = get_source_rev(apiurl, r.get('project'), 
r.get('package'))
+                    version = sr.get('version')
+                    if not version or version == 'unknown':
+                        version = 'unknown'
+                    line = line + (' (version: %s)' % version)
                 for d in r.findall('devel'):
                    line+=" using sources from %s/%s"%(d.get('project'), 
d.get('package'))
                 print(line)
@@ -4505,6 +4524,8 @@
 
         elif project:
             prj_dir = opts.output_dir if opts.output_dir else project
+            if not opts.output_dir and conf.config['checkout_no_colon']:
+                prj_dir = prj_dir.replace(':', '/')
             if sys.platform[:3] == 'win':
                 prj_dir = prj_dir.replace(':', ';')
             if os.path.exists(prj_dir):
@@ -5248,6 +5269,8 @@
                         help='Disable results for all direct affect packages 
inside of the project')
     @cmdln.option('-M', '--multibuild-package', action='append', default=[],
                         help='Only show results for the specified multibuild 
package')
+    @cmdln.option('-V', '--vertical', action='store_true',
+                        help='list packages vertically instead horizontally 
for entire project')
     @cmdln.option('-w', '--watch', action='store_true',
                         help='watch the results until all finished building')
     @cmdln.option('', '--xml', action='store_true', default=False,
@@ -5292,7 +5315,6 @@
             opts.hide_legend = None
             opts.name_filter = None
             opts.status_filter = None
-            opts.vertical = None
             opts.show_non_building = None
             opts.show_excluded = None
             return self.do_prjresults('prjresults', opts, *args)
@@ -6470,7 +6492,7 @@
             build_args = ['--root=' + build_root, '--noinit', '--shell']
             if opts.wipe:
                 build_args.append('--wipe')
-            sys.exit(osc.build.run_build(*build_args))
+            sys.exit(osc.build.run_build(opts, *build_args))
         elif subcmd in ('shell', 'chroot') or opts.shell:
             print('--shell in combination with build-type %s is experimental.' 
% vm_chroot)
             print('The semantics may change at any time!')
@@ -7878,6 +7900,8 @@
             title = opts.title
         if opts.name:
             pac = opts.name
+        elif pac is not None:
+            pac = pac.decode()
         if opts.description:
             descr = opts.description
 
@@ -7886,7 +7910,6 @@
             print('please specify a package name with the \'--name\' option. ' 
\
                                 'The automatic detection failed', 
file=sys.stderr)
             sys.exit(1)
-        pac = pac.decode()
         if conf.config['do_package_tracking']:
             createPackageDir(os.path.join(project.dir, pac), project)
         else:
@@ -7899,7 +7922,7 @@
                                        'name': pac,
                                        'user': user}), apiurl=apiurl)
                 if data:
-                    data = ET.fromstring(''.join(data))
+                    data = ET.fromstring(parse_meta_to_string(data))
                     data.find('title').text = ''.join(title)
                     data.find('description').text = ''.join(descr)
                     data.find('url').text = url
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/conf.py new/osc-0.168.0/osc/conf.py
--- old/osc-0.167.2/osc/conf.py 2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/conf.py 2020-03-04 10:21:17.000000000 +0100
@@ -151,6 +151,8 @@
             'exclude_glob': '.osc CVS .svn .* _linkerror *~ #*# *.orig *.bak 
*.changes.vctmp.*',
             # whether to keep passwords in plaintext (deprecated (see creds 
manager)).
             'plaintext_passwd': '0',
+            # whether to print Web UI links to directly insert in browser 
(where possible)
+            'print_web_links': '0',
             # limit the age of requests shown with 'osc req list'.
             # this is a default only, can be overridden by 'osc req list -D 
NNN'
             # Use 0 for unlimted.
@@ -198,7 +200,7 @@
     'checkout_no_colon', 'checkout_rooted', 'check_for_request_on_action', 
'linkcontrol', 'show_download_progress', 'request_show_interactive',
     'request_show_source_buildstatus', 'review_inherit_group', 'use_keyring', 
'gnome_keyring', 'no_verify', 'builtin_signature_check',
     'http_full_debug', 'include_request_from_project', 'local_service_run', 
'buildlog_strip_time', 'no_preinstallimage',
-    'status_mtime_heuristic']
+    'status_mtime_heuristic', 'print_web_links']
 integer_opts = ['build-jobs']
 
 api_host_options = ['user', 'pass', 'passx', 'aliases', 'http_headers', 
'realname', 'email', 'sslcertck', 'cafile', 'capath', 'trusted_prj']
@@ -591,14 +593,6 @@
         HTTPConnection.send = filterhdrs(HTTPConnection.send, True, 'Cookie', 
'Authorization')
         HTTPResponse.begin = filterhdrs(HTTPResponse.begin, False, 'header: 
Set-Cookie.*\n')
 
-    if sys.version_info < (2, 6):
-        # HTTPS proxy is not supported in old urllib2. It only leads to an 
error
-        # or, at best, a warning.
-        if 'https_proxy' in os.environ:
-            del os.environ['https_proxy']
-        if 'HTTPS_PROXY' in os.environ:
-            del os.environ['HTTPS_PROXY']
-
     if config['http_debug']:
         # brute force
         def urllib2_debug_init(self, debuglevel=0):
@@ -1024,7 +1018,7 @@
 
 def select_credentials_manager_descr():
     if not credentials.has_keyring_support():
-        print('To use keyrings please install python-keyring.')
+        print('To use keyrings please install python%d-keyring.' % 
sys.version_info.major)
     creds_mgr_descriptors = credentials.get_credentials_manager_descriptors()
     for i, creds_mgr_descr in enumerate(creds_mgr_descriptors, 1):
         print('%d) %s (%s)' % (i, creds_mgr_descr.name(), 
creds_mgr_descr.description()))#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/core.py new/osc-0.168.0/osc/core.py
--- old/osc-0.167.2/osc/core.py 2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/core.py 2020-03-04 10:21:17.000000000 +0100
@@ -5,7 +5,7 @@
 
 from __future__ import print_function
 
-__version__ = '0.167.2'
+__version__ = '0.168.0'
 
 # __store_version__ is to be incremented when the format of the working copy
 # "store" changes in an incompatible way. Please add any needed migration
@@ -3808,6 +3808,19 @@
 
     return makeurl(apiurl, [path], query)
 
+def parse_meta_to_string(data):
+    """
+    Converts the output of meta_exists into a string value
+    """
+    # data can be a bytes object, a list with strings, a list with bytes, just 
a string.
+    # So we need the following even if it is ugly.
+    if sys.version_info >= (3, 0):
+        if isinstance(data, bytes):
+            data = decode_it(data)
+        elif isinstance(data, list):
+            data = decode_list(data)
+    return ''.join(data)
+
 
 def edit_meta(metatype,
               path_args=None,
@@ -3837,19 +3850,7 @@
     if metatype == 'pkg':
         # check if the package is a link to a different project
         project, package = path_args
-        # data can be a bytes object, a list with strings, a list with bytes, 
just a string.
-        # So we need the following even if it is ugly.
-        if sys.version_info >= (3, 0):
-            if isinstance(data, bytes):
-                data = decode_it(data)
-                orgprj = ET.fromstring(''.join(data)).get('project')
-            elif isinstance(data, list):
-                decode_data = decode_list(data)
-                orgprj = ET.fromstring(''.join(decode_data)).get('project')
-            else:
-                orgprj = ET.fromstring(''.join(data)).get('project')
-        else:
-            orgprj = ET.fromstring(''.join(data)).get('project')
+        orgprj = ET.fromstring(parse_meta_to_string(data)).get('project')
 
         if orgprj is not None and unquote(project) != orgprj:
             print('The package is linked from a different project.')
@@ -4186,12 +4187,12 @@
     return r
 
 # create a maintenance incident per request
-def create_maintenance_request(apiurl, src_project, src_packages, tgt_project, 
tgt_releaseproject, opt_sourceupdate, message='', enforce_branching=False):
+def create_maintenance_request(apiurl, src_project, src_packages, tgt_project, 
tgt_releaseproject, opt_sourceupdate, message='', enforce_branching=False, 
rev=None):
     import cgi
     r = Request()
     if src_packages:
         for p in src_packages:
-            r.add_action('maintenance_incident', src_project=src_project, 
src_package=p, tgt_project=tgt_project, tgt_releaseproject=tgt_releaseproject, 
opt_sourceupdate = opt_sourceupdate)
+            r.add_action('maintenance_incident', src_project=src_project, 
src_package=p, src_rev=rev, tgt_project=tgt_project, 
tgt_releaseproject=tgt_releaseproject, opt_sourceupdate = opt_sourceupdate)
     else:
         r.add_action('maintenance_incident', src_project=src_project, 
tgt_project=tgt_project, tgt_releaseproject=tgt_releaseproject, 
opt_sourceupdate = opt_sourceupdate)
     # XXX: clarify why we need the unicode(...) stuff
@@ -4271,7 +4272,7 @@
             if project is None:
                 raise oscerr.APIError("Server did not define a default 
maintenance project, can't submit.")
             tproject = project.get('name')
-            r = create_maintenance_request(apiurl, src_project, [src_package], 
tproject, dst_project, src_update, message)
+            r = create_maintenance_request(apiurl, src_project, [src_package], 
tproject, dst_project, src_update, message, rev=orev)
             r = r.reqid
         else:
             raise
@@ -4706,18 +4707,6 @@
     if target_filename.endswith('.AppImage'):
         os.chmod(target_filename, 0o755)
 
-def dgst_from_string(str):
-    # Python 2.5 depracates the md5 modules
-    # Python 2.4 doesn't have hashlib yet
-    try:
-        import hashlib
-        md5_hash = hashlib.md5()
-    except ImportError:
-        import md5
-        md5_hash = md5.new()
-    md5_hash.update(str)
-    return md5_hash.hexdigest()
-
 def dgst(file):
 
     #if not os.path.exists(file):
@@ -5146,7 +5135,7 @@
                                path_args=(quote_plus(dst_project), 
quote_plus(dst_package)),
                                template_args=None,
                                create_new=False, apiurl=apiurl)
-        root = ET.fromstring(b''.join(dst_meta))
+        root = ET.fromstring(parse_meta_to_string(dst_meta))
         if root.get('project') != dst_project:
             # The source comes from a different project via a project link, we 
need to create this instance
             meta_change = True
@@ -5241,7 +5230,7 @@
                                path_args=(quote_plus(dst_project), 
quote_plus(dst_package)),
                                template_args=None,
                                create_new=False, apiurl=apiurl)
-        root = ET.fromstring(b''.join(dst_meta))
+        root = ET.fromstring(parse_meta_to_string(dst_meta))
         if root.get('project') != dst_project:
             # The source comes from a different project via a project link, we 
need to create this instance
             meta_change = True
@@ -6959,7 +6948,7 @@
                        create_new=False)
 
     if data and get_user_meta(apiurl, user) != None:
-        root = ET.fromstring(b''.join(data))
+        root = ET.fromstring(parse_meta_to_string(data))
         found = False
         for person in root.getiterator('person'):
             if person.get('userid') == user and person.get('role') == role:
@@ -6992,7 +6981,7 @@
                        template_args=None,
                        create_new=False)
     if data and get_user_meta(apiurl, user) != None:
-        root = ET.fromstring(''.join(data))
+        root = ET.fromstring(parse_meta_to_string(data))
         found = False
         for person in root.getiterator('person'):
             if person.get('userid') == user and person.get('role') == role:
@@ -7023,7 +7012,7 @@
         group=user.replace('group:', '')
         user=None
     if data:
-        root = ET.fromstring(b''.join(data))
+        root = ET.fromstring(parse_meta_to_string(data))
         for group_element in root.getiterator('group'):
             if  group_element.get('role') == "bugowner":
                 root.remove(group_element)
@@ -7049,7 +7038,7 @@
                        create_new=False)
 
     if data and show_project_meta(apiurl, dprj) != None:
-        root = ET.fromstring(''.join(data))
+        root = ET.fromstring(parse_meta_to_string(data))
         if not root.find('devel') != None:
             ET.SubElement(root, 'devel')
         elem = root.find('devel')
@@ -7540,7 +7529,7 @@
                 if tmpfile is not None:
                     tmpfile.seek(0)
                     # the read bytes probably have a moderate size so the str 
won't be too large
-                    footer += '\n\n' + tmpfile.read()
+                    footer += '\n\n' + decode_it(tmpfile.read())
                 if msg is None:
                     try:
                         msg = edit_message(footer = footer, 
template=msg_template)
@@ -7913,7 +7902,7 @@
         if missing_tags:
             user = conf.get_apiurl_usr(apiurl)
             data = get_user_data(apiurl, user, *missing_tags)
-            if data is not None:
+            if data:
                 for tag in missing_tags:
                     val = data.pop(0)
                     if val != '-':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/credentials.py 
new/osc-0.168.0/osc/credentials.py
--- old/osc-0.167.2/osc/credentials.py  2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/credentials.py  2020-03-04 10:21:17.000000000 +0100
@@ -199,7 +199,10 @@
         self._keyring_backend = keyring_backend
 
     def name(self):
-        return self._keyring_backend.name
+        if hasattr(self._keyring_backend, 'name'):
+            return self._keyring_backend.name
+        else:
+            return self._keyring_backend.__class__.__name__
 
     def description(self):
         return 'Backend provided by python-keyring'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/fetch.py new/osc-0.168.0/osc/fetch.py
--- old/osc-0.167.2/osc/fetch.py        2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/fetch.py        2020-03-04 10:21:17.000000000 +0100
@@ -82,9 +82,9 @@
                         raise oscerr.APIError('CPIO archive is incomplete '
                                               '(see .errors file)')
                     if package == '_repository':
-                        n = re.sub(b'\.pkg\.tar\..z$', b'.arch', hdr.filename)
+                        n = re.sub(b'\.pkg\.tar\.(zst|.z)$', b'.arch', 
hdr.filename)
                         if n.startswith(b'container:'):
-                            n = re.sub(b'\.tar\..z$', b'.tar', hdr.filename)
+                            n = re.sub(b'\.tar\.(zst|.z)$', b'.tar', 
hdr.filename)
                             pac = pkgs[decode_it(n.rsplit(b'.', 1)[0])]
                             pac.canonname = hdr.filename
                         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/util/helper.py 
new/osc-0.168.0/osc/util/helper.py
--- old/osc-0.167.2/osc/util/helper.py  2020-01-07 11:29:52.000000000 +0100
+++ new/osc-0.168.0/osc/util/helper.py  2020-03-04 10:21:17.000000000 +0100
@@ -3,6 +3,7 @@
 # and distributed under the terms of the GNU General Public Licence,
 # either version 2, or (at your option) any later version.
 
+from osc import oscerr
 
 def cmp_to_key(mycmp):
     """ Converts a cmp= function into a key= function.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.167.2/osc/util/packagequery.py 
new/osc-0.168.0/osc/util/packagequery.py
--- old/osc-0.167.2/osc/util/packagequery.py    2020-01-07 11:29:52.000000000 
+0100
+++ new/osc-0.168.0/osc/util/packagequery.py    2020-03-04 10:21:17.000000000 
+0100
@@ -72,7 +72,8 @@
         elif magic[:5] == b'<?xml':
             f.close()
             return None
-        elif magic[:5] == b'\375\067zXZ' or magic[:2] == b'\037\213':
+        # arch tar ball compressed with gz, xz or zst
+        elif magic[:5] == b'\375\067zXZ' or magic[:2] == b'\037\213' or 
magic[:4] == b'(\xb5/\xfd':
             from . import archquery
             pkgquery = archquery.ArchQuery(f)
         else:

++++++ osc.dsc ++++++
--- /var/tmp/diff_new_pack.gakT2Z/_old  2020-03-05 23:23:24.577348115 +0100
+++ /var/tmp/diff_new_pack.gakT2Z/_new  2020-03-05 23:23:24.577348115 +0100
@@ -1,8 +1,8 @@
 Format: 1.0
 Source: osc
-Version: 0.167.2
+Version: 0.168.0
 Binary: osc
 Maintainer: Adrian Schroeter <[email protected]>
 Architecture: any
 Standards-Version: 3.7.1
-Build-Depends: debhelper (>= 4.0.0), python-dev, python-setuptools
+Build-Depends: debhelper (>= 9), dh-python, python3-all, python3-setuptools


Reply via email to