app-eselect/eselect-gradle-0.1 にて、 eselect gradle
と eselect gradle
が正しく動作しないので修正してみました。
始めに
主に Java 開発にてお世話になる Gradle。この記事を書いている時点では Gentoo の標準ツリーに含まれていませんが、 layman によって取得できる java ツリーに含まれています1。Gradle のパッケージは複数バージョンが混在できるよう、マルチスロット構成となっており、標準でどのバージョンを使うかを eselect gradle
によって選択することができるようになっています 2。
どこがおかしいの?
eselect gradle
で行えるアクションは list
、set <target>
、show
、update
の 4 種類。肝心の set
はきちんと動作するのですが、現在どれが選択されているかを表示する list
、show
がうまく動作しません。
$ eselect gradle list
Available gradle symlink targets:
[1] gradle-3.1
[2] gradle-bin-2.11
$ eselect gradle show
Current gradle symlink:
/usr/share/eselect/modules/gradle.eselect: 行 48: cannonicalise: コマンドが見つかりません
eselect gradle list
ではどれが選択されているか分かりませんし、 eselect gradle show
では何も出力されないどころかエラーが吐かれています。
$ gradle --version
------------------------------------------------------------
Gradle 2.11
------------------------------------------------------------
Build time: 2016-02-08 07:59:16 UTC
Build number: none
Revision: 584db1c7c90bdd1de1d1c4c51271c665bfcba978
Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.8.0_92 (Oracle Corporation 25.92-b14)
OS: Linux 4.5.0-gentoo amd64
$ sudo eselect gradle set 1
$ gradle --version
------------------------------------------------------------
Gradle 3.1-20161019144024+0000
------------------------------------------------------------
Build time: 2016-10-19 14:40:24 UTC
Revision: <unknown>
Groovy: 2.4.7
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_92 (Oracle Corporation 25.92-b14)
OS: Linux 4.5.0-gentoo amd64
幸い、 eselect gradle set
はきちんと動いているようですが。
何故動かない?
eselect-gradle の処理は /usr/share/eselect/modules/gradle.eselect
に書かれています。これを読むと、以下のような記述が見付かります。
...
write_list_start "Current gradle symlink:"
if [[ -L ${EROOT}/usr/bin/gradle ]]; then
local gradle=$(cannonicalise "${EROOT}/usr/bin/gradle") ← ん?
write_kv_list_entry "${gradle}" ""
else
write_kv_list_entry "(unset)" ""
fi
}
...
do_list() {
local i targets=( $(find_targets) )
write_list_start "Available gradle symlink targets:"
for (( i = 0; i < ${#targets[@]}; i++ )); do
# highligh the target where the symlink is pointing to
[[ ${targets[i]} = \
$(basename "$(canonicalise "${EROOT}/usr/bin/gradle")") ]] \ ← んんん?
&& targets[i]=$(highlight_marker "${targets[i]}")
done
write_numbered_list -m "(none found)" "${targets[@]}"
}
...
シンボリックリンクの解決をしたいと思われる行がありますが、そこで使われているコマンドは cannonicalise
に canonicalise
3。残念ながらそういったコマンドはありません。
修正
さて、上で示したふたつのコマンドを readlink
に置き換えてからもう一度試してみます。
$ eselect gradle list
Available gradle symlink targets:
[1] gradle-3.1 *
[2] gradle-bin-2.11
$ eselect gradle show
Current gradle symlink:
gradle-3.1
$ sudo eselect gradle set 2
$ eselect gradle show
Current gradle symlink:
gradle-bin-2.11
$ eselect gradle list
Available gradle symlink targets:
[1] gradle-3.1
[2] gradle-bin-2.11 *
今度はきちんと表示されました。
(んで、このバグ報告ってどこに持っていったらいいんだ?)