1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# Copyright (c) 2018 Egor Tensin <Egor.Tensin@gmail.com>
# This file is part of the "cgitize" project.
# For details, see https://github.com/egor-tensin/cgitize.
# Distributed under the MIT License.
import os.path
from cgitize.utils import url_remove_auth, url_replace_auth
class Repo:
@staticmethod
def from_config(src, config):
if 'name' not in src:
raise ValueError("every repository must have 'name'")
name = src['name']
desc = src.get('desc')
homepage = src.get('homepage')
owner = src.get('owner', config.main.default_owner)
if 'clone_url' not in src:
raise ValueError("every repository must have 'clone_url'")
clone_url = src['clone_url']
subdir = src.get('dir')
return Repo(name, clone_url, owner=owner, desc=desc, homepage=homepage,
subdir=subdir)
@staticmethod
def from_github(src, config, subdir=None):
name = src.name
desc = src.description
homepage = src.html_url
owner = src.owner.name
https_url = src.clone_url
ssh_url = src.ssh_url
clone_url = ssh_url if config.main.clone_via_ssh else https_url
url_auth = None if config.main.clone_via_ssh else config.github.url_auth
return Repo(name, clone_url, owner=owner, desc=desc, homepage=homepage,
url_auth=url_auth, subdir=subdir)
@staticmethod
def from_bitbucket(src, config, subdir=None):
name = src['name']
desc = src['description']
homepage = src['links']['html']['href']
owner = src['owner']['display_name']
https_urls = [link for link in src['links']['clone'] if link['name'] == 'https']
if len(https_urls) != 1:
raise RuntimeError(f"no https:// clone URL for repository '{name}'?!")
# Bitbucket leaves the username in the URL... Sigh.
https_url = url_remove_auth(https_urls[0]['href'])
ssh_urls = [link for link in src['links']['clone'] if link ['name'] == 'ssh']
if len(ssh_urls) != 1:
raise RuntimeError(f"no ssh:// clone URL for repository '{name}'?!")
ssh_url = ssh_urls[0]['href']
clone_url = ssh_url if config.main.clone_via_ssh else https_url
url_auth = None if config.main.clone_via_ssh else config.bitbucket.url_auth
return Repo(name, clone_url, owner=owner, desc=desc, homepage=homepage,
url_auth=url_auth, subdir=subdir)
@staticmethod
def from_gitlab(src, config, subdir=None):
name = src.name
desc = src.description
homepage = src.web_url
owner = src.namespace['name']
https_url = src.http_url_to_repo
ssh_url = src.ssh_url_to_repo
clone_url = ssh_url if config.main.clone_via_ssh else https_url
url_auth = None if config.main.clone_via_ssh else config.gitlab.url_auth
return Repo(name, clone_url, owner=owner, desc=desc, homepage=homepage,
url_auth=url_auth, subdir=subdir)
def __init__(self, name, clone_url, owner=None, desc=None, homepage=None,
url_auth=None, subdir=None):
self._name = name
self._desc = desc
self._homepage = homepage
self._owner = owner
self._clone_url = clone_url
self._url_auth = url_auth
self._dir = subdir
@property
def name(self):
return self._name
@property
def desc(self):
if self._desc is not None and self._desc:
return self._desc
if self.homepage:
return self.homepage
if self.clone_url:
return self.clone_url
return self.name
@property
def homepage(self):
return self._homepage
@property
def owner(self):
return self._owner
@property
def clone_url(self):
return self._clone_url
@property
def url_auth(self):
return self._url_auth
@property
def clone_url_with_auth(self):
if not self.url_auth:
return self.clone_url
return url_replace_auth(self.clone_url, self.url_auth)
@property
def dir(self):
if self._dir is None:
return self.name
return os.path.join(self._dir, self.name)
|