FreeBSDでportupgrade -aをするときの困り事

1. 状況

FreeBSDでportsで管理されてないパッケージがあるとき、アップデートでちょっと困った。
まずは更新すべきパッケージの一覧を portversion -vL= で取得する。
-vL=は恐らく、vでバージョン番号などの詳細、Lで除外するパッケージのflagを指定, =が-Lの引数で同等、となっているようだ。

shell> portversion -vL= > ~/tmp/hoge && cat ~/tmp/hoge
[Updating the pkgdb  in /var/db/pkg ... - 228 packages found (-0 +2) .. done]
... (略) ...
bsdpan-Lingua-LanguageGuesser-0.00_14  #  [held] error - origin not recorded; run pkgdb -F
emacs-23.3_5,2              <  needs updating (port has 23.3_6,2)
... (略) ...

さて、更新が来てるportsの一覧が取得できたのだけれど、このままではアップデート出来ない。
バージョンが古いか新しいか、などを表すフラグに # が付いてしまっている。そしてportsにみつからないよ、って出てる。

2. 問題

Linga-LanguageGuesser という、言語特定に結構便利なパッケージがあるのだけれど、こいつが portupgrade -a を邪魔しちゃってる。
portupgrade -a は、All、全てのportsで管理されるパッケージに対して、port treeに更新があれば更新を行おうとする。
実は何も気にせずに portupgrade -a ってのは結構キケンを伴う。FreeBSDのportsシステムは、出た当初には他のパッケージシステムに比べ、依存関係を適当に調べて必要なパッケージを入れてくれたりととても便利だったのだけれど、現在ではその利点はちょっと薄れてきてしまっている。(とはいえ、バイナリでコンパイル済みのパッケージを入れるのではなく、ソースからコンパイルするというパッケージシステムで比較すればもちろん個人的には十分に好きだったり)
というのも、依存するパッケージの中でいくつかクセのあるやつがいたりなんかして、portupgradeをかけたときにインストールやコンパイルでコケちゃったりするのだ。
なので “portupgrade -a なんてもってのほか” という話もあったりする。

まぁでも、どうせコケたらなんとかすれば良いし、ダメならOSごと入れ直せばいいし、ってスタンスで運用してるのでここはportupgrade -a を利用する。本当はアップグレードの前に /usr/ports/UPDATING もちゃんと目を通さないとダメだけど、最近は困ったときだけ見るようにしてる。

さて、portupgrade -a を行いたいのだけれど、うまくいかない。というのも portupgrade -a では対象となるパッケージを全てアップデートしようとするんだけれど、その中で先述の Lingua-LanguageGuesser がportsにないのでコケちゃう。で、残りのアップデートもしてくれない。
pkgtools.confをいじって portupgrade から除外しようとしてみたのだけれどうまく除外できない。

3. 解決方法

というわけで、さっきいったん取得しておいた portversion の結果をもってportupgrade をした。
以下にメモ。

shell> grep -v 'Lingua' /home/hogetan/tmp/portversion | cut -f1 -d ' ' | xargs sudo portupgrade -c

残念だけど上の方法だとうまくいかなかった。 dialogとかscriptがcpuを100%持ってっちゃって帰ってこない。xargsに分割する数を変えて、 -n 100とかしたけどダメ。
xargsのオプションで実行するかどうかを聞いてくる-pオプション、find で言うところの-okみたいなオプションがあったので見たところ、問題なさそう。
コレを手動でコピペして実行したらうまくいっている様子。
ちょっと不満だけどこれでやっていこう。

shell> grep -v 'Lingua' /home/hogetan/tmp/portversion | cut -f1 -d ' ' | xargs -p -n 10000 sudo portupgrade -c

コメントを残す