Hello community,
here is the log from the commit of package osc for openSUSE:Factory
checked in at Mon Jul 19 21:08:29 CEST 2010.
--------
--- osc/osc.changes 2010-06-09 12:57:24.000000000 +0200
+++ /mounts/work_src_done/STABLE/osc/osc.changes 2010-07-16 15:56:53.000000000 +0200
@@ -1,0 +2,17 @@
+Fri Jul 16 13:38:12 UTC 2010 - adrian@suse.de
+
+- update to 0.128
+ - better default commands selection for editor/pager
+ - support "osc rq reopen" to set a request in new state again
+ - "osc repos" and "wipebinaries" is checking for local project now
+ - "osc getbinaries" works in project dir now
+ - support added for SPARC builds
+ - support build --oldpackages
+ - introduced the "trusted projects"
+ - Fixes for default editor, api check on deleterequest call, tempfile leaks, getbinaries source package handling, results command
+#
+# Feature which require either OBS 2.1 or 2.0.4
+#
+ - add osc signkey --extend for extending the expiration date of the gpg public key
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
Old:
----
osc-0.127.tar.gz
New:
----
osc-0.128.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ osc.spec ++++++
--- /var/tmp/diff_new_pack.KsUPhJ/_old 2010-07-19 21:08:00.000000000 +0200
+++ /var/tmp/diff_new_pack.KsUPhJ/_new 2010-07-19 21:08:00.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package osc (Version 0.127)
+# spec file for package osc (Version 0.128)
#
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@@ -18,7 +18,7 @@
Name: osc
-Version: 0.127
+Version: 0.128
Release: 1
Group: Development/Tools/Other
License: GPLv2+
++++++ debian.changelog ++++++
--- /var/tmp/diff_new_pack.KsUPhJ/_old 2010-07-19 21:08:00.000000000 +0200
+++ /var/tmp/diff_new_pack.KsUPhJ/_new 2010-07-19 21:08:00.000000000 +0200
@@ -1,3 +1,13 @@
+osc (0.128-1) unstable; urgency=low
+ - Update to 0.128
+
+ -- Adrian Schroeter Fr, 16 Jul 2010 15:56:00 +0200
+
+osc (0.127-1) unstable; urgency=low
+ - Update to 0.127
+
+ -- Adrian Schroeter Tu, 22 Jun 2010 10:00:00 +0200
+
osc (0.125.4-3) unstable; urgency=low
* Fix dependency on python-celementtree, it is included in python2.5.
++++++ osc-0.127.tar.gz -> osc-0.128.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/NEWS new/osc-0.128/NEWS
--- old/osc-0.127/NEWS 2010-05-25 12:07:33.000000000 +0200
+++ new/osc-0.128/NEWS 2010-07-16 15:36:34.000000000 +0200
@@ -1,3 +1,17 @@
+0.128
+ - better default commands selection for editor/pager
+ - support "osc rq reopen" to set a request in new state again
+ - "osc repos" and "wipebinaries" is checking for local project now
+ - "osc getbinaries" works in project dir now
+ - support added for SPARC builds
+ - support build --oldpackages
+ - introduced the "trusted projects"
+ - Fixes for default editor, api check on deleterequest call, tempfile leaks, getbinaries source package handling, results command
+#
+# Feature which require either OBS 2.1 or 2.0.4
+#
+ - add osc signkey --extend for extending the expiration date of the gpg public key
+
0.127
- add size limit mode, files can be ignored on checkout or update given a certain size limit.
- --csv/--format options for results command - using format user can explicitly specify what he wants print
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/TODO new/osc-0.128/TODO
--- old/osc-0.127/TODO 2010-03-31 17:41:24.000000000 +0200
+++ new/osc-0.128/TODO 2010-07-16 15:36:34.000000000 +0200
@@ -64,6 +64,7 @@
JW:
+FIXME: osc bco ignores --nodevelproject ??
FIXME: osc co overwrites local changes without warning.
FIXME: when branching, the user should be added to bugowner, for the branch project.
FIXME: 'osc rq' shall default to 'osc rq list -M -B -s all',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/osc/OscConfigParser.py new/osc-0.128/osc/OscConfigParser.py
--- old/osc-0.127/osc/OscConfigParser.py 2010-03-02 08:47:14.000000000 +0100
+++ new/osc-0.128/osc/OscConfigParser.py 2010-07-16 15:36:34.000000000 +0200
@@ -317,15 +317,20 @@
# XXX: simplify!
def __str__(self):
ret = []
+ first = True
for line in self._sections._lines:
if line.type == 'section':
+ if first:
+ first = False
+ else:
+ ret.append('')
ret.append('[%s]' % line.name)
for sline in line._lines:
if sline.name == '__name__':
continue
if sline.type == 'option':
ret.append(sline.frmt % (sline.name, sline.value))
- else:
+ elif str(sline) != '':
ret.append(str(sline))
else:
ret.append(str(line))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/osc/babysitter.py new/osc-0.128/osc/babysitter.py
--- old/osc-0.127/osc/babysitter.py 2010-05-14 16:45:58.000000000 +0200
+++ new/osc-0.128/osc/babysitter.py 2010-07-16 15:36:34.000000000 +0200
@@ -104,7 +104,11 @@
if hasattr(e, 'osc_msg'):
print >>sys.stderr, e.osc_msg
- body = e.read()
+ try:
+ body = e.read()
+ except AttributeError:
+ body = ''
+
if getattr(prg.options, 'debug', None) or \
getattr(prg.conf, 'config', {}).get('debug', None):
print >>sys.stderr, e.hdrs
@@ -137,6 +141,10 @@
print >>sys.stderr, e
return 2
+ except oscerr.RuntimeError, e:
+ print >>sys.stderr, e.msg
+ return 1
+
except oscerr.WorkingCopyOutdated, e:
print >>sys.stderr, e
return 1
@@ -165,10 +173,6 @@
print >>sys.stderr, e
return 1
- except OSError, e:
- print >>sys.stderr, e
- return 1
-
except CpioError, e:
print >>sys.stderr, e
return 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/osc/build.py new/osc-0.128/osc/build.py
--- old/osc-0.127/osc/build.py 2010-05-08 08:04:55.000000000 +0200
+++ new/osc-0.128/osc/build.py 2010-07-16 15:36:34.000000000 +0200
@@ -8,10 +8,11 @@
import os
import re
import sys
-from tempfile import NamedTemporaryFile
-from shutil import rmtree
+import shutil
+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
+from osc.core import get_binarylist, get_binary_file
from osc.util import rpmquery, debquery
import osc.conf
import oscerr
@@ -29,6 +30,8 @@
'i386': 'linux32',
'ppc': 'powerpc32',
's390': 's390',
+ 'sparc': 'linux32',
+ 'sparcv8': 'linux32',
}
can_also_build = {
@@ -47,6 +50,7 @@
'i586': [ 'i386', 'ppc', 'ppc64', 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el', 'sh4', 'mips', 'mips64' ],
'i686': [ 'i586', 'ppc', 'ppc64', 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el', 'sh4', 'mips', 'mips64' ],
'x86_64': ['i686', 'i586', 'i386', 'ppc', 'ppc64', 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el', 'sh4', 'mips', 'mips64' ],
+ 'sparc64': ['sparc64v', 'sparcv9v', 'sparcv9', 'sparcv8', 'sparc'],
}
# real arch of this machine
@@ -54,7 +58,6 @@
if hostarch == 'i686': # FIXME
hostarch = 'i586'
-
class Buildinfo:
"""represent the contents of a buildinfo file"""
@@ -318,13 +321,38 @@
return depfile
-def main(opts, argv):
+trustprompt = """Would you like to ...
+0 - quit (default)
+1 - trust packages from '%(project)s' always
+2 - trust them just this time
+? """
+def check_trusted_projects(apiurl, projects):
+ trusted = config['api_host_options'][apiurl]['trusted_prj']
+ tlen = len(trusted)
+ for prj in projects:
+ if not prj in trusted:
+ print "\nThe build root needs packages from project '%s'." % prj
+ print "Note that malicious packages can compromise the build result or even your system."
+ r = raw_input(trustprompt % { 'project':prj })
+ if r == '1':
+ print "adding '%s' to ~/.oscrc: ['%s']['trusted_prj']" % (prj,apiurl)
+ trusted.append(prj)
+ elif r != '2':
+ print "Well, good good bye then :-)"
+ raise oscerr.UserAbort()
+
+ if tlen != len(trusted):
+ config['api_host_options'][apiurl]['trusted_prj'] = trusted
+ conf.config_set_option(apiurl, 'trusted_prj', ' '.join(trusted))
+
+def main(apiurl, opts, argv):
repo = argv[0]
arch = argv[1]
build_descr = argv[2]
xp = []
build_root = None
+ build_uid=''
vm_type = config['build-type']
build_descr = os.path.abspath(build_descr)
@@ -378,7 +406,9 @@
if opts.without:
for o in opts.without:
buildargs.append('--without %s' % o)
- build_uid=''
+# FIXME: quoting
+# if opts.define:
+# buildargs.append('--define "%s"' % opts.define)
if config['build-uid']:
build_uid = config['build-uid']
if opts.build_uid:
@@ -392,9 +422,6 @@
else:
print >>sys.stderr, 'Error: build-uid arg must be 2 colon separated numerics: "uid:gid" or "caller"'
return 1
-# FIXME: quoting
-# if opts.define:
-# buildargs.append('--define "%s"' % opts.define)
if opts.vm_type:
vm_type = opts.vm_type
if opts.alternative_project:
@@ -406,7 +433,6 @@
pac = '_repository'
else:
pac = store_read_package(os.curdir)
- apiurl = store_read_apiurl(os.curdir)
# make it possible to override configuration of the rc file
for var in ['OSC_PACKAGECACHEDIR', 'OSC_SU_WRAPPER', 'OSC_BUILD_ROOT']:
@@ -568,8 +594,6 @@
if bi.release:
buildargs.append('--release %s' % bi.release)
- buildargs = ' '.join(buildargs)
-
# real arch of this machine
# vs.
# arch we are supposed to build for
@@ -591,7 +615,6 @@
bi.remove_dep(name)
rpmlist_prefers.append((name, path))
print ' - %s (%s)' % (name, path)
- continue
print 'Updating cache of required packages'
@@ -619,15 +642,83 @@
enable_cpio = opts.cpio_bulk_download,
cookiejar=cookiejar)
+ # implicitly trust the project we are building for
+ check_trusted_projects(apiurl, [ i for i in bi.projects.keys() if not i == prj ])
+
# now update the package cache
fetcher.run(bi)
+ old_pkg_dir = None
+ if opts.oldpackages:
+ old_pkg_dir = opts.oldpackages
+ if not old_pkg_dir.startswith('/') and not opts.offline:
+ data = [ prj, pacname, repo, arch]
+ if old_pkg_dir == '_link':
+ p = osc.core.findpacs(os.curdir)[0]
+ if not p.islink():
+ raise oscerr.WrongOptions('package is not a link')
+ data[0] = p.linkinfo.project
+ data[1] = p.linkinfo.package
+ repos = osc.core.get_repositories_of_project(apiurl, data[0])
+ # hack for links to e.g. Factory
+ if not data[2] in repos and 'standard' in repos:
+ data[2] = 'standard'
+ elif old_pkg_dir != '' and old_pkg_dir != '_self':
+ a = old_pkg_dir.split('/')
+ for i in range(0, len(a)):
+ data[i] = a[i]
+
+ destdir = os.path.join(config['packagecachedir'], data[0], data[2], data[3])
+ old_pkg_dir = None
+ try:
+ print "Downloading previous build from %s ..." % '/'.join(data)
+ binaries = get_binarylist(apiurl, data[0], data[2], data[3], package=data[1], verbose=True)
+ except Exception, e:
+ print "Error: failed to get binaries: %s" % str(e)
+ binaries = []
+
+ if binaries:
+ class mytmpdir:
+ """ temporary directory that removes itself"""
+ def __init__(self, *args, **kwargs):
+ self.name = mkdtemp(*args, **kwargs)
+ def cleanup(self):
+ shutil.rmtree(self.name)
+ def __del__(self):
+ self.cleanup()
+ def __exit__(self):
+ self.cleanup()
+ def __str__(self):
+ return self.name
+
+ old_pkg_dir = mytmpdir(prefix='.build.oldpackages', dir=os.path.abspath(os.curdir))
+ if not os.path.exists(destdir):
+ os.makedirs(destdir)
+ for i in binaries:
+ fname = os.path.join(destdir, i.name)
+ os.symlink(fname, os.path.join(str(old_pkg_dir), i.name))
+ if os.path.exists(fname):
+ st = os.stat(fname)
+ if st.st_mtime == i.mtime and st.st_size == i.size:
+ continue
+ get_binary_file(apiurl,
+ data[0],
+ data[2], data[3],
+ i.name,
+ package = data[1],
+ target_filename = fname,
+ target_mtime = i.mtime,
+ progress_meter = True)
+
+ if old_pkg_dir != None:
+ buildargs.append('--oldpackages %s' % old_pkg_dir)
+
# Make packages from buildinfo available as repos for kiwi
if build_type == 'kiwi':
if not os.path.exists('repos'):
os.mkdir('repos')
else:
- rmtree('repos')
+ shutil.rmtree('repos')
os.mkdir('repos')
for i in bi.deps:
# project
@@ -654,27 +745,12 @@
os.symlink(sffn, tffn)
if bi.pacsuffix == 'rpm':
- if vm_type == "xen" or vm_type == "kvm" or vm_type == "lxc":
- print 'Skipping verification of package signatures due to secure VM build'
- elif opts.no_verify or opts.noinit or opts.offline:
+ if opts.no_verify:
print 'Skipping verification of package signatures'
else:
print 'Verifying integrity of cached packages'
- t = config['api_host_options'][apiurl]['trusted_prj']
- for prj in bi.prjkeys:
- if not prj in t:
- print "\nYou are trying to use packages from project '%s'." % prj
- print "Note that malicious packages can compromise your system when using chroot build enviroment."
- print "Use kvm or xen builds for a safe enviroment."
-# saving back to config file is complicated
-# r = raw_input("Would you like to trust '%s' (a)lways, (t)emorarily or (N)ever? " % prj)
-# if r == 'a':
-# config['api_host_options'][apiurl]['trusted_prj'] += prj
-# elif r != 't':
-# print "Well, good good bye then :-)"
-# sys.exit(1)
-
verify_pacs([ i.fullfilename for i in bi.deps ], bi.keys)
+
elif bi.pacsuffix == 'deb':
if vm_type == "xen" or vm_type == "kvm" or vm_type == "lxc":
print 'Skipping verification of package signatures due to secure VM build'
@@ -751,7 +827,7 @@
specialcmdopts,
bi.buildarch,
vm_options,
- buildargs,
+ ' '.join(buildargs),
build_descr)
if need_root:
@@ -787,7 +863,6 @@
if opts.keep_pkgs:
for i in b_built.splitlines() + s_built.splitlines():
- import shutil
shutil.copy2(i, os.path.join(opts.keep_pkgs, os.path.basename(i)))
if bi_file:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/osc/commandline.py new/osc-0.128/osc/commandline.py
--- old/osc-0.127/osc/commandline.py 2010-06-09 12:54:10.000000000 +0200
+++ new/osc-0.128/osc/commandline.py 2010-07-16 15:57:28.000000000 +0200
@@ -499,6 +499,8 @@
cmd = args[0]
del args[0]
+ apiurl = self.get_api_url()
+
if cmd in ['pkg']:
min_args, max_args = 0, 2
elif cmd in ['pattern']:
@@ -563,24 +565,24 @@
# show
if not opts.edit and not opts.file and not opts.delete and not opts.create and not opts.set:
if cmd == 'prj':
- sys.stdout.write(''.join(show_project_meta(conf.config['apiurl'], project)))
+ sys.stdout.write(''.join(show_project_meta(apiurl, project)))
elif cmd == 'pkg':
- sys.stdout.write(''.join(show_package_meta(conf.config['apiurl'], project, package)))
+ sys.stdout.write(''.join(show_package_meta(apiurl, project, package)))
elif cmd == 'attribute':
- sys.stdout.write(''.join(show_attribute_meta(conf.config['apiurl'], project, package, subpackage, opts.attribute, opts.attribute_defaults, opts.attribute_project)))
+ sys.stdout.write(''.join(show_attribute_meta(apiurl, project, package, subpackage, opts.attribute, opts.attribute_defaults, opts.attribute_project)))
elif cmd == 'prjconf':
- sys.stdout.write(''.join(show_project_conf(conf.config['apiurl'], project)))
+ sys.stdout.write(''.join(show_project_conf(apiurl, project)))
elif cmd == 'user':
- r = get_user_meta(conf.config['apiurl'], user)
+ r = get_user_meta(apiurl, user)
if r:
sys.stdout.write(''.join(r))
elif cmd == 'pattern':
if pattern:
- r = show_pattern_meta(conf.config['apiurl'], project, pattern)
+ r = show_pattern_meta(apiurl, project, pattern)
if r:
sys.stdout.write(''.join(r))
else:
- r = show_pattern_metalist(conf.config['apiurl'], project)
+ r = show_pattern_metalist(apiurl, project)
if r:
sys.stdout.write('\n'.join(r) + '\n')
@@ -590,6 +592,7 @@
edit_meta(metatype='prj',
edit=True,
path_args=quote_plus(project),
+ apiurl=apiurl,
template_args=({
'name': project,
'user': conf.config['user']}))
@@ -597,6 +600,7 @@
edit_meta(metatype='pkg',
edit=True,
path_args=(quote_plus(project), quote_plus(package)),
+ apiurl=apiurl,
template_args=({
'name': package,
'user': conf.config['user']}))
@@ -604,16 +608,19 @@
edit_meta(metatype='prjconf',
edit=True,
path_args=quote_plus(project),
+ apiurl=apiurl,
template_args=None)
elif cmd == 'user':
edit_meta(metatype='user',
edit=True,
path_args=(quote_plus(user)),
+ apiurl=apiurl,
template_args=({'user': user}))
elif cmd == 'pattern':
edit_meta(metatype='pattern',
edit=True,
path_args=(project, pattern),
+ apiurl=apiurl,
template_args=None)
# create attribute entry
@@ -627,7 +634,7 @@
values += '<value>%s</value>' % i
aname = opts.attribute.split(":")
d = '<attributes>%s</attribute></attributes>' % (aname[0], aname[1], values)
- url = makeurl(conf.config['apiurl'], attributepath)
+ url = makeurl(apiurl, attributepath)
for data in streamfile(url, http_POST, data=d):
sys.stdout.write(data)
@@ -646,26 +653,31 @@
edit_meta(metatype='prj',
data=f,
edit=opts.edit,
+ apiurl=apiurl,
path_args=quote_plus(project))
elif cmd == 'pkg':
edit_meta(metatype='pkg',
data=f,
edit=opts.edit,
+ apiurl=apiurl,
path_args=(quote_plus(project), quote_plus(package)))
elif cmd == 'prjconf':
edit_meta(metatype='prjconf',
data=f,
edit=opts.edit,
+ apiurl=apiurl,
path_args=quote_plus(project))
elif cmd == 'user':
edit_meta(metatype='user',
data=f,
edit=opts.edit,
+ apiurl=apiurl,
path_args=(quote_plus(user)))
elif cmd == 'pattern':
edit_meta(metatype='pattern',
data=f,
edit=opts.edit,
+ apiurl=apiurl,
path_args=(project, pattern))
@@ -674,13 +686,13 @@
path = metatypes[cmd]['path']
if cmd == 'pattern':
path = path % (project, pattern)
- u = makeurl(conf.config['apiurl'], [path])
+ u = makeurl(apiurl, [path])
http_DELETE(u)
elif cmd == 'attribute':
if not opts.attribute:
raise oscerr.WrongOptions('no attribute given to create')
attributepath.append(opts.attribute)
- u = makeurl(conf.config['apiurl'], attributepath)
+ u = makeurl(apiurl, attributepath)
for data in streamfile(u, http_DELETE):
sys.stdout.write(data)
else:
@@ -836,7 +848,7 @@
print "Requests created: ",
for i in sr_ids:
print i,
- sys.exit('Successfull finished')
+ sys.exit('Successfully finished')
elif len(args) <= 2:
# try using the working copy at hand
@@ -948,7 +960,7 @@
print 'created request id', result
- def _actionparser(option, opt_str, value, parser):
+ def _actionparser(self, opt_str, value, parser):
value = []
if not hasattr(parser.values, 'actiondata'):
setattr(parser.values, 'actiondata', [])
@@ -1320,28 +1332,45 @@
def do_deleterequest(self, subcmd, opts, *args):
"""${cmd_name}: Create request to delete a package or project
-
usage:
+ osc deletereq [-m TEXT] # works in checked out project/package
osc deletereq [-m TEXT] PROJECT [PACKAGE]
${cmd_option_list}
"""
args = slash_split(args)
+ project = None
+ package = None
+
if len(args) < 1:
- raise oscerr.WrongArgs('Please specify at least a project.')
- if len(args) > 2:
+ if is_project_dir(os.getcwd()):
+ project = store_read_project(os.curdir)
+ elif is_package_dir(os.getcwd()):
+ project = store_read_project(os.curdir)
+ package = store_read_package(os.curdir)
+ else:
+ raise oscerr.WrongArgs('Please specify at least a project.')
+ elif len(args) == 1:
+ project = args[0]
+ elif len(args) > 1:
+ project = args[0]
+ package = args[1]
+ elif len(args) > 2:
raise oscerr.WrongArgs('Too many arguments.')
- apiurl = conf.config['apiurl']
-
- project = args[0]
- package = None
- if len(args) > 1:
- package = args[1]
+ apiurl = self.get_api_url()
if not opts.message:
- opts.message = edit_message()
+ import textwrap
+ if package is not None:
+ footer=textwrap.TextWrapper(width = 66).fill(
+ 'please explain why you like to delete package %s of project %s'
+ % (package,project))
+ else:
+ footer=textwrap.TextWrapper(width = 66).fill(
+ 'please explain why you like to delete project %s' % project)
+ opts.message = edit_message(footer)
result = create_delete_request(apiurl, project, package, opts.message)
print result
@@ -1473,6 +1502,7 @@
osc request log ID
osc request [show] [-d] [-b] ID
osc request accept [-m TEXT] ID
+ osc request reopen [-m TEXT] ID
osc request approvenew [-m TEXT] PROJECT
osc request decline [-m TEXT] ID
osc request revoke [-m TEXT] ID
@@ -1505,7 +1535,7 @@
if opts.state == '':
opts.state = 'new'
- cmds = ['list', 'log', 'show', 'decline', 'accept', 'approvenew', 'wipe', 'revoke', 'checkout', 'co', 'help']
+ cmds = ['list', 'log', 'show', 'decline', 'reopen', 'accept', 'approvenew', 'wipe', 'revoke', 'checkout', 'co', 'help']
if not args or args[0] not in cmds:
raise oscerr.WrongArgs('Unknown request action %s. Choose one of %s.' \
% (args[0],', '.join(cmds)))
@@ -1541,7 +1571,7 @@
if len(args) > 1:
package = args[1]
- elif cmd in ['log', 'show', 'decline', 'accept', 'wipe', 'revoke', 'checkout', 'co']:
+ elif cmd in ['log', 'show', 'decline', 'reopen', 'accept', 'wipe', 'revoke', 'checkout', 'co']:
reqid = args[0]
# list and approvenew
@@ -1609,7 +1639,7 @@
if cmd == 'approvenew':
print "\n *** Approve them all ? [y/n] ***"
if sys.stdin.read(1) == "y":
-
+
if not opts.message:
opts.message = edit_message()
for result in results:
@@ -1667,7 +1697,7 @@
else:
if not opts.message:
opts.message = edit_message()
- state_map = {'accept' : 'accepted', 'decline' : 'declined', 'wipe' : 'deleted', 'revoke' : 'revoked'}
+ state_map = {'reopen' : 'new', 'accept' : 'accepted', 'decline' : 'declined', 'wipe' : 'deleted', 'revoke' : 'revoked'}
# Change review state only
if subcmd == 'review':
if cmd in ['accept', 'decline', 'new']:
@@ -1675,7 +1705,7 @@
reqid, state_map[cmd], conf.config['user'], '', opts.message or '')
print r
# Change state of entire request
- elif cmd in ['accept', 'decline', 'wipe', 'revoke']:
+ elif cmd in ['reopen', 'accept', 'decline', 'wipe', 'revoke']:
r = change_request_state(conf.config['apiurl'],
reqid, state_map[cmd], opts.message or '')
print r
@@ -2800,7 +2830,7 @@
if opts.skip_validation:
validators = None
elif not os.path.exists(validators):
- print "WARNING: validator directory", validators, "configured, but not existing. Skipping ..."
+ print "WARNING: validator directory", validators, "configured, but not existing (please install osc-source_validator). Skipping ..."
validators = None
if opts.verbose_validation:
verbose_validation = 1
@@ -3194,6 +3224,8 @@
help='Show results only for specified repo(s)')
@cmdln.option('-a', '--arch', action='append', default = [],
help='Show results only for specified architecture(s)')
+ @cmdln.option('-v', '--verbose', action='store_true', default=False,
+ help='more verbose output')
@cmdln.option('', '--xml', action='store_true', default=False,
help='generate output in XML (former results_meta)')
@cmdln.option('', '--csv', action='store_true', default=False,
@@ -3217,8 +3249,10 @@
wd = os.curdir
if is_project_dir(wd):
opts.csv = None
- opts.arch = None
- opts.repo = 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
@@ -3239,19 +3273,14 @@
if opts.xml and opts.csv:
raise oscerr.WrongOptions("--xml and --csv are mutual exclusive")
+ args = [ apiurl, project, package, opts.last_build, opts.repo, opts.arch ]
if opts.xml:
- func = show_results_meta
- delim = ''
+ return show_results_meta(*args)
elif opts.csv:
- def _func(*args):
- return format_results(get_package_results(*args), opts.format)
- func = _func
- delim = '\n'
+ return '\n'.join(format_results(get_package_results(*args), opts.format))
else:
- func = get_results
- delim = '\n'
-
- print delim.join(func(apiurl, project, package, opts.last_build, opts.repo, opts.arch))
+ args.append(opts.verbose)
+ return '\n'.join(get_results(*args))
# WARNING: this function is also called by do_results. You need to set a default there
# as well when adding a new option!
@@ -3708,27 +3737,41 @@
def do_repos(self, subcmd, opts, *args):
- """${cmd_name}: shows repositories configured for a project
+ """${cmd_name}: shows repositories configured for a project or package
usage:
osc repos
- osc repos [PROJECT]
+ osc repos [PROJECT] [PACKAGE]
${cmd_option_list}
"""
apiurl = self.get_api_url()
+ package = None
+ disabled = None
if len(args) == 1:
project = args[0]
+ elif len(args) == 1:
+ project = args[0]
+ package = args[1]
elif len(args) == 0:
- project = store_read_project('.')
+ if is_package_dir('.'):
+ package = store_read_package('.')
+ project = store_read_project('.')
+ elif is_project_dir('.'):
+ project = store_read_project('.')
else:
raise oscerr.WrongArgs('Wrong number of arguments')
+ if package is not None:
+ disabled = show_package_disabled_repos(apiurl, project, package)
+
data = []
for repo in get_repos_of_project(apiurl, project):
- data += [repo.name, repo.arch]
+ if (disabled is None) or ((disabled is not None) and (repo.name not in disabled)):
+ data += [repo.name, repo.arch]
+
for row in build_table(2, data, width=2):
print row
@@ -3765,7 +3808,8 @@
f.close()
else:
project = alternative_project or store_read_project('.')
- repositories = get_repositories_of_project(store_read_apiurl('.'), project)
+ apiurl = self.get_api_url()
+ repositories = get_repositories_of_project(apiurl, project)
if not len(repositories):
raise oscerr.WrongArgs('no repositories defined for project \'%s\'' % project)
try:
@@ -3890,6 +3934,8 @@
help='enable downloading packages as cpio archive from api')
@cmdln.option('--download-api-only', action='store_true',
help=SUPPRESS_HELP)
+ @cmdln.option('--oldpackages', metavar='DIR',
+ help='take previous build from DIR (special values: _self, _link)')
def do_build(self, subcmd, opts, *args):
"""${cmd_name}: Build a package on your local machine
@@ -3967,7 +4013,7 @@
raise oscerr.WrongOptions('--offline and --preload are mutually exclusive')
print 'Building %s for %s/%s' % (args[2], args[0], args[1])
- return osc.build.main(opts, args)
+ return osc.build.main(self.get_api_url(), opts, args)
@cmdln.option('--local-package', action='store_true',
@@ -4294,21 +4340,34 @@
otherwise all binary packages in the project will be deleted.
usage:
+ osc wipebinaries OPTS # works in checked out project dir
osc wipebinaries OPTS PROJECT [PACKAGE]
${cmd_option_list}
"""
args = slash_split(args)
+ package = project = None
+ apiurl = self.get_api_url()
+
+ # try to get project and package from checked out dirs
if len(args) < 1:
- raise oscerr.WrongArgs('Missing <project> argument.')
+ if is_project_dir(os.getcwd()):
+ project = store_read_project(os.curdir)
+ if is_package_dir(os.getcwd()):
+ project = store_read_project(os.curdir)
+ package = store_read_package(os.curdir)
+ if project is None:
+ raise oscerr.WrongArgs('Missing <project> argument.')
if len(args) > 2:
raise oscerr.WrongArgs('Wrong number of arguments.')
+ # respect given project and package
+ if len(args) >= 1:
+ project = args[0]
+
if len(args) == 2:
- package = args[1]
- else:
- package = None
+ package = args[1]
codes = []
if opts.build_disabled:
@@ -4327,7 +4386,7 @@
# make a new request for each code= parameter
for code in codes:
- print wipebinaries(conf.config['apiurl'], args[0], package, opts.arch, opts.repo, code)
+ print wipebinaries(apiurl, project, package, opts.arch, opts.repo, code)
@cmdln.option('-q', '--quiet', action='store_true',
@@ -4344,8 +4403,8 @@
others even when they are not "published" yet.
usage:
- osc getbinaries REPOSITORY # works in checked out package (check out all archs in subdirs)
- osc getbinaries REPOSITORY ARCHITECTURE # works in checked out package
+ osc getbinaries REPOSITORY # works in checked out project/package (check out all archs in subdirs)
+ osc getbinaries REPOSITORY ARCHITECTURE # works in checked out project/package
osc getbinaries PROJECT PACKAGE REPOSITORY ARCHITECTURE
${cmd_option_list}
"""
@@ -4353,8 +4412,12 @@
args = slash_split(args)
apiurl = self.get_api_url()
+ package = None
+ project = None
if len(args) < 1 and is_package_dir('.'):
+ project = store_read_project(os.curdir)
+ package = store_read_package(os.curdir)
self.print_repos()
architecture = None
@@ -4364,11 +4427,14 @@
repository = args[2]
architecture = args[3]
elif len(args) <= 2:
- if not is_package_dir(os.getcwd()):
+ if is_package_dir(os.getcwd()):
+ project = store_read_project(os.curdir)
+ package = store_read_package(os.curdir)
+ elif is_project_dir(os.getcwd()):
+ project = store_read_project(os.curdir)
+ else:
raise oscerr.WrongArgs('Missing arguments: either specify <project> and ' \
- '<package> or move to a package working copy')
- project = store_read_project(os.curdir)
- package = store_read_package(os.curdir)
+ '<package> or move to a project or package working copy')
repository = args[0]
if len(args) == 2:
architecture = args[1]
@@ -4379,36 +4445,46 @@
arches = [architecture]
if architecture is None:
arches = [i.arch for i in get_repos_of_project(apiurl, project) if repository == i.name]
+
+ if package is None:
+ package = meta_get_packagelist(apiurl, project)
+ else:
+ package = [package]
+
for arch in arches:
- binaries = get_binarylist(apiurl, project, repository, arch,
- package=package, verbose=True)
- if not binaries:
- print >>sys.stderr, 'no binaries found: Either the package ' \
- 'does not exist or no binaries have been built.'
- continue
- target_dir = opts.destdir
- if architecture is None:
- # we're going to fetch all repo arches
- target_dir = '%s/%s' % (opts.destdir, arch)
- target_dir = os.path.normpath(target_dir)
- if not os.path.isdir(target_dir):
- print 'Creating %s' % target_dir
- os.makedirs(target_dir, 0755)
-
- for i in binaries:
- fname = '%s/%s' % (target_dir, i.name)
- if os.path.exists(fname):
- st = os.stat(fname)
- if st.st_mtime == i.mtime and st.st_size == i.size:
- continue
- get_binary_file(apiurl,
- project,
- repository, arch,
- i.name,
- package = package,
- target_filename = fname,
- target_mtime = i.mtime,
- progress_meter = not opts.quiet)
+ for pac in package:
+ binaries = get_binarylist(apiurl, project, repository, arch,
+ package=pac, verbose=True)
+ if not binaries:
+ print >>sys.stderr, 'no binaries found: Either the package %s ' \
+ 'does not exist or no binaries have been built.' % pac
+ continue
+ target_dir = opts.destdir
+ if architecture is None:
+ # we're going to fetch all repo arches
+ target_dir = '%s/%s' % (opts.destdir, arch)
+ target_dir = os.path.normpath(target_dir)
+ if not os.path.isdir(target_dir):
+ print 'Creating %s' % target_dir
+ os.makedirs(target_dir, 0755)
+
+ for i in binaries:
+ # skip source rpms
+ if not opts.sources and i.name.endswith('.src.rpm'):
+ continue
+ fname = '%s/%s' % (target_dir, i.name)
+ if os.path.exists(fname):
+ st = os.stat(fname)
+ if st.st_mtime == i.mtime and st.st_size == i.size:
+ continue
+ get_binary_file(apiurl,
+ project,
+ repository, arch,
+ i.name,
+ package = pac,
+ target_filename = fname,
+ target_mtime = i.mtime,
+ progress_meter = not opts.quiet)
@cmdln.option('-b', '--bugowner', action='store_true',
@@ -4423,6 +4499,8 @@
help='exclude requests for specified project')
@cmdln.option('-v', '--verbose', action='store_true',
help='verbose listing')
+ @cmdln.option('--maintained', action='store_true',
+ help='limit search results to packages with maintained attribute set.')
def do_my(self, subcmd, opts, type):
"""${cmd_name}: show packages, projects or requests involving yourself
@@ -4494,7 +4572,7 @@
role_filter = ''
res = get_user_projpkgs(apiurl, user, role_filter,
- exclude_projects, what.has_key('project'), what.has_key('package'))
+ exclude_projects, what.has_key('project'), what.has_key('package'), opts.maintained)
request_todo = {}
roles = {}
if len(what.keys()) == 2:
@@ -5438,6 +5516,8 @@
@cmdln.option('--create', action='store_true', default=False,
help='create new gpg signing key for this project')
+ @cmdln.option('--extend', action='store_true', default=False,
+ help='extend expiration date of the gpg public key for this project')
@cmdln.option('--delete', action='store_true', default=False,
help='delete the gpg signing key in this project')
@cmdln.option('--notraverse', action='store_true', default=False,
@@ -5445,7 +5525,7 @@
def do_signkey(self, subcmd, opts, *args):
"""${cmd_name}: Manage Project Signing Key
- osc signkey [--create|--delete] <PROJECT>
+ osc signkey [--create|--delete|--extend] <PROJECT>
osc signkey [--notraverse] <PROJECT>
This command is for managing gpg keys. It shows the public key
@@ -5482,6 +5562,9 @@
if opts.create:
url = makeurl(apiurl, ['source', prj], query='cmd=createkey')
f = http_POST(url)
+ elif opts.extend:
+ url = makeurl(apiurl, ['source', prj], query='cmd=extendkey')
+ f = http_POST(url)
elif opts.delete:
url = makeurl(apiurl, ['source', prj, "_pubkey"])
f = http_DELETE(url)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/osc/conf.py new/osc-0.128/osc/conf.py
--- old/osc-0.127/osc/conf.py 2010-05-20 11:02:56.000000000 +0200
+++ new/osc-0.128/osc/conf.py 2010-07-16 15:57:28.000000000 +0200
@@ -101,7 +101,7 @@
'checkout_no_colon': '0',
# local files to ignore with status, addremove, ....
# local files to ignore with status, addremove, ....
- 'exclude_glob': '.osc CVS .svn .* _linkerror *~ #*# *.orig *.bak',
+ '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.
@@ -466,8 +466,22 @@
cp = get_configParser(config['conffile'])
# don't allow "internal" options
general_opts = [i for i in DEFAULTS.keys() if not i in ['user', 'pass', 'passx']]
- section = config['apiurl_aliases'].get(section, section)
- sections = dict([[i.rstrip('/'), i] for i in cp.sections()])
+ if section != 'general':
+ section = config['apiurl_aliases'].get(section, section)
+ scheme, host = \
+ parse_apisrv_url(config.get('scheme', 'https'), section)
+ section = urljoin(scheme, host)
+
+ sections = {}
+ for url in cp.sections():
+ if url == 'general':
+ sections[url] = url
+ else:
+ scheme, host = \
+ parse_apisrv_url(config.get('scheme', 'https'), url)
+ apiurl = urljoin(scheme, host)
+ sections[apiurl] = url
+
section = sections.get(section.rstrip('/'), section)
if not section in cp.sections():
raise oscerr.ConfigError('unknown section \'%s\'' % section, config['conffile'])
@@ -722,7 +736,7 @@
api_host_options[apiurl]['sslcertck'] = True
if cp.has_option(url, 'trusted_prj'):
- api_host_options[apiurl]['trusted_prj'] = cp.get(url, key).split(' ')
+ api_host_options[apiurl]['trusted_prj'] = cp.get(url, 'trusted_prj').split(' ')
else:
api_host_options[apiurl]['trusted_prj'] = []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osc-0.127/osc/core.py new/osc-0.128/osc/core.py
--- old/osc-0.127/osc/core.py 2010-06-09 12:59:27.000000000 +0200
+++ new/osc-0.128/osc/core.py 2010-07-16 15:36:34.000000000 +0200
@@ -3,7 +3,7 @@
# and distributed under the terms of the GNU General Public Licence,
# either version 2, or version 3 (at your option).
-__version__ = '0.127'
+__version__ = '0.128'
# __store_version__ is to be incremented when the format of the working copy
# "store" changes in an incompatible way. Please add any needed migration
@@ -1344,9 +1344,9 @@
sys.exit(1)
data = read_meta_from_spec(specfile, 'Summary', 'Url', '%description')
- self.summary = data['Summary']
- self.url = data['Url']
- self.descr = data['%description']
+ self.summary = data.get('Summary', '')
+ self.url = data.get('Url', '')
+ self.descr = data.get('%description', '')
def update_package_meta(self, force=False):
@@ -2263,8 +2263,8 @@
if meta:
query['meta'] = 1
- # packages like _project, _pattern and _project do not have a _meta file
- if pac.startswith('_'):
+ # packages like _pattern and _project do not have a _meta file
+ if pac.startswith('_pattern') or pac.startswith('_project'):
return ""
url = makeurl(apiurl, ['source', prj, pac, '_meta'], query)
@@ -2309,6 +2309,17 @@
return None
+def show_package_disabled_repos(apiurl, prj, pac):
+ m = show_package_meta(apiurl, prj, pac)
+ try:
+ root = ET.fromstring(''.join(m))
+ elm = root.find('build')
+ r = [ node.get('repository') for node in elm.findall('disable')]
+ return r
+ except:
+ return None
+
+
def show_pattern_metalist(apiurl, prj):
url = makeurl(apiurl, ['source', prj, '_pattern'])
try:
@@ -2564,18 +2575,12 @@
m = re.compile(tag_pat % tag, re.I | re.M).search(''.join(lines))
if m and m.group('val'):
spec_data[tag] = m.group('val').strip()
- else:
- print >>sys.stderr, 'error - tag \'%s\' does not exist' % tag
- sys.exit(1)
section_pat = '^%s\s*?$'
for section in sections:
m = re.compile(section_pat % section, re.I | re.M).search(''.join(lines))
if m:
start = lines.index(m.group()+'\n') + 1
- else:
- print >>sys.stderr, 'error - section \'%s\' does not exist' % section
- sys.exit(1)
data = []
for line in lines[start:]:
if line.startswith('%'):
@@ -2585,6 +2590,40 @@
return spec_data
+def get_default_editor():
+ import platform
+ system = platform.system()
+ if system == 'Windows':
+ return 'notepad'
+ if system == 'Linux':
+ try:
+ # Python 2.6
+ dist = platform.linux_distribution()[0]
+ except AttributeError:
+ dist = platform.dist()[0]
+ if dist == 'debian':
+ return 'editor'
+ elif dist == 'fedora':
+ return 'vi'
+ return 'vim'
+ return 'vi'
+
+def get_default_pager():
+ import platform
+ system = platform.system()
+ if system == 'Windows':
+ return 'less'
+ if system == 'Linux':
+ try:
+ # Python 2.6
+ dist = platform.linux_distribution()[0]
+ except AttributeError:
+ dist = platform.dist()[0]
+ if dist == 'debian':
+ return 'pager'
+ return 'less'
+ return 'more'
+
def run_pager(message):
import tempfile, sys
@@ -2594,17 +2633,23 @@
tmpfile = tempfile.NamedTemporaryFile()
tmpfile.write(message)
tmpfile.flush()
- pager = os.getenv('PAGER', default='less')
- subprocess.call('%s %s' % (pager, tmpfile.name), shell=True)
- tmpfile.close()
+ pager = os.getenv('PAGER', default=get_default_pager())
+ try:
+ try:
+ subprocess.call('%s %s' % (pager, tmpfile.name), shell=True)
+ except OSError, e:
+ raise oscerr.RuntimeError('cannot run pager \'%s\': %s' % (pager, e.strerror), pager)
+ finally:
+ tmpfile.close()
def run_editor(filename):
- if sys.platform[:3] != 'win':
- editor = os.getenv('EDITOR', default='vim')
- else:
- editor = os.getenv('EDITOR', default='notepad')
-
- return subprocess.call([ editor, filename ])
+ editor = os.getenv('EDITOR', default=get_default_editor())
+ cmd = editor.split(' ')
+ cmd.append(filename)
+ try:
+ return subprocess.call(cmd)
+ except OSError, e:
+ raise oscerr.RuntimeError('cannot run editor \'%s\': %s' % (editor, e.strerror), editor)
def edit_message(footer='', template='', templatelen=30):
delim = '--This line, and those below, will be ignored--\n'
@@ -3125,6 +3170,7 @@
diff.append(get_source_file_diff(os.path.dirname(tmpfile), os.path.basename(tmpfile),
revision, file, cmp_pac.storedir, file))
+ os.unlink(tmpfile)
os.chdir(olddir)
if cmp_pac != None:
delete_dir(cmp_pac.absdir)
@@ -3707,16 +3753,24 @@
"""apply selected format on each dict in results and return it as a list of strings"""
return [format % r for r in results]
-def get_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[]):
+def get_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[], verbose=False):
r = []
result_line_templ = '%(rep)-20s %(arch)-10s %(status)s'
- for res in get_package_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[]):
+ for res in get_package_results(apiurl, prj, package, lastbuild, repository, arch):
res['status'] = res['code']
- if res['details'] != '':
- res['status'] += ': %s' % (res['details'], )
+ if verbose and res['details'] != '':
+ if res['status'] in ('unresolvable', 'expansion error'):
+ lines = res['details'].split(',')
+ res['status'] += ': ' + '\n '.join(lines)
+
+ else:
+ res['status'] += ': %s' % (res['details'], )
if res['dirty']:
- res['status'] = 'state is outdated (was: %s)' % res['status']
+ if verbose:
+ res['status'] = 'state is outdated (was: %s)' % res['status']
+ else:
+ res['status'] += '*'
r.append(result_line_templ % res)
@@ -3738,14 +3792,14 @@
if root.find('result') == None:
return []
for results in root.findall('result'):
- for node in results:
- pacs.append(node.get('package'))
+ for node in results:
+ pacs.append(node.get('package'))
pacs = sorted(list(set(pacs)))
for node in root.findall('result'):
# filter architecture and repository
- if arch != None and arch != node.get('arch'):
+ if arch != None and node.get('arch') not in arch:
continue
- if repo != None and repo != node.get('repository'):
+ if repo != None and node.get('repository') not in repo:
continue
if node.get('dirty') == "true":
state = "outdated"
@@ -4445,9 +4499,7 @@
print >>sys.stderr, 'error - \'%s\' is not a source rpm.' % srpm
sys.exit(1)
curdir = os.getcwd()
- if not os.path.isdir(dir):
- dir = curdir
- else:
+ if os.path.isdir(dir):
os.chdir(dir)
cmd = 'rpm2cpio %s | cpio -i %s &> /dev/null' % (srpm, ' '.join(files))
ret = subprocess.call(cmd, shell=True)
@@ -4891,7 +4943,15 @@
import tempfile, subprocess, re
tmpfile = None
- print request
+
+ try:
+ # FIXME: print can fail with unicode chars in the string.
+ # Here we fix the symptoms, not the cause.
+ # UnicodeEncodeError: 'ascii' codec can't encode character u'\u2002' in position 309: ordinal not in range(128)
+ print request
+ except:
+ print request.__str__().encode('ascii', 'xmlcharrefreplace')
+
try:
msg = '(a)ccept/(d)ecline/(r)evoke/(c)ancel > '
if request.actions[0].type == 'submit':
@@ -4912,8 +4972,7 @@
request.actions[0].src_project, request.actions[0].src_package, request.actions[0].src_rev, True, False)
tmpfile.write(diff)
tmpfile.flush()
- pager = os.getenv('EDITOR', default='less')
- subprocess.call('%s %s' % (pager, tmpfile.name), shell=True)
+ run_editor(tmpfile.name)
elif repl == 'c':
print >>sys.stderr, 'Aborting'
raise oscerr.UserAbort()
@@ -4940,7 +4999,7 @@
if tmpfile is not None:
tmpfile.close()
-def get_user_projpkgs(apiurl, user, role=None, exclude_projects=[], proj=True, pkg=True):
+def get_user_projpkgs(apiurl, user, role=None, exclude_projects=[], proj=True, pkg=True, maintained=False):
"""Return all project/packages where user is involved."""
xpath = 'person/@userid = \'%s\'' % user
excl_prj = ''
@@ -4953,6 +5012,10 @@
xpath = xpath_join(xpath, 'person/@role = \'%s\'' % role, inner=True, op='and')
xpath_pkg = xpath_join(xpath, excl_pkg, op='and')
xpath_prj = xpath_join(xpath, excl_prj, op='and')
+
+ if maintained:
+ xpath_pkg = xpath_join(xpath_pkg, '(project/attribute/@name=\'%(attr)s\' or attribute/@name=\'%(attr)s\')' % {'attr': conf.config['maintained_attribute']}, op='and')
+
what = {}
if pkg:
what['package_id'] = xpath_pkg
++++++ osc.dsc ++++++
--- /var/tmp/diff_new_pack.KsUPhJ/_old 2010-07-19 21:08:01.000000000 +0200
+++ /var/tmp/diff_new_pack.KsUPhJ/_new 2010-07-19 21:08:01.000000000 +0200
@@ -1,6 +1,6 @@
Format: 1.0
Source: osc
-Version: 0.127
+Version: 0.128
Binary: osc
Maintainer: Adrian Schroeter
Architecture: any
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org