groovyでsvn操作ツール作ったよ
愛機は 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。
セットアップ
- どこかに以下のコードを svntool.groovy という名前で保存。
- svn コマンドにパスは通しておこう。
- tkdiff コマンドが使えると多少幸せになれる(これは、Linux限定です)
- windows の場合には、すべての "svn 〜" の部分を "cmd.exe /c svn 〜" に書き直してね。(WindowsにはTortoiseSVNあるかw)*
- 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のアプリを作る際には非常に良い。
サーバを立てるまでもないようなアプリだとなおさらですね。
不具合がありましたらご連絡ください。
ディスカッション
コメント一覧
まだ使ってないですが、よさそうな感じですね。
この勢いでGit版もお願いします(笑)
>fumokmmさん
fumokmmさんはMercurial版を(笑)