SVN URL Parser - libvcs.url.svn
#
For svn, aka svn(1)
.
This module is an all-in-one parser and validator for Subversion URLs.
Detection:
SvnURL.is_valid()
Parse:
SvnURL
compare to
urllib.parse.ParseResult
Output
svn(1)
URL:SvnURL.to_url()
Note
Subversion isnβt seen as often these days, can you βrage against the dying of the lightβ and assure its light is not extinguished? Help assure SVN URL parsing is correct and robust. Visit the project tracker and give us a wave. This API wonβt be stabilized until weβre confident Subversion is covered accurately and can handle all-terrain scenarios.
- libvcs.url.svn.DEFAULT_RULES: list[libvcs.url.base.Rule] = [Rule(label=core-svn, description=Vanilla svn pattern, pattern=re.compile('\n ^\n (?P<scheme>\n (\n file|http|https|svn|svn\\+ssh\n )\n )\n\n ://\n \n ((?P<user>[^/:@]+)@)?\n (?P<hostname>([^/:@]+))\n (:(?P<port>\\d{1,5}), re.VERBOSE), defaults={}), Rule(label=core-svn-scp, description=Vanilla scp(1) / ssh(1) type URL, pattern=re.compile("\n ^(?P<scheme>ssh)?\n \n # Optional user, e.g. 'git@'\n ((?P<user>\\w+)@)?\n # Server, e.g. 'github.com'.\n (?P<hostname>([^/:]+))\n (?P<separator>:)\n # The server-s, re.VERBOSE), defaults={'username': 'svn'})]#
Core regular expressions. These are patterns understood by
svn(1)
- libvcs.url.svn.PIP_DEFAULT_RULES: list[libvcs.url.base.Rule] = [Rule(label=pip-url, description=pip-style svn URL, pattern=re.compile('\n ^\n (?P<scheme>\n (\n svn\\+ssh|\n svn\\+https|\n svn\\+http\n )\n )\n\n ://\n \n ((?P<user>[^/:@]+)@)?\n (?P<hostname>([^/:@]+))\n , re.VERBOSE), defaults={}, is_explicit=True), Rule(label=pip-file-url, description=pip-style svn+file:// URL, pattern=re.compile('\n (?P<scheme>svn\\+file)://\n (?P<path>.*)\n ', re.VERBOSE), defaults={}, is_explicit=True)]#
pip-style svn URLs.
Examples of PIP-style svn URLs (via pip.pypa.io):
MyProject @ svn+https://svn.example.com/MyProject MyProject @ svn+ssh://svn.example.com/MyProject MyProject @ svn+ssh://user@svn.example.com/MyProject
Refs (via pip.pypa.io):
MyProject @ -e svn+http://svn.example.com/svn/MyProject/trunk@2019 MyProject @ -e svn+http://svn.example.com/svn/MyProject/trunk@{20080101}
Notes
- class libvcs.url.svn.SvnBaseURL(url, scheme=None, user=None, hostname='', port=None, separator='/', path='', ref=None, rule=None)[source]#
Bases:
URLProtocol
,SkipDefaultFieldsReprMixin
SVN repository location. Parses URLs on initialization.
Examples
>>> SvnBaseURL( ... url='svn+ssh://svn.debian.org/svn/aliothproj/path/in/project/repository') SvnBaseURL(url=svn+ssh://svn.debian.org/svn/aliothproj/path/in/project/repository, scheme=svn+ssh, hostname=svn.debian.org, path=svn/aliothproj/path/in/project/repository, rule=core-svn)
>>> myrepo = SvnBaseURL( ... url='svn+ssh://svn.debian.org/svn/aliothproj/path/in/project/repository' ... )
>>> myrepo.hostname 'svn.debian.org'
>>> myrepo.path 'svn/aliothproj/path/in/project/repository'
Compatibility checking:
SvnBaseURL.is_valid()
URLs compatible with
svn(1)
:SvnBaseURL.to_url()
- Parameters:
- rule_map = RuleMap(_rule_map={'core-svn': Rule(label=core-svn, description=Vanilla svn pattern, pattern=re.compile('\n ^\n (?P<scheme>\n (\n file|http|https|svn|svn\\+ssh\n )\n )\n\n ://\n \n ((?P<user>[^/:@]+)@)?\n (?P<hostname>([^/:@]+))\n (:(?P<port>\\d{1,5}), re.VERBOSE), defaults={}), 'core-svn-scp': Rule(label=core-svn-scp, description=Vanilla scp(1) / ssh(1) type URL, pattern=re.compile("\n ^(?P<scheme>ssh)?\n \n # Optional user, e.g. 'git@'\n ((?P<user>\\w+)@)?\n # Server, e.g. 'github.com'.\n (?P<hostname>([^/:]+))\n (?P<separator>:)\n # The server-s, re.VERBOSE), defaults={'username': 'svn'})})#
- classmethod is_valid(url, is_explicit=None)[source]#
Whether URL is compatible with VCS or not.
Examples
>>> SvnBaseURL.is_valid( ... url='svn+ssh://svn.debian.org/svn/aliothproj/path/in/project/repository' ... ) True
>>> SvnBaseURL.is_valid(url='notaurl') False
- to_url()[source]#
Return a
svn(1)
-compatible URL. Can be used withsvn checkout
.- Return type:
Examples
>>> svn_url = SvnBaseURL( ... url='svn+ssh://[email protected]/vcs-python/libvcs' ... )
>>> svn_url SvnBaseURL(url=svn+ssh://[email protected]/vcs-python/libvcs, scheme=svn+ssh, user=my-username, hostname=my-server, path=vcs-python/libvcs, rule=core-svn)
Switch repo libvcs -> vcspull:
>>> svn_url.path = 'vcs-python/vcspull'
>>> svn_url.to_url() 'svn+ssh://[email protected]/vcs-python/vcspull'
Switch user to βtomβ:
>>> svn_url.user = 'tom'
>>> svn_url.to_url() 'svn+ssh://[email protected]/vcs-python/vcspull'
- _abc_impl = <_abc._abc_data object>#
- _is_protocol = False#
- class libvcs.url.svn.SvnPipURL(url, scheme=None, user=None, hostname='', port=None, separator='/', path='', ref=None, rule=None, rev=None)[source]#
Bases:
SvnBaseURL
,URLProtocol
,SkipDefaultFieldsReprMixin
Supports pip svn URLs.
- Parameters:
- rule_map = RuleMap(_rule_map={'pip-url': Rule(label=pip-url, description=pip-style svn URL, pattern=re.compile('\n ^\n (?P<scheme>\n (\n svn\\+ssh|\n svn\\+https|\n svn\\+http\n )\n )\n\n ://\n \n ((?P<user>[^/:@]+)@)?\n (?P<hostname>([^/:@]+))\n , re.VERBOSE), defaults={}, is_explicit=True), 'pip-file-url': Rule(label=pip-file-url, description=pip-style svn+file:// URL, pattern=re.compile('\n (?P<scheme>svn\\+file)://\n (?P<path>.*)\n ', re.VERBOSE), defaults={}, is_explicit=True)})#
- classmethod is_valid(url, is_explicit=None)[source]#
Whether URL is compatible with VCS or not.
Examples
>>> SvnPipURL.is_valid( ... url='svn+https://svn.project.org/project-central' ... ) True
>>> SvnPipURL.is_valid(url='svn+ssh://[email protected]:cpython') True
>>> SvnPipURL.is_valid(url='notaurl') False
- to_url()[source]#
Return a
svn(1)
-compatible URL. Can be used withsvn clone
.- Return type:
Examples
>>> svn_url = SvnPipURL(url='svn+https://svn.project.org/project-central')
>>> svn_url SvnPipURL(url=svn+https://svn.project.org/project-central, scheme=svn+https, hostname=svn.project.org, path=project-central, rule=pip-url)
Switch repo project-central -> mobile-browser:
>>> svn_url.path = 'mobile-browser'
>>> svn_url.to_url() 'svn+https://svn.project.org/mobile-browser'
Switch them to localhost:
>>> svn_url.hostname = 'localhost' >>> svn_url.scheme = 'http'
>>> svn_url.to_url() 'http://localhost/mobile-browser'
- _abc_impl = <_abc._abc_data object>#
- _is_protocol = False#
- class libvcs.url.svn.SvnURL(url, scheme=None, user=None, hostname='', port=None, separator='/', path='', ref=None, rule=None, rev=None)[source]#
Bases:
SvnPipURL
,SvnBaseURL
,URLProtocol
,SkipDefaultFieldsReprMixin
Batteries included URL Parser. Supports svn(1) and pip URLs.
Ancestors (MRO) This URL parser inherits methods and attributes from the following parsers:
- Parameters:
- rule_map = RuleMap(_rule_map={'core-svn': Rule(label=core-svn, description=Vanilla svn pattern, pattern=re.compile('\n ^\n (?P<scheme>\n (\n file|http|https|svn|svn\\+ssh\n )\n )\n\n ://\n \n ((?P<user>[^/:@]+)@)?\n (?P<hostname>([^/:@]+))\n (:(?P<port>\\d{1,5}), re.VERBOSE), defaults={}), 'core-svn-scp': Rule(label=core-svn-scp, description=Vanilla scp(1) / ssh(1) type URL, pattern=re.compile("\n ^(?P<scheme>ssh)?\n \n # Optional user, e.g. 'git@'\n ((?P<user>\\w+)@)?\n # Server, e.g. 'github.com'.\n (?P<hostname>([^/:]+))\n (?P<separator>:)\n # The server-s, re.VERBOSE), defaults={'username': 'svn'}), 'pip-url': Rule(label=pip-url, description=pip-style svn URL, pattern=re.compile('\n ^\n (?P<scheme>\n (\n svn\\+ssh|\n svn\\+https|\n svn\\+http\n )\n )\n\n ://\n \n ((?P<user>[^/:@]+)@)?\n (?P<hostname>([^/:@]+))\n , re.VERBOSE), defaults={}, is_explicit=True), 'pip-file-url': Rule(label=pip-file-url, description=pip-style svn+file:// URL, pattern=re.compile('\n (?P<scheme>svn\\+file)://\n (?P<path>.*)\n ', re.VERBOSE), defaults={}, is_explicit=True)})#
- _abc_impl = <_abc._abc_data object>#
- _is_protocol = False#
- classmethod is_valid(url, is_explicit=None)[source]#
Whether URL is compatible included Svn URL rule_map or not.
Examples
Will match normal
svn(1)
URLs, useSvnURL.is_valid()
for that.>>> SvnURL.is_valid( ... url='https://svn.project.org/project-central/project-central') True
>>> SvnURL.is_valid(url='[email protected]:MyProject/project') True
Pip-style URLs:
>>> SvnURL.is_valid(url='svn+https://svn.project.org/project-central/project') True
>>> SvnURL.is_valid(url='svn+ssh://[email protected]:MyProject/project') True
>>> SvnURL.is_valid(url='notaurl') False
Explicit VCS detection
Pip-style URLs are prefixed with the VCS name in front, so its rule_map can unambigously narrow the type of VCS:
>>> SvnURL.is_valid( ... url='svn+ssh://[email protected]:project-central/image', ... is_explicit=True ... ) True
Below, while itβs svn.project.org, that doesnβt necessarily mean that the URL itself is conclusively a svn URL (e.g. the pattern is too broad):
>>> SvnURL.is_valid( ... url='[email protected]:project-central/image', is_explicit=True ... ) False
You could create a project rule that consider svn.project.org hostnames to be exclusively svn:
>>> projectRule = Rule( ... # Since svn.project.org exclusively serves svn repos, make explicit ... label='project-rule', ... description='Matches svn.project.org https URLs, exact VCS match', ... pattern=re.compile( ... rf''' ... ^(?P<scheme>ssh)? ... ((?P<user>\w+)@)? ... (?P<hostname>(svn.project.org)+): ... (?P<path>(\w[^:]+)) ... ''', ... re.VERBOSE, ... ), ... is_explicit=True, ... defaults={ ... 'hostname': 'svn.project.org' ... } ... )
>>> SvnURL.rule_map.register(projectRule)
>>> SvnURL.is_valid( ... url='[email protected]:project-central/image', is_explicit=True ... ) True
>>> SvnURL(url='[email protected]:project-central/image').rule 'project-rule'
This is just us cleaning up:
>>> SvnURL.rule_map.unregister('project-rule')
>>> SvnURL(url='[email protected]:project-central/project-rule').rule 'core-svn-scp'
- to_url()[source]#
Return a
svn(1)
-compatible URL. Can be used withsvn clone
.- Return type:
Examples
SSH style URL:
>>> svn_url = SvnURL(url='[email protected]:project-central/browser')
>>> svn_url.path = 'project-central/gfx'
>>> svn_url.to_url() '[email protected]:project-central/gfx'
HTTPs URL:
>>> svn_url = SvnURL(url='https://svn.project.org/project-central/memory')
>>> svn_url.path = 'project-central/image'
>>> svn_url.to_url() 'https://svn.project.org/project-central/image'
Switch them to svnlab:
>>> svn_url.hostname = 'localhost' >>> svn_url.scheme = 'http'
>>> svn_url.to_url() 'http://localhost/project-central/image'
Pip style URL, thanks to this class implementing
SvnPipURL
:>>> svn_url = SvnURL(url='svn+ssh://[email protected]/project-central/image')
>>> svn_url.hostname = 'localhost'
>>> svn_url.to_url() 'svn+ssh://[email protected]/project-central/image'
>>> svn_url.user = None
>>> svn_url.to_url() 'svn+ssh://localhost/project-central/image'
See also