Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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 と書きたかったのでしょうか。それでもやっぱり存在しませんが。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away