zrb 0.26.1__py3-none-any.whl → 0.27.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zrb/__init__.py +0 -3
- zrb/builtin/monorepo/_common.sh +15 -0
- zrb/builtin/monorepo/_helper.py +140 -0
- zrb/builtin/monorepo/_task.py +99 -72
- zrb/builtin/monorepo/add-subrepo.sh +22 -0
- zrb/builtin/monorepo/pull-monorepo.sh +18 -0
- zrb/builtin/monorepo/pull-subrepo.sh +18 -0
- zrb/builtin/monorepo/pull.py +2 -1
- zrb/builtin/monorepo/push-monorepo.sh +18 -0
- zrb/builtin/monorepo/push-subrepo.sh +18 -0
- zrb/builtin/monorepo/push.py +3 -17
- zrb/task/base_task/base_task.py +1 -1
- zrb/task/docker_compose_task.py +26 -26
- zrb/task/flow_task.py +0 -1
- zrb/task/remote_cmd_task.py +53 -14
- zrb/task/rsync_task.py +55 -19
- {zrb-0.26.1.dist-info → zrb-0.27.0.dist-info}/METADATA +2 -2
- {zrb-0.26.1.dist-info → zrb-0.27.0.dist-info}/RECORD +21 -15
- zrb/task/base_remote_cmd_task.py +0 -354
- {zrb-0.26.1.dist-info → zrb-0.27.0.dist-info}/LICENSE +0 -0
- {zrb-0.26.1.dist-info → zrb-0.27.0.dist-info}/WHEEL +0 -0
- {zrb-0.26.1.dist-info → zrb-0.27.0.dist-info}/entry_points.txt +0 -0
zrb/__init__.py
CHANGED
@@ -10,7 +10,6 @@ from zrb.task.any_task_event_handler import (
|
|
10
10
|
OnTriggered,
|
11
11
|
OnWaiting,
|
12
12
|
)
|
13
|
-
from zrb.task.base_remote_cmd_task import BaseRemoteCmdTask, RemoteConfig
|
14
13
|
from zrb.task.checker import Checker
|
15
14
|
from zrb.task.cmd_task import CmdTask
|
16
15
|
from zrb.task.decorator import python_task
|
@@ -69,8 +68,6 @@ assert CmdTask
|
|
69
68
|
assert DockerComposeTask
|
70
69
|
assert DockerComposeStartTask
|
71
70
|
assert ServiceConfig
|
72
|
-
assert BaseRemoteCmdTask
|
73
|
-
assert RemoteConfig
|
74
71
|
assert RemoteCmdTask
|
75
72
|
assert RsyncTask
|
76
73
|
assert Notifier
|
@@ -0,0 +1,15 @@
|
|
1
|
+
log_info() {
|
2
|
+
echo -e "🤖 \e[0;33m${1}\e[0;0m"
|
3
|
+
}
|
4
|
+
|
5
|
+
log_error() {
|
6
|
+
echo -e "\e[1;31m${1}\e[0;0m" >&2
|
7
|
+
}
|
8
|
+
|
9
|
+
log_conflict_error() {
|
10
|
+
log_error "Action blocked by unresolved conflicts."
|
11
|
+
log_error "You need to resolve the conflict(s) and commit the changes."
|
12
|
+
log_error "Unresolved conflict(s) detected:"
|
13
|
+
log_error "$1"
|
14
|
+
}
|
15
|
+
|
@@ -0,0 +1,140 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.builtin.monorepo._config import PROJECT_DIR
|
4
|
+
from zrb.task.cmd_task import CmdTask
|
5
|
+
from zrb.task_env.env import Env
|
6
|
+
from zrb.task_input.any_input import AnyInput
|
7
|
+
from zrb.task_input.str_input import StrInput
|
8
|
+
|
9
|
+
_CURRENT_DIR = os.path.dirname(__file__)
|
10
|
+
|
11
|
+
|
12
|
+
def create_pull_monorepo_task(
|
13
|
+
task_name: str = "pull-monorepo",
|
14
|
+
) -> CmdTask:
|
15
|
+
return CmdTask(
|
16
|
+
name=task_name,
|
17
|
+
envs=[
|
18
|
+
Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
|
19
|
+
],
|
20
|
+
cmd_path=[
|
21
|
+
os.path.join(_CURRENT_DIR, "_common.sh"),
|
22
|
+
os.path.join(_CURRENT_DIR, "pull-monorepo.sh"),
|
23
|
+
],
|
24
|
+
cwd=PROJECT_DIR,
|
25
|
+
should_show_cmd=False,
|
26
|
+
should_show_working_directory=False,
|
27
|
+
should_print_cmd_result=False,
|
28
|
+
retry=0,
|
29
|
+
)
|
30
|
+
|
31
|
+
|
32
|
+
def create_push_monorepo_task(
|
33
|
+
task_name: str = "push-monorepo", default_commit_message: str = "Save changes"
|
34
|
+
) -> CmdTask:
|
35
|
+
return CmdTask(
|
36
|
+
name=task_name,
|
37
|
+
inputs=[_create_commit_message_input(default_commit_message)],
|
38
|
+
envs=[
|
39
|
+
Env("MESSAGE", os_name="", default="{{input.message}}"),
|
40
|
+
],
|
41
|
+
cmd_path=[
|
42
|
+
os.path.join(_CURRENT_DIR, "_common.sh"),
|
43
|
+
os.path.join(_CURRENT_DIR, "push-monorepo.sh"),
|
44
|
+
],
|
45
|
+
cwd=PROJECT_DIR,
|
46
|
+
should_show_cmd=False,
|
47
|
+
should_show_working_directory=False,
|
48
|
+
should_print_cmd_result=False,
|
49
|
+
retry=0,
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
def create_add_subrepo_task(
|
54
|
+
origin: str,
|
55
|
+
folder: str,
|
56
|
+
branch: str,
|
57
|
+
task_name: str = "add",
|
58
|
+
) -> CmdTask:
|
59
|
+
return CmdTask(
|
60
|
+
name=task_name,
|
61
|
+
envs=[
|
62
|
+
Env("ORIGIN", os_name="", default=origin),
|
63
|
+
Env("FOLDER", os_name="", default=folder),
|
64
|
+
Env("BRANCH", os_name="", default=branch),
|
65
|
+
Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
|
66
|
+
],
|
67
|
+
cmd_path=[
|
68
|
+
os.path.join(_CURRENT_DIR, "_common.sh"),
|
69
|
+
os.path.join(_CURRENT_DIR, "add-subrepo.sh"),
|
70
|
+
],
|
71
|
+
cwd=PROJECT_DIR,
|
72
|
+
should_show_cmd=False,
|
73
|
+
should_show_working_directory=False,
|
74
|
+
should_print_cmd_result=False,
|
75
|
+
retry=0,
|
76
|
+
)
|
77
|
+
|
78
|
+
|
79
|
+
def create_pull_subrepo_task(
|
80
|
+
origin: str,
|
81
|
+
folder: str,
|
82
|
+
branch: str,
|
83
|
+
task_name: str = "pull",
|
84
|
+
) -> CmdTask:
|
85
|
+
return CmdTask(
|
86
|
+
name=task_name,
|
87
|
+
envs=[
|
88
|
+
Env("ORIGIN", os_name="", default=origin),
|
89
|
+
Env("FOLDER", os_name="", default=folder),
|
90
|
+
Env("BRANCH", os_name="", default=branch),
|
91
|
+
Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
|
92
|
+
],
|
93
|
+
cmd_path=[
|
94
|
+
os.path.join(_CURRENT_DIR, "_common.sh"),
|
95
|
+
os.path.join(_CURRENT_DIR, "pull-subrepo.sh"),
|
96
|
+
],
|
97
|
+
cwd=PROJECT_DIR,
|
98
|
+
should_show_cmd=False,
|
99
|
+
should_show_working_directory=False,
|
100
|
+
should_print_cmd_result=False,
|
101
|
+
retry=0,
|
102
|
+
)
|
103
|
+
|
104
|
+
|
105
|
+
def create_push_subrepo_task(
|
106
|
+
origin: str,
|
107
|
+
folder: str,
|
108
|
+
branch: str,
|
109
|
+
task_name: str = "push",
|
110
|
+
default_commit_message: str = "Commit",
|
111
|
+
) -> CmdTask:
|
112
|
+
return CmdTask(
|
113
|
+
name=task_name,
|
114
|
+
inputs=[_create_commit_message_input(default_commit_message)],
|
115
|
+
envs=[
|
116
|
+
Env("ORIGIN", os_name="", default=origin),
|
117
|
+
Env("FOLDER", os_name="", default=folder),
|
118
|
+
Env("BRANCH", os_name="", default=branch),
|
119
|
+
Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
|
120
|
+
Env("MESSAGE", os_name="", default="{{input.message}}"),
|
121
|
+
],
|
122
|
+
cmd_path=[
|
123
|
+
os.path.join(_CURRENT_DIR, "_common.sh"),
|
124
|
+
os.path.join(_CURRENT_DIR, "push-subrepo.sh"),
|
125
|
+
],
|
126
|
+
cwd=PROJECT_DIR,
|
127
|
+
should_show_cmd=False,
|
128
|
+
should_show_working_directory=False,
|
129
|
+
should_print_cmd_result=False,
|
130
|
+
retry=0,
|
131
|
+
)
|
132
|
+
|
133
|
+
|
134
|
+
def _create_commit_message_input(default: str) -> AnyInput:
|
135
|
+
return StrInput(
|
136
|
+
name="message",
|
137
|
+
shortcut="m",
|
138
|
+
prompt="Commit Message",
|
139
|
+
default=default,
|
140
|
+
)
|
zrb/builtin/monorepo/_task.py
CHANGED
@@ -1,25 +1,18 @@
|
|
1
|
-
import
|
2
|
-
from datetime import datetime
|
3
|
-
|
4
|
-
from zrb.builtin.monorepo._config import MONOREPO_CONFIG, PROJECT_DIR
|
1
|
+
from zrb.builtin.monorepo._config import MONOREPO_CONFIG
|
5
2
|
from zrb.builtin.monorepo._group import monorepo_group
|
3
|
+
from zrb.builtin.monorepo._helper import (
|
4
|
+
create_add_subrepo_task,
|
5
|
+
create_pull_monorepo_task,
|
6
|
+
create_pull_subrepo_task,
|
7
|
+
create_push_monorepo_task,
|
8
|
+
create_push_subrepo_task,
|
9
|
+
)
|
6
10
|
from zrb.helper.util import to_kebab_case
|
7
11
|
from zrb.runner import runner
|
8
|
-
from zrb.task.
|
12
|
+
from zrb.task.flow_task import FlowTask
|
9
13
|
from zrb.task_group.group import Group
|
10
|
-
from zrb.task_input.str_input import StrInput
|
11
14
|
|
12
|
-
_pull_monorepo =
|
13
|
-
name="pull-monorepo",
|
14
|
-
inputs=[StrInput(name="message")],
|
15
|
-
cmd=[
|
16
|
-
"git add . -A",
|
17
|
-
'git commit -m "{{input.message}}"',
|
18
|
-
'git pull origin "$(git branch --show-current)"',
|
19
|
-
],
|
20
|
-
cwd=PROJECT_DIR,
|
21
|
-
retry=0,
|
22
|
-
)
|
15
|
+
_pull_monorepo = create_pull_monorepo_task()
|
23
16
|
|
24
17
|
PULL_SUBREPO_UPSTREAM = _pull_monorepo
|
25
18
|
PUSH_SUBREPO_UPSTREAM = _pull_monorepo
|
@@ -28,72 +21,106 @@ for name, config in MONOREPO_CONFIG.items():
|
|
28
21
|
group = Group(
|
29
22
|
name=kebab_name, parent=monorepo_group, description=f"Subrepo {name} management"
|
30
23
|
)
|
31
|
-
|
32
|
-
|
33
|
-
|
24
|
+
origin = config.get("origin", "")
|
25
|
+
folder = config.get("folder", "")
|
26
|
+
branch = config.get("branch", "main")
|
34
27
|
|
35
|
-
|
36
|
-
pull_subrepo = CmdTask(
|
28
|
+
pull_subrepo = FlowTask(
|
37
29
|
name="pull",
|
38
30
|
group=group,
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
31
|
+
upstreams=[_pull_monorepo],
|
32
|
+
steps=[
|
33
|
+
create_add_subrepo_task(
|
34
|
+
origin=origin,
|
35
|
+
folder=folder,
|
36
|
+
branch=branch,
|
37
|
+
task_name=f"add-{kebab_name}-subrepo",
|
38
|
+
),
|
39
|
+
create_pull_subrepo_task(
|
40
|
+
origin=origin,
|
41
|
+
folder=folder,
|
42
|
+
branch=branch,
|
43
|
+
task_name=f"pull-{kebab_name}-subrepo",
|
44
|
+
),
|
46
45
|
],
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
46
|
+
)
|
47
|
+
runner.register(pull_subrepo)
|
48
|
+
|
49
|
+
linked_pull_subrepo = FlowTask(
|
50
|
+
name=f"pull-{kebab_name}",
|
51
|
+
upstreams=[PULL_SUBREPO_UPSTREAM],
|
52
|
+
steps=[
|
53
|
+
create_add_subrepo_task(
|
54
|
+
origin=origin,
|
55
|
+
folder=folder,
|
56
|
+
branch=branch,
|
57
|
+
task_name=f"add-{kebab_name}-subrepo",
|
58
|
+
),
|
59
|
+
create_pull_subrepo_task(
|
60
|
+
origin=origin,
|
61
|
+
folder=folder,
|
62
|
+
branch=branch,
|
63
|
+
task_name=f"pull-{kebab_name}-subrepo",
|
64
|
+
),
|
56
65
|
],
|
57
|
-
cwd=PROJECT_DIR,
|
58
|
-
retry=0,
|
59
66
|
)
|
60
|
-
_pull_monorepo >> pull_subrepo
|
61
|
-
linked_pull_subrepo = pull_subrepo.copy()
|
62
|
-
PULL_SUBREPO_UPSTREAM >> linked_pull_subrepo
|
63
67
|
PULL_SUBREPO_UPSTREAM = linked_pull_subrepo
|
64
|
-
runner.register(pull_subrepo)
|
65
68
|
|
66
|
-
|
67
|
-
push_subrepo = CmdTask(
|
69
|
+
push_subrepo = FlowTask(
|
68
70
|
name="push",
|
69
71
|
group=group,
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
upstreams=[_pull_monorepo],
|
73
|
+
steps=[
|
74
|
+
create_add_subrepo_task(
|
75
|
+
origin=origin,
|
76
|
+
folder=folder,
|
77
|
+
branch=branch,
|
78
|
+
task_name=f"add-{kebab_name}-subrepo",
|
79
|
+
),
|
80
|
+
create_pull_subrepo_task(
|
81
|
+
origin=origin,
|
82
|
+
folder=folder,
|
83
|
+
branch=branch,
|
84
|
+
task_name=f"pull-{kebab_name}-subrepo",
|
85
|
+
),
|
86
|
+
create_push_subrepo_task(
|
87
|
+
origin=origin,
|
88
|
+
folder=folder,
|
89
|
+
branch=branch,
|
90
|
+
task_name=f"push-{kebab_name}-subrepo",
|
91
|
+
),
|
92
|
+
create_push_monorepo_task(task_name="push-monorepo"),
|
77
93
|
],
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
94
|
+
)
|
95
|
+
runner.register(push_subrepo)
|
96
|
+
|
97
|
+
linked_push_subrepo = FlowTask(
|
98
|
+
name=f"push-{kebab_name}",
|
99
|
+
upstreams=[PUSH_SUBREPO_UPSTREAM],
|
100
|
+
steps=[
|
101
|
+
create_add_subrepo_task(
|
102
|
+
origin=origin,
|
103
|
+
folder=folder,
|
104
|
+
branch=branch,
|
105
|
+
task_name=f"add-{kebab_name}-subrepo",
|
106
|
+
),
|
107
|
+
create_pull_subrepo_task(
|
108
|
+
origin=origin,
|
109
|
+
folder=folder,
|
110
|
+
branch=branch,
|
111
|
+
task_name=f"pull-{kebab_name}-subrepo",
|
112
|
+
),
|
113
|
+
create_push_subrepo_task(
|
114
|
+
origin=origin,
|
115
|
+
folder=folder,
|
116
|
+
branch=branch,
|
117
|
+
task_name=f"push-{kebab_name}-subrepo",
|
118
|
+
),
|
91
119
|
],
|
92
|
-
cwd=PROJECT_DIR,
|
93
|
-
retry=0,
|
94
120
|
)
|
95
|
-
_pull_monorepo >> push_subrepo
|
96
|
-
linked_push_subrepo = push_subrepo.copy()
|
97
|
-
PUSH_SUBREPO_UPSTREAM >> linked_push_subrepo
|
98
121
|
PUSH_SUBREPO_UPSTREAM = linked_push_subrepo
|
99
|
-
|
122
|
+
|
123
|
+
|
124
|
+
_push_monorepo = create_push_monorepo_task(task_name="push-monorepo")
|
125
|
+
PUSH_SUBREPO_UPSTREAM >> _push_monorepo
|
126
|
+
PUSH_SUBREPO_UPSTREAM = _push_monorepo
|
@@ -0,0 +1,22 @@
|
|
1
|
+
set -e
|
2
|
+
|
3
|
+
if [ -d "${FOLDER}" ]
|
4
|
+
then
|
5
|
+
exit 0
|
6
|
+
fi
|
7
|
+
|
8
|
+
CONFLICT="$(git diff --name-only --diff-filter=U)"
|
9
|
+
if [ -n "${CONFLICT}" ]
|
10
|
+
then
|
11
|
+
log_conflict_error "${CONFLICT}"
|
12
|
+
exit 1
|
13
|
+
fi
|
14
|
+
|
15
|
+
log_info "Adding subtree: ${FOLDER}"
|
16
|
+
git subtree add --prefix "${FOLDER}" "${ORIGIN}" "${BRANCH}"
|
17
|
+
git add . -A
|
18
|
+
if [ -n "$(git status --porcelain)" ]
|
19
|
+
then
|
20
|
+
log_info "Commit changes"
|
21
|
+
git commit -m "Adding subtree: ${FOLDER} at ${TIME}"
|
22
|
+
fi
|
@@ -0,0 +1,18 @@
|
|
1
|
+
set -e
|
2
|
+
|
3
|
+
CONFLICT="$(git diff --name-only --diff-filter=U)"
|
4
|
+
if [ -n "${CONFLICT}" ]
|
5
|
+
then
|
6
|
+
log_conflict_error "${CONFLICT}"
|
7
|
+
exit 1
|
8
|
+
fi
|
9
|
+
|
10
|
+
git add . -A
|
11
|
+
if [ -n "$(git status --porcelain)" ]
|
12
|
+
then
|
13
|
+
log_info "Commit changes"
|
14
|
+
git commit -m "Before pulling from monorepo at ${TIME}"
|
15
|
+
fi
|
16
|
+
|
17
|
+
log_info "Pulling from main repository"
|
18
|
+
git pull origin "$(git branch --show-current)"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
set -e
|
2
|
+
|
3
|
+
CONFLICT="$(git diff --name-only --diff-filter=U)"
|
4
|
+
if [ -n "${CONFLICT}" ]
|
5
|
+
then
|
6
|
+
log_conflict_error "${CONFLICT}"
|
7
|
+
exit 1
|
8
|
+
fi
|
9
|
+
|
10
|
+
log_info "Pulling from subtree"
|
11
|
+
git subtree pull --prefix "${FOLDER}" "${ORIGIN}" "${BRANCH}"
|
12
|
+
|
13
|
+
CONFLICT="$(git diff --name-only --diff-filter=U)"
|
14
|
+
if [ -n "${CONFLICT}" ]
|
15
|
+
then
|
16
|
+
log_conflict_error "${CONFLICT}"
|
17
|
+
exit 1
|
18
|
+
fi
|
zrb/builtin/monorepo/pull.py
CHANGED
@@ -15,9 +15,10 @@ pull_from_monorepo = Task(
|
|
15
15
|
name="message",
|
16
16
|
shortcut="m",
|
17
17
|
prompt="Commit Messsage",
|
18
|
-
default=lambda m: f"
|
18
|
+
default=lambda m: f"Synchronize subrepos at {datetime.now()}",
|
19
19
|
)
|
20
20
|
],
|
21
|
+
retry=0,
|
21
22
|
)
|
22
23
|
PULL_SUBREPO_UPSTREAM >> pull_from_monorepo
|
23
24
|
runner.register(pull_from_monorepo)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
set -e
|
2
|
+
|
3
|
+
CONFLICT="$(git diff --name-only --diff-filter=U)"
|
4
|
+
if [ -n "${CONFLICT}" ]
|
5
|
+
then
|
6
|
+
log_conflict_error "${CONFLICT}"
|
7
|
+
exit 1
|
8
|
+
fi
|
9
|
+
|
10
|
+
git add . -A
|
11
|
+
if [ -n "$(git status --porcelain)" ]
|
12
|
+
then
|
13
|
+
log_info "Commit changes"
|
14
|
+
git commit -m "${MESSAGE}"
|
15
|
+
fi
|
16
|
+
|
17
|
+
log_info "Pushing to main repository"
|
18
|
+
git push origin "$(git branch --show-current)"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
set -e
|
2
|
+
|
3
|
+
CONFLICT="$(git diff --name-only --diff-filter=U)"
|
4
|
+
if [ -n "${CONFLICT}" ]
|
5
|
+
then
|
6
|
+
log_conflict_error "${CONFLICT}"
|
7
|
+
exit 1
|
8
|
+
fi
|
9
|
+
|
10
|
+
git add . -A
|
11
|
+
if [ -n "$(git status --porcelain)" ]
|
12
|
+
then
|
13
|
+
log_info "Commit changes"
|
14
|
+
git commit -m "${MESSAGE}"
|
15
|
+
fi
|
16
|
+
|
17
|
+
log_info "Pushing to subtree"
|
18
|
+
git subtree push --prefix "${FOLDER}" "${ORIGIN}" "${BRANCH}"
|
zrb/builtin/monorepo/push.py
CHANGED
@@ -1,26 +1,11 @@
|
|
1
|
-
import os
|
2
1
|
from datetime import datetime
|
3
2
|
|
4
|
-
from zrb.builtin.monorepo._config import PROJECT_DIR
|
5
3
|
from zrb.builtin.monorepo._group import monorepo_group
|
6
4
|
from zrb.builtin.monorepo._task import PUSH_SUBREPO_UPSTREAM
|
7
5
|
from zrb.runner import runner
|
8
|
-
from zrb.task.cmd_task import CmdTask
|
9
6
|
from zrb.task.task import Task
|
10
7
|
from zrb.task_input.str_input import StrInput
|
11
8
|
|
12
|
-
_push_monorepo = CmdTask(
|
13
|
-
name="push-monorepo",
|
14
|
-
inputs=[StrInput(name="message")],
|
15
|
-
cmd=[
|
16
|
-
"git add . -A",
|
17
|
-
'git commit -m "{{input.message}}"',
|
18
|
-
'git push origin "$(git branch --show-current)"',
|
19
|
-
],
|
20
|
-
cwd=PROJECT_DIR,
|
21
|
-
retry=0,
|
22
|
-
)
|
23
|
-
|
24
9
|
push_to_monorepo = Task(
|
25
10
|
name="push",
|
26
11
|
group=monorepo_group,
|
@@ -30,9 +15,10 @@ push_to_monorepo = Task(
|
|
30
15
|
name="message",
|
31
16
|
shortcut="m",
|
32
17
|
prompt="Commit Messsage",
|
33
|
-
default=lambda m: f"
|
18
|
+
default=lambda m: f"Synchronize subrepos at {datetime.now()}",
|
34
19
|
)
|
35
20
|
],
|
21
|
+
retry=0,
|
36
22
|
)
|
37
|
-
PUSH_SUBREPO_UPSTREAM >>
|
23
|
+
PUSH_SUBREPO_UPSTREAM >> push_to_monorepo
|
38
24
|
runner.register(push_to_monorepo)
|
zrb/task/base_task/base_task.py
CHANGED
@@ -288,7 +288,7 @@ class BaseTask(FinishTracker, AttemptTracker, Renderer, BaseTaskModel, AnyTask):
|
|
288
288
|
self._print_result(result)
|
289
289
|
return result
|
290
290
|
except RuntimeError as e:
|
291
|
-
if "event loop is closed" not in str(e).lower():
|
291
|
+
if raise_error and ("event loop is closed" not in str(e).lower()):
|
292
292
|
raise e
|
293
293
|
except Exception as e:
|
294
294
|
self.log_error(f"{e}")
|
zrb/task/docker_compose_task.py
CHANGED
@@ -33,32 +33,33 @@ from zrb.task_input.any_input import AnyInput
|
|
33
33
|
|
34
34
|
logger.debug(colored("Loading zrb.task.docker_compose_task", attrs=["dark"]))
|
35
35
|
|
36
|
+
TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
|
40
|
-
ensure_container_backend = CmdTask(
|
41
|
-
name="ensure-compose-backend",
|
42
|
-
cmd_path=[
|
43
|
-
os.path.join(SHELL_SCRIPT_DIR, "_common-util.sh"),
|
44
|
-
os.path.join(SHELL_SCRIPT_DIR, f"ensure-{backend}-is-installed.sh"),
|
45
|
-
],
|
46
|
-
preexec_fn=None,
|
47
|
-
should_print_cmd_result=False,
|
48
|
-
)
|
49
|
-
return CmdTask(
|
50
|
-
name="ensure-zrb-network",
|
51
|
-
cmd=[
|
52
|
-
f"{backend} network inspect zrb >/dev/null 2>&1 || \\",
|
53
|
-
f"{backend} network create -d bridge zrb",
|
54
|
-
],
|
55
|
-
upstreams=[ensure_container_backend],
|
56
|
-
should_print_cmd_result=False,
|
57
|
-
)
|
58
|
-
|
38
|
+
CURRENT_DIR = os.path.dirname(__file__)
|
39
|
+
SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
|
59
40
|
|
60
|
-
|
61
|
-
|
41
|
+
ensure_container_backend = CmdTask(
|
42
|
+
name="ensure-compose-backend",
|
43
|
+
cmd_path=[
|
44
|
+
os.path.join(SHELL_SCRIPT_DIR, "_common-util.sh"),
|
45
|
+
os.path.join(SHELL_SCRIPT_DIR, f"ensure-{CONTAINER_BACKEND}-is-installed.sh"),
|
46
|
+
],
|
47
|
+
preexec_fn=None,
|
48
|
+
should_print_cmd_result=False,
|
49
|
+
should_show_cmd=False,
|
50
|
+
should_show_working_directory=False,
|
51
|
+
)
|
52
|
+
ensure_zrb_network_task = CmdTask(
|
53
|
+
name="ensure-zrb-network",
|
54
|
+
cmd=[
|
55
|
+
f"{CONTAINER_BACKEND} network inspect zrb >/dev/null 2>&1 || \\",
|
56
|
+
f"{CONTAINER_BACKEND} network create -d bridge zrb",
|
57
|
+
],
|
58
|
+
upstreams=[ensure_container_backend],
|
59
|
+
should_print_cmd_result=False,
|
60
|
+
should_show_cmd=False,
|
61
|
+
should_show_working_directory=False,
|
62
|
+
)
|
62
63
|
|
63
64
|
|
64
65
|
@typechecked
|
@@ -120,14 +121,13 @@ class DockerComposeTask(CmdTask):
|
|
120
121
|
should_show_cmd: bool = True,
|
121
122
|
should_show_working_directory: bool = True,
|
122
123
|
):
|
123
|
-
combined_env_files = list(env_files)
|
124
124
|
CmdTask.__init__(
|
125
125
|
self,
|
126
126
|
name=name,
|
127
127
|
group=group,
|
128
128
|
inputs=inputs,
|
129
129
|
envs=envs,
|
130
|
-
env_files=
|
130
|
+
env_files=env_files,
|
131
131
|
icon=icon,
|
132
132
|
color=color,
|
133
133
|
description=description,
|
zrb/task/flow_task.py
CHANGED
zrb/task/remote_cmd_task.py
CHANGED
@@ -6,6 +6,7 @@ from typing import Any, Optional, Union
|
|
6
6
|
from zrb.helper.accessories.color import colored
|
7
7
|
from zrb.helper.log import logger
|
8
8
|
from zrb.helper.typecheck import typechecked
|
9
|
+
from zrb.helper.typing import JinjaTemplate
|
9
10
|
from zrb.task.any_task import AnyTask
|
10
11
|
from zrb.task.any_task_event_handler import (
|
11
12
|
OnFailed,
|
@@ -16,7 +17,6 @@ from zrb.task.any_task_event_handler import (
|
|
16
17
|
OnTriggered,
|
17
18
|
OnWaiting,
|
18
19
|
)
|
19
|
-
from zrb.task.base_remote_cmd_task import BaseRemoteCmdTask, RemoteConfig
|
20
20
|
from zrb.task.cmd_task import CmdTask, CmdVal
|
21
21
|
from zrb.task_env.env import Env
|
22
22
|
from zrb.task_env.env_file import EnvFile
|
@@ -37,15 +37,17 @@ ensure_ssh_is_installed = CmdTask(
|
|
37
37
|
os.path.join(_SHELL_SCRIPT_DIR, "ensure-ssh-is-installed.sh"),
|
38
38
|
],
|
39
39
|
preexec_fn=None,
|
40
|
+
should_print_cmd_result=False,
|
41
|
+
should_show_cmd=False,
|
42
|
+
should_show_working_directory=False,
|
40
43
|
)
|
41
44
|
|
42
45
|
|
43
46
|
@typechecked
|
44
|
-
class RemoteCmdTask(
|
47
|
+
class RemoteCmdTask(CmdTask):
|
45
48
|
def __init__(
|
46
49
|
self,
|
47
50
|
name: str,
|
48
|
-
remote_configs: Iterable[RemoteConfig],
|
49
51
|
group: Optional[Group] = None,
|
50
52
|
inputs: Iterable[AnyInput] = [],
|
51
53
|
envs: Iterable[Env] = [],
|
@@ -54,9 +56,15 @@ class RemoteCmdTask(BaseRemoteCmdTask):
|
|
54
56
|
color: Optional[str] = None,
|
55
57
|
description: str = "",
|
56
58
|
executable: Optional[str] = None,
|
59
|
+
remote_host: JinjaTemplate = "localhost",
|
60
|
+
remote_port: Union[JinjaTemplate, int] = 22,
|
61
|
+
remote_user: JinjaTemplate = "root",
|
62
|
+
remote_password: JinjaTemplate = "",
|
63
|
+
remote_ssh_key: JinjaTemplate = "",
|
57
64
|
cmd: CmdVal = "",
|
58
65
|
cmd_path: CmdVal = "",
|
59
66
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
67
|
+
should_render_cwd: bool = True,
|
60
68
|
upstreams: Iterable[AnyTask] = [],
|
61
69
|
fallbacks: Iterable[AnyTask] = [],
|
62
70
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -74,18 +82,14 @@ class RemoteCmdTask(BaseRemoteCmdTask):
|
|
74
82
|
max_error_line: int = 1000,
|
75
83
|
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
76
84
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
85
|
+
return_upstream_result: bool = False,
|
86
|
+
should_print_cmd_result: bool = True,
|
87
|
+
should_show_cmd: bool = True,
|
88
|
+
should_show_working_directory: bool = True,
|
77
89
|
):
|
78
|
-
|
79
|
-
[
|
80
|
-
_SSH_UTIL_SCRIPT,
|
81
|
-
"_SCRIPT=\"$(cat <<'ENDSCRIPT'",
|
82
|
-
]
|
83
|
-
)
|
84
|
-
post_cmd = "\n".join(["ENDSCRIPT", ')"', 'auth_ssh "$_SCRIPT"'])
|
85
|
-
BaseRemoteCmdTask.__init__(
|
90
|
+
CmdTask.__init__(
|
86
91
|
self,
|
87
92
|
name=name,
|
88
|
-
remote_configs=remote_configs,
|
89
93
|
group=group,
|
90
94
|
inputs=inputs,
|
91
95
|
envs=envs,
|
@@ -94,11 +98,10 @@ class RemoteCmdTask(BaseRemoteCmdTask):
|
|
94
98
|
color=color,
|
95
99
|
description=description,
|
96
100
|
executable=executable,
|
97
|
-
pre_cmd=pre_cmd,
|
98
101
|
cmd=cmd,
|
99
102
|
cmd_path=cmd_path,
|
100
|
-
post_cmd=post_cmd,
|
101
103
|
cwd=cwd,
|
104
|
+
should_render_cwd=should_render_cwd,
|
102
105
|
upstreams=[ensure_ssh_is_installed] + upstreams,
|
103
106
|
fallbacks=fallbacks,
|
104
107
|
on_triggered=on_triggered,
|
@@ -116,4 +119,40 @@ class RemoteCmdTask(BaseRemoteCmdTask):
|
|
116
119
|
max_error_line=max_error_line,
|
117
120
|
preexec_fn=preexec_fn,
|
118
121
|
should_execute=should_execute,
|
122
|
+
return_upstream_result=return_upstream_result,
|
123
|
+
should_print_cmd_result=should_print_cmd_result,
|
124
|
+
should_show_cmd=should_show_cmd,
|
125
|
+
should_show_working_directory=should_show_working_directory,
|
126
|
+
)
|
127
|
+
self._remote_host = remote_host
|
128
|
+
self._remote_port = remote_port
|
129
|
+
self._remote_user = remote_user
|
130
|
+
self._remote_password = remote_password
|
131
|
+
self._remote_ssh_key = remote_ssh_key
|
132
|
+
|
133
|
+
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
134
|
+
cmd_script = self._create_cmd_script(self._cmd_path, self._cmd, *args, **kwargs)
|
135
|
+
cmd_script = "\n".join(
|
136
|
+
[
|
137
|
+
"_SCRIPT=$(cat << 'ENDSCRIPT'",
|
138
|
+
cmd_script,
|
139
|
+
"ENDSCRIPT",
|
140
|
+
")",
|
141
|
+
]
|
119
142
|
)
|
143
|
+
ssh_command = self._get_ssh_command()
|
144
|
+
return "\n".join([cmd_script, ssh_command])
|
145
|
+
|
146
|
+
def _get_ssh_command(self) -> str:
|
147
|
+
host = self.render_str(self._remote_host)
|
148
|
+
port = self.render_str(self._remote_port)
|
149
|
+
user = self.render_str(self._remote_user)
|
150
|
+
password = self.render_str(self._remote_password)
|
151
|
+
key = self.render_str(self._remote_ssh_key)
|
152
|
+
if key != "" and password != "":
|
153
|
+
return f'sshpass -p "{password}" ssh -t -p "{port}" -i "{key}" "{user}@{host}" "$_SCRIPT"' # noqa
|
154
|
+
if key != "":
|
155
|
+
return f'ssh -t -p "{port}" -i "{key}" "{user}@{host}" "$_SCRIPT"'
|
156
|
+
if password != "":
|
157
|
+
return f'sshpass -p "{password}" ssh -t -p "{port}" "{user}@{host}" "$_SCRIPT"' # noqa
|
158
|
+
return f'ssh -t -p "{port}" "{user}@{host}" "$_SCRIPT"'
|
zrb/task/rsync_task.py
CHANGED
@@ -17,7 +17,6 @@ from zrb.task.any_task_event_handler import (
|
|
17
17
|
OnTriggered,
|
18
18
|
OnWaiting,
|
19
19
|
)
|
20
|
-
from zrb.task.base_remote_cmd_task import BaseRemoteCmdTask, RemoteConfig
|
21
20
|
from zrb.task.cmd_task import CmdTask
|
22
21
|
from zrb.task_env.env import Env
|
23
22
|
from zrb.task_env.env_file import EnvFile
|
@@ -39,19 +38,17 @@ ensure_rsync_is_installed = CmdTask(
|
|
39
38
|
os.path.join(_SHELL_SCRIPT_DIR, "ensure-rsync-is-installed.sh"),
|
40
39
|
],
|
41
40
|
preexec_fn=None,
|
41
|
+
should_print_cmd_result=False,
|
42
|
+
should_show_cmd=False,
|
43
|
+
should_show_working_directory=False,
|
42
44
|
)
|
43
45
|
|
44
46
|
|
45
47
|
@typechecked
|
46
|
-
class RsyncTask(
|
48
|
+
class RsyncTask(CmdTask):
|
47
49
|
def __init__(
|
48
50
|
self,
|
49
51
|
name: str,
|
50
|
-
remote_configs: Iterable[RemoteConfig],
|
51
|
-
src: JinjaTemplate,
|
52
|
-
dst: JinjaTemplate,
|
53
|
-
src_is_remote: bool = False,
|
54
|
-
dst_is_remote: bool = True,
|
55
52
|
group: Optional[Group] = None,
|
56
53
|
inputs: Iterable[AnyInput] = [],
|
57
54
|
envs: Iterable[Env] = [],
|
@@ -60,7 +57,17 @@ class RsyncTask(BaseRemoteCmdTask):
|
|
60
57
|
color: Optional[str] = None,
|
61
58
|
description: str = "",
|
62
59
|
executable: Optional[str] = None,
|
63
|
-
|
60
|
+
remote_host: JinjaTemplate = "localhost",
|
61
|
+
remote_port: Union[JinjaTemplate, int] = 22,
|
62
|
+
remote_user: JinjaTemplate = "root",
|
63
|
+
remote_password: JinjaTemplate = "",
|
64
|
+
remote_ssh_key: JinjaTemplate = "",
|
65
|
+
src_path: JinjaTemplate = ".",
|
66
|
+
src_is_remote: bool = False,
|
67
|
+
dst_path: JinjaTemplate = ".",
|
68
|
+
dst_is_remote: bool = True,
|
69
|
+
cwd: Optional[Union[JinjaTemplate, pathlib.Path]] = None,
|
70
|
+
should_render_cwd: bool = True,
|
64
71
|
upstreams: Iterable[AnyTask] = [],
|
65
72
|
fallbacks: Iterable[AnyTask] = [],
|
66
73
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -78,14 +85,14 @@ class RsyncTask(BaseRemoteCmdTask):
|
|
78
85
|
max_error_line: int = 1000,
|
79
86
|
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
80
87
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
88
|
+
return_upstream_result: bool = False,
|
89
|
+
should_print_cmd_result: bool = True,
|
90
|
+
should_show_cmd: bool = True,
|
91
|
+
should_show_working_directory: bool = True,
|
81
92
|
):
|
82
|
-
|
83
|
-
parsed_dst = self._get_parsed_path(dst_is_remote, dst)
|
84
|
-
cmd = f'auth_rsync "{parsed_src}" "{parsed_dst}"'
|
85
|
-
BaseRemoteCmdTask.__init__(
|
93
|
+
CmdTask.__init__(
|
86
94
|
self,
|
87
95
|
name=name,
|
88
|
-
remote_configs=remote_configs,
|
89
96
|
group=group,
|
90
97
|
inputs=inputs,
|
91
98
|
envs=envs,
|
@@ -94,9 +101,8 @@ class RsyncTask(BaseRemoteCmdTask):
|
|
94
101
|
color=color,
|
95
102
|
description=description,
|
96
103
|
executable=executable,
|
97
|
-
pre_cmd=_RSYNC_UTIL_SCRIPT,
|
98
|
-
cmd=cmd,
|
99
104
|
cwd=cwd,
|
105
|
+
should_render_cwd=should_render_cwd,
|
100
106
|
upstreams=[ensure_rsync_is_installed] + upstreams,
|
101
107
|
fallbacks=fallbacks,
|
102
108
|
on_triggered=on_triggered,
|
@@ -114,9 +120,39 @@ class RsyncTask(BaseRemoteCmdTask):
|
|
114
120
|
max_error_line=max_error_line,
|
115
121
|
preexec_fn=preexec_fn,
|
116
122
|
should_execute=should_execute,
|
123
|
+
return_upstream_result=return_upstream_result,
|
124
|
+
should_print_cmd_result=should_print_cmd_result,
|
125
|
+
should_show_cmd=should_show_cmd,
|
126
|
+
should_show_working_directory=should_show_working_directory,
|
117
127
|
)
|
128
|
+
self._remote_host = remote_host
|
129
|
+
self._remote_port = remote_port
|
130
|
+
self._remote_user = remote_user
|
131
|
+
self._remote_password = remote_password
|
132
|
+
self._remote_ssh_key = remote_ssh_key
|
133
|
+
self._src_path = src_path
|
134
|
+
self._src_is_remote = src_is_remote
|
135
|
+
self._dst_path = dst_path
|
136
|
+
self._dst_is_remote = dst_is_remote
|
137
|
+
|
138
|
+
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
139
|
+
port = self.render_str(self._remote_port)
|
140
|
+
password = self.render_str(self._remote_password)
|
141
|
+
key = self.render_str(self._remote_ssh_key)
|
142
|
+
src = self._get_path(self._src_path, self._src_is_remote)
|
143
|
+
dst = self._get_path(self._dst_path, self._dst_is_remote)
|
144
|
+
if key != "" and password != "":
|
145
|
+
return f'sshpass -p "{password}" rsync --mkpath -avz -e "ssh -i {key} -p {port}" {src} {dst}' # noqa
|
146
|
+
if key != "":
|
147
|
+
return f'rsync --mkpath -avz -e "ssh -i {key} -p {port}" {src} {dst}'
|
148
|
+
if password != "":
|
149
|
+
return f'sshpass -p "{password}" rsync --mkpath -avz -e "ssh -p {port}" {src} {dst}' # noqa
|
150
|
+
return f'rsync --mkpath -avz -e "ssh -p {port}" {src} {dst}'
|
118
151
|
|
119
|
-
def
|
120
|
-
|
121
|
-
|
122
|
-
|
152
|
+
def _get_path(self, resource_path: str, is_remote: bool) -> str:
|
153
|
+
rendered_path = self.render_str(resource_path)
|
154
|
+
if is_remote:
|
155
|
+
host = self.render_str(self._remote_host)
|
156
|
+
user = self.render_str(self._remote_user)
|
157
|
+
return f"{user}@{host}:{rendered_path}"
|
158
|
+
return rendered_path
|
@@ -1,10 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: zrb
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.27.0
|
4
4
|
Summary: A Framework to Enhance Your Workflow
|
5
5
|
Home-page: https://github.com/state-alchemists/zrb
|
6
6
|
License: AGPL-3.0-or-later
|
7
|
-
Keywords: Automation,Task Runner,Code Generator,Low Code
|
7
|
+
Keywords: Automation,Task Runner,Code Generator,Monorepo,Low Code
|
8
8
|
Author: Go Frendi Gunawan
|
9
9
|
Author-email: gofrendiasgard@gmail.com
|
10
10
|
Requires-Python: >=3.10.0,<4.0.0
|
@@ -1,4 +1,4 @@
|
|
1
|
-
zrb/__init__.py,sha256=
|
1
|
+
zrb/__init__.py,sha256=dQs1S6z3XbG1BeQ62YYxc6cUs5ejw9T9ajkPgNVEs34,2875
|
2
2
|
zrb/__main__.py,sha256=-_k0XOahDF-06n41Uly-oUMkZ8XDSxO-WUUImWz6GiA,171
|
3
3
|
zrb/action/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
zrb/action/runner.py,sha256=aB46inPOs7CDckfIsS_mlgQ92_bfKltcnb77PjW6Tfw,5179
|
@@ -87,12 +87,19 @@ zrb/builtin/md5/_group.py,sha256=dimqCmJItc7qx7yRm64tL608oMAjOVXRycP7NTSSFi0,100
|
|
87
87
|
zrb/builtin/md5/hash.py,sha256=futO_5AsXHdS5a7vuBLcgnKCpfEO9UeM-EqaIIBPCZE,572
|
88
88
|
zrb/builtin/md5/sum.py,sha256=KZLsXIJrVxvbjyAiVv27-Y2ty-nBRRojsGxXyzQZaYE,688
|
89
89
|
zrb/builtin/monorepo/__init__.py,sha256=AgzIDOcrW4FXxly5SqExyGRo-fIo0ocX_fCScLPDuR0,239
|
90
|
+
zrb/builtin/monorepo/_common.sh,sha256=HfSIyw_OYGXx0TZzwdLB21fX6sTnZ_45Vf6YXVxxU-k,336
|
90
91
|
zrb/builtin/monorepo/_config.py,sha256=cTKOoDonkVXR-1SGUYtA8d5aUpDkhN4olhPQwfJhV4U,365
|
91
92
|
zrb/builtin/monorepo/_group.py,sha256=idv_8MIE-TCNAvhE0urh7OxTx3qNZbBlE9wYJ-teqa8,115
|
92
|
-
zrb/builtin/monorepo/
|
93
|
+
zrb/builtin/monorepo/_helper.py,sha256=RuK0mkQI73ryixD_iYfp8lxJmrFxkHyFvDThW2fsrF8,4057
|
94
|
+
zrb/builtin/monorepo/_task.py,sha256=1UY8eErrjpykK51UjjIu74lH25jMW8l3k36-eyYk9KI,3869
|
95
|
+
zrb/builtin/monorepo/add-subrepo.sh,sha256=LWyie9_3aCA7OarzDl7HedJnV7OpkkSHUHHPDcToNQ8,426
|
93
96
|
zrb/builtin/monorepo/add.py,sha256=MtPhTEJEdpfRsbdB-hln4hyGzPVWu9kdrmiCxqu0dTs,1580
|
94
|
-
zrb/builtin/monorepo/pull.
|
95
|
-
zrb/builtin/monorepo/
|
97
|
+
zrb/builtin/monorepo/pull-monorepo.sh,sha256=80mC-FOmIFjhgeGe_s6SzKgf5ZyUwrUsz8O1huTP3Ww,377
|
98
|
+
zrb/builtin/monorepo/pull-subrepo.sh,sha256=7M6haXVkApuS3F1Ndp-jrdRMLbPbSYZUo7ckVAffypI,365
|
99
|
+
zrb/builtin/monorepo/pull.py,sha256=6W9w2QJipn9TYIqaE-tzW_KK1hxPU7oJW0IlH_yPwJA,676
|
100
|
+
zrb/builtin/monorepo/push-monorepo.sh,sha256=qkr6vfIvIKSKCiE1rartU5vahcjP7Ocvrt-zhgc1ZSo,346
|
101
|
+
zrb/builtin/monorepo/push-subrepo.sh,sha256=k-9ZbEEwDOgHn9Jo_CSkZwk4-bkcZm4TUc-e6j8Kvlk,353
|
102
|
+
zrb/builtin/monorepo/push.py,sha256=snKu4ravGFBBxHwLegI_kg65a9sG8bpf7t2T2CanNcE,668
|
96
103
|
zrb/builtin/process/__init__.py,sha256=dWM1zIehY65rkJvEAFvX6HGJHL8kb1gkzaSz0Woay8M,283
|
97
104
|
zrb/builtin/process/_group.py,sha256=KY7iQ_pvqe5iVsRFeLWs-O-xuSyqlTXVj47_TCnu7zQ,118
|
98
105
|
zrb/builtin/process/pid/__init__.py,sha256=Rcb3bYgR_oVNOlaggYjcRipHRehrumZuQyadrguXdR0,293
|
@@ -1386,9 +1393,8 @@ zrb/shell-scripts/ssh-util.sh,sha256=9lXDzw6oO8HuA4vdbfps_uQMMwKyNYX9fZkZgpK52g8
|
|
1386
1393
|
zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1387
1394
|
zrb/task/any_task.py,sha256=SlAp6LY-8TGopaQm3eZD3ZEx3wxvCff8UfcnYyu-aiY,39344
|
1388
1395
|
zrb/task/any_task_event_handler.py,sha256=ay4v7eXatF4sCiXpUYaHVJZljpnKlvBbFIwvZqXW8Mo,541
|
1389
|
-
zrb/task/base_remote_cmd_task.py,sha256=EhAT7grnIxFeMfwm8FV6GF6n0kOYESAyIIVzqgZBRBg,12324
|
1390
1396
|
zrb/task/base_task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1391
|
-
zrb/task/base_task/base_task.py,sha256=
|
1397
|
+
zrb/task/base_task/base_task.py,sha256=oihVRUHAvNMwlfLEWQoixt5OwyMLyW9w6bSGD9WGVIk,20457
|
1392
1398
|
zrb/task/base_task/component/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1393
1399
|
zrb/task/base_task/component/base_task_model.py,sha256=EuTWvY54mD_ATy4-VFZw4uCOu3Mfe8hgZikwTnIjmkY,10381
|
1394
1400
|
zrb/task/base_task/component/common_task_model.py,sha256=X_Ubu5kNycQJ-dFiLMARvC6GWQ9pIjBCdxh3MVelc-A,13544
|
@@ -1399,8 +1405,8 @@ zrb/task/checker.py,sha256=mh_2ajZqpNdJQ8AFVQ6ZArYtBUOXST3aZSisINuEivk,3400
|
|
1399
1405
|
zrb/task/cmd_task.py,sha256=B3kRtpb0QVjusPWAMLjpfGxvAdEfgD9_N0jiU55S3rA,14718
|
1400
1406
|
zrb/task/decorator.py,sha256=SuajollezbwiSOs29bv8A6PmFcFs_RH4pr4TPcQPDHM,3081
|
1401
1407
|
zrb/task/docker_compose_start_task.py,sha256=n4mLejebyy8sF4rbcfWZucPcBiqPSkDAdGZvOhk4Xt8,5335
|
1402
|
-
zrb/task/docker_compose_task.py,sha256=
|
1403
|
-
zrb/task/flow_task.py,sha256=
|
1408
|
+
zrb/task/docker_compose_task.py,sha256=NuNevzooQVn3wgMNrBBdVD2FepRpE38ouYkRNXeqQ2s,15543
|
1409
|
+
zrb/task/flow_task.py,sha256=wkvvUCrt6n1ul-o3STCPMdrlBuGBrNCRgtRzGyXir9o,5079
|
1404
1410
|
zrb/task/http_checker.py,sha256=gXqBlEStMnIhzmQ7FX9Zo-nG3-wsiVEML8IOJiSG5JI,5705
|
1405
1411
|
zrb/task/looper.py,sha256=zInLRgcQlReGXz4Ffxc2W99RovSChj6kHuGEGmaPb-Q,1432
|
1406
1412
|
zrb/task/notifier.py,sha256=xjqT5Vydr_0cc1m4jA-odhHMZg6CSGciFCs0rhVkvPM,6265
|
@@ -1409,9 +1415,9 @@ zrb/task/path_checker.py,sha256=xkOpxlLUaEXlsiWh1o-ghqQNWYadXvTl3QV4yeIC2Rc,4677
|
|
1409
1415
|
zrb/task/path_watcher.py,sha256=aKWhT7Kuc_UJMr8SSY7ZZym-_rV526tEeIaKRRz3XYU,7419
|
1410
1416
|
zrb/task/port_checker.py,sha256=SG2yrAxdJgxdR6xymviB48K529o3Rnq_WhDJZDKgAQg,4605
|
1411
1417
|
zrb/task/recurring_task.py,sha256=wtZhi0DCDdVM7ecIgoXghQPTOQemrEvCY8xDJoaG1mo,7444
|
1412
|
-
zrb/task/remote_cmd_task.py,sha256=
|
1418
|
+
zrb/task/remote_cmd_task.py,sha256=LQxDoFxd6Z-ALQqgDOntenaqABzQ5ri1sHTOKwb2-WQ,5801
|
1413
1419
|
zrb/task/resource_maker.py,sha256=e6nmFJsVHHo8_sW5F-lBfkO_2RszrlXNoubh4rwM6UY,7644
|
1414
|
-
zrb/task/rsync_task.py,sha256=
|
1420
|
+
zrb/task/rsync_task.py,sha256=gryXNikhsJ4BXU3XzK15xF4KDUXAH8ydO36JdUwER-c,6034
|
1415
1421
|
zrb/task/server.py,sha256=zC8swQOu_3YkRtGFXuRGZqz6yEu--ZhNRgNwbR44uUA,6741
|
1416
1422
|
zrb/task/task.py,sha256=iHDyUMUh1uVGlMCQdVewdT3epCOHKNRKblC3G1WSKS0,2493
|
1417
1423
|
zrb/task/time_watcher.py,sha256=v01whCMTvul_vraVccy8A9rDBk-CL7HFvPOu8g1BC5s,5130
|
@@ -1434,8 +1440,8 @@ zrb/task_input/multiline_input.py,sha256=KNto5k5X1C6KE_A-vX0OjpQyjgCRJ6BR2PwHXNQ
|
|
1434
1440
|
zrb/task_input/password_input.py,sha256=95NlJ9xIq7z_evpAyR2XsBpeuWpBXd2Ezn3P7oDOttk,4360
|
1435
1441
|
zrb/task_input/str_input.py,sha256=0nje7vI9fs_xqQBbmKB8Yn7wevlWp9Qebv7f8-GmiXs,4350
|
1436
1442
|
zrb/task_input/task_input.py,sha256=WTj_qIQyRs-04-VotjNTcVyIuf6b2afInVoCQHoRmr0,2327
|
1437
|
-
zrb-0.
|
1438
|
-
zrb-0.
|
1439
|
-
zrb-0.
|
1440
|
-
zrb-0.
|
1441
|
-
zrb-0.
|
1443
|
+
zrb-0.27.0.dist-info/LICENSE,sha256=WfnGCl8G60EYOPAEkuc8C9m9pdXWDe08NsKj3TBbxsM,728
|
1444
|
+
zrb-0.27.0.dist-info/METADATA,sha256=TPjzJNyVNVgFbcSDdhyJfNhbtYoGW2WXl72M1YqS8wE,17094
|
1445
|
+
zrb-0.27.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
1446
|
+
zrb-0.27.0.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
|
1447
|
+
zrb-0.27.0.dist-info/RECORD,,
|
zrb/task/base_remote_cmd_task.py
DELETED
@@ -1,354 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import pathlib
|
3
|
-
from collections.abc import Callable, Iterable, Mapping
|
4
|
-
from typing import Any, Optional, TypeVar, Union
|
5
|
-
|
6
|
-
from zrb.helper.accessories.color import colored
|
7
|
-
from zrb.helper.log import logger
|
8
|
-
from zrb.helper.typecheck import typechecked
|
9
|
-
from zrb.helper.typing import JinjaTemplate
|
10
|
-
from zrb.helper.util import to_snake_case
|
11
|
-
from zrb.task.any_task import AnyTask
|
12
|
-
from zrb.task.any_task_event_handler import (
|
13
|
-
OnFailed,
|
14
|
-
OnReady,
|
15
|
-
OnRetry,
|
16
|
-
OnSkipped,
|
17
|
-
OnStarted,
|
18
|
-
OnTriggered,
|
19
|
-
OnWaiting,
|
20
|
-
)
|
21
|
-
from zrb.task.base_task.base_task import BaseTask
|
22
|
-
from zrb.task.cmd_task import CmdTask, CmdVal
|
23
|
-
from zrb.task_env.env import Env
|
24
|
-
from zrb.task_env.env_file import EnvFile
|
25
|
-
from zrb.task_group.group import Group
|
26
|
-
from zrb.task_input.any_input import AnyInput
|
27
|
-
|
28
|
-
logger.debug(colored("Loading zrb.task.base_remote_cmd_task", attrs=["dark"]))
|
29
|
-
|
30
|
-
TSingleBaseRemoteCmdTask = TypeVar(
|
31
|
-
"TSingleBaseRemoteCmdTask", bound="SingleBaseRemoteCmdTask"
|
32
|
-
)
|
33
|
-
TBaseRemoteCmdTask = TypeVar("TBaseRemoteCmdTask", bound="BaseRemoteCmdTask")
|
34
|
-
|
35
|
-
|
36
|
-
@typechecked
|
37
|
-
class RemoteConfig:
|
38
|
-
def __init__(
|
39
|
-
self,
|
40
|
-
host: JinjaTemplate,
|
41
|
-
user: JinjaTemplate = "",
|
42
|
-
password: JinjaTemplate = "",
|
43
|
-
ssh_key: JinjaTemplate = "",
|
44
|
-
port: Union[int, JinjaTemplate] = 22,
|
45
|
-
name: Optional[str] = None,
|
46
|
-
config_map: Optional[Mapping[str, JinjaTemplate]] = None,
|
47
|
-
):
|
48
|
-
self.name = name if name is not None else host
|
49
|
-
self.host = host
|
50
|
-
self.user = user
|
51
|
-
self.password = password
|
52
|
-
self.ssh_key = ssh_key
|
53
|
-
self.port = port
|
54
|
-
self.config_map = {} if config_map is None else config_map
|
55
|
-
|
56
|
-
|
57
|
-
@typechecked
|
58
|
-
class SingleBaseRemoteCmdTask(CmdTask):
|
59
|
-
def __init__(
|
60
|
-
self,
|
61
|
-
name: str,
|
62
|
-
remote_config: RemoteConfig,
|
63
|
-
group: Optional[Group] = None,
|
64
|
-
inputs: Iterable[AnyInput] = [],
|
65
|
-
envs: Iterable[Env] = [],
|
66
|
-
env_files: Iterable[EnvFile] = [],
|
67
|
-
icon: Optional[str] = None,
|
68
|
-
color: Optional[str] = None,
|
69
|
-
description: str = "",
|
70
|
-
executable: Optional[str] = None,
|
71
|
-
pre_cmd: CmdVal = "",
|
72
|
-
pre_cmd_path: CmdVal = "",
|
73
|
-
cmd: CmdVal = "",
|
74
|
-
cmd_path: CmdVal = "",
|
75
|
-
post_cmd: CmdVal = "",
|
76
|
-
post_cmd_path: CmdVal = "",
|
77
|
-
cwd: Optional[Union[str, pathlib.Path]] = None,
|
78
|
-
should_render_cwd: bool = True,
|
79
|
-
upstreams: Iterable[AnyTask] = [],
|
80
|
-
fallbacks: Iterable[AnyTask] = [],
|
81
|
-
on_triggered: Optional[OnTriggered] = None,
|
82
|
-
on_waiting: Optional[OnWaiting] = None,
|
83
|
-
on_skipped: Optional[OnSkipped] = None,
|
84
|
-
on_started: Optional[OnStarted] = None,
|
85
|
-
on_ready: Optional[OnReady] = None,
|
86
|
-
on_retry: Optional[OnRetry] = None,
|
87
|
-
on_failed: Optional[OnFailed] = None,
|
88
|
-
checkers: Iterable[AnyTask] = [],
|
89
|
-
checking_interval: Union[float, int] = 0.05,
|
90
|
-
retry: int = 2,
|
91
|
-
retry_interval: Union[float, int] = 1,
|
92
|
-
max_output_line: int = 1000,
|
93
|
-
max_error_line: int = 1000,
|
94
|
-
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
95
|
-
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
96
|
-
return_upstream_result: bool = False,
|
97
|
-
should_print_cmd_result: bool = True,
|
98
|
-
should_show_cmd: bool = True,
|
99
|
-
should_show_working_directory: bool = True,
|
100
|
-
):
|
101
|
-
CmdTask.__init__(
|
102
|
-
self,
|
103
|
-
name=name,
|
104
|
-
group=group,
|
105
|
-
inputs=inputs,
|
106
|
-
envs=envs,
|
107
|
-
env_files=env_files,
|
108
|
-
icon=icon,
|
109
|
-
color=color,
|
110
|
-
description=description,
|
111
|
-
executable=executable,
|
112
|
-
cmd=cmd,
|
113
|
-
cmd_path=cmd_path,
|
114
|
-
cwd=cwd,
|
115
|
-
should_render_cwd=should_render_cwd,
|
116
|
-
upstreams=upstreams,
|
117
|
-
fallbacks=fallbacks,
|
118
|
-
on_triggered=on_triggered,
|
119
|
-
on_waiting=on_waiting,
|
120
|
-
on_skipped=on_skipped,
|
121
|
-
on_started=on_started,
|
122
|
-
on_ready=on_ready,
|
123
|
-
on_retry=on_retry,
|
124
|
-
on_failed=on_failed,
|
125
|
-
checkers=checkers,
|
126
|
-
checking_interval=checking_interval,
|
127
|
-
retry=retry,
|
128
|
-
retry_interval=retry_interval,
|
129
|
-
max_output_line=max_output_line,
|
130
|
-
max_error_line=max_error_line,
|
131
|
-
preexec_fn=preexec_fn,
|
132
|
-
should_execute=should_execute,
|
133
|
-
return_upstream_result=return_upstream_result,
|
134
|
-
should_print_cmd_result=should_print_cmd_result,
|
135
|
-
should_show_cmd=should_show_cmd,
|
136
|
-
should_show_working_directory=should_show_working_directory,
|
137
|
-
)
|
138
|
-
self._pre_cmd = pre_cmd
|
139
|
-
self._pre_cmd_path = pre_cmd_path
|
140
|
-
self._post_cmd = post_cmd
|
141
|
-
self._post_cmd_path = post_cmd_path
|
142
|
-
self._remote_config = remote_config
|
143
|
-
|
144
|
-
def copy(self) -> TSingleBaseRemoteCmdTask:
|
145
|
-
return super().copy()
|
146
|
-
|
147
|
-
def inject_envs(self):
|
148
|
-
super().inject_envs()
|
149
|
-
# add remote config properties as env
|
150
|
-
self.add_env(
|
151
|
-
Env(
|
152
|
-
name="_CONFIG_HOST",
|
153
|
-
os_name="",
|
154
|
-
default=self.render_str(self._remote_config.host),
|
155
|
-
),
|
156
|
-
Env(
|
157
|
-
name="_CONFIG_PORT",
|
158
|
-
os_name="",
|
159
|
-
default=str(self.render_int(self._remote_config.port)),
|
160
|
-
),
|
161
|
-
Env(
|
162
|
-
name="_CONFIG_SSH_KEY",
|
163
|
-
os_name="",
|
164
|
-
default=self.render_str(self._remote_config.ssh_key),
|
165
|
-
),
|
166
|
-
Env(
|
167
|
-
name="_CONFIG_USER",
|
168
|
-
os_name="",
|
169
|
-
default=self.render_str(self._remote_config.user),
|
170
|
-
),
|
171
|
-
Env(
|
172
|
-
name="_CONFIG_PASSWORD",
|
173
|
-
os_name="",
|
174
|
-
default=self.render_str(self._remote_config.password),
|
175
|
-
),
|
176
|
-
)
|
177
|
-
for key, val in self._remote_config.config_map.items():
|
178
|
-
upper_snake_key = to_snake_case(key).upper()
|
179
|
-
rendered_val = self.render_str(val)
|
180
|
-
# add remote config map as env
|
181
|
-
self.add_env(
|
182
|
-
Env(
|
183
|
-
name="_CONFIG_MAP_" + upper_snake_key,
|
184
|
-
os_name="",
|
185
|
-
default=rendered_val,
|
186
|
-
)
|
187
|
-
)
|
188
|
-
|
189
|
-
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
190
|
-
cmd_str = "\n".join(
|
191
|
-
[
|
192
|
-
self._create_cmd_script(
|
193
|
-
self._pre_cmd_path, self._pre_cmd, *args, **kwargs
|
194
|
-
),
|
195
|
-
super().get_cmd_script(*args, **kwargs),
|
196
|
-
self._create_cmd_script(
|
197
|
-
self._post_cmd_path, self._post_cmd, *args, **kwargs
|
198
|
-
),
|
199
|
-
]
|
200
|
-
)
|
201
|
-
return cmd_str
|
202
|
-
|
203
|
-
|
204
|
-
@typechecked
|
205
|
-
class BaseRemoteCmdTask(BaseTask):
|
206
|
-
def __init__(
|
207
|
-
self,
|
208
|
-
name: str,
|
209
|
-
remote_configs: Iterable[RemoteConfig],
|
210
|
-
group: Optional[Group] = None,
|
211
|
-
inputs: Iterable[AnyInput] = [],
|
212
|
-
envs: Iterable[Env] = [],
|
213
|
-
env_files: Iterable[EnvFile] = [],
|
214
|
-
icon: Optional[str] = None,
|
215
|
-
color: Optional[str] = None,
|
216
|
-
description: str = "",
|
217
|
-
executable: Optional[str] = None,
|
218
|
-
pre_cmd: CmdVal = "",
|
219
|
-
pre_cmd_path: CmdVal = "",
|
220
|
-
cmd: CmdVal = "",
|
221
|
-
cmd_path: CmdVal = "",
|
222
|
-
post_cmd: CmdVal = "",
|
223
|
-
post_cmd_path: CmdVal = "",
|
224
|
-
cwd: Optional[Union[JinjaTemplate, pathlib.Path]] = None,
|
225
|
-
should_render_cwd: bool = True,
|
226
|
-
upstreams: Iterable[AnyTask] = [],
|
227
|
-
fallbacks: Iterable[AnyTask] = [],
|
228
|
-
on_triggered: Optional[OnTriggered] = None,
|
229
|
-
on_waiting: Optional[OnWaiting] = None,
|
230
|
-
on_skipped: Optional[OnSkipped] = None,
|
231
|
-
on_started: Optional[OnStarted] = None,
|
232
|
-
on_ready: Optional[OnReady] = None,
|
233
|
-
on_retry: Optional[OnRetry] = None,
|
234
|
-
on_failed: Optional[OnFailed] = None,
|
235
|
-
checkers: Iterable[AnyTask] = [],
|
236
|
-
checking_interval: Union[float, int] = 0.05,
|
237
|
-
retry: int = 2,
|
238
|
-
retry_interval: Union[float, int] = 1,
|
239
|
-
max_output_line: int = 1000,
|
240
|
-
max_error_line: int = 1000,
|
241
|
-
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
242
|
-
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
243
|
-
return_upstream_result: bool = False,
|
244
|
-
should_print_cmd_result: bool = True,
|
245
|
-
should_show_cmd: bool = True,
|
246
|
-
should_show_working_directory: bool = True,
|
247
|
-
):
|
248
|
-
self._remote_configs = list(remote_configs)
|
249
|
-
self._sub_tasks = [
|
250
|
-
SingleBaseRemoteCmdTask(
|
251
|
-
name=f"{name}-{remote_config.name}",
|
252
|
-
remote_config=remote_config,
|
253
|
-
inputs=inputs,
|
254
|
-
envs=envs,
|
255
|
-
env_files=env_files,
|
256
|
-
description=description,
|
257
|
-
executable=executable,
|
258
|
-
pre_cmd=pre_cmd,
|
259
|
-
pre_cmd_path=pre_cmd_path,
|
260
|
-
cmd=cmd,
|
261
|
-
cmd_path=cmd_path,
|
262
|
-
post_cmd=post_cmd,
|
263
|
-
post_cmd_path=post_cmd_path,
|
264
|
-
cwd=cwd,
|
265
|
-
should_render_cwd=should_render_cwd,
|
266
|
-
upstreams=upstreams,
|
267
|
-
fallbacks=fallbacks,
|
268
|
-
on_triggered=on_triggered,
|
269
|
-
on_waiting=on_waiting,
|
270
|
-
on_skipped=on_skipped,
|
271
|
-
on_started=on_started,
|
272
|
-
on_ready=on_ready,
|
273
|
-
on_retry=on_retry,
|
274
|
-
on_failed=on_failed,
|
275
|
-
checkers=checkers,
|
276
|
-
checking_interval=checking_interval,
|
277
|
-
retry=retry,
|
278
|
-
retry_interval=retry_interval,
|
279
|
-
max_output_line=max_output_line,
|
280
|
-
max_error_line=max_error_line,
|
281
|
-
preexec_fn=preexec_fn,
|
282
|
-
should_execute=should_execute,
|
283
|
-
return_upstream_result=return_upstream_result,
|
284
|
-
should_print_cmd_result=should_print_cmd_result,
|
285
|
-
should_show_cmd=should_show_cmd,
|
286
|
-
should_show_working_directory=should_show_working_directory,
|
287
|
-
)
|
288
|
-
for remote_config in self._remote_configs
|
289
|
-
]
|
290
|
-
BaseTask.__init__(
|
291
|
-
self,
|
292
|
-
name=name,
|
293
|
-
icon=icon,
|
294
|
-
color=color,
|
295
|
-
group=group,
|
296
|
-
description=description,
|
297
|
-
upstreams=self._sub_tasks,
|
298
|
-
retry=0,
|
299
|
-
return_upstream_result=True,
|
300
|
-
)
|
301
|
-
|
302
|
-
def insert_input(self, *inputs: AnyInput):
|
303
|
-
super().insert_input(*inputs)
|
304
|
-
for subtask in self._sub_tasks:
|
305
|
-
subtask.insert_input(*inputs)
|
306
|
-
|
307
|
-
def add_input(self, *inputs: AnyInput):
|
308
|
-
super().add_input(*inputs)
|
309
|
-
for subtask in self._sub_tasks:
|
310
|
-
subtask.add_input(*inputs)
|
311
|
-
|
312
|
-
def insert_env(self, *envs: Env):
|
313
|
-
super().insert_env(*envs)
|
314
|
-
for subtask in self._sub_tasks:
|
315
|
-
subtask.insert_env(*envs)
|
316
|
-
|
317
|
-
def add_env(self, *envs: Env):
|
318
|
-
super().add_env(*envs)
|
319
|
-
for subtask in self._sub_tasks:
|
320
|
-
subtask.add_env(*envs)
|
321
|
-
|
322
|
-
def insert_env_file(self, *env_files: EnvFile):
|
323
|
-
super().insert_env_file(*env_files)
|
324
|
-
for subtask in self._sub_tasks:
|
325
|
-
subtask.insert_env_file(*env_files)
|
326
|
-
|
327
|
-
def add_env_file(self, *env_files: Env):
|
328
|
-
super().add_env_file(*env_files)
|
329
|
-
for subtask in self._sub_tasks:
|
330
|
-
subtask.add_env_file(*env_files)
|
331
|
-
|
332
|
-
def insert_upstream(self, *upstreams: AnyTask):
|
333
|
-
for subtask in self._sub_tasks:
|
334
|
-
subtask.insert_upstream(*upstreams)
|
335
|
-
|
336
|
-
def add_upstream(self, *upstreams: AnyTask):
|
337
|
-
for subtask in self._sub_tasks:
|
338
|
-
subtask.add_upstream(*upstreams)
|
339
|
-
|
340
|
-
def insert_fallback(self, *fallbacks: AnyTask):
|
341
|
-
for subtask in self._sub_tasks:
|
342
|
-
subtask.insert_fallbacks(*fallbacks)
|
343
|
-
|
344
|
-
def add_fallback(self, *fallbacks: AnyTask):
|
345
|
-
for subtask in self._sub_tasks:
|
346
|
-
subtask.add_fallback(*fallbacks)
|
347
|
-
|
348
|
-
def insert_checker(self, *checkers: AnyTask):
|
349
|
-
for subtask in self._sub_tasks:
|
350
|
-
subtask.insert_checkers(*checkers)
|
351
|
-
|
352
|
-
def add_checker(self, *checkers: AnyTask):
|
353
|
-
for subtask in self._sub_tasks:
|
354
|
-
subtask.add_checker(*checkers)
|
File without changes
|
File without changes
|
File without changes
|