Hello community, here is the log from the commit of package osc for openSUSE:Factory checked in at 2014-01-30 11:37:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/osc (Old) and /work/SRC/openSUSE:Factory/.osc.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "osc" Changes: -------- --- /work/SRC/openSUSE:Factory/osc/osc.changes 2014-01-03 19:47:42.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.osc.new/osc.changes 2014-01-30 11:37:07.000000000 +0100 @@ -1,0 +2,11 @@ +Fri Jan 24 09:38:32 UTC 2014 - [email protected] + +- 0.143.0 + - add option to add a auto-accept in future for delete requests (handy for admins) + - many bugfixes: + - plugin loading + - bugowner handling + - download of server side generated source "up -S" + - wipebinaries command + +------------------------------------------------------------------- Old: ---- osc-0.142.2.tar.gz New: ---- osc-0.143.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ osc.spec ++++++ --- /var/tmp/diff_new_pack.L1RbIo/_old 2014-01-30 11:37:07.000000000 +0100 +++ /var/tmp/diff_new_pack.L1RbIo/_new 2014-01-30 11:37:07.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package osc # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: osc -Version: 0.142.2 +Version: 0.143.0 Release: 0 Summary: openSUSE Build Service Commander License: GPL-2.0+ ++++++ PKGBUILD ++++++ --- /var/tmp/diff_new_pack.L1RbIo/_old 2014-01-30 11:37:07.000000000 +0100 +++ /var/tmp/diff_new_pack.L1RbIo/_new 2014-01-30 11:37:07.000000000 +0100 @@ -1,5 +1,5 @@ pkgname=osc -pkgver=0.142.2 +pkgver=0.143.0 pkgrel=0 pkgdesc="Open Build Service client" arch=('i686' 'x86_64') @@ -8,7 +8,7 @@ groups=('base-devel') depends=('python') source=(osc-${pkgver}.tar.gz) -md5sums=('cdce96f3d1a7c55f3bee980e33808b2e') +md5sums=('ad1f262fbb93e6a4c132d615648e6bbe') package() { msg "Installing osc ..." ++++++ _service ++++++ --- /var/tmp/diff_new_pack.L1RbIo/_old 2014-01-30 11:37:07.000000000 +0100 +++ /var/tmp/diff_new_pack.L1RbIo/_new 2014-01-30 11:37:07.000000000 +0100 @@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="disabled"> - <param name="version">0.142.2</param> - <param name="revision">0.142.2</param> + <param name="version">0.143.0</param> + <param name="revision">0.143.0</param> <param name="url">git://github.com/openSUSE/osc.git</param> <param name="scm">git</param> </service> ++++++ osc-0.142.2.tar.gz -> osc-0.143.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/NEWS new/osc-0.143.0/NEWS --- old/osc-0.142.2/NEWS 2013-12-04 09:26:09.000000000 +0100 +++ new/osc-0.143.0/NEWS 2014-01-24 10:50:08.000000000 +0100 @@ -1,3 +1,11 @@ +0.143 + - add option to add a auto-accept in future for delete requests (handy for admins) + - many bugfixes: + - plugin loading + - bugowner handling + - download of server side generated source "up -S" + - wipebinaries command + 0.142 - ppc64p7 build support - request --no-devel to disable request forwarding diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/osc/commandline.py new/osc-0.143.0/osc/commandline.py --- old/osc-0.142.2/osc/commandline.py 2013-12-04 09:26:09.000000000 +0100 +++ new/osc-0.143.0/osc/commandline.py 2014-01-24 10:50:08.000000000 +0100 @@ -592,9 +592,9 @@ @cmdln.option('-t', '--trigger', metavar='TOKENID', help='Trigger the action of a token') def do_token(self, subcmd, opts, *args): - """${cmd_name}: Show and manage authentification token + """${cmd_name}: Show and manage authentication token - Authentification token can be used to run specific commands without + Authentication token can be used to run specific commands without sending credentials. Usage: @@ -1740,6 +1740,8 @@ help='specify message TEXT') @cmdln.option('-r', '--repository', metavar='TEXT', help='specify message TEXT') + @cmdln.option('--accept-in-hours', metavar='TEXT', + help='specify message time when request shall get accepted automatically. Only works with write permissions in target.') @cmdln.alias("dr") @cmdln.alias("dropreq") @cmdln.alias("droprequest") @@ -1793,6 +1795,8 @@ r = Request() r.add_action('delete', tgt_project=project, tgt_package=package, tgt_repository=repository) r.description = cgi.escape(opts.message) + if opts.accept_in_hours: + r.accept_at_in_hours(int(opts.accept_in_hours)) r.create(self.get_api_url()) print(r.reqid) @@ -2133,7 +2137,7 @@ days = opts.days or conf.config['request_list_days'] since = '' try: - days = int(days) + days = float(days) except ValueError: days = 0 if days > 0: @@ -5630,7 +5634,7 @@ hostargs.append(long_name) hostargs.append(hostprefer) - rsync_prefer_cmd = ['rsync', '-az', '-delete', '-e', 'ssh', + rsync_prefer_cmd = ['rsync', '-az', '--delete', '-e', 'ssh', pdir, "%s:%s" % (hostname, os.path.dirname(hostprefer))] print('Run: %s' % " ".join(rsync_prefer_cmd)) @@ -5682,7 +5686,7 @@ ### run all commands ### # 1.) rsync sources - rsync_source_cmd = ['rsync', '-az', '-delete', '-e', 'ssh', cwd, "%s:%s" % (hostname, hostpath)] + rsync_source_cmd = ['rsync', '-az', '--delete', '-e', 'ssh', cwd, "%s:%s" % (hostname, hostpath)] print('Run: %s' % " ".join(rsync_source_cmd)) ret = run_external(rsync_source_cmd[0], *rsync_source_cmd[1:]) if ret != 0: @@ -7116,7 +7120,7 @@ if opts.set_bugowner: for role in roles: try: - setBugowner(apiurl, result.get('project'), result.get('package'), bugowner) + setBugowner(apiurl, result.get('project'), result.get('package'), opts.set_bugowner) except HTTPError as e: if e.code == 403: print("No write permission in", result.get('project'), end=' ') @@ -7140,7 +7144,7 @@ if opts.set_bugowner: for role in roles: try: - setBugowner(apiurl, prj, pac, opts.delete, role) + setBugowner(apiurl, prj, pac, opts.set_bugowner) except HTTPError as e: if e.code == 403: print("No write permission in" + result.get('project'), end=' ') @@ -8132,7 +8136,7 @@ if (inspect.isfunction(data) and inspect.getmodule(data) == mod or inspect.ismodule(data)): setattr(self.__class__, name, data) - except SyntaxError as e: + except (SyntaxError, NameError) as e: if (os.environ.get('OSC_PLUGIN_FAIL_IGNORE')): print("%s: %s\n" % (os.path.join(plugin_dir, extfile), e), file=sys.stderr) else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/osc/conf.py new/osc-0.143.0/osc/conf.py --- old/osc-0.142.2/osc/conf.py 2013-12-04 09:26:09.000000000 +0100 +++ new/osc-0.143.0/osc/conf.py 2014-01-24 10:50:08.000000000 +0100 @@ -36,6 +36,7 @@ """ +import bz2 import base64 import os import re @@ -570,8 +571,8 @@ cookiejar.load(ignore_discard=True) except IOError: try: - open(cookie_file, 'w').close() - os.chmod(cookie_file, 0o600) + fd = os.open(cookie_file, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, mode=0o600) + os.close(fd) except: #print 'Unable to create cookiejar file: \'%s\'. Using RAM-based cookies.' % cookie_file cookiejar = CookieJar() @@ -663,6 +664,13 @@ return (opt, cp.get(section, opt, raw=True)) return (opt, None) +def passx_decode(passx): + """decode the obfuscated password back to plain text password""" + return bz2.decompress(base64.b64decode(passx.encode("ascii"))).decode("ascii") + +def passx_encode(passwd): + """encode plain text password to obfuscated form""" + return base64.b64encode(bz2.compress(passwd.encode('ascii'))).decode("ascii") def write_initial_config(conffile, entries, custom_template=''): """ @@ -694,7 +702,7 @@ if not config['plaintext_passwd']: config['pass'] = '' else: - config['passx'] = base64.b64encode(config['pass'].encode('bz2')) + config['passx'] = passx_encode(config['pass']) sio = StringIO(conf_template.strip() % config) cp = OscConfigParser.OscConfigParser(DEFAULTS) @@ -734,7 +742,7 @@ cp.set(url, 'user', user) if not config['plaintext_passwd']: cp.remove_option(url, 'pass') - cp.set(url, 'passx', base64.b64encode(passwd.encode('bz2'))) + cp.set(url, 'passx', passx_encode(passwd)) else: cp.remove_option(url, 'passx') cp.set(url, 'pass', passwd) @@ -817,7 +825,7 @@ try: # Read from keyring lib if available user = cp.get(url, 'user', raw=True) - password = keyring.get_password(host, user) + password = str(keyring.get_password(host, user)) except: # Fallback to file based auth. pass @@ -829,7 +837,7 @@ raise oscerr.ConfigError('no user found in keyring', conffile) user = gk_data[0]['user'] if 'password' in gk_data[0]: - password = gk_data[0]['password'] + password = str(gk_data[0]['password']) else: # this is most likely an error print('warning: no password found in keyring', file=sys.stderr) @@ -856,7 +864,7 @@ user = cp.get(url, 'user', raw=True) # need to set raw to prevent '%' expansion password = cp.get(url, 'pass', raw=True) # especially on password! try: - passwordx = cp.get(url, 'passx', raw=True).decode('base64').decode('bz2') # especially on password! + passwordx = passx_decode(cp.get(url, 'passx', raw=True)) # especially on password! except: passwordx = '' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/osc/core.py new/osc-0.143.0/osc/core.py --- old/osc-0.142.2/osc/core.py 2013-12-04 09:26:09.000000000 +0100 +++ new/osc-0.143.0/osc/core.py 2014-01-24 10:50:09.000000000 +0100 @@ -5,7 +5,7 @@ from __future__ import print_function -__version__ = '0.142' +__version__ = '0.142git' # __store_version__ is to be incremented when the format of the working copy # "store" changes in an incompatible way. Please add any needed migration @@ -357,7 +357,11 @@ # cleanup existing generated files for filename in os.listdir(dir): if filename.startswith('_service:') or filename.startswith('_service_'): - os.unlink(os.path.join(dir, filename)) + ent = os.path.join(dir, filename) + if os.path.isdir(ent): + shutil.rmtree(ent) + else: + os.unlink(ent) allservices = self.services or [] if singleservice and not singleservice in allservices: @@ -1235,26 +1239,23 @@ u = makeurl(self.apiurl, ['source', self.prjname, self.name, pathname2url(n)], query=query) http_DELETE(u) - def put_source_file(self, n, copy_only=False): - cdir = os.path.join(self.storedir, '_in_commit') - try: - if not os.path.isdir(cdir): - os.mkdir(cdir) - query = 'rev=repository' - tmpfile = os.path.join(cdir, n) - shutil.copyfile(os.path.join(self.dir, n), tmpfile) - # escaping '+' in the URL path (note: not in the URL query string) is - # only a workaround for ruby on rails, which swallows it otherwise - if not copy_only: - u = makeurl(self.apiurl, ['source', self.prjname, self.name, pathname2url(n)], query=query) - http_PUT(u, file = os.path.join(self.dir, n)) - os.rename(tmpfile, os.path.join(self.storedir, n)) - finally: - if os.path.isdir(cdir): - shutil.rmtree(cdir) + def put_source_file(self, n, tdir, copy_only=False): + query = 'rev=repository' + tfilename = os.path.join(tdir, n) + shutil.copyfile(os.path.join(self.dir, n), tfilename) + # escaping '+' in the URL path (note: not in the URL query string) is + # only a workaround for ruby on rails, which swallows it otherwise + if not copy_only: + u = makeurl(self.apiurl, ['source', self.prjname, self.name, pathname2url(n)], query=query) + http_PUT(u, file = tfilename) if n in self.to_be_added: self.to_be_added.remove(n) + def __commit_update_store(self, tdir): + """move files from transaction directory into the store""" + for filename in os.listdir(tdir): + os.rename(os.path.join(tdir, filename), os.path.join(self.storedir, filename)) + def __generate_commitlist(self, todo_send): root = ET.Element('directory') for i in sorted(todo_send.keys()): @@ -1364,24 +1365,33 @@ real_send = [i for i in real_send if not i in send] # abort after 3 tries tries = 3 - while len(send) and tries: - for filename in send[:]: - sys.stdout.write('.') - sys.stdout.flush() - self.put_source_file(filename) - send.remove(filename) - tries -= 1 - sfilelist = self.__send_commitlog(msg, filelist) - send = self.__get_todo_send(sfilelist) - if len(send): - raise oscerr.PackageInternalError(self.prjname, self.name, - 'server does not accept filelist:\n%s\nmissing:\n%s\n' \ - % (ET.tostring(filelist, encoding=ET_ENCODING), ET.tostring(sfilelist, encoding=ET_ENCODING))) - # these files already exist on the server - # just copy them into the storedir - for filename in real_send: - self.put_source_file(filename, copy_only=True) - + tdir = None + try: + tdir = os.path.join(self.storedir, '_in_commit') + if os.path.isdir(tdir): + shutil.rmtree(tdir) + os.mkdir(tdir) + while len(send) and tries: + for filename in send[:]: + sys.stdout.write('.') + sys.stdout.flush() + self.put_source_file(filename, tdir) + send.remove(filename) + tries -= 1 + sfilelist = self.__send_commitlog(msg, filelist) + send = self.__get_todo_send(sfilelist) + if len(send): + raise oscerr.PackageInternalError(self.prjname, self.name, + 'server does not accept filelist:\n%s\nmissing:\n%s\n' \ + % (ET.tostring(filelist, encoding=ET_ENCODING), ET.tostring(sfilelist, encoding=ET_ENCODING))) + # these files already exist on the server + for filename in real_send: + self.put_source_file(filename, tdir, copy_only=True) + # update store with the committed files + self.__commit_update_store(tdir) + finally: + if tdir is not None and os.path.isdir(tdir): + shutil.rmtree(tdir) self.rev = sfilelist.get('rev') print() print('Committed revision %s.' % self.rev) @@ -1457,7 +1467,7 @@ shutil.copyfile(storefilename, filename) if mtime: - os.utime(filename, (-1, mtime)) + utime(filename, (-1, mtime)) if not origfile is None: os.unlink(origfile) @@ -2480,6 +2490,8 @@ ET.SubElement(root, 'title').text = self.title if self.description: ET.SubElement(root, 'description').text = self.description + if self.accept_at: + ET.SubElement(root, 'accept_at').text = self.accept_at return root def to_str(self): @@ -2488,6 +2500,14 @@ xmlindent(root) return ET.tostring(root, encoding=ET_ENCODING) + def accept_at_in_hours(self, hours): + """set auto accept_at time""" + import datetime + + now = datetime.datetime.utcnow() + now = now + datetime.timedelta(hours=hours) + self.accept_at = now.isoformat() + @staticmethod def format_review(review, show_srcupdate=False): """ @@ -2901,7 +2921,7 @@ return urlunsplit((scheme, netloc, '/'.join(l), query, '')) -def http_request(method, url, headers={}, data=None, file=None, timeout=0): +def http_request(method, url, headers={}, data=None, file=None): """wrapper around urllib2.urlopen for error handling, and to support additional (PUT, DELETE) methods""" def create_memoryview(obj): @@ -2967,18 +2987,12 @@ if conf.config['debug']: print(method, url, file=sys.stderr) - old_timeout = socket.getdefaulttimeout() - # XXX: dirty hack as timeout doesn't work with python-m2crypto - if old_timeout != timeout and not api_host_options.get('sslcertck'): - socket.setdefaulttimeout(timeout) try: if isinstance(data, str): data = bytes(data, "utf-8") fd = urlopen(req, data=data) finally: - if old_timeout != timeout and not api_host_options.get('sslcertck'): - socket.setdefaulttimeout(old_timeout) if hasattr(conf.cookiejar, 'save'): conf.cookiejar.save(ignore_discard=True) @@ -3396,7 +3410,7 @@ if include_service_files: try: sinfo = et.find('serviceinfo') - if sinfo and sinfo.get('xsrcmd5') and not sinfo.get('error'): + if sinfo != None and sinfo.get('xsrcmd5') and not sinfo.get('error'): return sinfo.get('xsrcmd5') except: pass @@ -3433,7 +3447,7 @@ if include_service_files: try: sinfo = et.find('serviceinfo') - if sinfo and sinfo.get('xsrcmd5') and not sinfo.get('error'): + if sinfo != None and sinfo.get('xsrcmd5') and not sinfo.get('error'): return sinfo.get('xsrcmd5') except: pass @@ -4028,7 +4042,7 @@ prefix = os.path.basename(filename) path = os.path.dirname(filename) (fd, tmpfile) = tempfile.mkstemp(dir=path, prefix = prefix, suffix = '.osctmp') - os.chmod(tmpfile, 0o644) + os.fchmod(fd, 0o644) try: o = os.fdopen(fd, 'wb') for buf in streamfile(url, http_GET, BUFSIZE, progress_obj=progress_obj): @@ -4043,7 +4057,7 @@ o.close() if mtime: - os.utime(filename, (-1, mtime)) + utime(filename, (-1, mtime)) def get_source_file(apiurl, prj, package, filename, targetfilename=None, revision=None, progress_obj=None, mtime=None, meta=False): targetfilename = targetfilename or filename @@ -5161,7 +5175,7 @@ row = ['_'] + ['/'.join(tg) for tg in targets] r.append(';'.join(row)) for pac in pacs: - row = [pac] + [status[pac][tg] for tg in targets] + row = [pac] + [status[pac][tg] for tg in targets if tg in status[pac]] r.append(';'.join(row)) return r @@ -6074,12 +6088,12 @@ create_new=False) if data: root = ET.fromstring(''.join(data)) - for group in root.getiterator('group'): - if group.get('role') == "bugowner": - root.remove(group) - for person in root.getiterator('person'): - if person.get('role') == "bugowner": - root.remove(person) + for group_element in root.getiterator('group'): + if group_element.get('role') == "bugowner": + root.remove(group_element) + for person_element in root.getiterator('person'): + if person_element.get('role') == "bugowner": + root.remove(person_element) if user: root.insert(2, ET.Element('person', role='bugowner', userid=user)) elif group: @@ -6405,10 +6419,10 @@ print_request(request) try: prompt = '(a)ccept/(d)ecline/(r)evoke/c(l)one/(s)kip/(c)ancel > ' - sr_actions = request.get_actions('submit') + editable_actions = request.get_actions('submit', 'maintenance_incident') # actions which have sources + buildresults - src_actions = sr_actions + request.get_actions('maintenance_release', 'maintenance_incident') - if sr_actions: + 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/(s)kip/(c)ancel > ' elif src_actions: # no edit for maintenance release requests @@ -6453,13 +6467,13 @@ for action in src_actions: print('%s/%s:' % (action.src_project, action.src_package)) print('\n'.join(get_results(apiurl, action.src_project, action.src_package))) - elif repl == 'e' and sr_actions: - # this is only for sr_actions + elif repl == 'e' and editable_actions: + # this is only for editable actions if not editprj: editprj = clone_request(apiurl, request.reqid, 'osc editrequest') orequest = request request = edit_submitrequest(apiurl, editprj, orequest, request) - src_actions = sr_actions = request.get_actions('submit') + src_actions = editable_actions = request.get_actions('submit', 'maintenance_incident') print_request(request) prompt = 'd(i)ff/(a)ccept/(b)uildstatus/(e)dit/(s)kip/(c)ancel > ' else: @@ -6728,6 +6742,15 @@ pass return None - +def utime(filename, arg, ignore_einval=True): + """wrapper around os.utime which ignore errno EINVAL by default""" + try: + # workaround for bnc#857610): if filename resides on a nfs share + # os.utime might raise EINVAL + os.utime(filename, arg) + except OSError as e: + if e.errno == errno.EINVAL and ignore_einval: + return + raise # vim: sw=4 et diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/tests/conf_fixtures/oscrc new/osc-0.143.0/tests/conf_fixtures/oscrc --- old/osc-0.142.2/tests/conf_fixtures/oscrc 1970-01-01 01:00:00.000000000 +0100 +++ new/osc-0.143.0/tests/conf_fixtures/oscrc 2014-01-24 10:50:08.000000000 +0100 @@ -0,0 +1,103 @@ +[general] +# URL to access API server, e.g. https://api.opensuse.org +# you also need a section [https://api.opensuse.org] with the credentials +apiurl = http://localhost +# Downloaded packages are cached here. Must be writable by you. +#packagecachedir = /var/tmp/osbuild-packagecache +# Wrapper to call build as root (sudo, su -, ...) +#su-wrapper = su -c +# rootdir to setup the chroot environment +# can contain %(repo)s, %(arch)s, %(project)s and %(package)s for replacement, e.g. +# /srv/oscbuild/%(repo)s-%(arch)s or +# /srv/oscbuild/%(repo)s-%(arch)s-%(project)s-%(package)s +#build-root = /var/tmp/build-root +# compile with N jobs (default: "getconf _NPROCESSORS_ONLN") +#build-jobs = N +# build-type to use - values can be (depending on the capabilities of the 'build' script) +# empty - chroot build +# kvm - kvm VM build (needs build-device, build-swap, build-memory) +# xen - xen VM build (needs build-device, build-swap, build-memory) +# experimental: +# qemu - qemu VM build +# lxc - lxc build +#build-type = +# build-device is the disk-image file to use as root for VM builds +# e.g. /var/tmp/FILE.root +#build-device = /var/tmp/FILE.root +# build-swap is the disk-image to use as swap for VM builds +# e.g. /var/tmp/FILE.swap +#build-swap = /var/tmp/FILE.swap +# build-memory is the amount of memory used in the VM +# value in MB - e.g. 512 +#build-memory = 512 +# build-vmdisk-rootsize is the size of the disk-image used as root in a VM build +# values in MB - e.g. 4096 +#build-vmdisk-rootsize = 4096 +# build-vmdisk-swapsize is the size of the disk-image used as swap in a VM build +# values in MB - e.g. 1024 +#build-vmdisk-swapsize = 1024 +# Numeric uid:gid to assign to the "abuild" user in the build-root +# or "caller" to use the current users uid:gid +# This is convenient when sharing the buildroot with ordinary userids +# on the host. +# This should not be 0 +# build-uid = +# extra packages to install when building packages locally (osc build) +# this corresponds to osc build's -x option and can be overridden with that +# -x '' can also be given on the command line to override this setting, or +# you can have an empty setting here. +#extra-pkgs = vim gdb strace +# build platform is used if the platform argument is omitted to osc build +#build_repository = openSUSE_Factory +# default project for getpac or bco +#getpac_default_project = openSUSE:Factory +# alternate filesystem layout: have multiple subdirs, where colons were. +#checkout_no_colon = 0 +# local files to ignore with status, addremove, .... +#exclude_glob = .osc CVS .svn .* _linkerror *~ #*# *.orig *.bak *.changes.* +# keep passwords in plaintext. If you see this comment, your osc +# already uses the encrypted password, and only keeps them in plain text +# for backwards compatibility. Default will change to 0 in future releases. +# You can remove the plaintext password without harm, if you do not need +# backwards compatibility. +#plaintext_passwd = 1 +# 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. +#request_list_days = 0 +# show info useful for debugging +#debug = 1 +# show HTTP traffic useful for debugging +#http_debug = 1 +# Skip signature verification of packages used for build. +#no_verify = 1 +# jump into the debugger in case of errors +#post_mortem = 1 +# print call traces in case of errors +#traceback = 1 +# use KDE/Gnome/MacOS/Windows keyring for credentials if available +#use_keyring = 1 +# check for unversioned/removed files before commit +#check_filelist = 1 +# check for pending requests after executing an action (e.g. checkout, update, commit) +#check_for_request_on_action = 0 +# what to do with the source package if the submitrequest has been accepted. If +# nothing is specified the API default is used +#submitrequest_on_accept_action = cleanup|update|noupdate +#review requests interactively (default: off) +#request_show_review = 1 +# Directory with executables to validate sources, esp before committing +#source_validator_directory = /usr/lib/osc/source_validators + +[http://localhost] +user=Admin +pass=opensuse +# set aliases for this apiurl +# aliases = foo, bar +# email used in .changes, unless the one from osc meta prj <user> will be used +# email = +# additional headers to pass to a request, e.g. for special authentication +#http_headers = Host: foofoobar, +# User: mumblegack +# Force using of keyring for this API +#keyring = 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/tests/suite.py new/osc-0.143.0/tests/suite.py --- old/osc-0.142.2/tests/suite.py 2013-12-04 09:26:09.000000000 +0100 +++ new/osc-0.143.0/tests/suite.py 2014-01-24 10:50:08.000000000 +0100 @@ -22,6 +22,7 @@ import test_request import test_setlinkrev import test_prdiff +import test_conf suite = unittest.TestSuite() suite.addTests(test_addfiles.suite()) @@ -38,6 +39,7 @@ suite.addTests(test_request.suite()) suite.addTests(test_setlinkrev.suite()) suite.addTests(test_prdiff.suite()) +suite.addTests(test_conf.suite()) if have_xmlrunner: result = xmlrunner.XMLTestRunner(output=os.path.join(os.getcwd(), 'junit-xml-results')).run(suite) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/tests/test_commit.py new/osc-0.143.0/tests/test_commit.py --- old/osc-0.142.2/tests/test_commit.py 2013-12-04 09:26:09.000000000 +0100 +++ new/osc-0.143.0/tests/test_commit.py 2014-01-24 10:50:08.000000000 +0100 @@ -2,6 +2,7 @@ import osc.oscerr import os import sys +import urllib2 from common import GET, PUT, POST, DELETE, OscTestCase from xml.etree import cElementTree as ET FIXTURES_DIR = os.path.join(os.getcwd(), 'commit_fixtures') @@ -287,6 +288,25 @@ self._check_status(p, 'add', '!') self._check_status(p, 'bar', ' ') + @GET('http://localhost/source/osctest/simple?rev=latest', file='testSimple_filesremote') + @POST('http://localhost/source/osctest/simple?cmd=getprojectservices', + exp='', text='<services />') + @POST('http://localhost/source/osctest/simple?comment=&cmd=commitfilelist&user=Admin', + file='testSimple_missingfilelist', expfile='testSimple_lfilelist') + @PUT('http://localhost/source/osctest/simple/nochange?rev=repository', + exp='This file didn\'t change but\nis modified.\n', text=rev_dummy) + @POST('http://localhost/source/osctest/simple?comment=&cmd=commitfilelist&user=Admin', + expfile='testSimple_lfilelist', text='an error occured', code=500) + def test_commitfilelist_error(self): + """commit modified file but when committing the filelist the server returns status 500 (see ticket #65)""" + self._change_to_pkg('simple') + p = osc.core.Package('.') + self._check_status(p, 'nochange', 'M') + self.assertRaises(urllib2.HTTPError, p.commit) + exp = 'Sending nochange\nTransmitting file data .' + self.assertEqual(sys.stdout.getvalue(), exp) + self._check_status(p, 'nochange', 'M') + if __name__ == '__main__': import unittest unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.142.2/tests/test_conf.py new/osc-0.143.0/tests/test_conf.py --- old/osc-0.142.2/tests/test_conf.py 1970-01-01 01:00:00.000000000 +0100 +++ new/osc-0.143.0/tests/test_conf.py 2014-01-24 10:50:08.000000000 +0100 @@ -0,0 +1,32 @@ +from osc.conf import passx_encode, passx_decode +from common import OscTestCase + +import os + +FIXTURES_DIR = os.path.join(os.getcwd(), 'conf_fixtures') + +def suite(): + import unittest + return unittest.makeSuite(TestConf) + +class TestConf(OscTestCase): + def _get_fixtures_dir(self): + return FIXTURES_DIR + + def setUp(self): + return super(TestConf, self).setUp(copytree=False) + + def testPassxEncodeDecode(self): + + passwd = "J0e'sPassword!@#" + passx = passx_encode(passwd) + #base64.b64encode(passwd.encode('bz2')) + passx27 = "QlpoOTFBWSZTWaDg4dQAAAKfgCiAQABAEEAAJgCYgCAAMQAACEyYmTyei67AsYSDSaLuSKcKEhQcHDqA" + + self.assertEqual(passwd, passx_decode(passx)) + self.assertEqual(passwd, passx_decode(passx27)) + self.assertEqual(passx, passx27) + +if __name__ == '__main__': + import unittest + unittest.main() ++++++ osc.dsc ++++++ --- /var/tmp/diff_new_pack.L1RbIo/_old 2014-01-30 11:37:08.000000000 +0100 +++ /var/tmp/diff_new_pack.L1RbIo/_new 2014-01-30 11:37:08.000000000 +0100 @@ -1,6 +1,6 @@ Format: 1.0 Source: osc -Version: 0.142.2 +Version: 0.143.0 Binary: osc Maintainer: Adrian Schroeter <[email protected]> Architecture: any -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
