urlutil: add a `copy` method to `path
authorPierre-Yves David <pierre-yves.david@octobus.net>
Thu, 15 Apr 2021 17:12:25 +0200
changeset 47196 a2632ce1f15b
parent 47195 9c4d30b079e0
child 47197 26b3953ba1b0
urlutil: add a `copy` method to `path This will be useful when inheriting from multiple path at the same time. Differential Revision: https://phab.mercurial-scm.org/D10445
mercurial/utils/urlutil.py
--- a/mercurial/utils/urlutil.py	Thu Apr 15 12:33:05 2021 +0200
+++ b/mercurial/utils/urlutil.py	Thu Apr 15 17:12:25 2021 +0200
@@ -707,7 +707,7 @@
 class path(object):
     """Represents an individual path and its configuration."""
 
-    def __init__(self, ui, name, rawloc=None, suboptions=None):
+    def __init__(self, ui=None, name=None, rawloc=None, suboptions=None):
         """Construct a path from its config options.
 
         ``ui`` is the ``ui`` instance the path is coming from.
@@ -719,6 +719,13 @@
         filesystem path with a .hg directory or b) a URL. If not,
         ``ValueError`` is raised.
         """
+        if ui is None:
+            # used in copy
+            assert name is None
+            assert rawloc is None
+            assert suboptions is None
+            return
+
         if not rawloc:
             raise ValueError(b'rawloc must be defined')
 
@@ -774,6 +781,16 @@
             suboptions.update(self._own_sub_opts)
             self._apply_suboptions(ui, suboptions)
 
+    def copy(self):
+        """make a copy of this path object"""
+        new = self.__class__()
+        for k, v in self.__dict__.items():
+            new_copy = getattr(v, 'copy', None)
+            if new_copy is not None:
+                v = new_copy()
+            new.__dict__[k] = v
+        return new
+
     def _validate_path(self):
         # When given a raw location but not a symbolic name, validate the
         # location is valid.