Hello community,
here is the log from the commit of package osc
checked in at Wed Jul 18 22:57:26 CEST 2007.
--------
--- osc/osc.changes 2007-07-11 11:25:01.000000000 +0200
+++ /mounts/work_src_done/STABLE/osc/osc.changes 2007-07-18 15:22:59.000000000 +0200
@@ -1,0 +2,46 @@
+Wed Jul 18 15:21:48 CEST 2007 - poeml@suse.de
+
+- update to r1861:
+ - commit (using the currently documented way):
+ - do DELETEs _before_ generating an "upload" revision with
+ PUTs. The DELETEs would be invalidated by the commit.
+ - switch to new commit mode also if the -F switch is used
+ - flush stdout, so that the progress dots are seen directly
+ when being written
+
+-------------------------------------------------------------------
+Mon Jul 16 18:30:18 CEST 2007 - poeml@suse.de
+
+- update to r1846:
+ - added initial search support (some ideas are taken from the webclient):
+ * when searching a package/project it
+ is also possible to search for the search term
+ in the <title /> and <description /> elements of
+ a package/project.
+ * show only exact matches
+ - new meta command, replacing editmeta, editprj, createprj,
+ editpac, createpac, edituser. Can either show existing meta, or
+ edit it (--edit), or upload content (--file). Fix metadata
+ change detection, which no longer relies on the timestamp of
+ the temporary file.
+ - log:
+ - renamed previous "log" command to "buildlog" (short: bl)
+ - implementing a log command to review the commit log
+ - commit:
+ - commit: implemented -m and -F option for the commit message.
+ NOTE: if -m is used, osc uses a different mode of uploading
+ files and commit them, namely the way which is currently
+ documented in the api. So far, osc was uploading each file
+ separately through the old backward compatible way. This way
+ of committing can also be forced with do_commits = 1 in
+ .oscrc.
+ - other changes:
+ - api now sends HTTP/1.1 400 Bad Request for invalid xml. Thus,
+ show the reply body because it contains helpful info.
+ - if PUT on metadata fails with a 500, and http_debug is True,
+ print out the body of the server reply
+ - improved exception handling in some places
+ - updatepacmetafromspec: read spec files in utf-8, or whatever
+ the preferred encoding is in the locale
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ osc.spec ++++++
--- /var/tmp/diff_new_pack.Vc9651/_old 2007-07-18 22:56:55.000000000 +0200
+++ /var/tmp/diff_new_pack.Vc9651/_new 2007-07-18 22:56:55.000000000 +0200
@@ -13,7 +13,7 @@
Name: osc
BuildRequires: python-devel
Version: 0.97
-Release: 1
+Release: 4
Group: Development/Tools/Other
License: GPL v2 or later
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -75,6 +75,46 @@
%doc README TODO NEWS
%changelog
+* Wed Jul 18 2007 - poeml@suse.de
+- update to r1861:
+ - commit (using the currently documented way):
+ - do DELETEs _before_ generating an "upload" revision with
+ PUTs. The DELETEs would be invalidated by the commit.
+ - switch to new commit mode also if the -F switch is used
+ - flush stdout, so that the progress dots are seen directly
+ when being written
+* Mon Jul 16 2007 - poeml@suse.de
+- update to r1846:
+ - added initial search support (some ideas are taken from the webclient):
+ * when searching a package/project it
+ is also possible to search for the search term
+ in the <title /> and <description /> elements of
+ a package/project.
+ * show only exact matches
+ - new meta command, replacing editmeta, editprj, createprj,
+ editpac, createpac, edituser. Can either show existing meta, or
+ edit it (--edit), or upload content (--file). Fix metadata
+ change detection, which no longer relies on the timestamp of
+ the temporary file.
+ - log:
+ - renamed previous "log" command to "buildlog" (short: bl)
+ - implementing a log command to review the commit log
+ - commit:
+ - commit: implemented -m and -F option for the commit message.
+ NOTE: if -m is used, osc uses a different mode of uploading
+ files and commit them, namely the way which is currently
+ documented in the api. So far, osc was uploading each file
+ separately through the old backward compatible way. This way
+ of committing can also be forced with do_commits = 1 in
+ .oscrc.
+ - other changes:
+ - api now sends HTTP/1.1 400 Bad Request for invalid xml. Thus,
+ show the reply body because it contains helpful info.
+ - if PUT on metadata fails with a 500, and http_debug is True,
+ print out the body of the server reply
+ - improved exception handling in some places
+ - updatepacmetafromspec: read spec files in utf-8, or whatever
+ the preferred encoding is in the locale
* Wed Jul 11 2007 - poeml@suse.de
- update to r1825:
- version 0.97
++++++ debian.changelog ++++++
--- osc/debian.changelog 2007-07-11 11:25:56.000000000 +0200
+++ /mounts/work_src_done/STABLE/osc/debian.changelog 2007-07-18 15:24:27.000000000 +0200
@@ -1,3 +1,58 @@
+osc (0.97-3) unstable; urgency=high
+
+ * update to r1861:
+ - commit (using the currently documented way):
+ - do DELETEs _before_ generating an "upload" revision with
+ PUTs. The DELETEs would be invalidated by the commit.
+ - switch to new commit mode also if the -F switch is used
+ - flush stdout, so that the progress dots are seen directly
+ when being written
+
+ -- Peter Poeml Wed, 18 Jul 2007 00:00:00 +0200
+
+osc (0.97-3) unstable; urgency=high
+
+ * update to r1846:
+ - added initial search support (some ideas are taken from the webclient):
+ * when searching a package/project it
+ is also possible to search for the search term
+ in the <title /> and <description /> elements of
+ a package/project.
+ * show only exact matches
+ - new meta command, replacing editmeta, editprj, createprj,
+ editpac, createpac, edituser. Can either show existing meta, or
+ edit it (--edit), or upload content (--file). Fix metadata
+ change detection, which no longer relies on the timestamp of
+ the temporary file.
+ - log:
+ - renamed previous "log" command to "buildlog" (short: bl)
+ - implementing a log command to review the commit log
+ - commit:
+ - commit: implemented -m and -F option for the commit message.
+ NOTE: if -m is used, osc uses a different mode of uploading
+ files and commit them, namely the way which is currently
+ documented in the api. So far, osc was uploading each file
+ separately through the old backward compatible way. This way
+ of committing can also be forced with do_commits = 1 in
+ .oscrc.
+ - other changes:
+ - api now sends HTTP/1.1 400 Bad Request for invalid xml. Thus,
+ show the reply body because it contains helpful info.
+ - if PUT on metadata fails with a 500, and http_debug is True,
+ print out the body of the server reply
+ - improved exception handling in some places
+ - updatepacmetafromspec: read spec files in utf-8, or whatever
+ the preferred encoding is in the locale
+
+
+ -- Peter Poeml Mon, 16 Jul 2007 00:00:00 +0200
+
+osc (0.97-2) unstable; urgency=high
+
+ * remove dependency on build package
+
+ -- Peter Poeml Fri, 13 Jul 2007 00:00:00 +0200
+
osc (0.97-1) unstable; urgency=high
* update to r1825:
++++++ debian.tar.gz ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/debian/control new/debian/control
--- old/debian/control 2007-03-09 09:31:12.000000000 +0100
+++ new/debian/control 2007-07-13 12:42:09.000000000 +0200
@@ -8,7 +8,7 @@
Package: osc
Section: devel
Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-celementtree, python-urlgrabber, build
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-celementtree, python-urlgrabber
Description: openSUSE (buildsystem) commander
svn-like cmdline tool (and python library) to maintain source files in the
opensuse buildservice
++++++ osc-0.97.tar.gz ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/NEWS new/osc-0.97/NEWS
--- old/osc-0.97/NEWS 2007-07-11 11:19:06.000000000 +0200
+++ new/osc-0.97/NEWS 2007-07-16 19:30:48.000000000 +0200
@@ -1,5 +1,18 @@
since 0.97:
-[...]
+
+- added initial search support
+- new meta command, replacing editmeta, editprj, createprj,
+ editpac, createpac, edituser
+- show helpful xml error messages if broken metadata is uploaded
+- implementing a log command to review the commit log
+- renamed previous "log" command to "buildlog" (short: bl)
+- initial support for commit messages (ci -m/-F)
+ NOTE: if -m is used, osc uses a different mode of uploading
+ files and commit them, namely the way which is currently
+ documented in the api. So far, osc was uploading each file
+ separately through the old backward compatible way. This way
+ of committing can also be forced with do_commits = 1 in
+ .oscrc.
0.97:
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/osc/build.py new/osc-0.97/osc/build.py
--- old/osc-0.97/osc/build.py 2007-05-14 10:29:50.000000000 +0200
+++ new/osc-0.97/osc/build.py 2007-07-16 19:30:48.000000000 +0200
@@ -159,7 +159,6 @@
for url in urllist:
self.urllist.append(url % self.mp)
-
def __str__(self):
return self.name
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/osc/commandline.py new/osc-0.97/osc/commandline.py
--- old/osc-0.97/osc/commandline.py 2007-07-07 19:13:37.000000000 +0200
+++ new/osc-0.97/osc/commandline.py 2007-07-18 15:20:59.000000000 +0200
@@ -132,102 +132,187 @@
print '\n'.join(l)
+ @cmdln.option('-F', '--file', metavar='FILE',
+ help='read metadata from FILE, instead of opening an editor. '
+ '\'-\' denotes standard input. ')
+ @cmdln.option('-e', '--edit', action='store_true',
+ help='edit metadata')
def do_meta(self, subcmd, opts, *args):
- """${cmd_name}: Shows meta information
-
- examples: osc meta Apache # show meta of project 'Apache'
- osc meta Apache subversion # show meta of package 'subversion'
-
- ${cmd_usage}
- ${cmd_option_list}
- """
-
- if not args:
- print >>sys.stderr, 'Missing argument.'
- self.do_help(['foo', 'meta'])
- return 2
-
- if len(args) == 2:
- project = args[0]
- package = args[1]
- print ''.join(show_package_meta(conf.config['apiurl'], project, package))
- print ''.join(show_files_meta(conf.config['apiurl'], project, package))
+ """${cmd_name}: Show meta information, or edit it
- elif len(args) == 1:
- project = args[0]
- print ''.join(show_project_meta(conf.config['apiurl'], project))
-
-
- @cmdln.alias("createpac")
- def do_editpac(self, subcmd, opts, project, package):
- """${cmd_name}: Create package or edit package metadata
+ Show or edit build service metadata of type .
- If the named package does not exist, it will be created.
-
- ${cmd_usage}
+ This command displays metadata on buildservice objects like projects,
+ packages, or users. The type of metadata is specified by the word after
+ "meta", like e.g. "meta prj".
+
+ prj denotes metadata of a buildservice project.
+ prjconf denotes the (build) configuration of a project.
+ pkg denotes metadata of a buildservice package.
+ user denotes the metadata of a user.
+
+ With the --edit switch, the metadata can be edited. Per default, osc
+ opens the program specified by the environmental variable EDITOR with a
+ temporary file. Alternatively, content to be saved can be supplied via
+ the --file switch. If the argument is '-', input is taken from stdin:
+ osc meta prjconf home:poeml | sed ... | osc meta prjconf home:poeml -F -
+
+ The --create switch is subject to discussion and not implemented. The
+ current behaviour is to create a non-existing resource implicitely, if
+ while it is edited.
+
+ usage:
+ osc meta ARGS...
+ osc meta -e|--edit [-c|--create] ARGS...
+ osc meta -F|--file ARGS...
${cmd_option_list}
"""
- edit_meta(project, package)
-
-
- @cmdln.alias('createprj')
- def do_editprj(self, subcmd, opts, project):
- """${cmd_name}: Create project or edit project metadata
-
- If the named project does not exist, it will be created.
-
- ${cmd_usage}
- ${cmd_option_list}
- """
+ args = slash_split(args)
- edit_meta(project, None)
+ if not args or args[0] not in metatypes.keys():
+ print >>sys.stderr, 'Unknown meta type. Choose one of %s.' % ', '.join(metatypes)
+ return 2
+ cmd = args[0]
+ del args[0]
- def do_editmeta(self, subcmd, opts, *args):
- """${cmd_name}: Edit project/package meta information
+ if cmd == 'pkg':
+ required_args = 2
+ else:
+ required_args = 1
+ if len(args) < required_args:
+ print >>sys.stderr, 'Too few arguments.'
+ return 2
+ if len(args) > required_args:
+ print >>sys.stderr, 'Too many arguments.'
+ return 2
- If the named project or package does not exist, it will be created.
+ # specific arguments
+ if cmd == 'prj':
+ project = args[0]
+ elif cmd == 'pkg':
+ project, package = args[0:2]
+ elif cmd == 'prjconf':
+ project = args[0]
+ elif cmd == 'user':
+ user = args[0]
- Examples:
- osc editmeta Apache # edit meta of project 'Apache'
- osc editmeta Apache apache2 # edit meta of package 'apache2'
+ # show
+ if not opts.edit:
+ if cmd == 'prj':
+ sys.stdout.write(''.join(show_project_meta(conf.config['apiurl'], project)))
+ elif cmd == 'pkg':
+ sys.stdout.write(''.join(show_package_meta(conf.config['apiurl'], project, package)))
+ elif cmd == 'prjconf':
+ sys.stdout.write(''.join(show_project_conf(conf.config['apiurl'], project)))
+ elif cmd == 'user':
+ r = get_user_meta(conf.config['apiurl'], user)
+ if r:
+ sys.stdout.write(''.join(r))
+
+ # edit
+ if opts.edit and not opts.file:
+ if cmd == 'prj':
+ edit_meta(metatype='prj',
+ edit=True,
+ path_args=quote_plus(project),
+ template_args=(project, conf.config['user']))
+ elif cmd == 'pkg':
+ edit_meta(metatype='pkg',
+ edit=True,
+ path_args=(quote_plus(project), quote_plus(package)),
+ template_args=(package, conf.config['user']))
+ elif cmd == 'prjconf':
+ edit_meta(metatype='prjconf',
+ edit=True,
+ path_args=quote_plus(project),
+ template_args=None)
+ elif cmd == 'user':
+ edit_meta(metatype='user',
+ edit=True,
+ path_args=(quote_plus(user)),
+ template_args=(user, user))
- ${cmd_usage}
- ${cmd_option_list}
- """
+ # upload file
+ if opts.file:
- args = slash_split(args)
+ if opts.file == '-':
+ f = sys.stdin.read()
+ else:
+ try:
+ f = open(opts.file).read()
+ except:
+ sys.exit('could not open file \'%s\'.' % opts.file)
- if not args:
- print >>sys.stderr, 'Missing argument.'
- self.do_help([None, 'editmeta'])
- return 2
+ if cmd == 'prj':
+ edit_meta(metatype='prj',
+ data=f,
+ edit=opts.edit,
+ path_args=quote_plus(project))
+ elif cmd == 'pkg':
+ edit_meta(metatype='pkg',
+ data=f,
+ edit=opts.edit,
+ path_args=(quote_plus(project), quote_plus(package)))
+ elif cmd == 'prjconf':
+ edit_meta(metatype='prjconf',
+ data=f,
+ edit=opts.edit,
+ path_args=quote_plus(project))
+ elif cmd == 'user':
+ edit_meta(metatype='user',
+ data=f,
+ edit=opts.edit,
+ path_args=(quote_plus(user)))
- if len(args) == 2:
- project = args[0]
- package = args[1]
- edit_meta(project, package)
- elif len(args) == 1:
- project = args[0]
- edit_meta(project, None)
+ # editmeta and its aliases are all depracated
+ @cmdln.alias("editprj")
+ @cmdln.alias("createprj")
+ @cmdln.alias("editpac")
+ @cmdln.alias("createpac")
+ @cmdln.alias("edituser")
+ @cmdln.alias("usermeta")
+ def do_editmeta(self, subcmd, opts, *args):
+ """${cmd_name}:
+
+ Obsolete command to edit metadata. Use 'meta' now.
- def do_edituser(self, subcmd, opts, *args):
- """${cmd_name}: Edit user meta information
+ See the help output of 'meta'.
- If the named user id does not exist, it will be created.
-
- ${cmd_usage}
- ${cmd_option_list}
"""
- if not args or len(args) != 1:
- user = conf.config['user']
- else:
- user = args[0]
- edit_user_meta(user)
+ print >>sys.stderr, 'This command is obsolete. Use \'osc meta <metatype> ...\'.'
+ print >>sys.stderr, 'See \'osc help meta\'.'
+ #self.do_help([None, 'meta'])
+ return 2
+
+# @cmdln.alias("createpac")
+# def do_editpac(self, subcmd, opts, project, package):
+# """${cmd_name}: Create package or edit package metadata
+#
+# If the named package does not exist, it will be created.
+#
+# ${cmd_usage}
+# ${cmd_option_list}
+# """
+#
+# edit_meta(project, package)
+
+
+# @cmdln.alias('createprj')
+# def do_editprj(self, subcmd, opts, project):
+# """${cmd_name}: Create project or edit project metadata
+#
+# If the named project does not exist, it will be created.
+#
+# ${cmd_usage}
+# ${cmd_option_list}
+# """
+#
+# edit_meta(project, None)
def do_linkpac(self, subcmd, opts, *args):
@@ -371,7 +456,7 @@
for p in pacs:
p.read_meta_from_spec(specfile)
- p.update_pac_meta()
+ p.update_package_meta()
@cmdln.alias('di')
@@ -492,7 +577,7 @@
"""${cmd_name}: shows URLs of .repo files
Shows URLs on which to access the project .repos files (yum-style
- metadata) on software.opensuse.org.
+ metadata) on download.opensuse.org.
ARG, if specified, is a package working copy.
@@ -503,7 +588,7 @@
args = parseargs(args)
pacs = findpacs(args)
- url_tmpl = 'http://software.opensuse.org/download/%s/%s/%s.repo'
+ url_tmpl = 'http://download.opensuse.org/repositories/%s/%s/%s.repo'
for p in pacs:
platforms = get_platforms_of_project(p.apiurl, p.prjname)
for platform in platforms:
@@ -708,6 +793,10 @@
@cmdln.alias('ci')
@cmdln.alias('checkin')
+ @cmdln.option('-m', '--message', metavar='TEXT',
+ help='specify log message TEXT')
+ @cmdln.option('-F', '--file', metavar='FILE',
+ help='read log message from FILE')
def do_commit(self, subcmd, opts, *args):
"""${cmd_name}: Upload content to the repository server
@@ -726,8 +815,25 @@
args = parseargs(args)
pacs = findpacs(args)
+ # this is experimental in that it enables a different way of uploading files
+ # see osc.core.Package.put_source_file()
+ # I assume that if -m is used, we want to commit this way.
+ if opts.message or opts.file:
+ conf.config['do_commits'] = True
+
for p in pacs:
+ if conf.config['do_commits']:
+ if opts.message:
+ msg = opts.message
+ elif opts.file:
+ try:
+ msg = open(opts.file).read()
+ except:
+ sys.exit('could not open file \'%s\'.' % opts.file)
+ else:
+ msg = ''
+
# commit only if the upstream revision is the same as the working copy's
upstream_rev = show_upstream_rev(p.apiurl, p.prjname, p.name)
if p.rev != upstream_rev:
@@ -753,18 +859,20 @@
continue
print 'Transmitting file data ',
- for filename in p.todo_send:
- sys.stdout.write('.')
- p.put_source_file(filename)
for filename in p.todo_delete:
p.delete_source_file(filename)
p.to_be_deleted.remove(filename)
- if conf.config['do_commits'] == '1':
- p.commit(msg='MESSAGE')
+ for filename in p.todo_send:
+ sys.stdout.write('.')
+ sys.stdout.flush()
+ p.put_source_file(filename)
+ if conf.config['do_commits']:
+ p.rev = p.commit(msg=msg)
+ print
+ print 'Committed revision %s.' % p.rev
- p.update_filesmeta()
+ p.update_local_filesmeta()
p.write_deletelist()
- print
@cmdln.option('-r', '--revision', metavar='rev',
@@ -829,7 +937,7 @@
saved_modifiedfiles = [ f for f in p.filenamelist if p.status(f) == 'M' ]
oldp = p
- p.update_filesmeta(rev)
+ p.update_local_filesmeta(rev)
p = Package(p.dir)
# which files do no longer exist upstream?
@@ -867,7 +975,7 @@
pass
- p.update_pacmeta()
+ p.update_local_pacmeta()
#print ljust(p.name, 45), 'At revision %s.' % p.rev
print 'At revision %s.' % p.rev
@@ -943,20 +1051,6 @@
p.clear_from_conflictlist(filename)
- def do_usermeta(self, subcmd, opts, name):
- """${cmd_name}: Shows user metadata
-
- Shows metadata about the buildservice user with the id NAME.
-
- ${cmd_usage}
- ${cmd_option_list}
- """
-
- r = get_user_meta(conf.config['apiurl'], name)
- if r:
- print ''.join(r)
-
-
def do_platforms(self, subcmd, opts, *args):
"""${cmd_name}: Shows available platforms
@@ -1048,7 +1142,8 @@
print '\n'.join(get_prj_results(apiurl, project, show_legend=opts.legend))
- def do_log(self, subcmd, opts, platform, arch):
+ @cmdln.alias('bl')
+ def do_buildlog(self, subcmd, opts, platform, arch):
"""${cmd_name}: Shows the build log of a package
Shows the log file of the build of a package. Can be used to follow the
@@ -1237,7 +1332,7 @@
if not os.path.exists('/usr/lib/build/debtransform'):
sys.stderr.write('Error: you need build.rpm with version 2006.6.14 or newer.\n')
- sys.stderr.write('See http://software.opensuse.org/download/openSUSE:/Tools/\n')
+ sys.stderr.write('See http://download.opensuse.org/repositories/openSUSE:/Tools/\n')
return 1
builddist = os.getenv('BUILD_DIST')
@@ -1306,6 +1401,27 @@
print '\n'.join(get_buildhistory(apiurl, project, package, platform, arch))
+ @cmdln.option('-r', '--revision', metavar='rev',
+ help='show log of the specified revision')
+ def do_log(self, subcmd, opts):
+ """${cmd_name}: Shows the commit log of a package
+
+ ${cmd_usage}
+ ${cmd_option_list}
+ """
+
+ wd = os.curdir
+ package = store_read_package(wd)
+ project = store_read_project(wd)
+ apiurl = store_read_apiurl(wd)
+ rev, dummy = parseRevisionOption(opts.revision)
+ if rev and not checkRevision(project, package, rev):
+ print >>sys.stderr, 'Revision \'%s\' does not exist' % rev
+ sys.exit(1)
+
+ print '\n'.join(get_commitlog(apiurl, project, package, rev))
+
+
@cmdln.option('-f', '--failed', action='store_true',
help='rebuild all failed packages')
def do_rebuildpac(self, subcmd, opts, *args):
@@ -1406,7 +1522,7 @@
def do_wipebinaries(self, subcmd, opts, *args):
"""${cmd_name}: Delete all binary packages of a certain project/package
- With the optional arguement <package> you can specify a certain package
+ With the optional argument <package> you can specify a certain package
otherwise all binary packages in the project will be deleted.
usage:
@@ -1428,6 +1544,70 @@
print wipebinaries(conf.config['apiurl'], args[0], package, opts.arch, opts.repo, opts.build_disabled)
+ @cmdln.option('-e', '--enable-exact', action='store_true',
+ help='show only exact matches')
+ @cmdln.option('--package', action='store_true',
+ help='search for a package')
+ @cmdln.option('--project', action='store_true',
+ help='search for a project')
+ @cmdln.option('--title', action='store_true',
+ help='search for matches in the \'title\' element')
+ @cmdln.option('--description', action='store_true',
+ help='search for matches in the \'description\' element')
+ @cmdln.option('-v', '--verbose', action='store_true',
+ help='show more information')
+ def do_search(self, subcmd, opts, *args):
+ """${cmd_name}: search for a project and/or package.
+
+ If no option is specified osc will search for projects and
+ packages which contains the \'search term\' in their name,
+ title or description.
+
+ usage:
+ osc search \'search term\' <options>
+ ${cmd_option_list}
+ """
+
+ if len(args) > 1:
+ print >>sys.stderr, 'too many arguments'
+ sys.exit(1)
+ elif len(args) < 1:
+ print >>sys.stderr, 'too few arguments'
+ sys.exit(1)
+
+ search_list = []
+ search_for = []
+ if opts.title:
+ search_list.append('title')
+ if opts.description:
+ search_list.append('description')
+ if opts.package:
+ search_list.append('@name')
+ search_for.append('package')
+ if opts.project:
+ search_list.append('@name')
+ search_for.append('project')
+
+ if not search_list:
+ search_list = ['title', 'description', '@name']
+ if not search_for:
+ search_for = [ 'project', 'package' ]
+ for kind in search_for:
+ result = search(conf.config['apiurl'], set(search_list), kind, args[0], opts.verbose, opts.enable_exact)
+ if result:
+ if kind == 'package':
+ headline = [ '# Package', '# Project' ]
+ else:
+ headline = [ '# Project' ]
+ if opts.verbose:
+ headline.append('# Title')
+ if len(search_for) > 1:
+ print '#' * 68
+ print 'matches for \'%s\' in %ss:\n' % (args[0], kind)
+ for row in build_table(len(headline), result, headline, 2):
+ print row
+ else:
+ print 'No matches found for \'%s\' in %ss' % (args[0], kind)
# load subcommands plugged-in locally
plugin_dirs = ['/var/lib/osc-plugins', os.path.expanduser('~/.osc-plugins')]
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/osc/conf.py new/osc-0.97/osc/conf.py
--- old/osc-0.97/osc/conf.py 2007-05-10 16:29:04.000000000 +0200
+++ new/osc-0.97/osc/conf.py 2007-07-16 11:45:17.000000000 +0200
@@ -26,7 +26,7 @@
'build-root': '/abuild/oscbuild-%(repo)s-%(arch)s',
'packagecachedir': '/var/cache/osbuild',
'su-wrapper': 'sudo',
- 'urllist': ['http://software.opensuse.org/download/%(project)s/%(repository)s/%(arch)s/%(...',
+ 'urllist': ['http://download.opensuse.org/repositories/%(project)s/%(repository)s/%(arch)...',
'http://api.opensuse.org/rpm/%(project)s/%(repository)s/_repository/%(buildar...'],
}
@@ -49,7 +49,7 @@
# default list of download URLs, which will be tried in order
'urllist': [
# the normal repo server, redirecting to mirrors
- 'http://software.opensuse.org/download/%(project)s/%(repository)s/%(arch)s/%(...',
+ 'http://download.opensuse.org/repositories/%(project)s/%(repository)s/%(arch)...',
# direct access to "full" tree
'%(scheme)s://%(apisrv)s/build/%(project)s/%(repository)s/%(buildarch)s/_repository/%(name)s',
],
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/osc/core.py new/osc-0.97/osc/core.py
--- old/osc-0.97/osc/core.py 2007-07-11 11:19:06.000000000 +0200
+++ new/osc-0.97/osc/core.py 2007-07-16 19:06:06.000000000 +0200
@@ -116,11 +116,11 @@
new_user_template = """\
<person>
- <login>%(user)s</login>
+ <login>%s</login>
<email>PUT_EMAIL_ADDRESS_HERE</email>
<realname>PUT_REAL_NAME_HERE</realname>
<watchlist>
- <project name="home:%(user)s"/>
+ <project name="home:%s"/>
</watchlist>
</person>
"""
@@ -312,7 +312,7 @@
# escaping '+' in the URL path (note: not in the URL query string) is
# only a workaround for ruby on rails, which swallows it otherwise
query = []
- if conf.config['do_commits'] == '1':
+ if conf.config['do_commits']:
query.append('rev=upload')
u = makeurl(self.apiurl, ['source', self.prjname, self.name, pathname2url(n)], query=query)
http_PUT(u, file = os.path.join(self.dir, n))
@@ -329,7 +329,9 @@
u = makeurl(self.apiurl, ['source', self.prjname, self.name], query=query)
#print u
f = http_POST(u)
- #print f.read()
+ root = ET.parse(f).getroot()
+ rev = int(root.get('rev'))
+ return rev
def write_conflictlist(self):
if len(self.in_conflict) == 0:
@@ -398,13 +400,21 @@
- def update_filesmeta(self, revision=None):
+ def update_local_filesmeta(self, revision=None):
+ """
+ Update the local _files file in the store.
+ It is replaced with the version pulled from upstream.
+ """
meta = ''.join(show_files_meta(self.apiurl, self.prjname, self.name, revision))
f = open(os.path.join(self.storedir, '_files'), 'w')
f.write(meta)
f.close()
- def update_pacmeta(self):
+ def update_local_pacmeta(self):
+ """
+ Update the local _meta file in the store.
+ It is replaced with the version pulled from upstream.
+ """
meta = ''.join(show_package_meta(self.apiurl, self.prjname, self.name))
f = open(os.path.join(self.storedir, '_meta'), 'w')
f.write(meta)
@@ -550,25 +560,18 @@
self.descr = descr
- def update_pac_meta(self, template=new_package_templ):
- import tempfile
+ def update_package_meta(self):
+ """
+ for the updatepacmetafromspec subcommand
+ """
+ import tempfile
(fd, filename) = tempfile.mkstemp(prefix = 'osc_editmeta.', suffix = '.xml', dir = '/tmp')
- try:
- u = makeurl(self.apiurl, ['source', self.prjname, self.name, '_meta'])
- m = http_GET(u).readlines()
- except urllib2.HTTPError, e:
- if e.code == 404:
- print 'package does not exist yet... creating it'
- m = template % (pac, conf.config['user'])
- else:
- print >>sys.stderr, 'error getting package meta for project \'%s\' package \'%s\':' % (prj, pac)
- print >>sys.stderr, e
- sys.exit(1)
+ m = ''.join(show_package_meta(self.apiurl, self.prjname, self.name))
f = os.fdopen(fd, 'w')
- f.write(''.join(m))
+ f.write(m)
f.close()
tree = ET.parse(filename)
@@ -578,7 +581,7 @@
# FIXME: escape stuff for xml
print '*' * 36, 'old', '*' * 36
- print ''.join(m)
+ print m
print '*' * 36, 'new', '*' * 36
tree.write(sys.stdout)
print '*' * 72
@@ -901,51 +904,23 @@
class metafile:
"""metafile that can be manipulated and is stored back after manipulation."""
- def __init__(self, prj, pac, template=new_package_templ, change_is_required=True):
+ def __init__(self, url, input, change_is_required=False):
import tempfile
+ self.url = url
self.change_is_required = change_is_required
- (fd, self.filename) = tempfile.mkstemp(prefix = 'osc_editmeta.', suffix = '.xml', dir = '/tmp')
-
-
- if pac:
- # package meta
- self.url = makeurl(conf.config['apiurl'], ['source', prj, pac, '_meta'])
- try:
- m = http_GET(self.url).readlines()
- except urllib2.HTTPError, e:
- if e.code == 404:
- m = template % (pac, conf.config['user'])
- else:
- print >>sys.stderr, 'error getting package meta for project \'%s\' package \'%s\':' % (prj, pac)
- print >>sys.stderr, e
- sys.exit(1)
-
- else:
- # project meta
- self.url = makeurl(conf.config['apiurl'], ['source', prj, '_meta'])
- try:
- m = http_GET(self.url).readlines()
- # when testing this offline:
- #except urllib2.URLError, e:
- # m = new_project_templ % (prj, conf.config['user'])
- except urllib2.HTTPError, e:
- if e.code == 404:
- m = new_project_templ % (prj, conf.config['user'])
- else:
- print >>sys.stderr, 'error getting package meta for project \'%s\':' % prj
- print >>sys.stderr, e
- sys.exit(1)
+ (fd, self.filename) = tempfile.mkstemp(prefix = 'osc_metafile.', suffix = '.xml', dir = '/tmp')
f = os.fdopen(fd, 'w')
- f.write(''.join(m))
+ f.write(''.join(input))
f.close()
- self.timestamp = os.path.getmtime(self.filename)
+ self.hash_orig = dgst(self.filename)
def sync(self):
- if self.change_is_required == True and os.path.getmtime(self.filename) == self.timestamp:
+ hash = dgst(self.filename)
+ if self.change_is_required == True and hash == self.hash_orig:
print 'File unchanged. Not saving.'
os.unlink(self.filename)
return True
@@ -958,83 +933,91 @@
return True
except urllib2.HTTPError, e:
# internal server error (probably the xml file is incorrect)
+ if e.code == 400:
+ print >>sys.stderr, 'Cannot save meta data.'
+ print >>sys.stderr, e
+ print >>sys.stderr, e.read()
+ return False
if e.code == 500:
- print >>sys.stderr, 'cannot save meta data - probably your xml file is incorrect'
+ print >>sys.stderr, 'Cannot save meta data. Unknown error.'
print >>sys.stderr, e
# this may be unhelpful... because it may just print a big blob of uninteresting
# ichain html and javascript... however it could potentially be useful if the orign
# server returns an information body
- #print >>sys.stderr, e.read()
+ if conf.config['http_debug']:
+ print >>sys.stderr, e.read()
return False
else:
print >> sys.stderr, 'cannot save meta data - an unexpected error occured'
return False
-#metatypes = { 'prj': { 'url': ['source', prj, '_meta'],
-# 'template': new_project_templ,
-# },
-# 'pkg': { 'url' : ['source', prj, pac, '_meta'],
-# 'template': new_package_templ,
-# },
-# 'prjconf': { 'url': ['source', prj, '_config'],
-# 'template': None,
-# },
-# 'user': { 'url': ['person', quote_plus(user)],
-# 'template': new_user_template,
-# },
-# }
-
-def edit_meta(prj, pac, template=new_package_templ, change_is_required=True):
- f=metafile(prj, pac, template, change_is_required)
-
- editor = os.getenv('EDITOR', default='vim')
- while 1:
- os.system('%s %s' % (editor, f.filename))
- if change_is_required == True:
- if not f.sync():
- input = raw_input('Try again? (yY = Yes - nN = No): ')
- if input != 'y' and input != 'Y':
- break
- else:
- break
- else:
- f.sync()
- break
-
-def edit_user_meta(user, change_is_required=True):
- import tempfile
+# different types of metadata
+metatypes = { 'prj': { 'path': 'source/%s/_meta',
+ 'template': new_project_templ,
+ },
+ 'pkg': { 'path' : 'source/%s/%s/_meta',
+ 'template': new_package_templ,
+ },
+ 'prjconf': { 'path': 'source/%s/_config',
+ 'template': '',
+ },
+ 'user': { 'path': 'person/%s',
+ 'template': new_user_template,
+ },
+ }
+
+def edit_meta(metatype,
+ path_args=None,
+ data=None,
+ template_args=None,
+ edit=False,
+ change_is_required=False):
+
+ if metatype not in metatypes.keys():
+ sys.exit('unknown metatype %s' % metatype)
+
+ path = metatypes[metatype]['path']
+ if path_args:
+ path = path % path_args
- u = makeurl(conf.config['apiurl'], ['person', quote_plus(user)])
+ url = makeurl(conf.config['apiurl'], [path])
- try:
- m = http_GET(u).readlines()
- except urllib2.HTTPError, e:
- if e.code == 404:
- m = new_user_template % { 'user': user }
- else:
- print >>sys.stderr, 'error getting metadata for user \'%s\':' % user
- print >>sys.stderr, e
- sys.exit(1)
-
- (fd, filename) = tempfile.mkstemp(prefix = 'osc_edituser.', suffix = '.xml', dir = '/tmp')
- f = os.fdopen(fd, 'w')
- f.write(''.join(m))
- f.close()
- timestamp = os.path.getmtime(filename)
+ if not data:
+ try:
+ data = http_GET(url).readlines()
+ except urllib2.HTTPError, e:
+ if e.code == 404:
+ data = metatypes[metatype]['template']
+ if template_args:
+ data = data % template_args
+ else:
+ print >>sys.stderr, 'error getting metadata for type \'%s\' at URL \'%s\':' \
+ % (metatype, url)
+ print >>sys.stderr, e
+ sys.exit(1)
- editor = os.getenv('EDITOR', default='vim')
- os.system('%s %s' % (editor, filename))
+ if edit:
+ change_is_required = True
- if change_is_required == True and os.path.getmtime(filename) == timestamp:
- print 'File unchanged. Not saving.'
- os.unlink(filename)
+ f=metafile(url, data, change_is_required)
+ if edit:
+ editor = os.getenv('EDITOR', default='vim')
+ while 1:
+ os.system('%s %s' % (editor, f.filename))
+ if change_is_required == True:
+ if not f.sync():
+ input = raw_input('Try again? (yY = Yes - nN = No): ')
+ if input != 'y' and input != 'Y':
+ break
+ else:
+ break
+ else:
+ f.sync()
+ break
else:
- print 'Sending meta data...',
- http_PUT(u, file=filename)
- os.unlink(filename)
- print 'Done.'
+ f.sync()
def show_files_meta(apiurl, prj, pac, revision=None):
@@ -1051,13 +1034,17 @@
def read_meta_from_spec(specfile):
+ import codecs, locale
"""read Name, Summary and %description from spec file"""
if not os.path.isfile(specfile):
print 'file \'%s\' is not a readable file' % specfile
return (None, None)
- lines = open(specfile).readlines()
+ try:
+ lines = codecs.open(specfile, 'r', locale.getpreferredencoding()).readlines()
+ except UnicodeDecodeError:
+ lines = open(specfile).readlines()
for line in lines:
if line.startswith('Name:'):
@@ -1127,6 +1114,7 @@
if not buf: break
s.update(buf)
return s.hexdigest()
+ f.close()
def binary(s):
@@ -1239,14 +1227,16 @@
# and create the package
tree = ET.parse(StringIO(''.join(src_meta)))
root = tree.getroot()
- root.set('name', '%s')
+ root.set('name', dst_package)
root.set('project', dst_project)
- tree.find('person').set('userid', '%s')
+ tree.find('person').set('userid', conf.config['user'])
buf = StringIO()
tree.write(buf)
src_meta = buf.getvalue()
- edit_meta(dst_project, dst_package, template=src_meta, change_is_required=False)
+ edit_meta('pkg',
+ path_args=(dst_project, dst_package),
+ data=src_meta)
# create the _link file
# but first, make sure not to overwrite an existing one
@@ -1497,6 +1487,43 @@
return r
+def get_commitlog(apiurl, prj, package, revision):
+ import time, locale
+ u = makeurl(apiurl, ['source', prj, package, '_history'])
+ f = http_GET(u)
+ root = ET.parse(f).getroot()
+
+ r = []
+ revisions = root.findall('revision')
+ revisions.reverse()
+ for node in revisions:
+ try:
+ rev = int(node.get('rev'))
+ #vrev = int(node.get('vrev')) # what is the meaning of vrev?
+ if revision and rev != int(revision):
+ continue
+ except ValueError:
+ # this part should _never_ be reached but...
+ return [ 'an unexpected error occured - please file a bug' ]
+ srcmd5 = node.find('srcmd5').text
+ version = node.find('version').text
+ user = node.find('user').text
+ try:
+ comment = node.find('comment').text.encode(locale.getpreferredencoding(), 'replace')
+ except:
+ comment = '<no message>'
+ t = time.localtime(int(node.find('time').text))
+ t = time.strftime('%Y-%m-%d %H:%M:%S', t)
+
+ s = '-' * 76 + \
+ '\nr%s | %s | %s | %s | %s\n' % (rev, user, t, srcmd5, version) + \
+ '\n' + comment
+ r.append(s)
+
+ r.append('-' * 76)
+ return r
+
+
def rebuild(apiurl, prj, package, repo, arch, code=None):
query = []
query.append('cmd=rebuild')
@@ -1523,12 +1550,21 @@
def store_read_project(dir):
- p = open(os.path.join(dir, store, '_project')).readlines()[0].strip()
+ try:
+ p = open(os.path.join(dir, store, '_project')).readlines()[0].strip()
+ except IOError:
+ print >>sys.stderr, 'error: \'%s\' is not an osc project dir ' \
+ 'or working copy' % dir
+ sys.exit(1)
return p
def store_read_package(dir):
- p = open(os.path.join(dir, store, '_package')).readlines()[0].strip()
+ try:
+ p = open(os.path.join(dir, store, '_package')).readlines()[0].strip()
+ except IOError:
+ print >>sys.stderr, 'error: \'%s\' is not an osc working copy' % dir
+ sys.exit(1)
return p
def store_read_apiurl(dir):
@@ -1612,6 +1648,7 @@
root = ET.parse(f).getroot()
return root.get('code')
+
def parseRevisionOption(string):
"""
returns a tuple which contains the revisions
@@ -1641,9 +1678,105 @@
check if revision is valid revision
"""
try:
- if int(revision) > int(show_upstream_rev(conf.config['apiurl'], prj, pac)):
+ if int(revision) > int(show_upstream_rev(conf.config['apiurl'], prj, pac)) \
+ or int(revision) <= 0:
return False
else:
return True
except (ValueError, TypeError):
return False
+
+def build_xpath_predicate(search_list, search_term, exact_matches):
+ """
+ Builds and returns a xpath predicate
+ """
+
+ predicate = ['[']
+ for i, elem in enumerate(search_list):
+ if i > 0 and i < len(search_list):
+ predicate.append(' or ')
+ if exact_matches:
+ predicate.append('%s=\'%s\'' % (elem, search_term))
+ else:
+ predicate.append('contains(%s, \'%s\')' % (elem, search_term))
+ predicate.append(']')
+ return predicate
+
+def build_table(col_num, data = [], headline = [], width=1):
+ """
+ This method builds a simple table.
+ Example1: build_table(2, ['foo', 'bar', 'suse', 'osc'], ['col1', 'col2'], 2)
+ col1 col2
+ foo bar
+ suse osc
+ """
+
+ longest_col = []
+ for i in range(col_num):
+ longest_col.append(0)
+ if headline:
+ data[0:0] = headline
+ # find longest entry in each column
+ i = 0
+ for itm in data:
+ if longest_col[i] < len(itm):
+ longest_col[i] = len(itm)
+ if i == col_num - 1:
+ i = 0
+ else:
+ i += 1
+ # calculate length for each column
+ for i, row in enumerate(longest_col):
+ longest_col[i] = row + width
+ # build rows
+ row = []
+ table = []
+ i = 0
+ for itm in data:
+ if i % col_num == 0:
+ if row:
+ table.append(''.join(row))
+ i = 0
+ row = [itm.ljust(longest_col[i])]
+ else:
+ # there is no need to justify the entries of the last column
+ if i == col_num -1:
+ row.append(itm)
+ else:
+ row.append(itm.ljust(longest_col[i]))
+ i += 1
+ table.append(''.join(row))
+ return table
+
+def search(apiurl, search_list, kind, search_term, verbose = False, exact_matches = False):
+ """
+ Perform a search for 'search_term'. A list which contains the
+ results will be returned on success otherwise 'None'. If 'verbose' is true
+ and the title-tag-text (<title>TEXT</title>) is longer than 60 chars it'll we
+ truncated.
+ """
+
+ predicate = build_xpath_predicate(search_list, search_term, exact_matches)
+ u = makeurl(apiurl, ['search', kind], ['match=%s' % quote_plus(''.join(predicate))])
+ f = http_GET(u)
+ root = ET.parse(f).getroot()
+ result = []
+ for node in root.findall(kind):
+ # TODO: clarify if we need to check if node.get() returns 'None'.
+ # If it returns 'None' something is broken anyway...
+ if kind == 'package':
+ project = node.get('project')
+ package = node.get('name')
+ result.append(package)
+ else:
+ project = node.get('name')
+ result.append(project)
+ if verbose:
+ title = node.findtext('title').strip()
+ if len(title) > 60:
+ title = title[:61] + '...'
+ result.append(title)
+ if result:
+ return result
+ else:
+ return None
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/README new/osc-0.97/README
--- old/osc-0.97/README 2007-07-11 09:58:40.000000000 +0200
+++ new/osc-0.97/README 2007-07-16 11:45:17.000000000 +0200
@@ -8,7 +8,7 @@
INSTALLATION:
RPM packages are here (yum repository):
-http://software.opensuse.org/download/openSUSE:/Tools/
+http://download.opensuse.org/repositories/openSUSE:/Tools/
To install from svn, do
python setup.py build
@@ -25,7 +25,7 @@
For local building, you will need python-urlgrabber in addition. Those are
standard package on SUSE Linux since a while. If your version is too old, you
can find python-elementtree and python-urlgrabber here:
-http://software.opensuse.org/download/devel:/languages:/python/
+http://download.opensuse.org/repositories/devel:/languages:/python/
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/tests.py new/osc-0.97/tests.py
--- old/osc-0.97/tests.py 2007-07-04 16:10:43.000000000 +0200
+++ new/osc-0.97/tests.py 2007-07-16 12:11:40.000000000 +0200
@@ -76,10 +76,9 @@
<project name="home:poeml"/>
</watchlist>
</person>
-
"""
- self.out, self.err = runosc('usermeta poeml')
+ self.out, self.err = runosc('meta user poeml')
self.assertEqual(self.err, '')
self.assertEqual(self.out, expect)
@@ -107,13 +106,13 @@
#####################################################################
def testMetaPrj(self):
- self.out, self.err = runosc('meta Apache')
+ self.out, self.err = runosc('meta prj Apache')
self.assertEqual(self.err, '')
self.assert_('<project name="Apache">' in self.out)
def testMetaPac(self):
- self.out, self.err = runosc('meta Apache apache2')
+ self.out, self.err = runosc('meta pkg Apache apache2')
self.assertEqual(self.err, '')
self.assert_('<package project="Apache" name="apache2">' in self.out)
@@ -274,8 +273,9 @@
self.out, self.err = runosc('ci')
self.assertEqual(self.err, '')
- self.assertEqual(self.out, """Sending foo1
+ self.assertEqual(remove_revid(self.out), """Sending foo1
Transmitting file data .
+Committed revision XX.
""")
@@ -286,8 +286,9 @@
self.out, self.err = runosc('ci')
self.assertEqual(self.err, '')
- self.assertEqual(self.out, """Deleting foo1
+ self.assertEqual(remove_revid(self.out), """Deleting foo1
Transmitting file data
+Committed revision XX.
""")
@@ -322,8 +323,9 @@
# check in a single argument
self.out, self.err = runosc('ci foo2')
self.assertEqual(self.err, '')
- self.assertEqual(self.out, """Sending foo2
+ self.assertEqual(remove_revid(self.out), """Sending foo2
Transmitting file data .
+Committed revision XX.
""")
# clean up
@@ -341,9 +343,10 @@
self.assertEqual(self.out, 'D foo2\nA bar1\n')
self.out, self.err = runosc('ci')
self.assertEqual(self.err, '')
- self.assertEqual(self.out, """Sending bar1
+ self.assertEqual(remove_revid(self.out), """Sending bar1
Deleting foo2
Transmitting file data .
+Committed revision XX.
""")
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/osc-0.97/TODO new/osc-0.97/TODO
--- old/osc-0.97/TODO 2007-07-04 15:31:39.000000000 +0200
+++ new/osc-0.97/TODO 2007-07-16 18:20:09.000000000 +0200
@@ -1,12 +1,6 @@
MAJOR:
- - new meta command, replacing usermeta, edituser, editprj, editmeta, ... [2]
- (poeml has started to work on this one)
- - See http://lists.opensuse.org/opensuse-buildservice/2007-05/msg00202.html
- and the two followups.
- - thereby, implement editing of project configuration (already works in api & backend)
-
- commit message handling, and source revision handling. This affects the commands
co, up, log, ci, diff. (Checking out or diffing against old revivions,
committing with commit messages, and reviewing the commit log)
@@ -27,12 +21,16 @@
(should also work with multiple spec files <package-name>-<repository-name>.spec, and with <package-name>-<version>.spec)
- think about how to locally build "linked" packages
+ http://lists4.opensuse.org/opensuse-buildservice/2007-07/msg00043.html
+ https://bugzilla.novell.com/show_bug.cgi?id=212565
NORMAL:
- add support for local build of packages which do not exist / have not been
created yet in the buildservice
+ - add switches to the meta command for easy adding of other maintainers
+ (like 'osc meta prj --add-maintainer foo')
- write howto for plugin-izing subcommand implementation
- split functionality that needs prj/pac as commandline arguments into a seperate tool (oscremote? osc -r?)
- status: implement -u option as in svn [3]
@@ -46,6 +44,10 @@
- show request body of 400 responses (bad request)
- commit: check if errors during PUT are handled sensibly, so the change is
not committed to localmeta
+ - store password base64 hashed, so it is not directly visible in plaintext
+ when opening .oscrc and someone is looking over the shoulder
+ - use http://code.google.com/p/iniparse/ instead of ConfigParser, with
+ write capability, for the change
MINOR:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org