# HG changeset patch # User Goffi # Date 1522513386 -7200 # Node ID b27165bf160c2451e6b4c2b429245dbfbc512748 # Parent 1d754bc14381c30aa68db6fc156941dc482395cf jp (merge-request/set): if service and node are not specified, URIFinder is now used + ask confirmation before publishing diff -r 1d754bc14381 -r b27165bf160c frontends/src/jp/cmd_merge_request.py --- a/frontends/src/jp/cmd_merge_request.py Sat Mar 31 18:21:56 2018 +0200 +++ b/frontends/src/jp/cmd_merge_request.py Sat Mar 31 18:23:06 2018 +0200 @@ -22,6 +22,7 @@ from sat.core.i18n import _ from sat_frontends.jp.constants import Const as C from sat_frontends.jp import xmlui_manager +from sat_frontends.jp import common from functools import partial import os.path @@ -31,12 +32,15 @@ class Set(base.CommandBase): def __init__(self, host): - base.CommandBase.__init__(self, host, 'set', use_pubsub=True, help=_(u'publish or update a merge request')) + base.CommandBase.__init__(self, host, 'set', use_pubsub=True, + pubsub_defaults = {u'service': _(u'auto'), u'node': _(u'auto')}, + help=_(u'publish or update a merge request')) self.need_loop=True def add_parser_options(self): self.parser.add_argument("-i", "--item", type=base.unicode_decoder, default=u'', help=_(u"id or URL of the request to update, or nothing for a new one")) self.parser.add_argument("-r", "--repository", metavar="PATH", type=base.unicode_decoder, default=u'.', help=_(u"path of the repository (DEFAULT: current directory)")) + self.parser.add_argument("-f", "--force", action="store_true", help=_(u"publish merge request without confirmation")) def mergeRequestSetCb(self, published_id): if published_id: @@ -45,13 +49,12 @@ self.disp(u"Merge request published") self.host.quit(C.EXIT_OK) - def start(self): - repository = os.path.expanduser(os.path.abspath(self.args.repository)) + def sendRequest(self): extra = {'update': 'true'} if self.args.item else {} self.host.bridge.mergeRequestSet( self.args.service, self.args.node, - repository, + self.repository, u'auto', {}, u'', @@ -63,6 +66,17 @@ msg=_(u"can't create merge request: {}"), exit_code=C.EXIT_BRIDGE_ERRBACK)) + def askConfirmation(self): + if not self.args.force: + message = _(u"You are going to publish your changes to service [{service}], are you sure ?").format( + service=self.args.service) + self.host.confirmOrQuit(message, _(u"merge request publication cancelled")) + self.sendRequest() + + def start(self): + self.repository = os.path.expanduser(os.path.abspath(self.args.repository)) + common.URIFinder(self, self.repository, 'merge requests', self.askConfirmation) + class Get(base.CommandBase): diff -r 1d754bc14381 -r b27165bf160c frontends/src/jp/common.py --- a/frontends/src/jp/common.py Sat Mar 31 18:21:56 2018 +0200 +++ b/frontends/src/jp/common.py Sat Mar 31 18:23:06 2018 +0200 @@ -22,9 +22,11 @@ from sat.core import exceptions from sat.tools.common import regex from sat.tools.common.ansi import ANSI as A +from sat.tools.common import uri as xmpp_uri from sat.tools import config from ConfigParser import NoSectionError, NoOptionError from collections import namedtuple +from functools import partial import json import os import os.path @@ -663,3 +665,37 @@ kwargs_ = {'col_sep':u' ', 'head_line_sep':u' ', 'show_borders':False} kwargs_.update(kwargs) return self.display(**kwargs_) + + +class URIFinder(object): + """Helper class to find URIs in well-known locations""" + + def __init__(self, command, path, key, callback): + if not command.args.service and not command.args.node: + self.host = command.host + self.args = command.args + self.key = key + self.callback = callback + self.host.bridge.URIFind(path, + [key], + callback=self.URIFindCb, + errback=partial(command.errback, + msg=_(u"can't find " + key + u" URI: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + else: + callback() + + def URIFindCb(self, uri_data): + try: + uri = uri_data[self.key] + except KeyError: + self.host.disp(_(u"No {key} URI specified for this project, please specify service and node").format(key=self.key), error=True) + self.host.quit(C.EXIT_NOT_FOUND) + parsed_uri = xmpp_uri.parseXMPPUri(uri) + try: + self.args.service = parsed_uri[u'path'] + self.args.node = parsed_uri[u'node'] + except KeyError: + self.host.disp(_(u"Invalid URI found: {uri}").format(uri=uri), error=True) + self.host.quit(C.EXIT_DATA_ERROR) + self.callback()