mirror of
https://github.com/openSUSE/osc.git
synced 2025-02-26 12:12:11 +01:00
- meta: implement -F|--file switch. Can read from stdin to ease scripting.
- rework editmeta class, because it was programmed to pull content from the server first - add a catch-all for the depracated commands which refers to the new meta command
This commit is contained in:
parent
4944828bf1
commit
5284a9b783
8
TODO
8
TODO
@ -1,12 +1,6 @@
|
|||||||
|
|
||||||
MAJOR:
|
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
|
- commit message handling, and source revision handling. This affects the commands
|
||||||
co, up, log, ci, diff. (Checking out or diffing against old revivions,
|
co, up, log, ci, diff. (Checking out or diffing against old revivions,
|
||||||
committing with commit messages, and reviewing the commit log)
|
committing with commit messages, and reviewing the commit log)
|
||||||
@ -35,6 +29,8 @@ NORMAL:
|
|||||||
|
|
||||||
- add support for local build of packages which do not exist / have not been
|
- add support for local build of packages which do not exist / have not been
|
||||||
created yet in the buildservice
|
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
|
- write howto for plugin-izing subcommand implementation
|
||||||
- split functionality that needs prj/pac as commandline arguments into a seperate tool (oscremote? osc -r?)
|
- split functionality that needs prj/pac as commandline arguments into a seperate tool (oscremote? osc -r?)
|
||||||
- status: implement -u option as in svn [3]
|
- status: implement -u option as in svn [3]
|
||||||
|
@ -132,11 +132,11 @@ class Osc(cmdln.Cmdln):
|
|||||||
print '\n'.join(l)
|
print '\n'.join(l)
|
||||||
|
|
||||||
|
|
||||||
@cmdln.option('-e', '--edit', action='store_true',
|
|
||||||
help='edit metadata')
|
|
||||||
@cmdln.option('-F', '--file', metavar='FILE',
|
@cmdln.option('-F', '--file', metavar='FILE',
|
||||||
help='read metadata from FILE, instead of opening an editor. '
|
help='read metadata from FILE, instead of opening an editor. '
|
||||||
'\'-\' denotes standard input. ')
|
'\'-\' denotes standard input. ')
|
||||||
|
@cmdln.option('-e', '--edit', action='store_true',
|
||||||
|
help='edit metadata')
|
||||||
def do_meta(self, subcmd, opts, *args):
|
def do_meta(self, subcmd, opts, *args):
|
||||||
"""${cmd_name}: Show meta information, or edit it
|
"""${cmd_name}: Show meta information, or edit it
|
||||||
|
|
||||||
@ -154,14 +154,17 @@ class Osc(cmdln.Cmdln):
|
|||||||
With the --edit switch, the metadata can be edited. Per default, osc
|
With the --edit switch, the metadata can be edited. Per default, osc
|
||||||
opens the program specified by the environmental variable EDITOR with a
|
opens the program specified by the environmental variable EDITOR with a
|
||||||
temporary file. Alternatively, content to be saved can be supplied via
|
temporary file. Alternatively, content to be saved can be supplied via
|
||||||
the --file switch.
|
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
|
The --create switch is subject to discussion and not implemented. The
|
||||||
current behaviour is to create a non-existing resource implicitely, if
|
current behaviour is to create a non-existing resource implicitely, if
|
||||||
while it is edited.
|
while it is edited.
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
osc meta <prj|pkg|prjconf|user> [-e|--edit [-f|--file] [-c|--create]] ARGS...
|
osc meta <prj|pkg|prjconf|user> ARGS...
|
||||||
|
osc meta <prj|pkg|prjconf|user> -e|--edit [-c|--create] ARGS...
|
||||||
|
osc meta <prj|pkg|prjconf|user> -F|--file ARGS...
|
||||||
${cmd_option_list}
|
${cmd_option_list}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -185,51 +188,106 @@ class Osc(cmdln.Cmdln):
|
|||||||
print >>sys.stderr, 'Too many arguments.'
|
print >>sys.stderr, 'Too many arguments.'
|
||||||
return 2
|
return 2
|
||||||
|
|
||||||
# prj
|
# specific arguments
|
||||||
if cmd == 'prj':
|
if cmd == 'prj':
|
||||||
project = args[0]
|
project = args[0]
|
||||||
if not opts.edit:
|
|
||||||
sys.stdout.write(''.join(show_project_meta(conf.config['apiurl'], project)))
|
|
||||||
else:
|
|
||||||
edit_meta(metatype='prj',
|
|
||||||
path_args = quote_plus(project),
|
|
||||||
template_args = (project, conf.config['user']))
|
|
||||||
|
|
||||||
# pkg
|
|
||||||
elif cmd == 'pkg':
|
elif cmd == 'pkg':
|
||||||
project, package = args[0:2]
|
project, package = args[0:2]
|
||||||
if not opts.edit:
|
|
||||||
sys.stdout.write(''.join(show_package_meta(conf.config['apiurl'], project, package)))
|
|
||||||
else:
|
|
||||||
edit_meta(metatype='pkg',
|
|
||||||
path_args = (quote_plus(project), quote_plus(package)),
|
|
||||||
template_args = (package, conf.config['user']))
|
|
||||||
|
|
||||||
# prjconf
|
|
||||||
elif cmd == 'prjconf':
|
elif cmd == 'prjconf':
|
||||||
project = args[0]
|
project = args[0]
|
||||||
if not opts.edit:
|
|
||||||
sys.stdout.write(''.join(show_project_conf(conf.config['apiurl'], project)))
|
|
||||||
else:
|
|
||||||
edit_meta(metatype='prjconf',
|
|
||||||
path_args = quote_plus(project),
|
|
||||||
template_args = None)
|
|
||||||
|
|
||||||
# user
|
|
||||||
elif cmd == 'user':
|
elif cmd == 'user':
|
||||||
user = args[0]
|
user = args[0]
|
||||||
if not opts.edit:
|
|
||||||
|
# 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)
|
r = get_user_meta(conf.config['apiurl'], user)
|
||||||
if r:
|
if r:
|
||||||
sys.stdout.write(''.join(r))
|
sys.stdout.write(''.join(r))
|
||||||
else:
|
|
||||||
|
# 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_meta(metatype='user',
|
||||||
path_args = (quote_plus(user)),
|
edit=True,
|
||||||
template_args = (user, user))
|
path_args=(quote_plus(user)),
|
||||||
|
template_args=(user, user))
|
||||||
|
|
||||||
|
# upload file
|
||||||
|
if opts.file:
|
||||||
|
|
||||||
|
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 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)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
See the help output of 'meta'.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
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")
|
# @cmdln.alias("createpac")
|
||||||
# def do_editpac(self, subcmd, opts, project, package):
|
# def do_editpac(self, subcmd, opts, project, package):
|
||||||
@ -257,52 +315,6 @@ class Osc(cmdln.Cmdln):
|
|||||||
# edit_meta(project, None)
|
# edit_meta(project, None)
|
||||||
|
|
||||||
|
|
||||||
# def do_editmeta(self, subcmd, opts, *args):
|
|
||||||
# """${cmd_name}: Edit project/package meta information
|
|
||||||
#
|
|
||||||
# If the named project or package does not exist, it will be created.
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
# osc editmeta Apache # edit meta of project 'Apache'
|
|
||||||
# osc editmeta Apache apache2 # edit meta of package 'apache2'
|
|
||||||
#
|
|
||||||
# ${cmd_usage}
|
|
||||||
# ${cmd_option_list}
|
|
||||||
# """
|
|
||||||
#
|
|
||||||
# args = slash_split(args)
|
|
||||||
#
|
|
||||||
# if not args:
|
|
||||||
# print >>sys.stderr, 'Missing argument.'
|
|
||||||
# self.do_help([None, 'editmeta'])
|
|
||||||
# return 2
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
|
|
||||||
# def do_edituser(self, subcmd, opts, *args):
|
|
||||||
# """${cmd_name}: Edit user meta information
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
|
|
||||||
def do_linkpac(self, subcmd, opts, *args):
|
def do_linkpac(self, subcmd, opts, *args):
|
||||||
"""${cmd_name}: "Link" a package to another package
|
"""${cmd_name}: "Link" a package to another package
|
||||||
|
|
||||||
@ -1032,20 +1044,6 @@ class Osc(cmdln.Cmdln):
|
|||||||
p.clear_from_conflictlist(filename)
|
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):
|
def do_platforms(self, subcmd, opts, *args):
|
||||||
"""${cmd_name}: Shows available platforms
|
"""${cmd_name}: Shows available platforms
|
||||||
|
|
||||||
|
86
osc/core.py
86
osc/core.py
@ -904,30 +904,16 @@ def show_package_meta(apiurl, prj, pac):
|
|||||||
|
|
||||||
class metafile:
|
class metafile:
|
||||||
"""metafile that can be manipulated and is stored back after manipulation."""
|
"""metafile that can be manipulated and is stored back after manipulation."""
|
||||||
def __init__(self, metatype, path, template, change_is_required=True):
|
def __init__(self, url, input, change_is_required=False):
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
|
self.url = url
|
||||||
self.change_is_required = change_is_required
|
self.change_is_required = change_is_required
|
||||||
|
|
||||||
(fd, self.filename) = tempfile.mkstemp(prefix = 'osc_editmeta.', suffix = '.xml', dir = '/tmp')
|
(fd, self.filename) = tempfile.mkstemp(prefix = 'osc_metafile.', suffix = '.xml', dir = '/tmp')
|
||||||
|
|
||||||
self.url = makeurl(conf.config['apiurl'], [path])
|
|
||||||
try:
|
|
||||||
m = http_GET(self.url).readlines()
|
|
||||||
# when testing this offline: <-- what did I mean with that??
|
|
||||||
#except urllib2.URLError, e:
|
|
||||||
# m = template
|
|
||||||
except urllib2.HTTPError, e:
|
|
||||||
if e.code == 404:
|
|
||||||
m = template
|
|
||||||
else:
|
|
||||||
print >>sys.stderr, 'error getting metadata for type \'%s\', path \'%s\':' \
|
|
||||||
% (metatype, self.url)
|
|
||||||
print >>sys.stderr, e
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
f = os.fdopen(fd, 'w')
|
f = os.fdopen(fd, 'w')
|
||||||
f.write(''.join(m))
|
f.write(''.join(input))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
self.hash_orig = dgst(self.filename)
|
self.hash_orig = dgst(self.filename)
|
||||||
@ -976,29 +962,57 @@ metatypes = { 'prj': { 'path': 'source/%s/_meta',
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def edit_meta(metatype, path_args, template_args, change_is_required=True):
|
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']
|
path = metatypes[metatype]['path']
|
||||||
template = metatypes[metatype]['template']
|
|
||||||
if path_args:
|
if path_args:
|
||||||
path = path % path_args
|
path = path % path_args
|
||||||
if template_args:
|
|
||||||
template = template % template_args
|
|
||||||
|
|
||||||
f=metafile(metatype, path, template, change_is_required)
|
url = makeurl(conf.config['apiurl'], [path])
|
||||||
|
|
||||||
editor = os.getenv('EDITOR', default='vim')
|
if not data:
|
||||||
while 1:
|
try:
|
||||||
os.system('%s %s' % (editor, f.filename))
|
data = http_GET(url).readlines()
|
||||||
if change_is_required == True:
|
except urllib2.HTTPError, e:
|
||||||
if not f.sync():
|
if e.code == 404:
|
||||||
input = raw_input('Try again? (yY = Yes - nN = No): ')
|
data = metatypes[metatype]['template']
|
||||||
if input != 'y' and input != 'Y':
|
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)
|
||||||
|
|
||||||
|
if edit:
|
||||||
|
change_is_required = True
|
||||||
|
|
||||||
|
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
|
break
|
||||||
else:
|
else:
|
||||||
|
f.sync()
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
f.sync()
|
f.sync()
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
def show_files_meta(apiurl, prj, pac, revision=None):
|
def show_files_meta(apiurl, prj, pac, revision=None):
|
||||||
@ -1215,7 +1229,11 @@ def link_pac(src_project, src_package, dst_project, dst_package):
|
|||||||
tree.write(buf)
|
tree.write(buf)
|
||||||
src_meta = buf.getvalue()
|
src_meta = buf.getvalue()
|
||||||
|
|
||||||
edit_meta(dst_project, dst_package, template=src_meta, change_is_required=False)
|
#edit_meta(dst_project, dst_package, template=src_meta)
|
||||||
|
edit_meta('pkg',
|
||||||
|
input=src_meta,
|
||||||
|
path_args=(dst_project, dst_package),
|
||||||
|
template_args=(dst_package, conf.config['user']))
|
||||||
|
|
||||||
# create the _link file
|
# create the _link file
|
||||||
# but first, make sure not to overwrite an existing one
|
# but first, make sure not to overwrite an existing one
|
||||||
|
Loading…
x
Reference in New Issue
Block a user