なんどかエントリに投稿しているけれども僕の家のマシンはubuntuです。
windows系だとTortoiseSVNなんかがあるんだろうけど、基本的にterminalで充分なのでなくてもあまり気にしない。
ただし、
- svn add
- svn remove
- svn commit -m 〜
の操作についてはコミット前に何度か叩かないといけないので面倒くさい。
そこで簡単な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で試してみた)
コード
#!/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は最高。
不具合がありましたらご連絡ください。(いちおう使用は自己責任で)


まだ使ってないですが、よさそうな感じですね。
返信削除この勢いでGit版もお願いします(笑)
>fumokmmさん
返信削除fumokmmさんはMercurial版を(笑)