Skip to content

Commit

Permalink
edit: fix a bug that the shell hangs with "source ble.sh --noattach &…
Browse files Browse the repository at this point in the history
…& ble-attach"
  • Loading branch information
akinomyoga committed Jan 18, 2020
1 parent db8b0c2 commit 59c1ce4
Show file tree
Hide file tree
Showing 3 changed files with 173 additions and 34 deletions.
20 changes: 10 additions & 10 deletions ble.pp
Original file line number Diff line number Diff line change
Expand Up @@ -687,18 +687,17 @@ function ble-attach {
return
fi

[[ $_ble_attached ]] && return
_ble_attached=1

# when detach flag is present
if [[ $_ble_edit_detach_flag ]]; then
case $_ble_edit_detach_flag in
(exit) ;;
(exit) return 0 ;;
(*) _ble_edit_detach_flag= ;; # cancel "detach"
esac
return 0
fi

[[ $_ble_attached ]] && return
_ble_attached=1

# 特殊シェル設定を待避
builtin eval "$_ble_base_adjust_FUNCNEST"
ble/base/adjust-bash-options
Expand All @@ -723,7 +722,6 @@ function ble-attach {
ble-edit/detach
return 1
fi
_ble_edit_detach_flag= # do not detach or exit

ble/history:bash/reset # 27s for bash-3.0

Expand All @@ -739,13 +737,15 @@ function ble-detach {
return
fi

[[ $_ble_attached ]] || return
_ble_attached=
[[ $_ble_attached && ! $_ble_edit_detach_flag ]] || return

# Note: 実際の detach 処理は ble-edit/bind/.check-detach で実行される
_ble_edit_detach_flag=${1:-detach} # schedule detach
}
function ble-detach/impl {
[[ $_ble_attached ]] || return
_ble_attached=

ble-edit/detach
ble-decode/detach
READLINE_LINE='' READLINE_POINT=0
Expand All @@ -760,10 +760,10 @@ function ble-detach/message {

function ble/base/unload-for-reload {
if [[ $_ble_attached ]]; then
_ble_attached=
ble-detach/impl
ble/util/print "${_ble_term_setaf[12]}[ble: reload]$_ble_term_sgr0" 1>&2
_ble_edit_detach_flag=reload
[[ $_ble_edit_detach_flag ]] ||
_ble_edit_detach_flag=reload
fi
ble/base/unload
return 0
Expand Down
148 changes: 145 additions & 3 deletions memo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1338,8 +1338,6 @@ bash_tips
bash-it の場合には bash-it-update だとか bash-it::update だとかだと
格好が悪いので bash-it update という形の関数名になるというのは分かる。

* manual: 英語版

* main: --attach=prompt の問題は何だったか
ref #D0940

Expand Down Expand Up @@ -3505,9 +3503,153 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2020-01-18

* ble-reload の後に固まる (reported by dylankb) [#D1223]
https://github.com/akinomyoga/ble.sh/issues/35

[再現]

| 再現できない。色々の OS で試してみたが再現しない。
|
| うーん。或いは Bash 5.0.11 の問題である可能性はあるか?
| →確認してみたが Fedora で 5.0.11 でも再現しないし、
| また FreeBSD も確認してみた所元から 5.0.11 だった。
|
| 再現しないと思ったがもしかして。。。--noattach が駄目?
| あー。そうだった。うーん。#D1199 で直した筈なのだが。
| 確認してみると D1199 で直したのは単純に source ble.sh --noattach
| した時の話であって、source ble.sh --noattach && ble-attach
| したら固まった。全然直っていなかった。

$ source ble.sh --noattach && ble-attach で再現する

[状況]

| これを直す為にはどうしたら良いのか。
| #D1199 でどの様に直したのか確認する必要がある。
| 調べると #D1199 の commit がないと思ったら ble-0.3 の問題として
| ble-0.3 に修正が入っていた。と言っても対症療法的な物で、
| ble-reload に対してしか修正が入っていなかったのだった。
| 5bcea69 がその修正である。参考にならない。
|
| 参考にするべきはこれである #D1130 d35682a caa46c2
|
| うーん。分かった。
| _ble_edit_detach_flag に値が設定されている時、
| ble-attach は ble-detach (遅延) をキャンセルする事になるので、
| 何もせずに抜けてしまう。これによって attach しているのにしていない、
| という様な中途半端な状態になってしまっているのである。
| 然し、そもそも _ble_attached になっているのが行けないのでは?
| _ble_attached の設計を考え直すべきなのではないかという気がする。
|
| 今一度 _ble_edit_detach_flag と _ble_attached の意味について考える。
| _ble_attached は実際に attach されているかどうかにするべきである。
| そして、_ble_edit_detach_flag は複数の値を取りうる。
| それぞれの意味について確認する。
|
| _ble_edit_detach_flag=detach
| これは ble-detach を呼び出した時に設定される。
| もし epilogue でこれが設定されていればその時に detach を実行する。
| 或いは ble-attach でキャンセルする事も可能である。
|
| _ble_edit_detach_flag=reload これは reload 検知時に設定される。
| 特に reload 検知前に attach していた時にこれが発生する。
| その場で完全に detach してしまいその後で reload を設定するのである。
| % 後の振る舞いとしては自動的に再 attach する事を示唆する。
| % と思ったが本当だろうか。違う気がする。
| % source した時に --noattach 等を指定していた場合には、
| % やはり勝手に attach しないという事になるのであろう。
| 後の振る舞いとしては。現在の bind -x が終了する時に
| detach 状態であるのであればメッセージを表示する、という所だろうか。
|
| さて、この時に ble-detach が呼び出された場合にはどうなるのか?
| うーん。_ble_attach が設定されていれば ble-detach を実行する。
| もし _ble_attach が設定されていれば実行の必要はない。
|
| うーん。実はこれは detach と等価なのでは?
| と思ったが .prologue を呼び出しているという所が異なる。
| うーん。何だか分からないが色々複雑な状態を復元しなければならないので
| 呼び出す必要があるという事だろうか。
|
| 然し、source ble.sh を実行した時点で色々と状態を調整している。
| そして抜ける瞬間にそれを復元している。しかしながらその状態は
| 更にその外側で復元される?? 何だかよく分からない。
|
| 先ず記録されているのは実行環境であって、
| ble.sh環境は一意であると考えている。
|
| attach が発生する場合は以下の様になる。
|
| コマンド実行 source ble.sh attach epilogue
| [ble.sh] →[実行環境A]→[ble.sh] → [実行環境B] → [ble.sh] → [ble.sh?]
|
| attach が発生しない場合は以下の様になる。
| epilogue prologue
| [ble.sh] →[実行環境A]→[ble.sh] → [実行環境B] → [ble.sh] → [実行環境]
|
| もしここで prologue を呼び出していないとするとどうなるのだろうか?
| つまり代わりに detach と同じ処理をするとどうなるのかという事。
| うーん。PS1 等が消滅するという事は考えにくいし、何も問題がない気がする。
| そもそも PS1 が消滅していたのは何故だったか。
| 恐らく epilogue を重複して呼び出してしまったから?
| epilogue が重複すると ble.sh 環境を実行環境として記録する事になってしまう。
| 色々考えるとやはり prologue は必要がない気がする。
|
| やっぱり何か不思議だ。detach の時にはほんの少ししか復元をしていない。
| 何故問題が起こらないのだろうか? と思ったが分かった気がする。
| どのタイミングで detach を実行したかの違いなんだ。
| reload の時には先に detach してしまうので epilogue で状態が壊される。
| なので再び prologue を呼び出す必要がある。
| detach の時には epilogue の後に detach しているので、
| その時点でちゃんと状態が作られている。なので、簡単で良い。
|
| という事は .check-detach に入った時の _ble_attached の状態で場合分けすれば良い。

_ble_attached の意味を変更して実際に attach/detach しているかの状態を保持する事にした。
_ble_edit_detach_flag に関しては reload と detach を区別しない処理に変更した。
代わりに、_ble_edit_detach_flag が立っているのに既に detach されている状態と、
まだ detach していない状態で場合分けする本来の目的に適う実装方法である。

[確認]

取り敢えず修正して動かして振る舞いを確認する。チェックするのは、

ble-reload
ble-detach; ble-attach
source "$_ble_base/ble.sh" --noattach
source "$_ble_base/ble.sh" --prompt
source "$_ble_base/ble.sh" --noattach && ble-attach

一応問題なく動いている気がする。

x source "$_ble_base"/ble.sh --noattach してから ble-attach すると変だ。

普通に ble-detach してから ble-attach する時との違いは何だろうか。
やはり状態として変な状態になっている? ちゃんと復元しきれていない?
然し attach 直前は別に変な振る舞いは見せていなかった筈。

ble-attach する時に PS1 の restore に失敗している可能性?
うーん。何がおかしいのだろうか。

というか状態がおかしいというよりは [EOF] のマークが表示されているのが問題。
ble-attach した時にプロンプトをその場で描画してしまうかそうでないかの違いは何?

うーん。やっぱり attach 時に [EOF] が表示されるのは変である。
.prologue で何か変な物がしかけられたのが原因だろう。

分かった。ble-decode/PROLOGUE で
ble-edit/exec:gexec/restore-state を呼び出して、
ble-edit/exec:gexec/.epilogue が呼び出されている。
その時に EOL 補正が入ってしまっているのである。
対症療法的ではあるが _ble_edit_exec_inside_prologue= を設定する。

* 2019-02-09 manual: 英語版 [#D1222]
取り敢えず完成した。

2020-01-17

* Error `ble/builtin/trap: invalid signal specification "-".` [#D1221]
* Error `ble/builtin/trap: invalid signal specification "-".` (reported by dylankb) [#D1221]
https://github.com/akinomyoga/ble.sh/issues/33#issuecomment-575476866

| うーん。何故だろう。調べるとこのエラーメッセージを出力するのは、
Expand Down
39 changes: 18 additions & 21 deletions src/edit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4289,8 +4289,8 @@ function ble-edit/exec:gexec/process {
}
function ble-edit/exec:gexec/restore-state {
# 構文エラー等で epilogue/end が呼び出されなかった時の為 #D1170
[[ $_ble_edit_exec_inside_prologue ]] && ble-edit/exec:gexec/.epilogue 3>&2 &>/dev/null
[[ $_ble_edit_exec_inside_begin ]] && ble-edit/exec:gexec/.end restore
[[ $_ble_edit_exec_inside_prologue ]] && ble-edit/exec:gexec/.epilogue 3>&2 &>/dev/null
[[ $_ble_edit_exec_inside_begin ]] && ble-edit/exec:gexec/.end restore
}

# **** accept-line **** @edit.accept
Expand Down Expand Up @@ -7095,21 +7095,6 @@ function ble-edit/bind/.exit-TRAPRTMAX {
## @exit detach した場合に 0 を返します。それ以外の場合に 1 を返します。
##
function ble-edit/bind/.check-detach {
# Note: #D1130 reload の為に detach して attach しなかった場合
if [[ ! $_ble_attached && $_ble_edit_detach_flag == reload ]]; then
ble-detach/message \
"${_ble_term_setaf[12]}[ble: detached]$_ble_term_sgr0" \
"Please run \`stty sane' to recover the correct TTY state."

if ((_ble_bash>=40000)); then
READLINE_LINE='stty sane;' READLINE_POINT=10
printf %s "$READLINE_LINE"
fi

ble-edit/exec:"$bleopt_internal_exec_type"/.prologue
return 0
fi

if [[ ! -o emacs && ! -o vi ]]; then
# 実は set +o emacs などとした時点で eval の評価が中断されるので、これを検知することはできない。
# 従って、現状ではここに入ってくることはないようである。
Expand All @@ -7122,7 +7107,8 @@ function ble-edit/bind/.check-detach {
_ble_edit_detach_flag=
#ble/term/visible-bell ' Bye!! '

ble-detach/impl
local attached=$_ble_attached
[[ $attached ]] && ble-detach/impl

if [[ $type == exit ]]; then
# ※この部分は現在使われていない。
Expand All @@ -7145,9 +7131,20 @@ function ble-edit/bind/.check-detach {
fi
fi

ble/base/restore-bash-options
ble/base/restore-POSIXLY_CORRECT
builtin eval "$_ble_base_restore_FUNCNEST" # これ以降関数は呼び出せない
if [[ $attached ]]; then
# ここで ble-detach/impl した時は調整は最低限でOK
ble/base/restore-bash-options
ble/base/restore-POSIXLY_CORRECT
builtin eval "$_ble_base_restore_FUNCNEST" # これ以降関数は呼び出せない
else
# Note: 既に ble-detach/impl されていた時 (reload 時) は
# epilogue によって detach 後の状態が壊されているので
# 改めて prologue を呼び出す必要がある。
# #D1130 #D1199 #D1223
ble-edit/exec:"$bleopt_internal_exec_type"/.prologue
_ble_edit_exec_inside_prologue=
fi

return 0
else
# Note: ここに入った時 -o emacs か -o vi のどちらかが成立する。なぜなら、
Expand Down

0 comments on commit 59c1ce4

Please sign in to comment.