Mercurial > hg4j
diff hg4j/src/test/java/org/tmatesoft/hg/test/StatusOutputParser.java @ 213:6ec4af642ba8 gradle
Project uses Gradle for build - actual changes
author | Alexander Kitaev <kitaev@gmail.com> |
---|---|
date | Tue, 10 May 2011 10:52:53 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hg4j/src/test/java/org/tmatesoft/hg/test/StatusOutputParser.java Tue May 10 10:52:53 2011 +0200 @@ -0,0 +1,148 @@ +/* + * 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@hg4j.com + */ +package org.tmatesoft.hg.test; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.tmatesoft.hg.repo.HgStatusCollector; +import org.tmatesoft.hg.util.Path; +import org.tmatesoft.hg.util.PathPool; +import org.tmatesoft.hg.util.PathRewrite; + +/** + * + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public class StatusOutputParser implements OutputParser { + + private final Pattern pattern; + // although using StatusCollector.Record is not really quite honest for testing, + // it's deemed acceptable as long as that class is primitive 'collect all results' + private HgStatusCollector.Record result = new HgStatusCollector.Record(); + private final PathPool pathHelper; + + public StatusOutputParser() { +// pattern = Pattern.compile("^([MAR?IC! ]) ([\\w \\.-/\\\\]+)$", Pattern.MULTILINE); + pattern = Pattern.compile("^([MAR?IC! ]) (.+)$", Pattern.MULTILINE); + pathHelper = new PathPool(new PathRewrite() { + + private final boolean winPathSeparator = File.separatorChar == '\\'; + + public String rewrite(String s) { + if (winPathSeparator) { + // Java impl always give slashed path, while Hg uses local, os-specific convention + s = s.replace('\\', '/'); + } + return s; + } + }); + } + + public void reset() { + result = new HgStatusCollector.Record(); + } + + public void parse(CharSequence seq) { + Matcher m = pattern.matcher(seq); + Path lastEntry = null; + while (m.find()) { + Path fname = pathHelper.path(m.group(2)); + switch ((int) m.group(1).charAt(0)) { + case (int) 'M' : { + result.modified(fname); + lastEntry = fname; // for files modified through merge there's also 'copy' source + break; + } + case (int) 'A' : { + result.added(fname); + lastEntry = fname; + break; + } + case (int) 'R' : { + result.removed(fname); + break; + } + case (int) '?' : { + result.unknown(fname); + break; + } + case (int) 'I' : { + result.ignored(fname); + break; + } + case (int) 'C' : { + result.clean(fname); + break; + } + case (int) '!' : { + result.missing(fname); + break; + } + case (int) ' ' : { + // last added is copy destination + // to get or to remove it - depends on what StatusCollector does in this case + result.copied(fname, lastEntry); + lastEntry = null; + break; + } + } + } + } + + // + public List<Path> getModified() { + return result.getModified(); + } + + public List<Path> getAdded() { + List<Path> rv = new LinkedList<Path>(result.getAdded()); + for (Path p : result.getCopied().keySet()) { + rv.remove(p); // remove only one duplicate + } + return rv; + } + + public List<Path> getRemoved() { + return result.getRemoved(); + } + + public Map<Path,Path> getCopied() { + return result.getCopied(); + } + + public List<Path> getClean() { + return result.getClean(); + } + + public List<Path> getMissing() { + return result.getMissing(); + } + + public List<Path> getUnknown() { + return result.getUnknown(); + } + + public List<Path> getIgnored() { + return result.getIgnored(); + } +}