Hello community,

here is the log from the commit of package osc for openSUSE:Factory checked in 
at 2017-10-27 14:01:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/osc (Old)
 and      /work/SRC/openSUSE:Factory/.osc.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "osc"

Fri Oct 27 14:01:05 2017 rev:123 rq:536884 version:0.161.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/osc/osc.changes  2017-10-05 12:04:53.265085781 
+0200
+++ /work/SRC/openSUSE:Factory/.osc.new/osc.changes     2017-10-27 
14:01:05.956920718 +0200
@@ -1,0 +2,18 @@
+Thu Oct 26 12:41:25 UTC 2017 - [email protected]
+
+- 0.161.1
+  - Fix python 2.6 SyntaxError (multiple context expressions) 
+
+-------------------------------------------------------------------
+Thu Oct 26 11:39:49 UTC 2017 - [email protected]
+
+- 0.161
+  - show lintlogs in interactive request review mode
+  - fix potential shell injections
+  - allow multiple --repo and --arch options in prjresults
+  - cleanup babysitter.by
+  - supersede existing requests if --yes is passed to osc sr
+  - prepend request summary to diff in interactive mode
+  - show issues(bugs) in interactive diff mode
+
+-------------------------------------------------------------------
@@ -5 +23 @@
-  without manually installint them. [bnc#1061500] 
+  without manually installing them. [bnc#1061500] 

Old:
----
  osc-0.160.0.tar.gz

New:
----
  osc-0.161.1.tar.gz

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

Other differences:
------------------
++++++ osc.spec ++++++
--- /var/tmp/diff_new_pack.UQbSqf/_old  2017-10-27 14:01:07.324856773 +0200
+++ /var/tmp/diff_new_pack.UQbSqf/_new  2017-10-27 14:01:07.328856586 +0200
@@ -16,12 +16,12 @@
 #
 
 
-%define version_unconverted 0.160.0
+%define version_unconverted 0.161.1
 %define osc_plugin_dir %{_prefix}/lib/osc-plugins
 %define macros_file macros.osc
 
 Name:           osc
-Version:        0.160.0
+Version:        0.161.1
 Release:        0
 Summary:        Open Build Service Commander
 License:        GPL-2.0+

++++++ PKGBUILD ++++++
--- /var/tmp/diff_new_pack.UQbSqf/_old  2017-10-27 14:01:07.356855277 +0200
+++ /var/tmp/diff_new_pack.UQbSqf/_new  2017-10-27 14:01:07.356855277 +0200
@@ -1,5 +1,5 @@
 pkgname=osc
-pkgver=0.160.0
+pkgver=0.161.1
 pkgrel=0
 pkgdesc="Open Build Service client"
 arch=('i686' 'x86_64')

++++++ _service ++++++
--- /var/tmp/diff_new_pack.UQbSqf/_old  2017-10-27 14:01:07.376854342 +0200
+++ /var/tmp/diff_new_pack.UQbSqf/_new  2017-10-27 14:01:07.380854155 +0200
@@ -1,7 +1,7 @@
 <services>
   <service name="tar_scm" mode="disabled">
-    <param name="version">0.160.0</param>
-    <param name="revision">0.160.0</param>
+    <param name="version">0.161.1</param>
+    <param name="revision">0.161.1</param>
     <param name="url">git://github.com/openSUSE/osc.git</param>
     <param name="scm">git</param>
   </service>

++++++ debian.changelog ++++++
--- /var/tmp/diff_new_pack.UQbSqf/_old  2017-10-27 14:01:07.416852472 +0200
+++ /var/tmp/diff_new_pack.UQbSqf/_new  2017-10-27 14:01:07.416852472 +0200
@@ -1,4 +1,4 @@
-osc (0.160.0-0) unstable; urgency=low
+osc (0.161.1-0) unstable; urgency=low
   - Install bash completion
 
  -- Nick Brown <[email protected]>  Wed, 26 Oct 2016 10:00:00 +0200

++++++ osc-0.160.0.tar.gz -> osc-0.161.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.160.0/NEWS new/osc-0.161.1/NEWS
--- old/osc-0.160.0/NEWS        2017-09-22 09:06:18.000000000 +0200
+++ new/osc-0.161.1/NEWS        2017-10-26 14:21:33.000000000 +0200
@@ -1,3 +1,15 @@
+0.161.1
+  - Fix python 2.6 SyntaxError (multiple context expressions)
+
+0.161
+  - show lintlogs in interactive request review mode
+  - fix potential shell injections
+  - allow multiple --repo and --arch options in prjresults
+  - cleanup babysitter.by
+  - supersede existing requests if --yes is passed to osc sr
+  - prepend request summary to diff in interactive mode
+  - show issues(bugs) in interactive diff mode
+
 0.160
   - support fissile build type
   - Container support for the package cache
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.160.0/osc/babysitter.py 
new/osc-0.161.1/osc/babysitter.py
--- old/osc-0.160.0/osc/babysitter.py   2017-09-22 09:06:18.000000000 +0200
+++ new/osc-0.161.1/osc/babysitter.py   2017-10-26 14:21:33.000000000 +0200
@@ -75,23 +75,18 @@
             raise
     except oscerr.SignalInterrupt:
         print('killed!', file=sys.stderr)
-        return 1
     except KeyboardInterrupt:
         print('interrupted!', file=sys.stderr)
         return 130
     except oscerr.UserAbort:
         print('aborted.', file=sys.stderr)
-        return 1
     except oscerr.APIError as e:
         print('BuildService API error:', e.msg, file=sys.stderr)
-        return 1
     except oscerr.LinkExpandError as e:
         print('Link "%s/%s" cannot be expanded:\n' % (e.prj, e.pac), e.msg, 
file=sys.stderr)
         print('Use "osc repairlink" to fix merge conflicts.\n', 
file=sys.stderr)
-        return 1
     except oscerr.WorkingCopyWrongVersion as e:
         print(e, file=sys.stderr)
-        return 1
     except oscerr.NoWorkingCopy as e:
         print(e, file=sys.stderr)
         if os.path.isdir('.git'):
@@ -102,7 +97,6 @@
             print("Current directory looks like svn.", file=sys.stderr)
         if os.path.isdir('CVS'):
             print("Current directory looks like cvs.", file=sys.stderr)
-        return 1
     except HTTPError as e:
         print('Server returned an error:', e, file=sys.stderr)
         if hasattr(e, 'osc_msg'):
@@ -131,83 +125,63 @@
                 if h != 'Set-Cookie':
                     print("%s: %s" % (h, v))
 
-        return 1
     except BadStatusLine as e:
         print('Server returned an invalid response:', e, file=sys.stderr)
         print(e.line, file=sys.stderr)
-        return 1
     except HTTPException as e:
         print(e, file=sys.stderr)
-        return 1
     except URLError as e:
         print('Failed to reach a server:\n', e.reason, file=sys.stderr)
-        return 1
     except URLGrabError as e:
         print('Failed to grab %s: %s' % (e.url, e.strerror), file=sys.stderr)
-        return 1
     except IOError as e:
         # ignore broken pipe
         if e.errno != errno.EPIPE:
             raise
-        return 1
     except OSError as e:
         if e.errno != errno.ENOENT:
             raise
         print(e, file=sys.stderr)
-        return 1
     except (oscerr.ConfigError, oscerr.NoConfigfile) as e:
         print(e.msg, file=sys.stderr)
-        return 1
     except oscerr.OscIOError as e:
         print(e.msg, file=sys.stderr)
         if getattr(prg.options, 'debug', None) or \
            getattr(prg.conf, 'config', {}).get('debug', None):
             print(e.e, file=sys.stderr)
-        return 1
     except (oscerr.WrongOptions, oscerr.WrongArgs) as e:
         print(e, file=sys.stderr)
         return 2
     except oscerr.ExtRuntimeError as e:
         print(e.file + ':', e.msg, file=sys.stderr)
-        return 1
     except oscerr.ServiceRuntimeError as e:
         print(e.msg, file=sys.stderr)
     except oscerr.WorkingCopyOutdated as e:
         print(e, file=sys.stderr)
-        return 1
     except (oscerr.PackageExists, oscerr.PackageMissing, 
oscerr.WorkingCopyInconsistent) as e:
         print(e.msg, file=sys.stderr)
-        return 1
     except oscerr.PackageInternalError as e:
         print('a package internal error occured\n' \
             'please file a bug and attach your current package working copy ' \
             'and the following traceback to it:', file=sys.stderr)
         print(e.msg, file=sys.stderr)
         traceback.print_exc(file=sys.stderr)
-        return 1
     except oscerr.PackageError as e:
         print(e.msg, file=sys.stderr)
-        return 1
     except PackageError as e:
         print('%s:' % e.fname, e.msg, file=sys.stderr)
-        return 1
     except RPMError as e:
         print(e, file=sys.stderr)
-        return 1
     except SSLError as e:
         print("SSL Error:", e, file=sys.stderr)
-        return 1
     except SSLVerificationError as e:
         print("Certificate Verification Error:", e, file=sys.stderr)
-        return 1
     except NoSecureSSLError as e:
         print(e, file=sys.stderr)
-        return 1
     except CpioError as e:
         print(e, file=sys.stderr)
-        return 1
     except oscerr.OscBaseError as e:
         print('*** Error:', e, file=sys.stderr)
-        return 1
+    return 1
 
 # vim: sw=4 et
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.160.0/osc/build.py new/osc-0.161.1/osc/build.py
--- old/osc-0.160.0/osc/build.py        2017-09-22 09:06:18.000000000 +0200
+++ new/osc-0.161.1/osc/build.py        2017-10-26 14:21:33.000000000 +0200
@@ -21,7 +21,7 @@
 from tempfile import NamedTemporaryFile, mkdtemp
 from osc.fetch import *
 from osc.core import get_buildinfo, store_read_apiurl, store_read_project, 
store_read_package, meta_exists, quote_plus, get_buildconfig, is_package_dir, 
dgst
-from osc.core import get_binarylist, get_binary_file, run_external, raw_input
+from osc.core import get_binarylist, get_binary_file, run_external, 
return_external, raw_input
 from osc.util import rpmquery, debquery, archquery
 import osc.conf
 from . import oscerr
@@ -90,7 +90,7 @@
 class Buildinfo:
     """represent the contents of a buildinfo file"""
 
-    def __init__(self, filename, apiurl, buildtype = 'spec', localpkgs = []):
+    def __init__(self, filename, apiurl, buildtype = 'spec', localpkgs = [], 
binarytype = 'rpm'):
         try:
             tree = ET.parse(filename)
         except:
@@ -117,12 +117,13 @@
             raise URLError('invalid protocol for the apiurl: \'%s\'' % apiurl)
 
         self.buildtype = buildtype
+        self.binarytype = binarytype
         self.apiurl = apiurl
 
         # are we building .rpm or .deb?
         # XXX: shouldn't we deliver the type via the buildinfo?
         self.pacsuffix = 'rpm'
-        if self.buildtype == 'dsc' or self.buildtype == 'collax':
+        if self.buildtype == 'dsc' or self.buildtype == 'collax' or 
self.binarytype == 'deb':
             self.pacsuffix = 'deb'
         if self.buildtype == 'arch':
             self.pacsuffix = 'arch'
@@ -811,7 +812,15 @@
         else:
             raise
 
-    bi = Buildinfo(bi_filename, apiurl, build_type, list(prefer_pkgs.keys()))
+    # Set default binary type if cannot be detected
+    binary_type = 'rpm'
+    if os.path.exists('/usr/lib/build/queryconfig'):
+        binary_type = return_external('/usr/lib/build/queryconfig', '--dist', 
bc_filename, 'binarytype').decode('utf-8').strip()
+    # If binary type is set to a useless value, reset to 'rpm'
+    if binary_type == 'UNDEFINED':
+        binary_type = 'rpm'
+
+    bi = Buildinfo(bi_filename, apiurl, build_type, list(prefer_pkgs.keys()), 
binary_type)
 
     if bi.debuginfo and not (opts.disable_debuginfo or '--debug' in buildargs):
         buildargs.append('--debug')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.160.0/osc/commandline.py 
new/osc-0.161.1/osc/commandline.py
--- old/osc-0.160.0/osc/commandline.py  2017-09-22 09:06:18.000000000 +0200
+++ new/osc-0.161.1/osc/commandline.py  2017-10-26 14:21:33.000000000 +0200
@@ -1359,17 +1359,19 @@
             return
         supersede_existing = False
         reqs = []
-        if not opts.supersede and not opts.yes:
+        if not opts.supersede:
             (supersede_existing, reqs) = check_existing_requests(apiurl,
                                                                  src_project,
                                                                  src_package,
                                                                  dst_project,
-                                                                 dst_package)
+                                                                 dst_package,
+                                                                 not opts.yes)
             if not supersede_existing:
                (supersede_existing, reqs) = 
check_existing_maintenance_requests(apiurl,
                                                                  src_project,
                                                                  [src_package],
-                                                                 dst_project, 
None)
+                                                                 dst_project, 
None,
+                                                                 not opts.yes)
         if not opts.message:
             difflines = []
             doappend = False
