コメント |
|
(0002410)
|
kaneko
|
2007-03-30 00:15
|
|
> ri コマンドを実行すると次のようにエラーになります。
>
> $ ri
> /usr/bin/ri:43: command not found: pager
/usr/lib/ruby/1.8/rdoc/ri/ri_display.rb の 211 行目以降に
以下の記載があります。
def setup_pager
unless @options.use_stdout
for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
return IO.popen(pager, "w") rescue nil
end
@options.use_stdout = true
nil
end
end
環境変数 PAGER が設定されていないと、最初に
IO.popen("pager", "w")
が実行され、コマンド pager が存在しないために上記のエラーとなります。
解決方法としては、以下の 3 つがあると思います。
(1) /usr/lib/ruby/1.8/rdoc/ri/ri_display.rb に以下のパッチを当てて、
pager を検索対象から除外する。
--- ri_display.rb.new 2007-03-30 00:10:10.000000000 +0900
+++ ri_display.rb.old 2007-03-30 00:09:37.000000000 +0900
@@ -210,7 +210,7 @@
def setup_pager
unless @options.use_stdout
- for pager in [ ENV['PAGER'], "less", "more" ].compact.uniq
+ for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
return IO.popen(pager, "w") rescue nil
end
@options.use_stdout = true
(2) 環境変数 PAGER に適切なコマンド (less とか) を設定する。
$ export PAGER=less
.bash_profile に設定してもいいでしょう。
(3) /usr/bin/pager として /usr/bin/less のシンボリックリンクを作成する。
# ln -s /usr/bin/less /usr/bin/pager |
|
|
(0002411)
|
kaneko
|
2007-03-30 00:17
|
|
> (1) /usr/lib/ruby/1.8/rdoc/ri/ri_display.rb に以下のパッチを当てて、
> pager を検索対象から除外する。
すみません、パッチの向きが逆でした。
正しいパッチは以下の通りです。
--- ri_display.rb.old 2007-03-30 00:09:37.000000000 +0900
+++ ri_display.rb.new 2007-03-30 00:10:10.000000000 +0900
@@ -210,7 +210,7 @@
def setup_pager
unless @options.use_stdout
- for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
+ for pager in [ ENV['PAGER'], "less", "more" ].compact.uniq
return IO.popen(pager, "w") rescue nil
end
@options.use_stdout = true |
|
|
|
> (3) /usr/bin/pager として /usr/bin/less のシンボリックリンクを作成する。
less util-linux(more) lv w3m など他のパッケージの修正が必要になりますが
update-alternatives を使って less などを
/usr/bin/pager にしておくといいのかもしれません。
less などが Provides:pager となっていれば
Requires:pager で利用できるし
apt-cache search pager で見つかるようにもなります。 |
|
|
|
> (1) /usr/lib/ruby/1.8/rdoc/ri/ri_display.rb に以下のパッチを当てて、
> pager を検索対象から除外する。
> --- ri_display.rb.old 2007-03-30 00:09:37.000000000 +0900
> +++ ri_display.rb.new 2007-03-30 00:10:10.000000000 +0900
> - for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
> + for pager in [ ENV['PAGER'], "less", "more" ].compact.uniq
rdoc の rpm -q --changelog を見たら
1.8.1-0vl2 で
- added ruby-1.8.1-ri-pager.patch:
- changed pager search order: ENV['PAGER'], pager, ...
となっています。
現在は version が上がって Patch900: ruby-1.8.5-ri_pager.patch となっていて
--- ruby-1.8.5.orig/lib/rdoc/ri/ri_display.rb 2006-06-27 05:44:14.000000000 +0900
+++ ruby-1.8.5/lib/rdoc/ri/ri_display.rb 2006-09-19 15:37:10.000000000 +0900
- for pager in [ ENV['PAGER'], "less", "more", 'pager' ].compact.uniq
+ for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
となってます。
(1) の提案と逆のことをしている patch のようです。
この patch が作られた経緯は知りませんが、今でも必要なものなのでしょうか? |
|
|
(0002414)
|
kaneko
|
2007-03-31 09:24
|
|
対象バージョンに4.1とSeedを追加しました。
> (1) の提案と逆のことをしている patch のようです。
> この patch が作られた経緯は知りませんが、今でも必要なものなのでしょうか?
情報ありがとうございます。
このパッチが必要かどうかはともかくとして、
pager というコマンドが update-alternatives で提供されるなら、
検索する順序としては妥当ではないかと思います。
update-alternatives の適用について開発者MLでも議論をお願いしていますが、
BTSのコメントも逐次開発者MLへ流れますので、
引き続き情報提供などお願いします。
また、
> less util-linux(more) lv w3m
以外の pager 候補がありましたら、ご提案ください。 |
|
|
|
> pager というコマンドが update-alternatives で提供されるなら、
> 検索する順序としては妥当ではないかと思います。
update-alternatives 関連は Seed でしかできないように思います。
4.x だと Plus ではないパッケージは Eratta での更新だけですよね?
4.2 のリリース時なら可能なのかな?
> for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
> return IO.popen(pager, "w") rescue nil
> end
(ruby はちょっとネットで調べてみただけですが)
最初の PAGER だけは ENV[] で処理されるので、未定義なら nil になって
.compact で捨てられます。
次の "pager" は .compact では捨てられずに残るので
return IO.popen(pager, "w") rescue nil に渡されます。
ここが pager ではなく less や more なら 4.x の環境でもコマンドが実行できて
PAGER が未定義でもエラーにならないと思います。
less や util-linux(more) のパッケージは
kernel -> initscripts -> console-tools -> gzip -> less
kernel -> initscripts -> util-linux
といったふうに依存関係が kernel にまでつながっていて
通常はアンインストールできないパッケージなので
command not found ということにはなりません。
消極的な対応かもしれませんが、
Patch を外すととりあえず less で動作するようになります。
/////
積極的な対応ということであれば
pager を提供するしないという話ではなくて、
pager が使えなくてもエラーで終了しないようになおす必要があると思います。
現状は、順番に試して使えるものを見つけるというのではなく
最初の一つだけを利用するようです。
変数 PAGER が定義されていればそれだけで終了して
次の候補になっている pager less more などを利用しません。
$ PAGER="hoge" ri
/usr/bin/ri:43: command not found: hoge
略
for 文のところを
実行できるコマンドかどうかチェックする
実行できないのであれば次の候補にうつる
という処理にすればいいように思います。
for pager in [ ENV['PAGER'], "pager", "less", "more" ].compact.uniq
if test(?X,pager) then
return IO.popen(pager, "w") rescue nil
end
end
といったような感じでしょうか?
とりあえず、test(?X, ) を使うとなると
コマンドを 絶対PATH に直すというステップも必要なようです。
他にスマートなやり方があるのかもしれません。
rubyに詳しくないので、あとはメンテナーさんや詳しい方にお願いします。 |
|
|
(0002416)
|
kaneko
|
2007-04-03 16:14
|
|
アーキテクチャに依存しない問題ですので、arch に x86_64 と ppc を
追加しました。
> > pager というコマンドが update-alternatives で提供されるなら、
> > 検索する順序としては妥当ではないかと思います。
>
> update-alternatives 関連は Seed でしかできないように思います。
Seedにおける対応は(パッチの変更、update-alternativesでの対応、
その他?)開発者MLで検討中ですのでしばらくお待ちください。
# 先にも書きましたが、引き続き情報提供は歓迎します。
> 4.x だと Plus ではないパッケージは Eratta での更新だけですよね?
> 4.2 のリリース時なら可能なのかな?
これは個人的な意見ですが、4.1 での対応は
パッケージは修正しない
回避方法として環境変数PAGERを設定する
ということでひとまず十分ではないかと思います。
パッケージ修正でしか対応できないという種類の問題ではないので…。
> for 文のところを
> 実行できるコマンドかどうかチェックする
> 実行できないのであれば次の候補にうつる
> という処理にすればいいように思います。
ご提案ありがとうございます。
この方法も選択肢に含めて、開発者MLで検討させてください。 |
|
|
(0002417)
|
kaneko
|
2007-04-11 22:05
|
|
Seed ML での検討の結果、対応は以下のとおりとします。
・4.1 ではパッケージ側での対応はしません。
ユーザの環境変数 PAGER に適切なページャのコマンドを設定してください。
~/.bash_profile に
export PAGER=less
などと設定すると、ri がきちんと動作するようになります。
・Seed では、update-alternatives を用いて /usr/bin/pager に
/usr/bin/less
/usr/bin/more
/usr/bin/lv
/usr/bin/w3m
という優先度順に設定されるようにしました。つまり Seed では、
(1) 環境変数 PAGER が設定されていれば、それが優先
(2) 設定されていなければ、システムデフォルトの pager として上記の優先度順でコマンドが割り当てられる。
となります。
関連パッケージに less util-linux lv w3m を追加、
担当者を kaneko に、
状態を確認待ちに変更します。 |
|
|
|
> ・Seed では、update-alternatives を用いて /usr/bin/pager に
> 関連パッケージに less util-linux lv w3m を追加、
Requires(post,preun): alternatives
が必要です。
あと
Provides: pager
があったほうがいいと思います。
%files セクションに %{_bindir}/pager は含まれないので
Provides: pager %{_bindir}/pager
のほうがいいと思うのですが
update-alternatives で提供されるコマンドを Provides: に入れるかどうか
指針が必要かもしれません。 |
|
|
(0002419)
|
kaneko
|
2007-04-13 01:40
|
|
Provides: pager
Requires(post,preun): alternatives
を追加して less, lv, util-linux, w3m の各パッケージを VineSeed に put しました。
> %files セクションに %{_bindir}/pager は含まれないので
> Provides: pager %{_bindir}/pager
> のほうがいいと思うのですが
ri の不具合対応として pager 対応だけそこまで手厚くするのは、
他のパッケージと比較するとやりすぎだと思いますので、
これは対応しません。
強いニーズがあるなら、他の Provides パッケージも含めて、
要望として別途検討すべきだと思います。 |
|
|
|
一通りの対応が行われたので、これで完了にします。
> > %files セクションに %{_bindir}/pager は含まれないので
> > Provides: pager %{_bindir}/pager
> > のほうがいいと思うのですが
>
> ri の不具合対応として pager 対応だけそこまで手厚くするのは、
> 他のパッケージと比較するとやりすぎだと思いますので、
> これは対応しません。
>
> 強いニーズがあるなら、他の Provides パッケージも含めて、
> 要望として別途検討すべきだと思います。
これについては特にどなたからも要望が上げられて
いませんし、現状の他のパッケージと見比べてみても
Provides を付けるのはちょっと例外的なようですので、
これ以上の対応は行わなくて良いと思います。
ハラダ |
|