「コミット内容をCSVにする」の編集履歴(バックアップ)一覧はこちら
「コミット内容をCSVにする」の最新版変更点
追加された行はこの色になります。
削除された行はこの色になります。
@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); + } + } + +}
このwikiの更新情報RSS