ominfra 0.0.0.dev173__tar.gz → 0.0.0.dev175__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {ominfra-0.0.0.dev173/ominfra.egg-info → ominfra-0.0.0.dev175}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/conf.py +12 -6
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/paths/paths.py +2 -2
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/specs.py +3 -9
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/scripts/journald2aws.py +46 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/scripts/manage.py +62 -15
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/scripts/supervisor.py +46 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175/ominfra.egg-info}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra.egg-info/requires.txt +2 -2
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/pyproject.toml +3 -3
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/LICENSE +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/MANIFEST.in +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/README.rst +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/.manifests.json +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/__about__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/__main__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/auth.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/cli.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/dataclasses.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/journald2aws/main.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/logs.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/aws/metadata.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/gcp/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/clouds/gcp/auth.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/cmds.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/configs.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/journald/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/journald/fields.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/journald/genmessages.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/journald/messages.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/journald/tailer.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/__main__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/bootstrap.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/bootstrap_.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/base.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/local.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/marshal.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/ping.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/subprocess.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/commands/types.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/config.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/apps.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/commands.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/config.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/deploy.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/git.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/interp.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/paths/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/paths/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/paths/manager.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/paths/owners.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/paths/types.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/tags.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/tmp.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/types.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/deploy/venvs.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/main.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/marshal.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/_main.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/channel.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/config.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/connection.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/execution.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/payload.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/remote/spawning.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/system/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/system/commands.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/system/config.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/system/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/system/packages.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/system/platforms.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/targets/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/targets/bestpython.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/targets/bestpython.sh +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/targets/connection.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/targets/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/manage/targets/targets.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/pyremote.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/scripts/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/ssh.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/LICENSE.txt +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/__main__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/configs.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/dispatchers.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/dispatchersimpl.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/events.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/exceptions.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/groups.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/groupsimpl.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/http.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/inject.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/io.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/main.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/pipes.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/privileges.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/process.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/processimpl.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/setup.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/setupimpl.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/signals.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/spawning.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/spawningimpl.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/states.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/supervisor.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/types.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/collections.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/diag.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/fds.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/fs.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/os.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/ostypes.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/signals.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/strings.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/supervisor/utils/users.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/tailscale/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/tailscale/api.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/tailscale/cli.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/threadworkers.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/tools/__init__.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra/tools/listresources.py +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra.egg-info/SOURCES.txt +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra.egg-info/dependency_links.txt +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra.egg-info/entry_points.txt +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/ominfra.egg-info/top_level.txt +0 -0
- {ominfra-0.0.0.dev173 → ominfra-0.0.0.dev175}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev175
|
4
4
|
Summary: ominfra
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omdev==0.0.0.
|
16
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omdev==0.0.0.dev175
|
16
|
+
Requires-Dist: omlish==0.0.0.dev175
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.18; extra == "all"
|
@@ -24,13 +24,12 @@ from omlish.os.paths import is_path_in_dir
|
|
24
24
|
from omlish.os.paths import relative_symlink
|
25
25
|
|
26
26
|
from .paths.paths import DeployPath
|
27
|
-
from .specs import AllActiveDeployAppConfLink
|
28
|
-
from .specs import CurrentOnlyDeployAppConfLink
|
29
27
|
from .specs import DeployAppConfFile
|
30
28
|
from .specs import DeployAppConfLink
|
31
29
|
from .specs import DeployAppConfSpec
|
32
30
|
from .tags import DEPLOY_TAG_SEPARATOR
|
33
31
|
from .tags import DeployApp
|
32
|
+
from .tags import DeployConf
|
34
33
|
from .tags import DeployTagMap
|
35
34
|
from .types import DeployHome
|
36
35
|
|
@@ -63,6 +62,7 @@ class DeployConfManager:
|
|
63
62
|
#
|
64
63
|
|
65
64
|
class _ComputedConfLink(ta.NamedTuple):
|
65
|
+
conf: DeployConf
|
66
66
|
is_dir: bool
|
67
67
|
link_src: str
|
68
68
|
link_dst: str
|
@@ -70,8 +70,9 @@ class DeployConfManager:
|
|
70
70
|
_UNIQUE_LINK_NAME_STR = '@app--@time--@app-key'
|
71
71
|
_UNIQUE_LINK_NAME = DeployPath.parse(_UNIQUE_LINK_NAME_STR)
|
72
72
|
|
73
|
+
@classmethod
|
73
74
|
def _compute_app_conf_link_dst(
|
74
|
-
|
75
|
+
cls,
|
75
76
|
link: DeployAppConfLink,
|
76
77
|
tags: DeployTagMap,
|
77
78
|
app_conf_dir: str,
|
@@ -85,6 +86,7 @@ class DeployConfManager:
|
|
85
86
|
if (is_dir := link.src.endswith('/')):
|
86
87
|
# @conf/ - links a directory in root of app conf dir to conf/@conf/@dst/
|
87
88
|
check.arg(link.src.count('/') == 1)
|
89
|
+
conf = DeployConf(link.src.split('/')[0])
|
88
90
|
link_dst_pfx = link.src
|
89
91
|
link_dst_sfx = ''
|
90
92
|
|
@@ -92,6 +94,7 @@ class DeployConfManager:
|
|
92
94
|
# @conf/file - links a single file in a single subdir to conf/@conf/@dst--file
|
93
95
|
d, f = os.path.split(link.src)
|
94
96
|
# TODO: check filename :|
|
97
|
+
conf = DeployConf(d)
|
95
98
|
link_dst_pfx = d + '/'
|
96
99
|
link_dst_sfx = DEPLOY_TAG_SEPARATOR + f
|
97
100
|
|
@@ -99,18 +102,20 @@ class DeployConfManager:
|
|
99
102
|
# @conf(.ext)* - links a single file in root of app conf dir to conf/@conf/@dst(.ext)*
|
100
103
|
if '.' in link.src:
|
101
104
|
l, _, r = link.src.partition('.')
|
105
|
+
conf = DeployConf(l)
|
102
106
|
link_dst_pfx = l + '/'
|
103
107
|
link_dst_sfx = '.' + r
|
104
108
|
else:
|
109
|
+
conf = DeployConf(link.src)
|
105
110
|
link_dst_pfx = link.src + '/'
|
106
111
|
link_dst_sfx = ''
|
107
112
|
|
108
113
|
#
|
109
114
|
|
110
|
-
if
|
115
|
+
if link.kind == 'current_only':
|
111
116
|
link_dst_mid = str(tags[DeployApp].s)
|
112
|
-
elif
|
113
|
-
link_dst_mid =
|
117
|
+
elif link.kind == 'all_active':
|
118
|
+
link_dst_mid = cls._UNIQUE_LINK_NAME.render(tags)
|
114
119
|
else:
|
115
120
|
raise TypeError(link)
|
116
121
|
|
@@ -124,6 +129,7 @@ class DeployConfManager:
|
|
124
129
|
link_dst = os.path.join(conf_link_dir, link_dst_name)
|
125
130
|
|
126
131
|
return DeployConfManager._ComputedConfLink(
|
132
|
+
conf=conf,
|
127
133
|
is_dir=is_dir,
|
128
134
|
link_src=link_src,
|
129
135
|
link_dst=link_dst,
|
@@ -170,7 +170,7 @@ class FileDeployPathPart(DeployPathPart):
|
|
170
170
|
return 'file'
|
171
171
|
|
172
172
|
|
173
|
-
|
173
|
+
##
|
174
174
|
|
175
175
|
|
176
176
|
@dc.dataclass(frozen=True)
|
@@ -197,7 +197,7 @@ class DeployPath:
|
|
197
197
|
return pd
|
198
198
|
|
199
199
|
@property
|
200
|
-
def kind(self) ->
|
200
|
+
def kind(self) -> DeployPathKind:
|
201
201
|
return self.parts[-1].kind
|
202
202
|
|
203
203
|
def render(self, tags: ta.Optional[DeployTagMap] = None) -> str:
|
@@ -95,7 +95,7 @@ class DeployAppConfFile:
|
|
95
95
|
|
96
96
|
|
97
97
|
@dc.dataclass(frozen=True)
|
98
|
-
class DeployAppConfLink
|
98
|
+
class DeployAppConfLink: # noqa
|
99
99
|
"""
|
100
100
|
May be either:
|
101
101
|
- @conf(.ext)* - links a single file in root of app conf dir to conf/@conf/@dst(.ext)*
|
@@ -105,20 +105,14 @@ class DeployAppConfLink(abc.ABC): # noqa
|
|
105
105
|
|
106
106
|
src: str
|
107
107
|
|
108
|
+
kind: ta.Literal['current_only', 'all_active'] = 'current_only'
|
109
|
+
|
108
110
|
def __post_init__(self) -> None:
|
109
111
|
check_valid_deploy_spec_path(self.src)
|
110
112
|
if '/' in self.src:
|
111
113
|
check.equal(self.src.count('/'), 1)
|
112
114
|
|
113
115
|
|
114
|
-
class CurrentOnlyDeployAppConfLink(DeployAppConfLink):
|
115
|
-
pass
|
116
|
-
|
117
|
-
|
118
|
-
class AllActiveDeployAppConfLink(DeployAppConfLink):
|
119
|
-
pass
|
120
|
-
|
121
|
-
|
122
116
|
#
|
123
117
|
|
124
118
|
|
@@ -1450,6 +1450,9 @@ log = logging.getLogger(__name__)
|
|
1450
1450
|
# ../../../../../omlish/lite/reflect.py
|
1451
1451
|
|
1452
1452
|
|
1453
|
+
##
|
1454
|
+
|
1455
|
+
|
1453
1456
|
_GENERIC_ALIAS_TYPES = (
|
1454
1457
|
ta._GenericAlias, # type: ignore # noqa
|
1455
1458
|
*([ta._SpecialGenericAlias] if hasattr(ta, '_SpecialGenericAlias') else []), # noqa
|
@@ -1467,6 +1470,9 @@ is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
|
|
1467
1470
|
is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
|
1468
1471
|
|
1469
1472
|
|
1473
|
+
##
|
1474
|
+
|
1475
|
+
|
1470
1476
|
def is_optional_alias(spec: ta.Any) -> bool:
|
1471
1477
|
return (
|
1472
1478
|
isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
|
@@ -1481,6 +1487,9 @@ def get_optional_alias_arg(spec: ta.Any) -> ta.Any:
|
|
1481
1487
|
return it
|
1482
1488
|
|
1483
1489
|
|
1490
|
+
##
|
1491
|
+
|
1492
|
+
|
1484
1493
|
def is_new_type(spec: ta.Any) -> bool:
|
1485
1494
|
if isinstance(ta.NewType, type):
|
1486
1495
|
return isinstance(spec, ta.NewType)
|
@@ -1493,6 +1502,26 @@ def get_new_type_supertype(spec: ta.Any) -> ta.Any:
|
|
1493
1502
|
return spec.__supertype__
|
1494
1503
|
|
1495
1504
|
|
1505
|
+
##
|
1506
|
+
|
1507
|
+
|
1508
|
+
def is_literal_type(spec: ta.Any) -> bool:
|
1509
|
+
if hasattr(ta, '_LiteralGenericAlias'):
|
1510
|
+
return isinstance(spec, ta._LiteralGenericAlias) # noqa
|
1511
|
+
else:
|
1512
|
+
return (
|
1513
|
+
isinstance(spec, ta._GenericAlias) and # type: ignore # noqa
|
1514
|
+
spec.__origin__ is ta.Literal
|
1515
|
+
)
|
1516
|
+
|
1517
|
+
|
1518
|
+
def get_literal_type_args(spec: ta.Any) -> ta.Iterable[ta.Any]:
|
1519
|
+
return spec.__args__
|
1520
|
+
|
1521
|
+
|
1522
|
+
##
|
1523
|
+
|
1524
|
+
|
1496
1525
|
def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
|
1497
1526
|
seen = set()
|
1498
1527
|
todo = list(reversed(cls.__subclasses__()))
|
@@ -2600,6 +2629,18 @@ class OptionalObjMarshaler(ObjMarshaler):
|
|
2600
2629
|
return self.item.unmarshal(o, ctx)
|
2601
2630
|
|
2602
2631
|
|
2632
|
+
@dc.dataclass(frozen=True)
|
2633
|
+
class LiteralObjMarshaler(ObjMarshaler):
|
2634
|
+
item: ObjMarshaler
|
2635
|
+
vs: frozenset
|
2636
|
+
|
2637
|
+
def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
|
2638
|
+
return self.item.marshal(check.in_(o, self.vs), ctx)
|
2639
|
+
|
2640
|
+
def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
|
2641
|
+
return check.in_(self.item.unmarshal(o, ctx), self.vs)
|
2642
|
+
|
2643
|
+
|
2603
2644
|
@dc.dataclass(frozen=True)
|
2604
2645
|
class MappingObjMarshaler(ObjMarshaler):
|
2605
2646
|
ty: type
|
@@ -2811,6 +2852,11 @@ class ObjMarshalerManager:
|
|
2811
2852
|
if is_new_type(ty):
|
2812
2853
|
return rec(get_new_type_supertype(ty))
|
2813
2854
|
|
2855
|
+
if is_literal_type(ty):
|
2856
|
+
lvs = frozenset(get_literal_type_args(ty))
|
2857
|
+
lty = check.single(set(map(type, lvs)))
|
2858
|
+
return LiteralObjMarshaler(rec(lty), lvs)
|
2859
|
+
|
2814
2860
|
if is_generic_alias(ty):
|
2815
2861
|
try:
|
2816
2862
|
mt = self._generic_mapping_types[ta.get_origin(ty)]
|
@@ -2667,6 +2667,9 @@ def pycharm_debug_preamble(prd: PycharmRemoteDebug) -> str:
|
|
2667
2667
|
# ../../../omlish/lite/reflect.py
|
2668
2668
|
|
2669
2669
|
|
2670
|
+
##
|
2671
|
+
|
2672
|
+
|
2670
2673
|
_GENERIC_ALIAS_TYPES = (
|
2671
2674
|
ta._GenericAlias, # type: ignore # noqa
|
2672
2675
|
*([ta._SpecialGenericAlias] if hasattr(ta, '_SpecialGenericAlias') else []), # noqa
|
@@ -2684,6 +2687,9 @@ is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
|
|
2684
2687
|
is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
|
2685
2688
|
|
2686
2689
|
|
2690
|
+
##
|
2691
|
+
|
2692
|
+
|
2687
2693
|
def is_optional_alias(spec: ta.Any) -> bool:
|
2688
2694
|
return (
|
2689
2695
|
isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
|
@@ -2698,6 +2704,9 @@ def get_optional_alias_arg(spec: ta.Any) -> ta.Any:
|
|
2698
2704
|
return it
|
2699
2705
|
|
2700
2706
|
|
2707
|
+
##
|
2708
|
+
|
2709
|
+
|
2701
2710
|
def is_new_type(spec: ta.Any) -> bool:
|
2702
2711
|
if isinstance(ta.NewType, type):
|
2703
2712
|
return isinstance(spec, ta.NewType)
|
@@ -2710,6 +2719,26 @@ def get_new_type_supertype(spec: ta.Any) -> ta.Any:
|
|
2710
2719
|
return spec.__supertype__
|
2711
2720
|
|
2712
2721
|
|
2722
|
+
##
|
2723
|
+
|
2724
|
+
|
2725
|
+
def is_literal_type(spec: ta.Any) -> bool:
|
2726
|
+
if hasattr(ta, '_LiteralGenericAlias'):
|
2727
|
+
return isinstance(spec, ta._LiteralGenericAlias) # noqa
|
2728
|
+
else:
|
2729
|
+
return (
|
2730
|
+
isinstance(spec, ta._GenericAlias) and # type: ignore # noqa
|
2731
|
+
spec.__origin__ is ta.Literal
|
2732
|
+
)
|
2733
|
+
|
2734
|
+
|
2735
|
+
def get_literal_type_args(spec: ta.Any) -> ta.Iterable[ta.Any]:
|
2736
|
+
return spec.__args__
|
2737
|
+
|
2738
|
+
|
2739
|
+
##
|
2740
|
+
|
2741
|
+
|
2713
2742
|
def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
|
2714
2743
|
seen = set()
|
2715
2744
|
todo = list(reversed(cls.__subclasses__()))
|
@@ -6049,6 +6078,18 @@ class OptionalObjMarshaler(ObjMarshaler):
|
|
6049
6078
|
return self.item.unmarshal(o, ctx)
|
6050
6079
|
|
6051
6080
|
|
6081
|
+
@dc.dataclass(frozen=True)
|
6082
|
+
class LiteralObjMarshaler(ObjMarshaler):
|
6083
|
+
item: ObjMarshaler
|
6084
|
+
vs: frozenset
|
6085
|
+
|
6086
|
+
def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
|
6087
|
+
return self.item.marshal(check.in_(o, self.vs), ctx)
|
6088
|
+
|
6089
|
+
def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
|
6090
|
+
return check.in_(self.item.unmarshal(o, ctx), self.vs)
|
6091
|
+
|
6092
|
+
|
6052
6093
|
@dc.dataclass(frozen=True)
|
6053
6094
|
class MappingObjMarshaler(ObjMarshaler):
|
6054
6095
|
ty: type
|
@@ -6260,6 +6301,11 @@ class ObjMarshalerManager:
|
|
6260
6301
|
if is_new_type(ty):
|
6261
6302
|
return rec(get_new_type_supertype(ty))
|
6262
6303
|
|
6304
|
+
if is_literal_type(ty):
|
6305
|
+
lvs = frozenset(get_literal_type_args(ty))
|
6306
|
+
lty = check.single(set(map(type, lvs)))
|
6307
|
+
return LiteralObjMarshaler(rec(lty), lvs)
|
6308
|
+
|
6263
6309
|
if is_generic_alias(ty):
|
6264
6310
|
try:
|
6265
6311
|
mt = self._generic_mapping_types[ta.get_origin(ty)]
|
@@ -7038,7 +7084,7 @@ class FileDeployPathPart(DeployPathPart):
|
|
7038
7084
|
return 'file'
|
7039
7085
|
|
7040
7086
|
|
7041
|
-
|
7087
|
+
##
|
7042
7088
|
|
7043
7089
|
|
7044
7090
|
@dc.dataclass(frozen=True)
|
@@ -7065,7 +7111,7 @@ class DeployPath:
|
|
7065
7111
|
return pd
|
7066
7112
|
|
7067
7113
|
@property
|
7068
|
-
def kind(self) ->
|
7114
|
+
def kind(self) -> DeployPathKind:
|
7069
7115
|
return self.parts[-1].kind
|
7070
7116
|
|
7071
7117
|
def render(self, tags: ta.Optional[DeployTagMap] = None) -> str:
|
@@ -7160,7 +7206,7 @@ class DeployAppConfFile:
|
|
7160
7206
|
|
7161
7207
|
|
7162
7208
|
@dc.dataclass(frozen=True)
|
7163
|
-
class DeployAppConfLink
|
7209
|
+
class DeployAppConfLink: # noqa
|
7164
7210
|
"""
|
7165
7211
|
May be either:
|
7166
7212
|
- @conf(.ext)* - links a single file in root of app conf dir to conf/@conf/@dst(.ext)*
|
@@ -7170,20 +7216,14 @@ class DeployAppConfLink(abc.ABC): # noqa
|
|
7170
7216
|
|
7171
7217
|
src: str
|
7172
7218
|
|
7219
|
+
kind: ta.Literal['current_only', 'all_active'] = 'current_only'
|
7220
|
+
|
7173
7221
|
def __post_init__(self) -> None:
|
7174
7222
|
check_valid_deploy_spec_path(self.src)
|
7175
7223
|
if '/' in self.src:
|
7176
7224
|
check.equal(self.src.count('/'), 1)
|
7177
7225
|
|
7178
7226
|
|
7179
|
-
class CurrentOnlyDeployAppConfLink(DeployAppConfLink):
|
7180
|
-
pass
|
7181
|
-
|
7182
|
-
|
7183
|
-
class AllActiveDeployAppConfLink(DeployAppConfLink):
|
7184
|
-
pass
|
7185
|
-
|
7186
|
-
|
7187
7227
|
#
|
7188
7228
|
|
7189
7229
|
|
@@ -7871,6 +7911,7 @@ class DeployConfManager:
|
|
7871
7911
|
#
|
7872
7912
|
|
7873
7913
|
class _ComputedConfLink(ta.NamedTuple):
|
7914
|
+
conf: DeployConf
|
7874
7915
|
is_dir: bool
|
7875
7916
|
link_src: str
|
7876
7917
|
link_dst: str
|
@@ -7878,8 +7919,9 @@ class DeployConfManager:
|
|
7878
7919
|
_UNIQUE_LINK_NAME_STR = '@app--@time--@app-key'
|
7879
7920
|
_UNIQUE_LINK_NAME = DeployPath.parse(_UNIQUE_LINK_NAME_STR)
|
7880
7921
|
|
7922
|
+
@classmethod
|
7881
7923
|
def _compute_app_conf_link_dst(
|
7882
|
-
|
7924
|
+
cls,
|
7883
7925
|
link: DeployAppConfLink,
|
7884
7926
|
tags: DeployTagMap,
|
7885
7927
|
app_conf_dir: str,
|
@@ -7893,6 +7935,7 @@ class DeployConfManager:
|
|
7893
7935
|
if (is_dir := link.src.endswith('/')):
|
7894
7936
|
# @conf/ - links a directory in root of app conf dir to conf/@conf/@dst/
|
7895
7937
|
check.arg(link.src.count('/') == 1)
|
7938
|
+
conf = DeployConf(link.src.split('/')[0])
|
7896
7939
|
link_dst_pfx = link.src
|
7897
7940
|
link_dst_sfx = ''
|
7898
7941
|
|
@@ -7900,6 +7943,7 @@ class DeployConfManager:
|
|
7900
7943
|
# @conf/file - links a single file in a single subdir to conf/@conf/@dst--file
|
7901
7944
|
d, f = os.path.split(link.src)
|
7902
7945
|
# TODO: check filename :|
|
7946
|
+
conf = DeployConf(d)
|
7903
7947
|
link_dst_pfx = d + '/'
|
7904
7948
|
link_dst_sfx = DEPLOY_TAG_SEPARATOR + f
|
7905
7949
|
|
@@ -7907,18 +7951,20 @@ class DeployConfManager:
|
|
7907
7951
|
# @conf(.ext)* - links a single file in root of app conf dir to conf/@conf/@dst(.ext)*
|
7908
7952
|
if '.' in link.src:
|
7909
7953
|
l, _, r = link.src.partition('.')
|
7954
|
+
conf = DeployConf(l)
|
7910
7955
|
link_dst_pfx = l + '/'
|
7911
7956
|
link_dst_sfx = '.' + r
|
7912
7957
|
else:
|
7958
|
+
conf = DeployConf(link.src)
|
7913
7959
|
link_dst_pfx = link.src + '/'
|
7914
7960
|
link_dst_sfx = ''
|
7915
7961
|
|
7916
7962
|
#
|
7917
7963
|
|
7918
|
-
if
|
7964
|
+
if link.kind == 'current_only':
|
7919
7965
|
link_dst_mid = str(tags[DeployApp].s)
|
7920
|
-
elif
|
7921
|
-
link_dst_mid =
|
7966
|
+
elif link.kind == 'all_active':
|
7967
|
+
link_dst_mid = cls._UNIQUE_LINK_NAME.render(tags)
|
7922
7968
|
else:
|
7923
7969
|
raise TypeError(link)
|
7924
7970
|
|
@@ -7932,6 +7978,7 @@ class DeployConfManager:
|
|
7932
7978
|
link_dst = os.path.join(conf_link_dir, link_dst_name)
|
7933
7979
|
|
7934
7980
|
return DeployConfManager._ComputedConfLink(
|
7981
|
+
conf=conf,
|
7935
7982
|
is_dir=is_dir,
|
7936
7983
|
link_src=link_src,
|
7937
7984
|
link_dst=link_dst,
|
@@ -2259,6 +2259,9 @@ Maybe._empty = tuple.__new__(_Maybe, ()) # noqa
|
|
2259
2259
|
# ../../../omlish/lite/reflect.py
|
2260
2260
|
|
2261
2261
|
|
2262
|
+
##
|
2263
|
+
|
2264
|
+
|
2262
2265
|
_GENERIC_ALIAS_TYPES = (
|
2263
2266
|
ta._GenericAlias, # type: ignore # noqa
|
2264
2267
|
*([ta._SpecialGenericAlias] if hasattr(ta, '_SpecialGenericAlias') else []), # noqa
|
@@ -2276,6 +2279,9 @@ is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
|
|
2276
2279
|
is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
|
2277
2280
|
|
2278
2281
|
|
2282
|
+
##
|
2283
|
+
|
2284
|
+
|
2279
2285
|
def is_optional_alias(spec: ta.Any) -> bool:
|
2280
2286
|
return (
|
2281
2287
|
isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
|
@@ -2290,6 +2296,9 @@ def get_optional_alias_arg(spec: ta.Any) -> ta.Any:
|
|
2290
2296
|
return it
|
2291
2297
|
|
2292
2298
|
|
2299
|
+
##
|
2300
|
+
|
2301
|
+
|
2293
2302
|
def is_new_type(spec: ta.Any) -> bool:
|
2294
2303
|
if isinstance(ta.NewType, type):
|
2295
2304
|
return isinstance(spec, ta.NewType)
|
@@ -2302,6 +2311,26 @@ def get_new_type_supertype(spec: ta.Any) -> ta.Any:
|
|
2302
2311
|
return spec.__supertype__
|
2303
2312
|
|
2304
2313
|
|
2314
|
+
##
|
2315
|
+
|
2316
|
+
|
2317
|
+
def is_literal_type(spec: ta.Any) -> bool:
|
2318
|
+
if hasattr(ta, '_LiteralGenericAlias'):
|
2319
|
+
return isinstance(spec, ta._LiteralGenericAlias) # noqa
|
2320
|
+
else:
|
2321
|
+
return (
|
2322
|
+
isinstance(spec, ta._GenericAlias) and # type: ignore # noqa
|
2323
|
+
spec.__origin__ is ta.Literal
|
2324
|
+
)
|
2325
|
+
|
2326
|
+
|
2327
|
+
def get_literal_type_args(spec: ta.Any) -> ta.Iterable[ta.Any]:
|
2328
|
+
return spec.__args__
|
2329
|
+
|
2330
|
+
|
2331
|
+
##
|
2332
|
+
|
2333
|
+
|
2305
2334
|
def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
|
2306
2335
|
seen = set()
|
2307
2336
|
todo = list(reversed(cls.__subclasses__()))
|
@@ -4991,6 +5020,18 @@ class OptionalObjMarshaler(ObjMarshaler):
|
|
4991
5020
|
return self.item.unmarshal(o, ctx)
|
4992
5021
|
|
4993
5022
|
|
5023
|
+
@dc.dataclass(frozen=True)
|
5024
|
+
class LiteralObjMarshaler(ObjMarshaler):
|
5025
|
+
item: ObjMarshaler
|
5026
|
+
vs: frozenset
|
5027
|
+
|
5028
|
+
def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
|
5029
|
+
return self.item.marshal(check.in_(o, self.vs), ctx)
|
5030
|
+
|
5031
|
+
def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
|
5032
|
+
return check.in_(self.item.unmarshal(o, ctx), self.vs)
|
5033
|
+
|
5034
|
+
|
4994
5035
|
@dc.dataclass(frozen=True)
|
4995
5036
|
class MappingObjMarshaler(ObjMarshaler):
|
4996
5037
|
ty: type
|
@@ -5202,6 +5243,11 @@ class ObjMarshalerManager:
|
|
5202
5243
|
if is_new_type(ty):
|
5203
5244
|
return rec(get_new_type_supertype(ty))
|
5204
5245
|
|
5246
|
+
if is_literal_type(ty):
|
5247
|
+
lvs = frozenset(get_literal_type_args(ty))
|
5248
|
+
lty = check.single(set(map(type, lvs)))
|
5249
|
+
return LiteralObjMarshaler(rec(lty), lvs)
|
5250
|
+
|
5205
5251
|
if is_generic_alias(ty):
|
5206
5252
|
try:
|
5207
5253
|
mt = self._generic_mapping_types[ta.get_origin(ty)]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev175
|
4
4
|
Summary: ominfra
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omdev==0.0.0.
|
16
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omdev==0.0.0.dev175
|
16
|
+
Requires-Dist: omlish==0.0.0.dev175
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.18; extra == "all"
|
@@ -12,7 +12,7 @@ authors = [
|
|
12
12
|
urls = {source = 'https://github.com/wrmsr/omlish'}
|
13
13
|
license = {text = 'BSD-3-Clause'}
|
14
14
|
requires-python = '>=3.12'
|
15
|
-
version = '0.0.0.
|
15
|
+
version = '0.0.0.dev175'
|
16
16
|
classifiers = [
|
17
17
|
'License :: OSI Approved :: BSD License',
|
18
18
|
'Development Status :: 2 - Pre-Alpha',
|
@@ -22,8 +22,8 @@ classifiers = [
|
|
22
22
|
]
|
23
23
|
description = 'ominfra'
|
24
24
|
dependencies = [
|
25
|
-
'omdev == 0.0.0.
|
26
|
-
'omlish == 0.0.0.
|
25
|
+
'omdev == 0.0.0.dev175',
|
26
|
+
'omlish == 0.0.0.dev175',
|
27
27
|
]
|
28
28
|
|
29
29
|
[project.optional-dependencies]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|