Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -90,6 +90,14 @@
`. <DEVBASE_ROOT>/bin/rc` に書き換えてください。

### Fixed
- **tmux 追随フックのサンプル(`docs/user/environment-variables.md`)が孤児ソケットを
検出できない**問題を修正しました。`test -S` はファイルの種別しか見ないため、VS Code の
異常終了で残った listen していないソケットも「生きている」と判定し、フックが
`tmux show-environment` からの拾い直しを早期 return でスキップしていました。
結果として `devbase up --open` が毎回「手元で実行するコマンドの提示」へ degrade します。
`nc -U -w 1 <sock> </dev/null` による接続確認を後段に足しました(macOS の `nc` は
`-z` を付けると Unix ドメインソケットで誤判定するため付けません)。`-S` を前段に
残しているので、ソケットファイルが無い一般ケースでは従来どおり追加のプロセスは起きません。
- **VS Code の異常終了後に残った IPC ソケットで `devbase up --open` が
`ECONNREFUSED` で失敗する問題を修正**しました。`VSCODE_IPC_HOOK_CLI` が指す
ソケットの死に方には「ファイルごと消えている」ほかに「ファイルは残っているが
Expand Down
14 changes: 8 additions & 6 deletions docs/user/environment-variables.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -203,7 +203,7 @@ devbase は**実際にソケットへ接続できるかを確認**してから V
| ファイルごと消えている | VS Code のウィンドウを正常に閉じた(VS Code が削除する) | 無し |
| ファイルは残っているが listen していない | VS Code のクラッシュ・強制終了・OS 再起動で後始末されなかった | **有り** |

後者は `$TMPDIR` に孤児ソケットとして溜まり、接続しようとすると `ECONNREFUSED` になります。`ls` では生きているものと見分けが付きません
後者は `$TMPDIR` に孤児ソケットとして溜まり、接続しようとすると `ECONNREFUSED` になります。`ls` でも `test -S` でも生きているものと見分けが付かないため、**生死の判定には実際の接続が要ります**

自動で開く状態に戻すには、tmux 側に環境変数を追随させます。`~/.tmux.conf` に以下を追記してください。

Expand All@@ -216,11 +216,13 @@ set -ga update-environment " VSCODE_IPC_HOOK_CLI VSCODE_GIT_IPC_HANDLE VSCODE_GI
```bash
if [ -n "${TMUX:-}" ]; then
_vscode_sync_env() {
# ソケットが生きている間は何もしない(サブプロセスを起動しない)。
# 注意: -S はファイルの種別しか見ないため、listen していない孤児ソケットは
# 「生きている」と判定されてしまう。この guard に引っかかって追随しない場合は
# 行ごと削除して、毎回 tmux show-environment で同期する。
[ -n "${VSCODE_IPC_HOOK_CLI:-}" ] && [ -S "${VSCODE_IPC_HOOK_CLI}" ] && return 0
# ソケットが生きている間は拾い直さない。生存確認は 2 段で行う。
# -S はファイルの種別しか見ないため、listen していない孤児ソケットも
# 通過してしまう(上表の 2 つめ)。実際に接続できるかまで確認する。
# -S を前段に置くことで、ファイルが無い一般ケースでは nc を起動しない。
# macOS の nc は -z を付けると Unix ソケットで誤判定するので付けないこと。
[ -n "${VSCODE_IPC_HOOK_CLI:-}" ] && [ -S "${VSCODE_IPC_HOOK_CLI}" ] \
&& nc -U -w 1 "${VSCODE_IPC_HOOK_CLI}" </dev/null >/dev/null 2>&1 && return 0
local line
while IFS= read -r line; do
case "$line" in
Expand Down
Loading