rcmdnk's blog

A Little History of Poetry (Little Histories)

Pythonの環境管理ツールのPoetryをHomebrewで入れてるものがあって、それをアップデートしたら補完用のファイルを読み込む際にエラーが出るようになってました。

poetryのbash_completionでのエラー

Homebrewでpoetryをインストールすると$(brew –prefix)/etc/bash_completion.d/poetryというファイルがインストールされ、 別途[email protected]とかをインストールしているか$(brew –prefix)/etc/bash_completion.d以下を.bashrc内などで読むようにしているとこのファイルが読み込まれます。

このファイルが

bash: .../etc/bash_completion.d/poetry: line 40: syntax error near unexpected token `clear'
bash: .../etc/bash_completion.d/poetry: line 40: `            (cache clear)'

といった感じのエラーを出すようになりました。

これはpoetry-1.2.0から(現在の1.2.1も)起こっている模様。

エラーの原因

エラーの原因は分かっていて、直接的には補完用スクリプトの中で、case文を使ってるところで

poetry
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
        case "$com" in

            (about)
            opts="${opts} "
            ;;

            (add)
            opts="${opts} --allow-prereleases --dev --dry-run --editable --extras --group --lock --optional --platform --python --source"
            ;;

            (build)
            opts="${opts} --format"
            ;;

            (cache clear)
            opts="${opts} --all"
            ;;

            (cache list)
            opts="${opts} "
            ;;
...

みたいな感じでcache clearなど、複数の単語に分かれてしまっている文字列を使ってしまっているところです。

ここでは("cache clear")のようにクォートで囲ってあげないといけません。

エラーを生み出したところ

Poetryはpython-poetry/cleoというツールを使って 組み立てられているようでこれが問題の原因のようです。(cleoもpoetryの開発者たちが作っているもの。)

poetry.bash-completion has multiple syntax errors · Issue #4572 · python-poetry/poetry

で、この問題自体はcleo側では解決した模様。

fix(completions): add quoting of command names by Secrus · Pull Request #247 · python-poetry/cleo

ただし、まだPoetryのリリースには含まれておらず、現状の1.2.1では問題が残っています。

Homebrew側での対応

Homebrew側でこの問題のあるバージョンを一旦もとに戻してほしい、というPRが出ましたが却下されました。

Revert “poetry 1.2.0” by ghyde · Pull Request #109662 · Homebrew/homebrew-core

前のバージョンに戻してもCIを通らないということで、そもそも以前は通っていたのか、という問がありますが、 それでもなぜ戻しちゃ駄目なのかわからないです。

開発者の人がもうfixしたから、と言ってますが、そこから1ヶ月位経っている状態。 問題が起こっているなら一旦戻しておいて治ったのが出来たら更新すれば良さそうなものですが。

現状での対応

シェルを立ち上げる時に出るだけで、コマンドラインを使う限りはそこを無視さえすれば特に問題なく使えます。

エラーを消したいなら 自分でbash_completion.dの中身を読んでる場合はpoetryを避けるようにすれば良いですが、 bash-completionとかを使って読み込んでいる場合はpoetryだけ除くのは無理なので一旦 $(brew –prefix)/etc/profile.d/bash_completion.shを読まないようにするとかして他の補完も諦める必要があります。

スクリプトの中とかで.bashrcとか読んでて-eオプションとか使ってると上のような対処が必要かも。 そもそもスクリプトの中で.bashrcとかあまり読まないようにしたほうが良いですが。

多分すぐに1.2.2が出て治ると思いますが、それまではそんな感じで対処を。

Sponsored Links
Sponsored Links

« GitHub Actions中でpushする際にgithub-actions[bot]をユーザーとして使う coc.nvimのサポートプラグインを管理する »

}