2009/06/09

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

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

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

ただし、

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

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

そこで簡単な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で試してみた)

コード

#!/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は最高。

不具合がありましたらご連絡ください。(いちおう使用は自己責任で)

2 件のコメント:

  1. まだ使ってないですが、よさそうな感じですね。
    この勢いでGit版もお願いします(笑)

    返信削除
  2. >fumokmmさん
    fumokmmさんはMercurial版を(笑)

    返信削除