548 user = util.shortuser(user) |
548 user = util.shortuser(user) |
549 return user |
549 return user |
550 |
550 |
551 def expandpath(self, loc, default=None): |
551 def expandpath(self, loc, default=None): |
552 """Return repository location relative to cwd or from [paths]""" |
552 """Return repository location relative to cwd or from [paths]""" |
553 if util.hasscheme(loc) or os.path.isdir(os.path.join(loc, '.hg')): |
|
554 return loc |
|
555 |
|
556 p = self.paths.getpath(loc, default=default) |
553 p = self.paths.getpath(loc, default=default) |
557 if p: |
554 if p: |
558 return p.loc |
555 return p.rawloc |
559 return loc |
556 return loc |
560 |
557 |
561 @util.propertycache |
558 @util.propertycache |
562 def paths(self): |
559 def paths(self): |
563 return paths(self) |
560 return paths(self) |
1000 if not loc: |
997 if not loc: |
1001 continue |
998 continue |
1002 self[name] = path(name, rawloc=loc) |
999 self[name] = path(name, rawloc=loc) |
1003 |
1000 |
1004 def getpath(self, name, default=None): |
1001 def getpath(self, name, default=None): |
1005 """Return a ``path`` for the specified name, falling back to a default. |
1002 """Return a ``path`` from a string, falling back to a default. |
|
1003 |
|
1004 ``name`` can be a named path or locations. Locations are filesystem |
|
1005 paths or URIs. |
1006 |
1006 |
1007 Returns the first of ``name`` or ``default`` that is present, or None |
1007 Returns the first of ``name`` or ``default`` that is present, or None |
1008 if neither is present. |
1008 if neither is present. |
1009 """ |
1009 """ |
1010 try: |
1010 try: |
1011 return self[name] |
1011 return self[name] |
1012 except KeyError: |
1012 except KeyError: |
|
1013 # Try to resolve as a local path or URI. |
|
1014 try: |
|
1015 return path(None, rawloc=name) |
|
1016 except ValueError: |
|
1017 pass |
|
1018 |
1013 if default is not None: |
1019 if default is not None: |
1014 try: |
1020 try: |
1015 return self[default] |
1021 return self[default] |
1016 except KeyError: |
1022 except KeyError: |
1017 pass |
1023 pass |
1024 def __init__(self, name, rawloc=None): |
1030 def __init__(self, name, rawloc=None): |
1025 """Construct a path from its config options. |
1031 """Construct a path from its config options. |
1026 |
1032 |
1027 ``name`` is the symbolic name of the path. |
1033 ``name`` is the symbolic name of the path. |
1028 ``rawloc`` is the raw location, as defined in the config. |
1034 ``rawloc`` is the raw location, as defined in the config. |
|
1035 |
|
1036 If ``name`` is not defined, we require that the location be a) a local |
|
1037 filesystem path with a .hg directory or b) a URL. If not, |
|
1038 ``ValueError`` is raised. |
1029 """ |
1039 """ |
|
1040 if not rawloc: |
|
1041 raise ValueError('rawloc must be defined') |
|
1042 |
|
1043 # Locations may define branches via syntax <base>#<branch>. |
|
1044 u = util.url(rawloc) |
|
1045 branch = None |
|
1046 if u.fragment: |
|
1047 branch = u.fragment |
|
1048 u.fragment = None |
|
1049 |
|
1050 self.url = u |
|
1051 self.branch = branch |
|
1052 |
1030 self.name = name |
1053 self.name = name |
1031 # We'll do more intelligent things with rawloc in the future. |
1054 self.rawloc = rawloc |
1032 self.loc = rawloc |
1055 self.loc = str(u) |
|
1056 |
|
1057 # When given a raw location but not a symbolic name, validate the |
|
1058 # location is valid. |
|
1059 if (not name and not u.scheme |
|
1060 and not os.path.isdir(os.path.join(str(u), '.hg'))): |
|
1061 raise ValueError('location is not a URL or path to a local ' |
|
1062 'repo: %s' % rawloc) |
1033 |
1063 |
1034 # we instantiate one globally shared progress bar to avoid |
1064 # we instantiate one globally shared progress bar to avoid |
1035 # competing progress bars when multiple UI objects get created |
1065 # competing progress bars when multiple UI objects get created |
1036 _progresssingleton = None |
1066 _progresssingleton = None |
1037 |
1067 |