Mercurial > jhg
comparison test/com/tmate/hgkit/StatusOutputParser.java @ 61:fac8e7fcc8b0
Simple test framework - capable of parsing Hg cmdline output to compare with Java result
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 18 Jan 2011 18:32:49 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 60:613c936d74e4 | 61:fac8e7fcc8b0 |
|---|---|
| 1 /* | |
| 2 * Copyright (c) 2011 Artem Tikhomirov | |
| 3 */ | |
| 4 package com.tmate.hgkit; | |
| 5 | |
| 6 import java.io.File; | |
| 7 import java.util.Collections; | |
| 8 import java.util.LinkedList; | |
| 9 import java.util.List; | |
| 10 import java.util.Map; | |
| 11 import java.util.TreeMap; | |
| 12 import java.util.regex.Matcher; | |
| 13 import java.util.regex.Pattern; | |
| 14 | |
| 15 /** | |
| 16 * | |
| 17 * @author artem | |
| 18 */ | |
| 19 public class StatusOutputParser implements OutputParser { | |
| 20 | |
| 21 private final Pattern pattern; | |
| 22 private List<String> modified, added, removed, clean, missing, unknown, ignored; | |
| 23 private Map<String, String> copied; | |
| 24 private final boolean winPathSeparator; | |
| 25 | |
| 26 public StatusOutputParser() { | |
| 27 // pattern = Pattern.compile("^([MAR?IC! ]) ([\\w \\.-/\\\\]+)$", Pattern.MULTILINE); | |
| 28 pattern = Pattern.compile("^([MAR?IC! ]) (.+)$", Pattern.MULTILINE); | |
| 29 winPathSeparator = File.separatorChar == '\\'; | |
| 30 } | |
| 31 | |
| 32 public void reset() { | |
| 33 modified = added = removed = clean = missing = unknown = ignored = null; | |
| 34 copied = null; | |
| 35 } | |
| 36 | |
| 37 public void parse(CharSequence seq) { | |
| 38 Matcher m = pattern.matcher(seq); | |
| 39 while (m.find()) { | |
| 40 String fname = m.group(2); | |
| 41 switch ((int) m.group(1).charAt(0)) { | |
| 42 case (int) 'M' : { | |
| 43 modified = doAdd(modified, fname); | |
| 44 break; | |
| 45 } | |
| 46 case (int) 'A' : { | |
| 47 added = doAdd(added, fname); | |
| 48 break; | |
| 49 } | |
| 50 case (int) 'R' : { | |
| 51 removed = doAdd(removed, fname); | |
| 52 break; | |
| 53 } | |
| 54 case (int) '?' : { | |
| 55 unknown = doAdd(unknown, fname); | |
| 56 break; | |
| 57 } | |
| 58 case (int) 'I' : { | |
| 59 ignored = doAdd(ignored, fname); | |
| 60 break; | |
| 61 } | |
| 62 case (int) 'C' : { | |
| 63 clean = doAdd(clean, fname); | |
| 64 break; | |
| 65 } | |
| 66 case (int) '!' : { | |
| 67 missing = doAdd(missing, fname); | |
| 68 break; | |
| 69 } | |
| 70 case (int) ' ' : { | |
| 71 if (copied == null) { | |
| 72 copied = new TreeMap<String, String>(); | |
| 73 } | |
| 74 // last added is copy destination | |
| 75 // to get or to remove it - depends on what StatusCollector does in this case | |
| 76 copied.put(fname, added.get(added.size() - 1)); | |
| 77 break; | |
| 78 } | |
| 79 } | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 // | |
| 84 public List<String> getModified() { | |
| 85 return proper(modified); | |
| 86 } | |
| 87 | |
| 88 public List<String> getAdded() { | |
| 89 return proper(added); | |
| 90 } | |
| 91 | |
| 92 public List<String> getRemoved() { | |
| 93 return proper(removed); | |
| 94 } | |
| 95 | |
| 96 public Map<String,String> getCopied() { | |
| 97 if (copied == null) { | |
| 98 return Collections.emptyMap(); | |
| 99 } | |
| 100 return Collections.unmodifiableMap(copied); | |
| 101 } | |
| 102 | |
| 103 public List<String> getClean() { | |
| 104 return proper(clean); | |
| 105 } | |
| 106 | |
| 107 public List<String> getMissing() { | |
| 108 return proper(missing); | |
| 109 } | |
| 110 | |
| 111 public List<String> getUnknown() { | |
| 112 return proper(unknown); | |
| 113 } | |
| 114 | |
| 115 public List<String> getIgnored() { | |
| 116 return proper(ignored); | |
| 117 } | |
| 118 | |
| 119 private List<String> proper(List<String> l) { | |
| 120 if (l == null) { | |
| 121 return Collections.emptyList(); | |
| 122 } | |
| 123 return Collections.unmodifiableList(l); | |
| 124 } | |
| 125 | |
| 126 private List<String> doAdd(List<String> l, String s) { | |
| 127 if (l == null) { | |
| 128 l = new LinkedList<String>(); | |
| 129 } | |
| 130 if (winPathSeparator) { | |
| 131 // Java impl always give slashed path, while Hg uses local, os-specific convention | |
| 132 s = s.replace('\\', '/'); | |
| 133 } | |
| 134 l.add(s); | |
| 135 return l; | |
| 136 } | |
| 137 } |
