tikhomirov@61: /* tikhomirov@66: * Copyright (c) 2011 TMate Software Ltd tikhomirov@66: * tikhomirov@66: * This program is free software; you can redistribute it and/or modify tikhomirov@66: * it under the terms of the GNU General Public License as published by tikhomirov@66: * the Free Software Foundation; version 2 of the License. tikhomirov@66: * tikhomirov@66: * This program is distributed in the hope that it will be useful, tikhomirov@66: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@66: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@66: * GNU General Public License for more details. tikhomirov@66: * tikhomirov@66: * For information on how to redistribute this software under tikhomirov@66: * the terms of a license other than GNU General Public License tikhomirov@66: * contact TMate Software at support@svnkit.com tikhomirov@61: */ tikhomirov@66: package org.tmatesoft.hg.test; 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@66: * @author Artem Tikhomirov tikhomirov@66: * @author TMate Software Ltd. 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@75: copied.put(added.get(added.size() - 1), fname); 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: }