tikhomirov@70: /* tikhomirov@70: * Copyright (c) 2011 TMate Software Ltd tikhomirov@70: * tikhomirov@70: * This program is free software; you can redistribute it and/or modify tikhomirov@70: * it under the terms of the GNU General Public License as published by tikhomirov@70: * the Free Software Foundation; version 2 of the License. tikhomirov@70: * tikhomirov@70: * This program is distributed in the hope that it will be useful, tikhomirov@70: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@70: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@70: * GNU General Public License for more details. tikhomirov@70: * tikhomirov@70: * For information on how to redistribute this software under tikhomirov@70: * the terms of a license other than GNU General Public License tikhomirov@102: * contact TMate Software at support@hg4j.com tikhomirov@70: */ tikhomirov@70: package org.tmatesoft.hg.test; tikhomirov@70: tikhomirov@70: import java.util.LinkedList; tikhomirov@70: import java.util.List; tikhomirov@70: import java.util.regex.Matcher; tikhomirov@70: import java.util.regex.Pattern; tikhomirov@70: tikhomirov@74: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@74: tikhomirov@70: tikhomirov@70: /** tikhomirov@70: * tikhomirov@70: * @author Artem Tikhomirov tikhomirov@70: * @author TMate Software Ltd. tikhomirov@70: */ tikhomirov@70: public class LogOutputParser implements OutputParser { tikhomirov@70: private final List result = new LinkedList(); tikhomirov@70: private Pattern pattern1; tikhomirov@70: private Pattern pattern2; tikhomirov@70: private Pattern pattern3; tikhomirov@70: private Pattern pattern4; tikhomirov@152: private Pattern pattern5; tikhomirov@70: tikhomirov@70: public LogOutputParser(boolean outputWithDebug) { tikhomirov@70: if (outputWithDebug) { tikhomirov@70: pattern1 = Pattern.compile("^changeset:\\s+(\\d+):([a-f0-9]{40})\n(^tag:(.+)$)?", Pattern.MULTILINE); tikhomirov@70: pattern2 = Pattern.compile("^parent:\\s+(-?\\d+):([a-f0-9]{40})\n", Pattern.MULTILINE); tikhomirov@70: pattern3 = Pattern.compile("^manifest:\\s+(\\d+):([a-f0-9]{40})\nuser:\\s+(\\S.+)\ndate:\\s+(\\S.+)\n", Pattern.MULTILINE); tikhomirov@152: pattern4 = Pattern.compile("^description:\\n", Pattern.MULTILINE); tikhomirov@152: pattern5 = Pattern.compile("\\n\\n"); tikhomirov@70: //p = "^manifest:\\s+(\\d+):([a-f0-9]{40})\nuser:(.+)$"; tikhomirov@70: } else { tikhomirov@70: throw HgRepository.notImplemented(); tikhomirov@70: } tikhomirov@70: } tikhomirov@70: tikhomirov@70: public void reset() { tikhomirov@70: result.clear(); tikhomirov@70: } tikhomirov@70: tikhomirov@70: public List getResult() { tikhomirov@70: return result; tikhomirov@70: } tikhomirov@70: tikhomirov@70: public void parse(CharSequence seq) { tikhomirov@70: Matcher m = pattern1.matcher(seq); tikhomirov@70: while (m.find()) { tikhomirov@70: Record r = new Record(); tikhomirov@70: r.changesetIndex = Integer.parseInt(m.group(1)); tikhomirov@70: r.changesetNodeid = m.group(2); tikhomirov@70: //tags = m.group(4); tikhomirov@70: m.usePattern(pattern2); tikhomirov@70: if (m.find()) { tikhomirov@70: r.parent1Index = Integer.parseInt(m.group(1)); tikhomirov@70: r.parent1Nodeid = m.group(2); tikhomirov@70: } tikhomirov@70: if (m.find()) { tikhomirov@70: r.parent2Index = Integer.parseInt(m.group(1)); tikhomirov@70: r.parent2Nodeid = m.group(2); tikhomirov@70: } tikhomirov@70: m.usePattern(pattern3); tikhomirov@70: if (m.find()) { tikhomirov@70: r.user = m.group(3); tikhomirov@70: r.date = m.group(4); tikhomirov@70: } tikhomirov@70: m.usePattern(pattern4); tikhomirov@70: if (m.find()) { tikhomirov@152: int commentStart = m.end(); tikhomirov@152: m.usePattern(pattern5); tikhomirov@152: if (m.find()) { tikhomirov@152: r.description = seq.subSequence(commentStart, m.start()).toString(); tikhomirov@152: } tikhomirov@70: } tikhomirov@70: result.add(r); tikhomirov@70: m.usePattern(pattern1); tikhomirov@70: } tikhomirov@70: } tikhomirov@70: tikhomirov@70: public static class Record { tikhomirov@70: public int changesetIndex; tikhomirov@70: public String changesetNodeid; tikhomirov@70: public int parent1Index; tikhomirov@70: public int parent2Index; tikhomirov@70: public String parent1Nodeid; tikhomirov@70: public String parent2Nodeid; tikhomirov@70: public String user; tikhomirov@70: public String date; tikhomirov@70: public String description; tikhomirov@70: } tikhomirov@70: }