aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cgitize/repo.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cgitize/repo.py76
1 files changed, 41 insertions, 35 deletions
diff --git a/cgitize/repo.py b/cgitize/repo.py
index 8ecbcf5..01b7430 100644
--- a/cgitize/repo.py
+++ b/cgitize/repo.py
@@ -9,14 +9,17 @@ from urllib.parse import urlsplit, urlunsplit
class Repo:
- @staticmethod
- def extract_repo_name(repo_id):
- return os.path.basename(repo_id)
-
- def __init__(self, repo_id, clone_url=None, owner=None, desc=None,
+ @classmethod
+ def from_config(cls, cfg):
+ if 'id' not in cfg:
+ raise ValueError('every repository must have its id defined')
+ return cls(cfg['id'], clone_url=cfg.get('clone_url'),
+ owner=cfg.get('owner'), desc=cfg.get('desc'),
+ homepage=cfg.get('homepage'))
+
+ def __init__(self, name, clone_url=None, owner=None, desc=None,
homepage=None):
- self._repo_id = repo_id
- self._repo_name = self.extract_repo_name(repo_id)
+ self._name = name
self._clone_url = clone_url
self._owner = owner
self._desc = desc
@@ -24,19 +27,15 @@ class Repo:
def fill_defaults(self, config):
if self._owner is None:
- self._owner = config.default_owner
+ self._owner = config.main.default_owner
def validate(self):
if self.clone_url is None:
raise RuntimeError('upstream repository URL must be specified')
@property
- def repo_id(self):
- return self._repo_id
-
- @property
- def repo_name(self):
- return self._repo_name
+ def name(self):
+ return self._name
@property
def clone_url(self):
@@ -54,7 +53,7 @@ class Repo:
return self.homepage
if self.clone_url:
return self.clone_url
- return self.repo_name
+ return self.name
@property
def homepage(self):
@@ -66,21 +65,32 @@ class Repo:
class HostedRepo(Repo, abc.ABC):
+ @classmethod
+ def from_config(cls, cfg):
+ if 'id' not in cfg:
+ raise ValueError('every repository must have its id defined')
+ return cls(cfg['id'], owner=cfg.get('owner'), desc=cfg.get('desc'),
+ homepage=cfg.get('homepage'))
+
+ @staticmethod
+ def split_repo_id(repo_id):
+ components = repo_id.split('/')
+ if len(components) != 2:
+ raise ValueError(f'repository ID must be in the USER/NAME format: {repo_id}')
+ user, name = components
+ return user, name
+
def __init__(self, repo_id, owner=None, desc=None, homepage=None,
- user=None, via_ssh=True):
- super().__init__(repo_id, clone_url=None, owner=owner, desc=desc,
+ via_ssh=True):
+ user, name = self.split_repo_id(repo_id)
+ super().__init__(name, clone_url=None, owner=owner, desc=desc,
homepage=homepage)
self._user = user
self._via_ssh = via_ssh
def fill_defaults(self, config):
super().fill_defaults(config)
- self._via_ssh = config.via_ssh
-
- def validate(self):
- super().validate()
- if self.user is None:
- raise RuntimeError(f'neither explicit or default {self.provider_name} username was specified')
+ self._via_ssh = config.main.via_ssh
@property
def user(self):
@@ -127,9 +137,7 @@ class GitHub(HostedRepo):
def fill_defaults(self, config):
super().fill_defaults(config)
- if self._user is None:
- self._user = config.github_username
- self._access_token = config.github_access_token
+ self._access_token = config.github.access_token
@property
def provider_name(self):
@@ -137,7 +145,7 @@ class GitHub(HostedRepo):
@property
def homepage(self):
- return f'https://github.com/{self.user}/{self.repo_name}'
+ return f'https://github.com/{self.user}/{self.name}'
@property
def url_auth(self):
@@ -147,11 +155,11 @@ class GitHub(HostedRepo):
@property
def clone_url_ssh(self):
- return f'ssh://git@github.com/{self.user}/{self.repo_name}.git'
+ return f'ssh://git@github.com/{self.user}/{self.name}.git'
@property
def clone_url_https(self):
- return f'https://github.com/{self.user}/{self.repo_name}.git'
+ return f'https://github.com/{self.user}/{self.name}.git'
class Bitbucket(HostedRepo):
@@ -161,9 +169,7 @@ class Bitbucket(HostedRepo):
def fill_defaults(self, config):
super().fill_defaults(config)
- if self._user is None:
- self._user = config.bitbucket_username
- self._app_password = config.bitbucket_app_password
+ self._app_password = config.bitbucket.app_password
@property
def provider_name(self):
@@ -171,7 +177,7 @@ class Bitbucket(HostedRepo):
@property
def homepage(self):
- return f'https://bitbucket.org/{self.user}/{self.repo_name.lower()}'
+ return f'https://bitbucket.org/{self.user}/{self.name.lower()}'
@property
def url_auth(self):
@@ -181,8 +187,8 @@ class Bitbucket(HostedRepo):
@property
def clone_url_ssh(self):
- return f'ssh://git@bitbucket.org/{self.user}/{self.repo_name}.git'
+ return f'ssh://git@bitbucket.org/{self.user}/{self.name}.git'
@property
def clone_url_https(self):
- return f'https://bitbucket.org/{self.user}/{self.repo_name}.git'
+ return f'https://bitbucket.org/{self.user}/{self.name}.git'