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):