groovyでsvn操作ツール作ったよ

2019-01-22Groovy

愛機は Ubuntu

なんどかエントリに投稿しているけれども僕の家のマシンはubuntuです。

理由は

  • Windows系OSは CUI 機能が弱い
  • Mac系OSは 費用が高い

結果として、かなり古めのNotebookに Ubuntu OSをインストールして使っています。意外と軽くて良い。

逆にGUIの弱さで苦しむ時がある

Windows系だと TortoiseSVN なんかがあるんだろうけど、基本的に Terminal で充分なのでなくてもあまり気にしない。

ただし、

  • svn add
  • svn remove
  • svn commit -m 〜

の操作についてはコミット前に何度か叩かないといけないので面倒くさい。

GUIなSVN操作ツールを作ってしまおう!

そこで簡単なSVN操作ツール作ってみた。

SwingBuilderそのまま使っていて、Event Dispatch Threadとか考慮できていないのでそこは許してください。

スクリーンショット

使い方

SVN管理フォルダに移動して、

svntool.groovy

と叩けばOK。

セットアップ

  1. どこかに以下のコードを svntool.groovy という名前で保存。
  2. svn コマンドにパスは通しておこう。
  3. tkdiff コマンドが使えると多少幸せになれる(これは、Linux限定です)
  4. windows の場合には、すべての "svn 〜" の部分を "cmd.exe /c svn 〜" に書き直してね。(WindowsにはTortoiseSVNあるかw)*
  5. windows でも、Cygwin上ならそのまま使える(windowsで試してみた)

コード

svntool.groovy を作成

ポイントは SwingBuilder を使っている点。これならWindows/Linux/Macのどの環境でも動作しますね。

#!/usr/bin/env groovy
import static javax.swing.JOptionPane.*
import groovy.swing.*
import javax.swing.*

def getDiffList = {
    "svn status".execute().text.readLines().collect{
        def columns = it.split(/s+/)
        [status:columns[0], path:columns[1]]
    }
}
def getSelectedDiffList = { builder ->
    builder.table.selectedRows.collect{ builder.table.model.rowsModel.value[it] }
}
def refreshScreen = { builder ->
    builder.info.text = "svn info".execute().text
    builder.table.model.rowsModel.value = getDiffList()
    builder.table.resizeAndRepaint()
}

def swing = new SwingBuilder()
def frame = swing.frame(title:'svn操作ツール', defaultCloseOperation:JFrame.EXIT_ON_CLOSE, show:true, pack:true, id:"frame"){
    panel{
        vbox{
            textArea("svn info".execute().text, size:[200, 200], id:"info")
            scrollPane{
                table(
                    id:"table", selectionMode:ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
                ){
                    tableModel(list:getDiffList()) {
                        propertyColumn(header:'状態', propertyName:'status')
                        propertyColumn(header:'ファイル名', propertyName:'path')
                    }
                }
            }
            hbox{
                button("? > add", actionPerformed:{ evt ->
                    def selectedPaths = getSelectedDiffList(swing).findAll{
                        it.status == "?"
                    }*.path
                    selectedPaths.each{
                        "svn add ${it}".execute().text
                    }
                    refreshScreen(swing)
                })
                button("! > del", actionPerformed:{ evt ->
                    def selectedPaths = getSelectedDiffList(swing).findAll{
                        it.status == "!"
                    }*.path
                    selectedPaths.each{
                        "svn remove ${it}".execute().text
                    }
                    refreshScreen(swing)
                })
                button("diff", actionPerformed:{ evt ->
                    def selectedPath = getSelectedDiffList(swing).findAll{
                        it.status == "M"
                    }*.path[0]
                    "svn diff --diff-cmd tkdiff ${selectedPath}".execute().text
                })
            }
            hbox{
                button("commit", actionPerformed:{ evt ->
                    def comment = showInputDialog( swing.frame, "コメントを入力", "" )
                    if( comment ){
                        def result = "svn commit -m "${comment}"".execute().text
                        showMessageDialog( swing.frame, result )
                        refreshScreen(swing)
                    }
                })
                button("update", actionPerformed:{ evt ->
                    def result = "svn update".execute().text
                    showMessageDialog( swing.frame, result )
                    refreshScreen(swing)
                })
            }
        }
    }
}

最後に

Groovyよ・・・最高だ。

30分程度で作れた。ちょっとしたツール作るにはGroovyは最高。特にGUIのアプリを作る際には非常に良い。
サーバを立てるまでもないようなアプリだとなおさらですね。

不具合がありましたらご連絡ください。

2019-01-22Groovy