|
40 | 40 | ("再ビルド (rebuild --no-cache)", "rebuild"), |
41 | 41 | ] |
42 | 42 |
|
| 43 | +# 実行後にサブメニューへ留まらずトップ一覧へ戻る操作。up/down はコンテナの |
| 44 | +# 起動状態が大きく変わるため、最新状態の一覧を見せる方が自然 (それ以外の |
| 45 | +# login/ps/logs/scale/build/rebuild は連続操作できるようサブメニューに留まる)。 |
| 46 | +_BACK_TO_TOP_OPS = frozenset({"up", "down"}) |
| 47 | + |
43 | 48 | # 中止系番兵は flow と同一オブジェクトを再公開する (呼び出し側・テストの契約)。 |
44 | 49 | _ARG_CANCEL = flow.ARG_CANCEL |
45 | 50 | _ABORT = flow.ABORT |
@@ -119,12 +124,16 @@ def _op_build(devbase_root: Path, name: str): |
119 | 124 |
|
120 | 125 |
|
121 | 126 | _OP_HANDLERS = { |
122 | | - # up/down/rebuild/ps は引数なしで即実行。up/rebuild は scale 属性を参照する |
123 | | - # (常に None。他コマンドは無視する)。down はデータを失わない (volume 保持・ |
124 | | - # up で復旧可能) ためメニュー選択を意思表示とみなし、確認プロンプトを出さない。 |
| 127 | + # up/down/ps は引数なしで即実行。up は scale 属性を参照する (常に None。他 |
| 128 | + # コマンドは無視する)。down はデータを失わない (volume 保持・up で復旧可能) |
| 129 | + # ためメニュー選択を意思表示とみなし、確認プロンプトを出さない。 |
125 | 130 | # ps の --all は CLI 既定 (False) に揃える。 |
126 | 131 | "up": lambda root, name: dispatch_lifecycle("up", name, scale=None), |
127 | | - "rebuild": lambda root, name: dispatch_lifecycle("rebuild", name, scale=None), |
| 132 | + # 「再ビルド (rebuild --no-cache)」はラベル通り base/project とも無条件 no-cache |
| 133 | + # で再ビルドする。CLI の `rebuild` は期限判定 (= build --expires=7) でキャッシュ |
| 134 | + # を使い、新しいイメージはスキップするため --no-cache を満たさない。no-cache の |
| 135 | + # 正規経路は `build --no-cache` なので build に no_cache=True を渡して委譲する。 |
| 136 | + "rebuild": lambda root, name: dispatch_lifecycle("build", name, no_cache=True), |
128 | 137 | "down": lambda root, name: dispatch_lifecycle("down", name), |
129 | 138 | "login": _op_login, |
130 | 139 | "ps": lambda root, name: dispatch_lifecycle("ps", name, all=False), |
@@ -152,27 +161,34 @@ def _run_operation(devbase_root: Path, name: str, op: str): |
152 | 161 | def _operation_menu(devbase_root: Path, name: str): |
153 | 162 | """running 行の操作サブメニューを回す。 |
154 | 163 |
|
155 | | - 戻り値 (``flow.menu_loop`` のプロトコル): dispatch の rc (``int``) / |
156 | | - ``menu.MENU_BACK`` (Esc・← で一覧へ戻る) / ``None`` (Ctrl-C 全体中止)。 |
157 | | - 引数収集を中止 (``_ARG_CANCEL``) した場合はサブメニューを再表示する。 |
| 164 | + 戻り値 (``flow.menu_loop`` のプロトコル): ``menu.MENU_BACK`` (Esc・← で一覧へ |
| 165 | + 戻る) / ``None`` (Ctrl-C 全体中止)。多くの操作は実行後もトップ一覧へ戻らず、 |
| 166 | + 出力を読めるよう一時停止してから**同じサブメニューを再表示する** (留まる)。 |
| 167 | + ただし up/down (``_BACK_TO_TOP_OPS``) は状態が大きく変わるため実行後はトップ |
| 168 | + 一覧へ戻り最新状態を再表示する。引数収集を中止 (``_ARG_CANCEL``) した場合も |
| 169 | + 同じサブメニューを再表示する。 |
158 | 170 | """ |
159 | 171 | return flow.menu_loop( |
160 | 172 | lambda: _select_action(name), |
161 | | - lambda op: _run_operation(devbase_root, name, op)) |
| 173 | + lambda op: _run_operation(devbase_root, name, op), |
| 174 | + back_after=lambda op: op in _BACK_TO_TOP_OPS) |
162 | 175 |
|
163 | 176 |
|
164 | 177 | def handle_row(devbase_root: Path, row: dict): |
165 | 178 | """一覧で選択された 1 プロジェクト行を処理する (トップ画面から呼ばれる)。 |
166 | 179 |
|
167 | 180 | 戻り値プロトコル (トップループが ``is`` 同一性で判定する): |
168 | | - - **操作を実行した場合**: ``dispatch_lifecycle`` の rc (``int``) を返す。 |
169 | | - 「実行したので一覧へ戻る、rc は呼び出し側が記憶」の意味。これにより |
170 | | - project 操作の失敗が ``devbase list`` の終了コードへ伝搬する。 |
171 | | - - ``menu.MENU_BACK``: 操作サブメニューで Esc/← (操作なしで一覧へ)。 |
| 181 | + - ``menu.MENU_BACK``: 操作サブメニューで Esc/← (一覧へ戻る)。running 行は操作を |
| 182 | + 実行しても (出力確認の一時停止後) サブメニューに留まり、Esc/← で初めて一覧へ |
| 183 | + 戻るため、この値を返す。 |
| 184 | + - **直接 up を実行した場合** (stopped / unknown 行): ``dispatch_lifecycle`` の |
| 185 | + rc (``int``) を返す。トップループが rc を記憶し ``devbase list`` の終了コードへ |
| 186 | + 伝搬する。 |
172 | 187 | - ``None``: サブメニューで Ctrl-C による全体中止。 |
173 | 188 |
|
174 | | - 選択行が running 中なら ``_operation_menu`` で全操作を選ばせ、それ以外 |
175 | | - (stopped / unknown) は従来どおり直接 ``project up`` を起動する (PR1 非回帰)。 |
| 189 | + 選択行が running 中なら ``_operation_menu`` で全操作を選ばせ (実行後もサブ |
| 190 | + メニューに留まる)、それ以外 (stopped / unknown) は従来どおり直接 ``project up`` |
| 191 | + を起動して一覧へ戻る (PR1 非回帰)。 |
176 | 192 | """ |
177 | 193 | name = row["name"] |
178 | 194 | if str(row.get("status", "")).startswith("running"): |
|
0 commit comments