@@ -4416,6 +4418,7 @@
           'C' Conflicted
           'D' Deleted
           'M' Modified
+          'R' Replaced (file was deleted and added again afterwards)
           '?' item is not under version control
           '!' item is missing (removed by non-osc command) or incomplete
           'S' item is skipped (item exceeds a file size limit or is _service:* 
file)
@@ -5096,10 +5099,6 @@
             raise oscerr.WrongOptions("No project given")
 
         if package == None:
-            if opts.arch == []:
-                opts.arch = None
-            if opts.repo == []:
-                opts.repo = None
             opts.hide_legend = None
             opts.name_filter = None
             opts.status_filter = None
@@ -5150,9 +5149,9 @@
                         help='show only packages with buildstatus STATUS (see 
legend)')
     @cmdln.option('-n', '--name-filter', metavar='EXPR',
                         help='show only packages whose names match EXPR')
-    @cmdln.option('-a', '--arch', metavar='ARCH',
+    @cmdln.option('-a', '--arch', metavar='ARCH', action='append',
                         help='show results only for specified architecture(s)')
-    @cmdln.option('-r', '--repo', metavar='REPO',
+    @cmdln.option('-r', '--repo', metavar='REPO', action='append',
                         help='show results only for specified repo(s)')
     @cmdln.option('-V', '--vertical', action='store_true',
                         help='list packages vertically instead horizontally')
@@ -5180,7 +5179,7 @@
             project = store_read_project(wd)
 
         if opts.xml:
-            print(''.join(show_prj_results_meta(apiurl, project)))
+            print(''.join(show_prj_results_meta(apiurl, project, opts.repo, 
opts.arch)))
             return
 
         print('\n'.join(get_prj_results(apiurl, project, 
hide_legend=opts.hide_legend, \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osc-0.160.0/osc/core.py new/osc-0.161.1/osc/core.py
--- old/osc-0.160.0/osc/core.py 2017-09-22 09:06:18.000000000 +0200
+++ new/osc-0.161.1/osc/core.py 2017-10-26 14:21:33.000000000 +0200
@@ -5,7 +5,7 @@
 
 from __future__ import print_function
 
-__version__ = '0.160.0'
+__version__ = '0.161.1'
 
 # __store_version__ is to be incremented when the format of the working copy
 # "store" changes in an incompatible way. Please add any needed migration
@@ -1627,8 +1627,10 @@
         else:
             # try merging
             # diff3 OPTIONS... MINE OLDER YOURS
-            merge_cmd = 'diff3 -m -E %s %s %s > %s' % (myfilename, 
storefilename, upfilename, filename)
-            ret = run_external(merge_cmd, shell=True)
+            ret = -1
+            with open(filename, 'w') as f:
+                ret = run_external('diff3', '-m', '-E', myfilename,
+                                   storefilename, upfilename, stdout=f)
 
             #   "An exit status of 0 means `diff3' was successful, 1 means some
             #   conflicts were found, and 2 means trouble."
@@ -4443,11 +4445,13 @@
     return data
 
 def check_existing_requests(apiurl, src_project, src_package, dst_project,
-                            dst_package):
+                            dst_package, ask=True):
     reqs = get_exact_request_list(apiurl, src_project, dst_project,
                                   src_package, dst_package,
                                   req_type='submit',
                                   req_state=['new', 'review', 'declined'])
+    if not ask:
+        return True, reqs
     repl = ''
     if reqs:
         print('There are already the following submit request: %s.' % \
@@ -4462,13 +4466,15 @@
     return repl == 'y', reqs
 
 def check_existing_maintenance_requests(apiurl, src_project, src_packages, 
dst_project,
-                            release_project):
+                                        release_project, ask=True):
     reqs = []
     for src_package in src_packages:
        reqs += get_exact_request_list(apiurl, src_project, dst_project,
                                   src_package, None,
                                   req_type='maintenance_incident',
                                   req_state=['new', 'review', 'declined'])
+    if not ask:
+        return True, reqs
     repl = ''
     if reqs:
         print('There are already the following maintenance incident request: 
%s.' % \
@@ -4771,6 +4777,29 @@
     f = http_POST(u)
     return f.read()
 
+def get_request_issues(apiurl, reqid):
+    """
+    gets a request xml with the issues for the request inside and creates
+    a list 'issue_list' with a dict of the relevant information for the issues.
+    This only works with bugtrackers we can access, like buzilla.o.o
+    """
+    u = makeurl(apiurl, ['request', reqid], query={'cmd': 'diff', 'view': 
'xml', 'withissues': '1'} )
+    f = http_POST(u)
+    request_tree = ET.parse(f).getroot()
+    issue_list = []
+    for elem in request_tree.iterfind('action/sourcediff/issues/issue'):
+        issue_id = elem.get('name')
+        encode_search = '@name=\'%s\'' % issue_id
+        u = makeurl(apiurl, ['search/issue'], query={'match': encode_search} )
+        f = http_GET(u)
+        collection = ET.parse(f).getroot()
+        for cissue in collection:
+            issue = {}
+            for issue_detail in cissue.iter():
+                issue[issue_detail.tag] = issue_detail.text.strip()
+            issue_list.append(issue)
+    return issue_list
+
 def submit_action_diff(apiurl, action):
     """diff a single submit action"""
     # backward compatiblity: only a recent api/backend supports the missingok 
parameter
@@ -5525,30 +5554,33 @@
 
 
 def show_results_meta(apiurl, prj, package=None, lastbuild=None, 
repository=[], arch=[], oldstate=None, multibuild=False, locallink=False):
-    query = {}
+    query = []
     if package:
-        query['package'] = package
+        query.append('package=%s' % quote_plus(package))
     if oldstate:
-        query['oldstate'] = oldstate
+        query.append('oldstate=%s' % quote_plus(oldstate))
     if lastbuild:
-        query['lastbuild'] = 1
+        query.append('lastbuild=1')
     if multibuild:
-        query['multibuild'] = 1
+        query.append('multibuild=1')
     if locallink:
-        query['locallink'] = 1
-    u = makeurl(apiurl, ['build', prj, '_result'], query=query)
+        query.append('locallink=1')
     for repo in repository:
-        u = u + '&repository=%s' % repo
+        query.append('repository=%s' % quote_plus(repo))
     for a in arch:
-        u = u + '&arch=%s' % a
+        query.append('arch=%s' % quote_plus(a))
+    u = makeurl(apiurl, ['build', prj, '_result'], query=query)
     f = http_GET(u)
     return f.readlines()
 
 
-def show_prj_results_meta(apiurl, prj):
-    u = makeurl(apiurl, ['build', prj, '_result'])
-    f = http_GET(u)
-    return f.readlines()
+def show_prj_results_meta(apiurl, prj, repositories=None, arches=None):
+    # this function is only needed for backward/api compatibility
+    if repositories is None:
+        repositories = []
+    if arches is None:
+        arches = []
+    return show_results_meta(apiurl, prj, repository=repositories, arch=arches)
 
 
 def result_xml_to_dicts(xml):
@@ -5716,9 +5748,9 @@
     pacs = sorted(list(set(pacs)))
     for node in root.findall('result'):
         # filter architecture and repository
-        if arch != None and node.get('arch') not in arch:
+        if arch and node.get('arch') not in arch:
             continue
-        if repo != None and node.get('repository') not in repo:
+        if repo and node.get('repository') not in repo:
             continue
         if node.get('dirty') == "true":
             state = "outdated"
@@ -6664,8 +6696,22 @@
     curdir = os.getcwd()
     if os.path.isdir(dir):
         os.chdir(dir)
-    cmd = 'rpm2cpio %s | cpio -i %s &> /dev/null' % (srpm, ' '.join(files))
-    ret = run_external(cmd, shell=True)
+    ret = -1
+    with open(srpm, 'r') as fsrpm:
+        with open(os.devnull, 'w') as devnull:
+            rpm2cpio_proc = subprocess.Popen(['rpm2cpio'], stdin=fsrpm,
+                                             stdout=subprocess.PIPE)
+            # XXX: shell injection is possible via the files parameter, but the
+            #      current osc code does not use the files parameter.
+            cpio_proc = subprocess.Popen(['cpio', '-i'] + list(files),
+                                         stdin=rpm2cpio_proc.stdout,
+                                         stderr=devnull)
+            rpm2cpio_proc.stdout.close()
+            cpio_proc.communicate()
+            rpm2cpio_proc.wait()
+            ret = rpm2cpio_proc.returncode
+            if not ret:
+                ret = cpio_proc.returncode
     if ret != 0:
         print('error \'%s\' - cannot extract \'%s\'' % (ret, srpm), 
file=sys.stderr)
         sys.exit(1)
@@ -6954,9 +7000,13 @@
         if resp not in ('y', 'Y'):
             continue
         archive = "%s.obscpio" % filename
-        # XXX: hmm we should use subprocess.Popen here (to avoid all the
-        # issues that come with shell=True...)
-        run_external("find %s | cpio -o -H newc > %s" % (filename, archive), 
shell=True)
+        todo = [os.path.join(p, elm)
+                for p, dirnames, fnames in os.walk(filename, followlinks=False)
+                for elm in dirnames + fnames]
+        with open(archive, 'w') as f:
+            cpio_proc = subprocess.Popen(['cpio', '-o', '-H', 'newc', '-0'],
+                                         stdin=subprocess.PIPE, stdout=f)
+            cpio_proc.communicate('\0'.join(todo))
         pacs.extend(findpacs([archive]))
 
     for pac in pacs:
@@ -7126,6 +7176,40 @@
             print('Try -f to force the state change', file=sys.stderr)
         return False
 
+    def safe_get_rpmlint_log(src_actions):
+        lintlogs = []
+        for action in src_actions:
+            print('Type %s:' % action.type)
+            disabled = show_package_disabled_repos(apiurl, action.src_project, 
action.src_package)
+            for repo in get_repos_of_project(apiurl, action.src_project):
+                if disabled is None or repo.name not in disabled:
+                    lintlog_entry = {
+                                      'proj': action.src_project,
+                                      'pkg': action.src_package,
+                                      'repo': repo.name,
+                                      'arch': repo.arch
+                                      }
+                    lintlogs.append(lintlog_entry)
+                    print('(%i) %s/%s/%s/%s' % ((len(lintlogs)-1), 
action.src_project, action.src_package, repo.name, repo.arch))
+        if not lintlogs:
+            print('No possible rpmlintlogs found')
+            return False
+        while True:
+            try:
+                lint_n = int(raw_input('Number of rpmlint log to examine (0 - 
%i): ' % (len(lintlogs)-1)))
+                lintlogs[lint_n]
+                break
+            except (ValueError, IndexError):
+                print('Invalid rpmlintlog index. Please choose between 0 and 
%i' % (len(lintlogs)-1))
+        try:
+            print(get_rpmlint_log(apiurl, **lintlogs[lint_n]))
+        except HTTPError as e:
+            if e.code == 404:
+                print('No rpmlintlog for %s %s' % (lintlogs[lint_n]['repo'],
+                      lintlogs[lint_n]['arch']))
+            else:
+                raise e
+
     def print_request(request):
         print(request)
 
@@ -7141,6 +7225,30 @@
                     raise
                 print('unable to retrieve the buildstatus: %s' % e)
 
+    def get_formatted_issues(apiurl, reqid):
+        """get issue_list and return a printable string"""
+        issue_list = get_request_issues(apiurl, reqid)
+        issues = ""
+        issues_nodetails = ""
+        # the check_list is needed to make sure that every issue is just listed
+        # once. Sometimes the API returns the same issue twice or more. See:
+        # https://github.com/openSUSE/open-build-service/issues/4044
+        # Once this is fixed this can be changed.
+        check_list = []
+        for issue in issue_list:
+            if issue['label'] in check_list:
+                continue
+            if 'summary' in issue:
+                issues += ("## BUG# " + issue['label'] + ": "
+                          + issue.get('summary') + " : "
+                          + issue.get('state', 'unknown state') + '\n')
+            else:
+                issues_nodetails += issue['label'] + ' '
+            check_list.append(issue['label'])
+        if issues_nodetails:
+            issues += '## No details for the issue(s): ' + issues_nodetails + 
'\n'
+        return issues
+
     print_request(request)
     print_comments(apiurl, 'request', request.reqid)
     try:
@@ -7149,10 +7257,10 @@
         # actions which have sources + buildresults
         src_actions = editable_actions + 
request.get_actions('maintenance_release')
         if editable_actions:
-            prompt = 
'd(i)ff/(a)ccept/(d)ecline/(r)evoke/(b)uildstatus/c(l)one/(e)dit/co(m)ment/(s)kip/(c)ancel
 > '
+            prompt = 
'd(i)ff/(a)ccept/(d)ecline/(r)evoke/(b)uildstatus/rpm(li)ntlog/c(l)one/(e)dit/co(m)ment/(s)kip/(c)ancel
 > '
         elif src_actions:
             # no edit for maintenance release requests
-            prompt = 
'd(i)ff/(a)ccept/(d)ecline/(r)evoke/(b)uildstatus/c(l)one/co(m)ment/(s)kip/(c)ancel
 > '
+            prompt = 
'd(i)ff/(a)ccept/(d)ecline/(r)evoke/(b)uildstatus/rpm(li)ntlog/c(l)one/co(m)ment/(s)kip/(c)ancel
 > '
         editprj = ''
         orequest = None
         if source_buildstatus and src_actions:
@@ -7164,11 +7272,15 @@
             else:
                 repl = raw_input(prompt).strip()
             if repl == 'i' and src_actions:
+                req_summary = str(request) + '\n'
+                issues = '\n\n' + get_formatted_issues(apiurl, request.reqid)
                 if not orequest is None and tmpfile:
                     tmpfile.close()
                     tmpfile = None
                 if tmpfile is None:
                     tmpfile = tempfile.NamedTemporaryFile(suffix='.diff')
+                    tmpfile.write(req_summary)
+                    tmpfile.write(issues)
                     try:
                         diff = request_diff(apiurl, request.reqid)
                         tmpfile.write(diff)
@@ -7197,6 +7309,8 @@
                 create_comment(apiurl, 'request', comment, request.reqid)
             elif repl == 'b' and src_actions:
                 print_source_buildstatus(src_actions)
+            elif repl =='li' and src_actions:
+                safe_get_rpmlint_log(src_actions)
             elif repl == 'e' and editable_actions:
                 # this is only for editable actions
                 if not editprj:
@@ -7221,7 +7335,8 @@
                     footer = 'changing request from state \'%s\' to 
\'%s\'\n\n' \
                         % (request.state.name, state)
                     msg_template = change_request_state_template(request, 
state)
-                footer += str(request)
+                if tmpfile is None:
+                    footer += str(request)
                 if tmpfile is not None:
                     tmpfile.seek(0)
                     # the read bytes probably have a moderate size so the str 
won't be too large

++++++ osc.dsc ++++++
--- /var/tmp/diff_new_pack.UQbSqf/_old  2017-10-27 14:01:07.736837514 +0200
+++ /var/tmp/diff_new_pack.UQbSqf/_new  2017-10-27 14:01:07.736837514 +0200
@@ -1,6 +1,6 @@
 Format: 1.0
 Source: osc
-Version: 0.160.0-0
+Version: 0.161.1-0
 Binary: osc
 Maintainer: Adrian Schroeter <[email protected]>
 Architecture: any


Reply via email to