1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-12-28 10:46:15 +01:00
Introduce "osc request approval..." and "osc request cancelapproval"
commands.
This commit is contained in:
Marcus Huewe 2018-10-18 15:23:06 +02:00
commit f12c7747d0
5 changed files with 28 additions and 6 deletions

2
NEWS
View File

@ -1,5 +1,5 @@
0.164 0.164
- - add support for approved requests (requires OBS 2.10)
0.163 0.163
- add sendsysrq command (requires OBS 2.10) - add sendsysrq command (requires OBS 2.10)

View File

@ -2130,6 +2130,9 @@ Please submit there instead, or use --nodevelproject to force direct submission.
the actual submit process. That would normally be a server-side copy of the actual submit process. That would normally be a server-side copy of
the source package to the target package. the source package to the target package.
"approve" marks a requests in "review" state as approved. This request will get accepted
automatically when the last review got accepted.
"checkout" will checkout the request's source package ("submit" requests only). "checkout" will checkout the request's source package ("submit" requests only).
"priorize" change the prioritity of a request to either "critical", "important", "moderate" or "low" "priorize" change the prioritity of a request to either "critical", "important", "moderate" or "low"
@ -2153,6 +2156,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
osc request [show] [-d] [-b] ID osc request [show] [-d] [-b] ID
osc request accept [-m TEXT] ID osc request accept [-m TEXT] ID
osc request approve [-m TEXT] ID
osc request cancelapprove [-m TEXT] ID
osc request decline [-m TEXT] ID osc request decline [-m TEXT] ID
osc request revoke [-m TEXT] ID osc request revoke [-m TEXT] ID
osc request reopen [-m TEXT] ID osc request reopen [-m TEXT] ID
@ -2199,7 +2204,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
if args[0] == 'help': if args[0] == 'help':
return self.do_help(['help', 'request']) return self.do_help(['help', 'request'])
cmds = ['list', 'ls', 'log', 'show', 'decline', 'reopen', 'clone', 'accept', 'approvenew', 'wipe', 'setincident', 'supersede', 'revoke', 'checkout', 'co', 'priorize'] cmds = ['list', 'ls', 'log', 'show', 'decline', 'reopen', 'clone', 'accept', 'approve', 'cancelapproval',
'approvenew', 'wipe', 'setincident', 'supersede', 'revoke', 'checkout', 'co', 'priorize']
if subcmd != 'review' and args[0] not in cmds: if subcmd != 'review' and args[0] not in cmds:
raise oscerr.WrongArgs('Unknown request action %s. Choose one of %s.' \ raise oscerr.WrongArgs('Unknown request action %s. Choose one of %s.' \
% (args[0], ', '.join(cmds))) % (args[0], ', '.join(cmds)))
@ -2259,7 +2265,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
elif cmd == 'priorize': elif cmd == 'priorize':
reqid = args[0] reqid = args[0]
priority = args[1] priority = args[1]
elif cmd in ['log', 'add', 'show', 'decline', 'reopen', 'clone', 'accept', 'wipe', 'revoke', 'checkout', 'co']: elif cmd in ['log', 'add', 'show', 'decline', 'reopen', 'clone', 'accept', 'wipe', 'revoke', 'checkout',
'co', 'approve', 'cancelapproval']:
reqid = args[0] reqid = args[0]
# clone all packages from a given request # clone all packages from a given request
@ -2267,6 +2274,13 @@ Please submit there instead, or use --nodevelproject to force direct submission.
# should we force a message? # should we force a message?
print('Cloned packages are available in project: %s' % clone_request(apiurl, reqid, opts.message)) print('Cloned packages are available in project: %s' % clone_request(apiurl, reqid, opts.message))
# approve request
elif cmd == 'approve' or cmd == 'cancelapproval':
query = { 'cmd': cmd }
url = makeurl(apiurl, ['request', reqid], query)
r = http_POST(url, data=opts.message)
print(ET.parse(r).getroot().get('code'))
# change incidents # change incidents
elif cmd == 'setincident': elif cmd == 'setincident':
query = { 'cmd': 'setincident', 'incident': incident } query = { 'cmd': 'setincident', 'incident': incident }

View File

