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 - adrian@suse.de
+
+- 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