diff test/org/tmatesoft/hg/test/StatusOutputParser.java @ 66:52dc3f4cfc76

Primitive test suite in org.tmatesoft
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 21 Jan 2011 18:20:05 +0100
parents test/com/tmate/hgkit/StatusOutputParser.java@fac8e7fcc8b0
children e62f9638fb27
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/org/tmatesoft/hg/test/StatusOutputParser.java	Fri Jan 21 18:20:05 2011 +0100
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2011 TMate Software Ltd
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * For information on how to redistribute this software under
+ * the terms of a license other than GNU General Public License
+ * contact TMate Software at support@svnkit.com
+ */
+package org.tmatesoft.hg.test;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author Artem Tikhomirov
+ * @author TMate Software Ltd.
+ */
+public class StatusOutputParser implements OutputParser {
+
+	private final Pattern pattern;
+	private List<String> modified, added, removed, clean, missing, unknown, ignored;
+	private Map<String, String> copied;
+	private final boolean winPathSeparator;
+
+	public StatusOutputParser() {
+//		pattern = Pattern.compile("^([MAR?IC! ]) ([\\w \\.-/\\\\]+)$", Pattern.MULTILINE);
+		pattern = Pattern.compile("^([MAR?IC! ]) (.+)$", Pattern.MULTILINE);
+		winPathSeparator = File.separatorChar == '\\';
+	}
+
+	public void reset() {
+		modified = added = removed = clean = missing = unknown = ignored = null;
+		copied = null;
+	}
+
+	public void parse(CharSequence seq) {
+		Matcher m = pattern.matcher(seq);
+		while (m.find()) {
+			String fname = m.group(2);
+			switch ((int) m.group(1).charAt(0)) {
+			case (int) 'M' : {
+				modified = doAdd(modified, fname);
+				break;
+			}
+			case (int) 'A' : {
+				added = doAdd(added, fname);
+				break;
+			}
+			case (int) 'R' : {
+				removed = doAdd(removed, fname);
+				break;
+			}
+			case (int) '?' : {
+				unknown = doAdd(unknown, fname);
+				break;
+			}
+			case (int) 'I' : {
+				ignored = doAdd(ignored, fname);
+				break;
+			}
+			case (int) 'C' : {
+				clean = doAdd(clean, fname);
+				break;
+			}
+			case (int) '!' : {
+				missing = doAdd(missing, fname);
+				break;
+			}
+			case (int) ' ' : {
+				if (copied == null) {
+					copied = new TreeMap<String, String>();
+				}
+				// last added is copy destination
+				// to get or to remove it - depends on what StatusCollector does in this case
+				copied.put(fname, added.get(added.size() - 1));
+				break;
+			}
+			}
+		}
+	}
+
+	// 
+	public List<String> getModified() {
+		return proper(modified);
+	}
+
+	public List<String> getAdded() {
+		return proper(added);
+	}
+
+	public List<String> getRemoved() {
+		return proper(removed);
+	}
+
+	public Map<String,String> getCopied() {
+		if (copied == null) {
+			return Collections.emptyMap();
+		}
+		return Collections.unmodifiableMap(copied);
+	}
+
+	public List<String> getClean() {
+		return proper(clean);
+	}
+
+	public List<String> getMissing() {
+		return proper(missing);
+	}
+
+	public List<String> getUnknown() {
+		return proper(unknown);
+	}
+
+	public List<String> getIgnored() {
+		return proper(ignored);
+	}
+	
+	private List<String> proper(List<String> l) {
+		if (l == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableList(l);
+	}
+
+	private List<String> doAdd(List<String> l, String s) {
+		if (l == null) {
+			l = new LinkedList<String>();
+		}
+		if (winPathSeparator) {
+			// Java impl always give slashed path, while Hg uses local, os-specific convention
+			s = s.replace('\\', '/'); 
+		}
+		l.add(s);
+		return l;
+	}
+}