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();
		
	}

}