「コミット内容をCSVにする」の編集履歴(バックアップ)一覧はこちら
「コミット内容をCSVにする」(2009/12/22 (火) 03:31:39) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
@ECHO OFF
set HOOKDIR="E:\repository\hooks"
set TMPDIR="%HOOKDIR%\.svnhook"
set SVNLOOKDIR="E:\subversion\bin"
set REPOS=%1
set TXN=%2
set RET=1
set LOG=%TMPDIR%\%TXN%.log
set CHANGED=%TMPDIR%\%TXN%.changed
if not exist %TMPDIR% mkdir %TMPDIR%
call %SVNLOOKDIR%\svnlook log -t %TXN% %REPOS% >> %LOG%
call %SVNLOOKDIR%\svnlook changed -t %TXN% %REPOS% >> %CHANGED%
cd %HOOKDIR%
java -classpath %HOOKDIR% SvnToCsv %LOG% %CHANGED%
set RET=%ERRORLEVEL%
del %LOG%
del %CHANGED%
exit %RET%
@ECHO OFF
set HOOKDIR="E:\repository\hooks"
set TMPDIR="%HOOKDIR%\.svnhook"
set SVNLOOKDIR="E:\subversion\bin"
set REPOS=%1
set TXN=%2
set RET=1
set LOG=%TMPDIR%\%TXN%.log
set CHANGED=%TMPDIR%\%TXN%.changed
if not exist %TMPDIR% mkdir %TMPDIR%
call %SVNLOOKDIR%\svnlook log -t %TXN% %REPOS% >> %LOG%
call %SVNLOOKDIR%\svnlook changed -t %TXN% %REPOS% >> %CHANGED%
cd %HOOKDIR%
java -classpath %HOOKDIR% SvnToCsv %LOG% %CHANGED%
set RET=%ERRORLEVEL%
del %LOG%
del %CHANGED%
exit %RET%
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* svn logの実行結果からCSVを作成します。
*
*/
public class SvnToCsv {
private String log;
private String changed;
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("引数の数が変ですよ。(" + args.length + "個)");
System.exit(1);
}
int result;
try {
result = new SvnToCsv(args[0], args[1]).toCsv();
} catch (Exception e) {
System.err.print(e.getMessage());
result = 1;
}
System.exit(result);
}
public SvnToCsv(String logPath, String changedPath) throws IOException {
log = read(logPath);
changed = read(changedPath);
}
public int toCsv() throws IllegalFormatException, IOException {
// 特定のディレクトリへの変更をしなければスルー
if (!needToCsv()) {
return 0;
}
String bugNo = getFirstGroup(log, "課題管理番号:(\\d+)");
String comment = getFirstGroup(log, "コメント:(.+)");
String[] changedPathes = getChangdPathes();
write(toCsvString(bugNo, comment, changedPathes));
return 0;
}
private void write(String csv) throws IOException {
FileOutputStream out = null;
PrintWriter writer = null;
try {
out = new FileOutputStream(new File("C:/release.log"), true);
FileChannel channel = out.getChannel();
FileLock lock = getLock(channel);
writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out)));
writer.print(csv);
lock.release();
} finally {
if (writer != null) writer.close();
if (out != null) out.close();
}
}
private FileLock getLock(FileChannel channel) throws IOException {
for (int i=0; i<5; i++) {
FileLock lock = channel.tryLock();
if (lock == null) {
try {
Thread.sleep(1000);
continue;
} catch (InterruptedException e) {}
}
return lock;
}
throw new IOException("C:/release.logのロックが取得できませんでした。");
}
private String toCsvString(String bugNo, String comment, String[] changedPathes) {
StringBuilder builder = new StringBuilder();
for (String path: changedPathes) {
builder.append(bugNo).append(",").append(path).append(",").append(comment).append("\r\n");
}
return builder.toString();
}
private String[] getChangdPathes() throws IllegalFormatException {
String[] changedArray = changed.split("\\r\\n");
String[] changedPathes = new String[changedArray.length];
for (int i=0; i<changedArray.length; i++) {
String changedElement = changedArray[i];
changedPathes[i] = getFirstGroup(changedElement, ".+/ほげ/(ふが/.+)");
}
return changedPathes;
}
private String getFirstGroup(String target, String regexp) throws IllegalFormatException {
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(target);
if (!matcher.find()) {
throw new IllegalFormatException("正規表現「" + regexp + "」が見つかりません。\r\n対象:" + target);
}
return matcher.group(1);
}
private boolean needToCsv() {
Pattern pattern = Pattern.compile("/ほげ/");
return pattern.matcher(changed).find();
}
private String read(String path) throws IOException {
BufferedReader reader = null;
StringBuilder builder = new StringBuilder();
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "MS932"));
while (true) {
String line = reader.readLine();
if (line == null) break;
builder.append(line).append("\r\n");
}
} finally {
if (reader != null) reader.close();
}
return builder.toString();
}
private class IllegalFormatException extends Exception {
IllegalFormatException(String message) {
super(message);
}
}
}
表示オプション
横に並べて表示:
変化行の前後のみ表示: