タグ別アーカイブ: Subversion

コマンドライン版Everythingを使ってSubversionのワーキングコピーフォルダをリストアップする

最近TortoiseSVNが1.7になって、既存のワーキングコピーを初めて操作するときに自動的に管理ファイルをアップデートするらしい既存のワーキングコピーを手動でアップデートする必要があるらしい ( WC-NG )。未アップデートのワーキングコピーが混在するのは気持ち悪いのでまとめてアップデートしたいと思う。

しかし、僕の場合、ワーキングコピーがいろんなところに散在していて探すのがめんどくさい。それでワーキングコピーのルートフォルダをリストアップするコマンドラインアプリを作りました。

また、複数のプロジェクトをメンテしていてコミットがおろそかになってしまうことが多いんですが、これで列挙すればどこにワーキングセットがあるのか分かりやすくなります。

各ドライブ以下を全検索するのはやってられないので、Everythingの力を借りています。
そのためNTFSフォーマットのドライブ限定になります。

# This script searches all subversion working copy root folders.
# You need Tcl interpreter and Everything command line interface (es.exe).
# Download from this site: http://www.voidtools.com/download.php
# tclsh FindSvnRoots.tcl
array set wcopy {}
set ch [open {|es -i -s -r "^.svn$"}]
 
while {![eof $ch]} {
	if {[gets $ch path] != -1} {
		set parent [file dirname $path]
		set wcopy($parent) 1
	}
}
 
set paths [lsort -dictionary [array names wcopy]]
foreach path $paths {
	array unset wcopy "${path}?*"
}
 
set paths [lsort -dictionary [array names wcopy]]
foreach path $paths {
	puts $path
}

ここからes.exeをダウンロードして、スクリプトの実行フォルダかパスの通ったフォルダに置く必要があります。
http://www.voidtools.com/download.php

※ Tclインタープリタ不要なバージョンも作りました。
これにもes.exeは必要です。

FindSvnRoots 1.0.0.0 (Windows binary)

# 未コミットかどうかも表示できるようにしたい。

2011-10-27 追記

svn status -qコマンドで取得した状態で、" "でないものがあった場合は最初に見つけたものを表示します。

>FindSvnRoots.exe
  C:\src\my\project1
M C:\src\my\project2
A C:\src\my\project2

svnコマンドにパスが通っていない場合は全ての状態が" "になります。

>FindSvnRoots.exe
  C:\src\my\project1
  C:\src\my\project2

FindSvnRoots 2.0.0.0 (Windows binary)

ソースコードは以下。

# This script searches all subversion working copy root folders.
# You need Everything command line interface (es.exe).
# tclsh FindSvnRoots.tcl
# Output format:
# [ ACDIMRX?!~] "Working set folder's full path"
 
set svn_exists [expr {![catch {exec svn --version --quiet}]}]
 
array set wcopy {}
 
set ch [open {|es -i -s -r "^.svn$"}]
 
while {![eof $ch]} {
	if {[gets $ch path] != -1} {
		set parent [file dirname $path]
		set wcopy($parent) 1
	}
}
 
set paths [lsort -dictionary [array names wcopy]]
foreach path $paths {
	array unset wcopy "${path}?*"
}
 
set paths [lsort -dictionary [array names wcopy]]
foreach path $paths {
	set native_path [file nativename $path]
	set s " "
	if {$svn_exists} {
		if {[catch {exec svn status -q $path} str]} {
			puts "E $path : Failed to retrieve local modification : [lindex [split $str \n] 0]"
		}
		set lines [split $str \n]
		foreach line $lines {
			set s [string index $line 0]
			if {$s ne " "} {
				break
			}
		}
	}
	puts "$s $native_path"
}

初めてソフトを公開してみた。DateTimeConverter

他人に見せられるほどのプログラムでもないのですが、試しに公開してみました。

https://sourceforge.net/projects/dtconverter/

追記: Softpediaにも載せてもらいました。スクリーンショットのロケールが英語になってる。自分では試せなかったのでちゃんと動いているようでよかったです。

http://goo.gl/zZxFe

動作環境:  .NET Framework 4.0 Client Profile

WindowsからTortoiseSVNでプロジェクトのレポジトリにコミットする方法は以下を参考にしました。

https://sourceforge.net/apps/trac/sourceforge/wiki/TortoiseSVN%20instructions

なにをするソフトかというと、日時を指定してそのシリアル値を調べたり、逆にシリアル値から日時を調べたりするソフトです。

時刻のシリアル値というのは、エポック秒などとも呼ばれたりもしますが、時刻を表す整数や実数のことです。

コンピュータでは"2011年8月5日 14時3分21秒"とかいう文字列で時刻を記憶するのではなく、西暦何年1月1日の午前0時から数えて何秒目とかいう数え方をします。

シリアル値の始まり(時刻ゼロ)や時刻の刻みの細かさなどに関しては、処理系によってそれぞれ異なります。

このソフトを使うと、代表的な時刻のシリアル値を相互に変換できます。

DateTimeConverter screenshot 1 DateTimeConverter screenshot 2

代表的、というのは私がよく使うというだけなので、誰にとっても役立つものなのかは分かりません。今のところ、拡張性があるように作ってもいないので、需要があればなんか考えます。
公開した後で、名前がひんしゅくを買いそうな名前だなと気づいたものの、時間ないのでとりあえずそのまま。