From 93f87c9838d911ecc3cca0e59ed4e1d9cd2d53fc Mon Sep 17 00:00:00 2001 From: Sascha Peilicke Date: Thu, 7 Jul 2011 10:12:57 +0200 Subject: [PATCH 1/3] Honor '-p' and '-P' parameters in request list command. Fixes bnc#703586 --- osc/commandline.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/osc/commandline.py b/osc/commandline.py index 68100b72..24d73785 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -1878,6 +1878,10 @@ Please submit there instead, or use --nodevelproject to force direct submission. package = store_read_package(os.curdir) except oscerr.NoWorkingCopy: pass + elif opts.project: + project = opts.project + if opts.package: + package = opts.package if len(args) > 1: package = args[1] From 6676d530bcac384514d690fe834487a43f1ee841 Mon Sep 17 00:00:00 2001 From: Sascha Peilicke Date: Fri, 8 Jul 2011 15:11:17 +0200 Subject: [PATCH 2/3] Give some status output if request list was empty. Either there where no requests or the project didn't exist. Fixes bnc#543999 --- osc/commandline.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/osc/commandline.py b/osc/commandline.py index 24d73785..e4dd767c 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -1954,6 +1954,15 @@ Please submit there instead, or use --nodevelproject to force direct submission. results = get_request_list(apiurl, project, package, who, state_list, opts.type, opts.exclude_target_project or []) + # Check if project actually exists if result list is empty + if not results: + try: + show_project_meta(apiurl, project) + print 'No results for {0}'.format(project) + except: + print 'Project {0} does not exist'.format(project) + return + results.sort(reverse=True) import time days = opts.days or conf.config['request_list_days'] From 438569f8216a6d33d8842f853411b76b40e5d8a0 Mon Sep 17 00:00:00 2001 From: Sascha Peilicke Date: Fri, 8 Jul 2011 16:09:44 +0200 Subject: [PATCH 3/3] PEP8-ified parts of the code. Exchange individual return statements with a finally statement in the big try/except statement in babysitter.py. If you return a different value in the 'except' clause, it takes precedency over the 'finally' clause (finally is executed before returning, naturally). --- osc-wrapper.py | 9 +++-- osc/babysitter.py | 95 ++++++++++------------------------------------ osc/commandline.py | 8 ++-- setup.py | 13 ++++--- 4 files changed, 38 insertions(+), 87 deletions(-) diff --git a/osc-wrapper.py b/osc-wrapper.py index b477dc64..416dbe6d 100755 --- a/osc-wrapper.py +++ b/osc-wrapper.py @@ -3,7 +3,11 @@ # this wrapper exists so it can be put into /usr/bin, but still allows the # python module to be called within the source directory during development -import sys, locale +import locale +import sys + +from osc import commandline, babysitter + # this is a hack to make osc work as expected with utf-8 characters, # no matter how site.py is set... reload(sys) @@ -13,9 +17,6 @@ if not loc: sys.setdefaultencoding(loc) del sys.setdefaultencoding -from osc import commandline -from osc import babysitter - osccli = commandline.Osc() r = babysitter.run(osccli) diff --git a/osc/babysitter.py b/osc/babysitter.py index 43a222bc..5c7100db 100644 --- a/osc/babysitter.py +++ b/osc/babysitter.py @@ -3,13 +3,14 @@ # and distributed under the terms of the GNU General Public Licence, # either version 2, or (at your option) any later version. +import errno import os.path +import pdb import sys import signal -import errno +import traceback + from osc import oscerr -from urllib2 import URLError, HTTPError -from httplib import HTTPException, BadStatusLine from oscsslexcp import NoSecureSSLError from osc.util.cpio import CpioError from osc.util.packagequery import PackageError @@ -28,79 +29,65 @@ except: # if rpm-python isn't installed (we might be on a debian system): RPMError = None +from httplib import HTTPException, BadStatusLine +from urllib2 import URLError, HTTPError # the good things are stolen from Matt Mackall's mercurial + def catchterm(*args): raise oscerr.SignalInterrupt for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': num = getattr(signal, name, None) - if num: signal.signal(num, catchterm) + if num: + signal.signal(num, catchterm) def run(prg): - try: - try: if '--debugger' in sys.argv: - import pdb pdb.set_trace() - # here we actually run the program: return prg.main() - except: - # look for an option in the prg.options object and in the config dict - # print stack trace, if desired + # look for an option in the prg.options object and in the config + # dict print stack trace, if desired if getattr(prg.options, 'traceback', None) or getattr(prg.conf, 'config', {}).get('traceback', None) or \ getattr(prg.options, 'post_mortem', None) or getattr(prg.conf, 'config', {}).get('post_mortem', None): - import traceback traceback.print_exc(file=sys.stderr) # we could use http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52215 - # enter the debugger, if desired if getattr(prg.options, 'post_mortem', None) or getattr(prg.conf, 'config', {}).get('post_mortem', None): if sys.stdout.isatty() and not hasattr(sys, 'ps1'): - import pdb pdb.post_mortem(sys.exc_info()[2]) else: print >>sys.stderr, 'sys.stdout is not a tty. Not jumping into pdb.' raise - except oscerr.SignalInterrupt: print >>sys.stderr, 'killed!' - return 1 - except KeyboardInterrupt: print >>sys.stderr, 'interrupted!' - return 1 - except oscerr.UserAbort: print >>sys.stderr, 'aborted.' - return 1 - except oscerr.APIError, e: print >>sys.stderr, 'BuildService API error:', e.msg - return 1 - except oscerr.LinkExpandError, e: print >>sys.stderr, 'Link "%s/%s" cannot be expanded:\n' % (e.prj, e.pac), e.msg print >>sys.stderr, 'Use "osc repairlink" to fix merge conflicts.\n' - return 1 - except oscerr.WorkingCopyWrongVersion, e: print >>sys.stderr, e - except oscerr.NoWorkingCopy, e: print >>sys.stderr, e - if os.path.isdir('.git'): print >>sys.stderr, "Current directory looks like git." - if os.path.isdir('.hg'): print >>sys.stderr, "Current directory looks like mercurial." - if os.path.isdir('.svn'): print >>sys.stderr, "Current directory looks like svn." - if os.path.isdir('CVS'): print >>sys.stderr, "Current directory looks like cvs." - return 1 - + if os.path.isdir('.git'): + print >>sys.stderr, "Current directory looks like git." + if os.path.isdir('.hg'): + print >>sys.stderr, "Current directory looks like mercurial." + if os.path.isdir('.svn'): + print >>sys.stderr, "Current directory looks like svn." + if os.path.isdir('CVS'): + print >>sys.stderr, "Current directory looks like cvs." except HTTPError, e: print >>sys.stderr, 'Server returned an error:', e if hasattr(e, 'osc_msg'): @@ -116,105 +103,65 @@ def run(prg): print >>sys.stderr, e.hdrs print >>sys.stderr, body - if e.code in [ 400, 403, 404, 500 ]: + if e.code in [400, 403, 404, 500]: if '' in body: msg = body.split('')[1] msg = msg.split('')[0] print >>sys.stderr, msg - - return 1 - except BadStatusLine, e: print >>sys.stderr, 'Server returned an invalid response:', e print >>sys.stderr, e.line - return 1 - except HTTPException, e: print >>sys.stderr, e - return 1 - except URLError, e: print >>sys.stderr, 'Failed to reach a server:\n', e.reason - return 1 - except IOError, e: # ignore broken pipe if e.errno != errno.EPIPE: raise - return 1 - except OSError, e: if e.errno != errno.ENOENT: raise print >>sys.stderr, e - return 1 - except (oscerr.ConfigError, oscerr.NoConfigfile), e: print >>sys.stderr, e.msg - return 1 - except oscerr.OscIOError, e: print >>sys.stderr, e.msg if getattr(prg.options, 'debug', None) or \ getattr(prg.conf, 'config', {}).get('debug', None): print >>sys.stderr, e.e - return 1 - except (oscerr.WrongOptions, oscerr.WrongArgs), e: print >>sys.stderr, e return 2 - except oscerr.ExtRuntimeError, e: print >>sys.stderr, e.msg - return 1 - except oscerr.WorkingCopyOutdated, e: print >>sys.stderr, e - return 1 - except (oscerr.PackageExists, oscerr.PackageMissing, oscerr.WorkingCopyInconsistent), e: print >>sys.stderr, e.msg - return 1 - except oscerr.PackageInternalError, e: - import traceback print >>sys.stderr, 'a package internal error occured\n' \ 'please file a bug and attach your current package working copy ' \ 'and the following traceback to it:' print >>sys.stderr, e.msg traceback.print_exc(file=sys.stderr) - return 1 - except oscerr.PackageError, e: print >>sys.stderr, e.msg - return 1 - except PackageError, e: print >>sys.stderr, '%s:' % e.fname, e.msg - return 1 - except RPMError, e: print >>sys.stderr, e - return 1 - except SSLError, e: print >>sys.stderr, "SSL Error:", e - return 1 - except SSLVerificationError, e: print >>sys.stderr, "Certificate Verification Error:", e - return 1 - except NoSecureSSLError, e: print >>sys.stderr, e - return 1 - except CpioError, e: print >>sys.stderr, e - return 1 - except oscerr.OscBaseError, e: print >>sys.stderr, '*** Error:', e + finally: return 1 # vim: sw=4 et diff --git a/osc/commandline.py b/osc/commandline.py index e4dd767c..08021de2 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4,14 +4,17 @@ # either version 2, or version 3 (at your option). -from core import * import cmdln import conf import oscerr import sys -from util import safewriter +import time + from optparse import SUPPRESS_HELP +from core import * +from util import safewriter + MAN_HEADER = r""".TH %(ucname)s "1" "%(date)s" "%(name)s %(version)s" "User Commands" .SH NAME %(name)s \- openSUSE build service command-line tool. @@ -1964,7 +1967,6 @@ Please submit there instead, or use --nodevelproject to force direct submission. return results.sort(reverse=True) - import time days = opts.days or conf.config['request_list_days'] since = '' try: diff --git a/setup.py b/setup.py index 5fa94e7e..f1bb2b71 100755 --- a/setup.py +++ b/setup.py @@ -15,6 +15,7 @@ try: except: HAVE_PY2EXE = False + class build_osc(distutils.command.build.build, object): """ Custom build command which generates man page. @@ -27,9 +28,9 @@ class build_osc(distutils.command.build.build, object): man_path = os.path.join('build', 'osc.1.gz') distutils.log.info('generating %s' % man_path) outfile = gzip.open(man_path, 'w') - osccli = commandline.Osc(stdout = outfile) - # FIXME: we cannot call the main method because osc expects an ~/.oscrc file - # (this would break builds in environments like the obs) + osccli = commandline.Osc(stdout=outfile) + # FIXME: we cannot call the main method because osc expects an ~/.oscrc + # file (this would break builds in environments like the obs) #osccli.main(argv = ['osc','man']) osccli.optparser = osccli.get_optparser() osccli.do_man(None) @@ -43,11 +44,11 @@ addparams = {} if HAVE_PY2EXE: addparams['console'] = [{'script': 'osc-wrapper.py', 'dest_base': 'osc', 'icon_resources': [(1, 'osc.ico')]}] addparams['zipfile'] = 'shared.lib' - addparams['options'] = {'py2exe': { 'optimize': 0, 'compressed': True, 'packages': ['xml.etree', 'StringIO', 'gzip'] }} + addparams['options'] = {'py2exe': {'optimize': 0, 'compressed': True, 'packages': ['xml.etree', 'StringIO', 'gzip']}} data_files = [] if sys.platform[:3] != 'win': - data_files.append((os.path.join('share','man','man1'), [os.path.join('build', 'osc.1.gz')])) + data_files.append((os.path.join('share', 'man', 'man1'), [os.path.join('build', 'osc.1.gz')])) setup(name='osc', version = osc.core.__version__, @@ -56,7 +57,7 @@ setup(name='osc', author = 'openSUSE project', author_email = 'opensuse-buildservice@opensuse.org', license = 'GPL', - platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME'], + platforms = ['Linux', 'Mac OSX', 'Windows XP/2000/NT', 'Windows 95/98/ME'], keywords = ['openSUSE', 'SUSE', 'RPM', 'build', 'buildservice'], url = 'http://en.opensuse.org/openSUSE:OSC', download_url = 'http://gitorious.org/opensuse/osc',