Mercurial > libervia-backend
diff sat_frontends/jp/cmd_merge_request.py @ 3040:fee60f17ebac
jp: jp asyncio port:
/!\ this commit is huge. Jp is temporarily not working with `dbus` bridge /!\
This patch implements the port of jp to asyncio, so it is now correctly using the bridge
asynchronously, and it can be used with bridges like `pb`. This also simplify the code,
notably for things which were previously implemented with many callbacks (like pagination
with RSM).
During the process, some behaviours have been modified/fixed, in jp and backends, check
diff for details.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 25 Sep 2019 08:56:41 +0200 |
parents | ab2696e34d29 |
children | 9d0df638c8b4 |
line wrap: on
line diff
--- a/sat_frontends/jp/cmd_merge_request.py Wed Sep 25 08:53:38 2019 +0200 +++ b/sat_frontends/jp/cmd_merge_request.py Wed Sep 25 08:56:41 2019 +0200 @@ -18,19 +18,19 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. +import os.path from . import base from sat.core.i18n import _ from sat.tools.common import data_format 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 __commands__ = ["MergeRequest"] class Set(base.CommandBase): + def __init__(self, host): base.CommandBase.__init__( self, @@ -40,7 +40,6 @@ pubsub_defaults={"service": _("auto"), "node": _("auto")}, help=_("publish or update a merge request"), ) - self.need_loop = True def add_parser_options(self): self.parser.add_argument( @@ -70,47 +69,43 @@ help=_("labels to categorize your request"), ) - def mergeRequestSetCb(self, published_id): - if published_id: - self.disp("Merge request published at {pub_id}".format(pub_id=published_id)) - else: - self.disp("Merge request published") - self.host.quit(C.EXIT_OK) + async def start(self): + self.repository = os.path.expanduser(os.path.abspath(self.args.repository)) + await common.fill_well_known_uri(self, self.repository, "merge requests") + if not self.args.force: + message = _( + f"You are going to publish your changes to service " + f"[{self.args.service}], are you sure ?" + ) + await self.host.confirmOrQuit( + message, _("merge request publication cancelled")) - def sendRequest(self): extra = {"update": True} if self.args.item else {} values = {} if self.args.labels is not None: values["labels"] = self.args.labels - self.host.bridge.mergeRequestSet( - self.args.service, - self.args.node, - self.repository, - "auto", - values, - "", - self.args.item, - data_format.serialise(extra), - self.profile, - callback=self.mergeRequestSetCb, - errback=partial( - self.errback, - msg=_("can't create merge request: {}"), - exit_code=C.EXIT_BRIDGE_ERRBACK, - ), - ) + try: + published_id = await self.host.bridge.mergeRequestSet( + self.args.service, + self.args.node, + self.repository, + "auto", + values, + "", + self.args.item, + data_format.serialise(extra), + self.profile, + ) + except Exception as e: + self.disp(f"can't create merge requests: {e}", error=True) + self.host.quit(C.EXIT_BRIDGE_ERRBACK) - def askConfirmation(self): - if not self.args.force: - message = _( - "You are going to publish your changes to service [{service}], are you sure ?" - ).format(service=self.args.service) - self.host.confirmOrQuit(message, _("merge request publication cancelled")) - self.sendRequest() + if published_id: + self.disp(_(f"Merge request published at {published_id}")) + else: + self.disp(_("Merge request published")) - def start(self): - self.repository = os.path.expanduser(os.path.abspath(self.args.repository)) - common.URIFinder(self, self.repository, "merge requests", self.askConfirmation) + self.host.quit(C.EXIT_OK) class Get(base.CommandBase): @@ -125,45 +120,38 @@ pubsub_defaults={"service": _("auto"), "node": _("auto")}, help=_("get a merge request"), ) - self.need_loop = True def add_parser_options(self): pass - def mergeRequestGetCb(self, requests_data): + async def start(self): + await common.fill_well_known_uri( + self, os.getcwd(), "merge requests", meta_map={}) + extra = {} + try: + requests_data = await self.host.bridge.mergeRequestsGet( + self.args.service, + self.args.node, + self.args.max, + self.args.items, + "", + extra, + self.profile, + ) + except Exception as e: + self.disp(f"can't get merge request: {e}", error=True) + self.host.quit(C.EXIT_BRIDGE_ERRBACK) + if self.verbosity >= 1: whitelist = None else: whitelist = {"id", "title", "body"} for request_xmlui in requests_data[0]: xmlui = xmlui_manager.create(self.host, request_xmlui, whitelist=whitelist) - xmlui.show(values_only=True) + await xmlui.show(values_only=True) self.disp("") self.host.quit(C.EXIT_OK) - def getRequests(self): - extra = {} - self.host.bridge.mergeRequestsGet( - self.args.service, - self.args.node, - self.args.max, - self.args.items, - "", - extra, - self.profile, - callback=self.mergeRequestGetCb, - errback=partial( - self.errback, - msg=_("can't get merge request: {}"), - exit_code=C.EXIT_BRIDGE_ERRBACK, - ), - ) - - def start(self): - common.URIFinder( - self, os.getcwd(), "merge requests", self.getRequests, meta_map={} - ) - class Import(base.CommandBase): def __init__(self, host): @@ -176,7 +164,6 @@ pubsub_defaults={"service": _("auto"), "node": _("auto")}, help=_("import a merge request"), ) - self.need_loop = True def add_parser_options(self): self.parser.add_argument( @@ -187,31 +174,25 @@ help=_("path of the repository (DEFAULT: current directory)"), ) - def mergeRequestImportCb(self): - self.host.quit(C.EXIT_OK) - - def importRequest(self): + async def start(self): + self.repository = os.path.expanduser(os.path.abspath(self.args.repository)) + await common.fill_well_known_uri( + self, self.repository, "merge requests", meta_map={}) extra = {} - self.host.bridge.mergeRequestsImport( - self.repository, - self.args.item, - self.args.service, - self.args.node, - extra, - self.profile, - callback=self.mergeRequestImportCb, - errback=partial( - self.errback, - msg=_("can't import merge request: {}"), - exit_code=C.EXIT_BRIDGE_ERRBACK, - ), - ) - - def start(self): - self.repository = os.path.expanduser(os.path.abspath(self.args.repository)) - common.URIFinder( - self, self.repository, "merge requests", self.importRequest, meta_map={} - ) + try: + await self.host.bridge.mergeRequestsImport( + self.repository, + self.args.item, + self.args.service, + self.args.node, + extra, + self.profile, + ) + except Exception as e: + self.disp(f"can't import merge request: {e}", error=True) + self.host.quit(C.EXIT_BRIDGE_ERRBACK) + else: + self.host.quit() class MergeRequest(base.CommandBase):