LoginSignup
2
1

More than 5 years have passed since last update.

app-eselect/eselect-gradle の list、show が正しく動作するように修正する

Last updated at Posted at 2016-10-19

app-eselect/eselect-gradle-0.1 にて、 eselect gradleeselect gradle が正しく動作しないので修正してみました。

始めに

主に Java 開発にてお世話になる Gradle。この記事を書いている時点では Gentoo の標準ツリーに含まれていませんが、 layman によって取得できる java ツリーに含まれています1。Gradle のパッケージは複数バージョンが混在できるよう、マルチスロット構成となっており、標準でどのバージョンを使うかを eselect gradle によって選択することができるようになっています 2

どこがおかしいの?

eselect gradle で行えるアクションは listset <target>showupdate の 4 種類。肝心の set はきちんと動作するのですが、現在どれが選択されているかを表示する listshow がうまく動作しません。

$ 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 に書かれています。これを読むと、以下のような記述が見付かります。

/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[@]}"
}
...

シンボリックリンクの解決をしたいと思われる行がありますが、そこで使われているコマンドは cannonicalisecanonicalise 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 *

今度はきちんと表示されました。

(んで、このバグ報告ってどこに持っていったらいいんだ?)


  1. dev-java/gradle と dev-java/gradle-bin 

  2. eselct binutilseselect kernel や eselect と似た gcc-configjava-config 等でお馴染の方法ですね。 

  3. canonicalize と書きたかったのでしょうか。それでもやっぱり存在しませんが。 

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1