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
