path: add a method to retrieve a "push variant" of a path
authorPierre-Yves David <pierre-yves.david@octobus.net>
Thu, 01 Dec 2022 01:32:24 +0100
changeset 49696 0acefbbcc82a
parent 49694 dd62eb4d2ea5
child 49697 1fae401b3b14
path: add a method to retrieve a "push variant" of a path This gets you the same path, but using the `pushurl` as destination. This opens the way for a lot of different improvements, the one which interests us is having `peer` objects aware of the `path` they came from.
mercurial/utils/urlutil.py
--- a/mercurial/utils/urlutil.py	Thu Dec 01 01:27:47 2022 +0100
+++ b/mercurial/utils/urlutil.py	Thu Dec 01 01:32:24 2022 +0100
@@ -867,6 +867,7 @@
         self.name = name
 
         # set by path variant to point to their "non-push" version
+        self.main_path = None
         self._setup_url(rawloc)
 
         if validate_path:
@@ -907,6 +908,26 @@
             new.__dict__[k] = v
         return new
 
+    @property
+    def is_push_variant(self):
+        """is this a path variant to be used for pushing"""
+        return self.main_path is not None
+
+    def get_push_variant(self):
+        """get a "copy" of the path, but suitable for pushing
+
+        This means using the value of the `pushurl` option (if any) as the url.
+
+        The original path is available in the `main_path` attribute.
+        """
+        if self.main_path:
+            return self
+        new = self.copy()
+        new.main_path = self
+        if self.pushloc:
+            new._setup_url(self.pushloc)
+        return new
+
     def _validate_path(self):
         # When given a raw location but not a symbolic name, validate the
         # location is valid.