Source code for pkgcore.sync.svn
__all__ = ("svn_syncer",)
import os
from snakeoil.process.spawn import spawn_get_output
from . import base
[docs]
class svn_syncer(base.ExternalSyncer):
binary = "svn"
supported_uris = (
("svn://", 5),
("svn+", 5),
)
[docs]
@classmethod
def is_usable_on_filepath(cls, path):
svn_path = os.path.join(path, ".svn")
if cls.disabled or not os.path.isdir(svn_path):
return None
code, data = spawn_get_output([cls.binary, "info", path])
if code != 0:
# should alert the user somehow
return None
for line in data:
line = line.strip().split(":", 1)
if len(line) != 2:
continue
if line[0] == "URL":
uri = f"svn+{line[1].strip()}"
return (cls._rewrite_uri_from_stat(svn_path, uri),)
return None
[docs]
@staticmethod
def parse_uri(raw_uri):
if raw_uri.startswith("svn://"):
return raw_uri
elif raw_uri.startswith("http+svn://"):
return raw_uri[5:]
elif raw_uri.startswith("https+svn://"):
return raw_uri[6:]
elif raw_uri.startswith("svn+"):
if raw_uri.startswith("svn+:"):
raise base.UriError(raw_uri, "svn+:// isn't valid")
return raw_uri[4:]
else:
raise base.UriError(raw_uri, "protocol unknown")
return raw_uri
def _sync(self, verbosity):
uri = self.uri
if uri.startswith("svn+http://"):
uri = uri.replace("svn+http://", "http://")
elif uri.startswith("svn+https://"):
uri = uri.replace("svn+https://", "https://")
if not os.path.exists(self.basedir):
return 0 == self._spawn_interactive(
[self.binary_path, "co", uri, self.basedir]
)
return 0 == self._spawn_interactive(
[self.binary_path, "update"],
cwd=self.basedir,
)