tikhomirov@61: /* tikhomirov@61: * Copyright (c) 2011 Artem Tikhomirov tikhomirov@61: */ tikhomirov@61: package com.tmate.hgkit; tikhomirov@61: tikhomirov@61: import java.io.File; tikhomirov@61: import java.util.Collections; tikhomirov@61: import java.util.LinkedList; tikhomirov@61: import java.util.List; tikhomirov@61: import java.util.Map; tikhomirov@61: import java.util.TreeMap; tikhomirov@61: import java.util.regex.Matcher; tikhomirov@61: import java.util.regex.Pattern; tikhomirov@61: tikhomirov@61: /** tikhomirov@61: * tikhomirov@61: * @author artem tikhomirov@61: */ tikhomirov@61: public class StatusOutputParser implements OutputParser { tikhomirov@61: tikhomirov@61: private final Pattern pattern; tikhomirov@61: private List modified, added, removed, clean, missing, unknown, ignored; tikhomirov@61: private Map copied; tikhomirov@61: private final boolean winPathSeparator; tikhomirov@61: tikhomirov@61: public StatusOutputParser() { tikhomirov@61: // pattern = Pattern.compile("^([MAR?IC! ]) ([\\w \\.-/\\\\]+)$", Pattern.MULTILINE); tikhomirov@61: pattern = Pattern.compile("^([MAR?IC! ]) (.+)$", Pattern.MULTILINE); tikhomirov@61: winPathSeparator = File.separatorChar == '\\'; tikhomirov@61: } tikhomirov@61: tikhomirov@61: public void reset() { tikhomirov@61: modified = added = removed = clean = missing = unknown = ignored = null; tikhomirov@61: copied = null; tikhomirov@61: } tikhomirov@61: tikhomirov@61: public void parse(CharSequence seq) { tikhomirov@61: Matcher m = pattern.matcher(seq); tikhomirov@61: while (m.find()) { tikhomirov@61: String fname = m.group(2); tikhomirov@61: switch ((int) m.group(1).charAt(0)) { tikhomirov@61: case (int) 'M' : { tikhomirov@61: modified = doAdd(modified, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) 'A' : { tikhomirov@61: added = doAdd(added, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) 'R' : { tikhomirov@61: removed = doAdd(removed, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) '?' : { tikhomirov@61: unknown = doAdd(unknown, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) 'I' : { tikhomirov@61: ignored = doAdd(ignored, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) 'C' : { tikhomirov@61: clean = doAdd(clean, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) '!' : { tikhomirov@61: missing = doAdd(missing, fname); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: case (int) ' ' : { tikhomirov@61: if (copied == null) { tikhomirov@61: copied = new TreeMap(); tikhomirov@61: } tikhomirov@61: // last added is copy destination tikhomirov@61: // to get or to remove it - depends on what StatusCollector does in this case tikhomirov@61: copied.put(fname, added.get(added.size() - 1)); tikhomirov@61: break; tikhomirov@61: } tikhomirov@61: } tikhomirov@61: } tikhomirov@61: } tikhomirov@61: tikhomirov@61: // tikhomirov@61: public List getModified() { tikhomirov@61: return proper(modified); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public List getAdded() { tikhomirov@61: return proper(added); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public List getRemoved() { tikhomirov@61: return proper(removed); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public Map getCopied() { tikhomirov@61: if (copied == null) { tikhomirov@61: return Collections.emptyMap(); tikhomirov@61: } tikhomirov@61: return Collections.unmodifiableMap(copied); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public List getClean() { tikhomirov@61: return proper(clean); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public List getMissing() { tikhomirov@61: return proper(missing); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public List getUnknown() { tikhomirov@61: return proper(unknown); tikhomirov@61: } tikhomirov@61: tikhomirov@61: public List getIgnored() { tikhomirov@61: return proper(ignored); tikhomirov@61: } tikhomirov@61: tikhomirov@61: private List proper(List l) { tikhomirov@61: if (l == null) { tikhomirov@61: return Collections.emptyList(); tikhomirov@61: } tikhomirov@61: return Collections.unmodifiableList(l); tikhomirov@61: } tikhomirov@61: tikhomirov@61: private List doAdd(List l, String s) { tikhomirov@61: if (l == null) { tikhomirov@61: l = new LinkedList(); tikhomirov@61: } tikhomirov@61: if (winPathSeparator) { tikhomirov@61: // Java impl always give slashed path, while Hg uses local, os-specific convention tikhomirov@61: s = s.replace('\\', '/'); tikhomirov@61: } tikhomirov@61: l.add(s); tikhomirov@61: return l; tikhomirov@61: } tikhomirov@61: }