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
|
# Copyright (c) 2021 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 configparser
import importlib
import logging
import os
import sys
from cgitize.repo import Repo, GitHub as GitHubRepo, Bitbucket as BitbucketRepo
from cgitize.utils import chdir
import tomli
class Section:
def __init__(self, impl):
self.impl = impl
def _get_config_value(self, key, required=True, default=None):
if required and default is None:
if not key in self.impl:
raise RuntimeError(f'configuration value is missing: {key}')
return self.impl.get(key, default)
def _get_config_path(self, *args, **kwargs):
return os.path.abspath(self._get_config_value(*args, **kwargs))
class Main(Section):
DEFAULT_OUTPUT_DIR = '/var/tmp/cgitize/output'
@property
def output(self):
return self._get_config_path('output', default=Main.DEFAULT_OUTPUT_DIR)
@property
def clone_url(self):
return self._get_config_value('clone_url', required=False)
@property
def default_owner(self):
return self._get_config_value('owner', required=False)
@property
def via_ssh(self):
return self._get_config_value('ssh', default=True)
class GitHub(Section):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.repositories = Repositories(self.impl.get('repositories', {}), GitHubRepo)
@property
def access_token(self):
access_token = self._get_config_value('access_token', required=False)
if access_token is not None:
return access_token
env_var = 'CGITIZE_GITHUB_ACCESS_TOKEN'
if env_var in os.environ:
return os.environ[env_var]
return None
def enum_repositories(self):
return self.repositories.enum_repositories()
class Bitbucket(Section):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.repositories = Repositories(self.impl.get('repositories', {}), BitbucketRepo)
@property
def app_password(self):
app_password = self._get_config_value('app_password', required=False)
if app_password is not None:
return app_password
env_var = 'CGITIZE_BITBUCKET_APP_PASSWORD'
if env_var in os.environ:
return os.environ[env_var]
return None
def enum_repositories(self):
return self.repositories.enum_repositories()
class Repositories(Section):
def __init__(self, impl, repo_cls=Repo):
super().__init__(impl)
self.repo_cls = repo_cls
def enum_repositories(self):
for k, v in self.impl.items():
yield self.repo_cls.from_config(v)
class Config:
DEFAULT_PATH = '/etc/cgitize/cgitize.toml'
@staticmethod
def read(path):
return Config(path)
def __init__(self, path):
self.path = os.path.abspath(path)
with open(self.path, 'rb') as f:
self.impl = tomli.load(f)
self.main = Main(self.impl)
self.repositories = Repositories(self.impl.get('repositories', {}))
self.github = GitHub(self.impl.get('github', {}))
self.bitbucket = Bitbucket(self.impl.get('bitbucket', {}))
def enum_repositories(self):
yield from self.repositories.enum_repositories()
yield from self.github.enum_repositories()
yield from self.bitbucket.enum_repositories()
|