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

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


## 始めに

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

[^1]: dev-java/gradle と dev-java/gradle-bin
[^2]: `eselct binutils` 、 `eselect kernel` や eselect と似た `gcc-config` や `java-config` 等でお馴染の方法ですね。

## どこがおかしいの？

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

```bash
$ 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` では何も出力されないどころかエラーが吐かれています。

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

```bash:/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` に置き換えてからもう一度試してみます。

```bash
$ 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 *
```

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

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



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