kitaev@213: /* kitaev@213: * Copyright (c) 2011 TMate Software Ltd kitaev@213: * kitaev@213: * This program is free software; you can redistribute it and/or modify kitaev@213: * it under the terms of the GNU General Public License as published by kitaev@213: * the Free Software Foundation; version 2 of the License. kitaev@213: * kitaev@213: * This program is distributed in the hope that it will be useful, kitaev@213: * but WITHOUT ANY WARRANTY; without even the implied warranty of kitaev@213: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the kitaev@213: * GNU General Public License for more details. kitaev@213: * kitaev@213: * For information on how to redistribute this software under kitaev@213: * the terms of a license other than GNU General Public License kitaev@213: * contact TMate Software at support@hg4j.com kitaev@213: */ kitaev@213: package org.tmatesoft.hg.test; kitaev@213: kitaev@213: import java.io.File; kitaev@213: import java.util.LinkedList; kitaev@213: import java.util.List; kitaev@213: import java.util.Map; kitaev@213: import java.util.regex.Matcher; kitaev@213: import java.util.regex.Pattern; kitaev@213: kitaev@213: import org.tmatesoft.hg.repo.HgStatusCollector; kitaev@213: import org.tmatesoft.hg.util.Path; kitaev@213: import org.tmatesoft.hg.util.PathPool; kitaev@213: import org.tmatesoft.hg.util.PathRewrite; kitaev@213: kitaev@213: /** kitaev@213: * kitaev@213: * @author Artem Tikhomirov kitaev@213: * @author TMate Software Ltd. kitaev@213: */ kitaev@213: public class StatusOutputParser implements OutputParser { kitaev@213: kitaev@213: private final Pattern pattern; kitaev@213: // although using StatusCollector.Record is not really quite honest for testing, kitaev@213: // it's deemed acceptable as long as that class is primitive 'collect all results' kitaev@213: private HgStatusCollector.Record result = new HgStatusCollector.Record(); kitaev@213: private final PathPool pathHelper; kitaev@213: kitaev@213: public StatusOutputParser() { kitaev@213: // pattern = Pattern.compile("^([MAR?IC! ]) ([\\w \\.-/\\\\]+)$", Pattern.MULTILINE); kitaev@213: pattern = Pattern.compile("^([MAR?IC! ]) (.+)$", Pattern.MULTILINE); kitaev@213: pathHelper = new PathPool(new PathRewrite() { kitaev@213: kitaev@213: private final boolean winPathSeparator = File.separatorChar == '\\'; kitaev@213: kitaev@213: public String rewrite(String s) { kitaev@213: if (winPathSeparator) { kitaev@213: // Java impl always give slashed path, while Hg uses local, os-specific convention kitaev@213: s = s.replace('\\', '/'); kitaev@213: } kitaev@213: return s; kitaev@213: } kitaev@213: }); kitaev@213: } kitaev@213: kitaev@213: public void reset() { kitaev@213: result = new HgStatusCollector.Record(); kitaev@213: } kitaev@213: kitaev@213: public void parse(CharSequence seq) { kitaev@213: Matcher m = pattern.matcher(seq); kitaev@213: Path lastEntry = null; kitaev@213: while (m.find()) { kitaev@213: Path fname = pathHelper.path(m.group(2)); kitaev@213: switch ((int) m.group(1).charAt(0)) { kitaev@213: case (int) 'M' : { kitaev@213: result.modified(fname); kitaev@213: lastEntry = fname; // for files modified through merge there's also 'copy' source kitaev@213: break; kitaev@213: } kitaev@213: case (int) 'A' : { kitaev@213: result.added(fname); kitaev@213: lastEntry = fname; kitaev@213: break; kitaev@213: } kitaev@213: case (int) 'R' : { kitaev@213: result.removed(fname); kitaev@213: break; kitaev@213: } kitaev@213: case (int) '?' : { kitaev@213: result.unknown(fname); kitaev@213: break; kitaev@213: } kitaev@213: case (int) 'I' : { kitaev@213: result.ignored(fname); kitaev@213: break; kitaev@213: } kitaev@213: case (int) 'C' : { kitaev@213: result.clean(fname); kitaev@213: break; kitaev@213: } kitaev@213: case (int) '!' : { kitaev@213: result.missing(fname); kitaev@213: break; kitaev@213: } kitaev@213: case (int) ' ' : { kitaev@213: // last added is copy destination kitaev@213: // to get or to remove it - depends on what StatusCollector does in this case kitaev@213: result.copied(fname, lastEntry); kitaev@213: lastEntry = null; kitaev@213: break; kitaev@213: } kitaev@213: } kitaev@213: } kitaev@213: } kitaev@213: kitaev@213: // kitaev@213: public List getModified() { kitaev@213: return result.getModified(); kitaev@213: } kitaev@213: kitaev@213: public List getAdded() { kitaev@213: List rv = new LinkedList(result.getAdded()); kitaev@213: for (Path p : result.getCopied().keySet()) { kitaev@213: rv.remove(p); // remove only one duplicate kitaev@213: } kitaev@213: return rv; kitaev@213: } kitaev@213: kitaev@213: public List getRemoved() { kitaev@213: return result.getRemoved(); kitaev@213: } kitaev@213: kitaev@213: public Map getCopied() { kitaev@213: return result.getCopied(); kitaev@213: } kitaev@213: kitaev@213: public List getClean() { kitaev@213: return result.getClean(); kitaev@213: } kitaev@213: kitaev@213: public List getMissing() { kitaev@213: return result.getMissing(); kitaev@213: } kitaev@213: kitaev@213: public List getUnknown() { kitaev@213: return result.getUnknown(); kitaev@213: } kitaev@213: kitaev@213: public List getIgnored() { kitaev@213: return result.getIgnored(); kitaev@213: } kitaev@213: }