Skip to content

Commit

Permalink
main. util: fix problems of readlink etc. found by test in macOS
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Jul 24, 2022
1 parent 5b63459 commit fa955c1
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 7 deletions.
25 changes: 20 additions & 5 deletions ble.pp
Expand Up @@ -1126,15 +1126,23 @@ function ble/util/readlink/.readlink {
function ble/util/readlink/.resolve-physical-directory {
[[ $path == */?* ]] || return 0
local PWD=$PWD OLDPWD=$OLDPWD CDPATH=
builtin cd -L . &&
local pwd=$PWD &&
if builtin cd -L .; then
local pwd=$PWD
builtin cd -P "${path%/*}/" &&
path=${PWD%/}/${path##*/}
builtin cd -L "$pwd"
path=${PWD%/}/${path##*/}

# Note #D1849: 現在ディレクトリが他者により改名されている場合や PWD がユー
# ザーに書き換えられている場合にも元のディレクトリに戻る為、cd -L . した
# 後のパスに cd する。但し pwd の結果はこの関数の呼び出し前と変わってしま
# う (が実際にはこの方が良いだろう)。PWD は local にして元の値に戻すので
# 変わらない。
builtin cd "$pwd"
fi
return 0
}
function ble/util/readlink/.resolve-loop {
local path=$ret
while [[ $path == ?*/ ]]; do path=${path%/}; done
builtin eval -- "$_ble_util_readlink_visited_init"
while [[ -h $path ]]; do
local link
Expand All @@ -1145,7 +1153,7 @@ function ble/util/readlink/.resolve-loop {
else
# 相対パス ../ は物理ディレクトリ構造に従って遡る。
ble/util/readlink/.resolve-physical-directory
path=${path%/}/$link
path=${path%/*}/$link
fi
while [[ $path == ?*/ ]]; do path=${path%/}; done
done
Expand Down Expand Up @@ -2146,6 +2154,13 @@ function ble/base/sub:test {
ble/test/log "BLE_VERSION: $BLE_VERSION"
fi
ble/test/log "BASH_VERSION: $BASH_VERSION"
local line='locale:' var ret
for var in LANG "${!LC_@}"; do
ble/string#quote-word "${!var}"
line="$line $var=$ret"
done
ble/test/log "$line"

local section
for section; do
local file=$_ble_base/lib/test-$section.sh
Expand Down
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Expand Up @@ -275,6 +275,7 @@
- decode (`ble-bind`): fix the printed definition of `-c`/`-x` bindings `#D1821` 94de078
- command-help (`.read-man`): add missing `ble/util/assign/.rmtmp` `#D1840` 937a164
- complete: fix wrong `COMP_POINT` with `progcomp_alias` `#D1841` 369f7c0
- main. util: fix problems of readlink etc. found by test in macOS (reported by aiotter) `#D1849` XXXXXXX

## Documentation

Expand Down
2 changes: 1 addition & 1 deletion lib/core-test.sh
Expand Up @@ -16,7 +16,7 @@ function ble/test/chdir {
_ble_test_dir=$dir/$BASHPID.d
[[ -d $_ble_test_dir ]] ||
ble/bin/mkdir -p "$_ble_test_dir"
cd "$_ble_test_dir"
cd -L "$_ble_test_dir"
}
function ble/test/rmdir {
[[ -d $_ble_test_dir ]] &&
Expand Down
2 changes: 1 addition & 1 deletion lib/test-util.sh
Expand Up @@ -1434,7 +1434,7 @@ ble/test ble/util/is-running-in-subshell exit=1
(
ble/test/chdir
function getpid {
sh -c 'echo -n $PPID' >| a.txt
sh -c 'printf %s $PPID' >| a.txt
ble/util/readfile ppid a.txt
}

Expand Down
79 changes: 79 additions & 0 deletions note.txt
Expand Up @@ -6528,6 +6528,85 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2022-07-24

* main, util: make check が nix-build @ macOS で失敗する (reported by aiotter) [#D1849]
https://github.com/NixOS/nixpkgs/pull/181963#issuecomment-1193125126

* fixed: 他に sh -c 'echo -n $PID' において echo が -n を特別に解釈していな
い事によってそのまま出力してしまっている問題があった。これは元々自分の環
境で動かす事を想定していた為に適当にしていた事が悪い。修正した。

* done: readlink が期待通りに動作していない。nix-build の外でも発生している。

うーん。これは readlink が一体どの実装を選択しているのかに依存する。

* nix-build @ macOS で一体何が選ばれるのか確認したい。と思って実装を確認
したがこれは実際にどう動作するか確認するまでもなく .resolve-loop 一択で
ある。なので、.resolve-loop のテストを実行すれば良い。

* 先ずそもそも $PWD 自体が symlink だった時にどの様に振る舞うべきなのか?
うーん。これはちゃんと考えていなかった。

readlink -f の振る舞いを見ると現在のディレクトリがリンクだった時に、そ
れについても全て解決している。ble/util/readlink の目的を考えると其処ま
でする必要はないが、実装毎の差異を吸収する為には其処までしなければなら
ないのだろうか。

と思ったがこれはテストを実行する時に cd -L . をしておけば良いのでは。
→というか ble/test/chdir で移動する時に cd -L "..." で移動すれば良い。

改めて実装を確認してみたが、そもそも実装自体が怪しい気がしてきた。確かめる。

実際に代替実装の動作を確認してみた所 Linux の上でも動いていない。動作を確認する。

* fixed: resolve-physical-directory の実装が怪しい。取り敢えず設定されていないか
もしれない pwd を参照しているのはおかしい。修正は必要だがどの様に修正し
て良いのか分からない。

* done: check: mshex の実装を確認する → mshex の実装は古い実装しかなかっ
た。コメントにある taken from はもう古いので削除するべきなのかもしれな
い。念の為再度 grep -r で検索してみたがやはり readlink の実装は単純な物
しかない。

* done: check: #D1720 以前の readlink の改良の時の議論を参照する。これは
#D1720 だった。うーん。しかしここには大した説明は書かれていない。元の参
考にした qiita の記事とその repository も見てみたが、其処にも余りコメン
ト等は書かれていないし、其処から大きく書き換えてしまっているので参考に
はならない様だ。結局改めて動作について確認する必要がある。

恐らく元の resolve-physical-directory の実装で元のディレクトリ名ではな
くて cd -L . した後のディレクトリ名に移動しているのは、現在ディレクトリ
が改名された場合等にも正しいディレクトリに戻る為である。実験してみる事
にする。

Ref: D1849-cd-physdir.sh

分かった事。

1 pwd の結果は最後に cd を実行した時のそのディレクトリのパスになってい
る。PWD を書き換えたとしても変化しない。また現在ディレクトリが他者に
よって改名されたとしても変化しない。新しく現在ディレクトリの位置を取
得し直すという訳では無い様だ。

2 PWD は cd した時のディレクトリのパスに設定されるが当然後から自由に書
き換える事ができる。

また、当然の事ながら PWD の値が信用できるのかという事もある。ユーザーが
勝手に変な値に設定しているかもしれない。pwd の結果を読み取るという手も
あるがファイルに一旦書き込んでそれを読み取るというコストがある。なので、
cd -L . した後に PWD を読み取るというのは確かに一つの手である。

実装を修正して Note を残しておく事にした。

* 先ず初めに nix-build environment では locale が全くないという疑惑。元々の
locale が utf-8 でない上に、そもそも en_US.utf8 を設定するのですら失敗し
ている。どの locale が利用可能かについて調べてもらう必要がある。

これはどうしたら良いのか分からない。取り敢えず locale がどうなっているの
かについて尋ねるのが良い。特に、en_US.utf8 がそもそもないという所を見ると
locale を正しく設定してもらう所から始まる様な気がする。

2022-07-21

* 2022-07-06 syntax: "function word1 word2 word3 word4()" [#D1848]
Expand Down

0 comments on commit fa955c1

Please sign in to comment.