"重複を許可しない" という言葉だけだと、何言ってるかわからないと思いますが、少しタイトル長くした程度ではいずれにせよ理解してもらえなそうだったので、こういうタイトルになりました。
これに気がついた流れを追って説明すると(別に流れを追う必要ないんですが)
- sbt-scalapropsという、この前作ったテストライブラリのsbt pluginを作る(これについてはあとでblog書きたい・・・ https://github.com/scalaprops/sbt-scalaprops )
- sbt-scalapropsは、テストのクラスとメソッドをタブ補間するためのものである
- 「そういえばtestOnlyコマンドって重複除去されるけど、どうやってるのだろう?」という疑問が浮かぶ
- sbtのコード読む
- 該当箇所発見する https://github.com/sbt/sbt/blob/v0.13.8/main/src/main/scala/sbt/Defaults.scala#L886-L903
- なるほど便利っぽいけど、privateだし、testOnly専用の処理*1が入ってるので、コピペしつつ改変して使用
- https://github.com/scalaprops/sbt-scalaprops/blob/v0.1.0/src/main/scala/scalaprops/ScalapropsPlugin.scala#L84-L90
- ついでに、sbt-release pluginも、以前からその部分微妙な気がしていたのでpull req https://github.com/sbt/sbt-release/pull/115 (mergeされるといいな・・・)
さて、説明が前後しますが、"重複許可しない"とは何かというと、sbtのtestOnlyは、もしTestA, TestB, TestC と3つのテストのクラスがあった際に、以下ようにTestAとスペース入力後にタブキーを押すと
> testOnly TestA TestB TestC
補間される候補から、TestAは除かれていますね?(つまりTestBとTestCのみが候補にでる)
TestAを2回入力しても無視すればいいだけなので、候補にでること自体は致命的ではないですが、逆に言うと2回入力する意味はないので、補間候補から消えてくれたほうが嬉しいですね?
というわけで、上記の5、6行のコード書けば、sbtのparserはそういうことができるようになってます。便利だ・・・
*1: "--"で区切るなど