@ -2586,6 +2586,7 @@ class RequestState(AbstractState):
self.name = state_node.get('name') self.name = state_node.get('name')
self.who = state_node.get('who') self.who = state_node.get('who')
self.when = state_node.get('when') self.when = state_node.get('when')
self.approver = state_node.get('approver')
if state_node.find('description') is None: if state_node.find('description') is None:
# OBS 2.6 has it always, before it did not exist # OBS 2.6 has it always, before it did not exist
self.description = state_node.get('description') self.description = state_node.get('description')
@ -2595,7 +2596,7 @@ class RequestState(AbstractState):
self.comment = state_node.find('comment').text.strip() self.comment = state_node.find('comment').text.strip()
def get_node_attrs(self): def get_node_attrs(self):
return ('name', 'who', 'when') return ('name', 'who', 'when', 'approver')
def get_comment(self): def get_comment(self):
return self.comment return self.comment
@ -2943,7 +2944,10 @@ class Request:
def list_view(self): def list_view(self):
"""return "list view" format""" """return "list view" format"""
import textwrap import textwrap
lines = ['%6s State:%-10s By:%-12s When:%-19s' % (self.reqid, self.state.name, self.state.who, self.state.when)] status = self.state.name
if self.state.name == 'review' and self.state.approver:
status += "(approved)"
lines = ['%6s State:%-10s By:%-12s When:%-19s' % (self.reqid, status, self.state.who, self.state.when)]
tmpl = ' %(type)-16s %(source)-50s %(target)s' tmpl = ' %(type)-16s %(source)-50s %(target)s'
for action in self.actions: for action in self.actions:
lines.append(tmpl % self.format_action(action)) lines.append(tmpl % self.format_action(action))
@ -2967,6 +2971,8 @@ class Request:
lines.append(' *** This request will get automatically accepted after '+self.accept_at+' ! ***\n') lines.append(' *** This request will get automatically accepted after '+self.accept_at+' ! ***\n')
if self.priority in [ 'critical', 'important' ] and self.state.name in [ 'new', 'review' ]: if self.priority in [ 'critical', 'important' ] and self.state.name in [ 'new', 'review' ]:
lines.append(' *** This request has classified as '+self.priority+' ! ***\n') lines.append(' *** This request has classified as '+self.priority+' ! ***\n')
if self.state.approver and self.state.name == 'review':
lines.append(' *** This request got approved by '+self.state.approver+'. It will get automatically accepted after last review got accepted! ***\n')
for action in self.actions: for action in self.actions:
tmpl = ' %(type)-13s %(source)s %(target)s' tmpl = ' %(type)-13s %(source)s %(target)s'

View File

@ -11,7 +11,7 @@
<person name="bar" role="maintainer" /> <person name="bar" role="maintainer" />
<group name="groupxyz" role="reader" /> <group name="groupxyz" role="reader" />
</action> </action>
<state name="review" when="2010-12-27T01:36:29" who="abc" /> <state approver="someone" name="review" when="2010-12-27T01:36:29" who="abc" />
<review by_group="group1" state="new" when="2010-12-28T00:11:22" who="abc"> <review by_group="group1" state="new" when="2010-12-28T00:11:22" who="abc">
<comment>review start</comment> <comment>review start</comment>
</review> </review>

View File

@ -341,6 +341,7 @@ class TestRequest(OscTestCase):
self.assertEqual(r.state.name, 'accepted') self.assertEqual(r.state.name, 'accepted')
self.assertEqual(r.state.when, '2010-12-27T01:36:29') self.assertEqual(r.state.when, '2010-12-27T01:36:29')
self.assertEqual(r.state.who, 'user1') self.assertEqual(r.state.who, 'user1')
self.assertEqual(r.state.approver, None)
self.assertEqual(r.state.comment, '') self.assertEqual(r.state.comment, '')
self.assertEqual(r.statehistory[0].when, '2010-12-13T13:02:03') self.assertEqual(r.statehistory[0].when, '2010-12-13T13:02:03')
self.assertEqual(r.statehistory[0].who, 'creator') self.assertEqual(r.statehistory[0].who, 'creator')
@ -373,6 +374,7 @@ class TestRequest(OscTestCase):
self.assertTrue(r.actions[1].tgt_package is None) self.assertTrue(r.actions[1].tgt_package is None)
self.assertEqual(r.state.name, 'review') self.assertEqual(r.state.name, 'review')
self.assertEqual(r.state.when, '2010-12-27T01:36:29') self.assertEqual(r.state.when, '2010-12-27T01:36:29')
self.assertEqual(r.state.approver, 'someone')
self.assertEqual(r.state.who, 'abc') self.assertEqual(r.state.who, 'abc')
self.assertEqual(r.state.comment, '') self.assertEqual(r.state.comment, '')
self.assertEqual(r.reviews[0].state, 'new') self.assertEqual(r.reviews[0].state, 'new')