TortoiseSVNのログをhogehogeする
TortoiseSVNの以下のinputのような情報を自由に処理したい.
例えば、outputのように対象のファイルが修正されたRevisionを出力するなど...
とりあえず、コードは動く. 寝ます.
[input]
Revision: 1
Author: xxx
Date: xxx
Message:
I am very tired..
-
-
- -
-
Modified : /piopio.java
Revision: 2
....
[output]
target: piopio.java
rev: 1, 3, 5
[code]
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author dki * */ public class TargetRevisionFomatter { private static String TAG_REV = "Revision:"; private static String TAG_AUTH = "Author:"; private static String TAG_DATE = "Date:"; private static String TAG_MESS = "Message:"; private static String TAG_OTHER = "----"; private static Pattern PAT_REV = Pattern.compile(TAG_REV); private static Pattern PAT_AUTH = Pattern.compile(TAG_AUTH); private static Pattern PAT_DATE = Pattern.compile(TAG_DATE); private static Pattern PAT_MESS = Pattern.compile(TAG_MESS); private static Pattern PAT_OTHER = Pattern.compile(TAG_OTHER); private static Pattern PAT_MOD = Pattern.compile("Modified"); private static Pattern PAT_ADD = Pattern.compile("Added"); private static Pattern PAT_DELL = Pattern.compile("Deleted"); private Map<Integer, Map<String, List<String>>> contants = new HashMap<Integer, Map<String, List<String>>>(); private static enum READ_STATE{ REV, AUTH, DATE, MESS, OTHER, NONE } private READ_STATE state = null; private READ_STATE whichTAG(String line){ if(PAT_REV.matcher(line).find()){ return READ_STATE.REV; }else if(PAT_AUTH.matcher(line).find()){ return READ_STATE.AUTH; }else if(PAT_DATE.matcher(line).find()){ return READ_STATE.DATE; }else if(PAT_MESS.matcher(line).find()){ return READ_STATE.MESS; }else if(PAT_OTHER.matcher(line).find()){ return READ_STATE.OTHER; }else{ return READ_STATE.NONE; } } public void parseContants(File file) throws IOException{ BufferedReader br = new BufferedReader(new FileReader(file)); String str = br.readLine(); int counter = 0; while(str != null){ READ_STATE line_state = whichTAG(str); if(state==null && line_state==READ_STATE.NONE){ str = br.readLine(); continue; } //System.out.println(str); if(line_state == READ_STATE.REV){ contants.put(++counter, new HashMap<String, List<String>>()); } if(line_state != READ_STATE.NONE){ state = line_state; String regex = ".+: (.*)"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if (m.find()){ addVal(counter, m.group(1)); } }else{ addVal(counter, str); } str = br.readLine(); } } private void addVal(int index, String val){ List<String> vals = contants.get(index).get(state.toString()); if(vals == null){ vals = new ArrayList<String>(); contants.get(index).put(state.toString(), vals); } vals.add(val); } public void printTarget2Rev(){ Map<String, List<Integer>> target2revMap = new HashMap<String, List<Integer>>(); for(Entry<Integer, Map<String, List<String>>> e :contants.entrySet()){ Map<String, List<String>> commitLog = e.getValue(); for(String target:commitLog.get(READ_STATE.OTHER.toString())){ List<Integer> revlist = target2revMap.get(target); if(revlist==null){ revlist = new ArrayList<Integer>(); } revlist.add(Integer.valueOf(commitLog.get(READ_STATE.REV.toString()).get(0))); target2revMap.put(target, revlist); } } for(Entry<String, List<Integer>> e:target2revMap.entrySet()){ String target = e.getKey(); if(PAT_MOD.matcher(target).find()){ String[] ss = target.split("/"); System.out.print("m " + ss[ss.length-1]); }else if(PAT_ADD.matcher(target).find()){ String[] ss = target.split("/"); System.out.print("+ " + ss[ss.length-1]); }else if(PAT_DELL.matcher(target).find()){ String[] ss = target.split("/"); System.out.print("- " + ss[ss.length-1]); } System.out.print(","); List<Integer> revs = e.getValue(); Collections.sort(revs); for(Integer rev:revs){ System.out.print(rev ); } System.out.println(", " + target); } } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { TargetRevisionFomatter inst = new TargetRevisionFomatter(); inst.parseContants(new File("branch.log")); inst.printTarget2Rev(); } }