Vine Linux バグトラッキングシステム - Vine Linux
課題の詳細を表示
0000481Vine Linux1 バグ公開2007-02-17 11:312007-07-07 00:34
anonymous 
kaneko 
不明 
完了不明 
 
 
x86, x86_64, ppc
rdoc less util-linux lv w3m
0000481: ri で command not found: pager
ri コマンドを実行すると次のようにエラーになります。

 $ ri
 /usr/bin/ri:43: command not found: pager
 /usr/lib/ruby/1.8/rdoc/ri/ri_options.rb:127:in `write': Broken pipe (Errno::EPIPE)
        from /usr/lib/ruby/1.8/rdoc/ri/ri_options.rb:127:in `puts'
        from /usr/lib/ruby/1.8/rdoc/ri/ri_options.rb:127:in `usage'
        from /usr/lib/ruby/1.8/rdoc/ri/ri_display.rb:51:in `display_usage'
        from /usr/lib/ruby/1.8/rdoc/ri/ri_display.rb:201:in `page'
        from /usr/lib/ruby/1.8/rdoc/ri/ri_display.rb:50:in `display_usage'
        from /usr/lib/ruby/1.8/rdoc/ri/ri_driver.rb:129:in `process_args'
        from /usr/bin/ri:48

ri --no-pager で正しく表示されているようです。

インストールしたVine Linuxのバージョンは、4.0です。

ri は
  apt-get install rdoc
でインストールしています。

ハードウェア環境は、ThinkPad X31 です。
設定されていません。
課題の履歴
2007-02-17 11:31anonymous新規課題
2007-03-30 00:15kanekoコメント追加: 0002410
2007-03-30 00:17kanekoコメント追加: 0002411
2007-03-30 03:06anonymousコメント追加: 0002412
2007-03-31 03:01anonymousコメント追加: 0002413
2007-03-31 09:24kanekoバージョン4.0 => 4.0,4.1,VineSeed
2007-03-31 09:24kanekoコメント追加: 0002414
2007-03-31 20:14anonymousコメント追加: 0002415
2007-04-03 16:14kanekoarchx86 => x86, x86_64, ppc
2007-04-03 16:14kanekoコメント追加: 0002416
2007-04-11 22:05kanekoパッケージrdoc-1.8.5-0vl1.1 => rdoc less util-linux lv w3m
2007-04-11 22:05kaneko担当者 => kaneko
2007-04-11 22:05kaneko状態新規 => テスト待ち
2007-04-11 22:05kanekoコメント追加: 0002417
2007-04-13 00:09anonymousコメント追加: 0002418
2007-04-13 01:40kanekoコメント追加: 0002419
2007-07-07 00:34kazutaka状態テスト待ち => 完了
2007-07-07 00:34kazutakaコメント追加: 0002420

コメント
(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
(0002412)
anonymous   
2007-03-30 03:06   
> (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 で見つかるようにもなります。
(0002413)
anonymous   
2007-03-31 03:01   
> (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 候補がありましたら、ご提案ください。
(0002415)
anonymous   
2007-03-31 20:14   
> 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 に、
状態を確認待ちに変更します。
(0002418)
anonymous   
2007-04-13 00:09   
> ・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 パッケージも含めて、
要望として別途検討すべきだと思います。
(0002420)
kazutaka   
2007-07-07 00:34   
一通りの対応が行われたので、これで完了にします。

> > %files セクションに %{_bindir}/pager は含まれないので
> > Provides: pager %{_bindir}/pager
> > のほうがいいと思うのですが
>
> ri の不具合対応として pager 対応だけそこまで手厚くするのは、
> 他のパッケージと比較するとやりすぎだと思いますので、
> これは対応しません。
>
> 強いニーズがあるなら、他の Provides パッケージも含めて、
> 要望として別途検討すべきだと思います。

これについては特にどなたからも要望が上げられて
いませんし、現状の他のパッケージと見比べてみても
Provides を付けるのはちょっと例外的なようですので、
これ以上の対応は行わなくて良いと思います。

ハラダ