| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.tests.ccvs.ui.old; |
| |
| |
| import java.io.BufferedOutputStream; |
| import java.io.File; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.PrintStream; |
| |
| import org.xml.sax.SAXException; |
| |
| public class PrintDiffMain { |
| public static void main(String[] args) { |
| Parser parser = new Parser(); |
| if (! parser.parse(args)) { |
| System.err.println("Usage: <newer log> <older log> [-out <file>] [-csv] [-t <thresh>] [-i]"); |
| System.err.println(" -out <file> : specify the output file, default is console"); |
| System.err.println(" -csv : produce comma separated values data"); |
| System.err.println(" -t <thresh> : minimum non-negligible absolute % change"); |
| System.err.println(" -i : ignore negligible changes in results"); |
| return; |
| } |
| try { |
| PrintStream ps = System.out; |
| try { |
| if (parser.outputFile != null) ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(parser.outputFile))); |
| printDiff(ps, parser.newerLogFile, parser.olderLogFile, parser.csv, parser.thresh, parser.ignore); |
| } finally { |
| if (ps != System.out) ps.close(); |
| } |
| } catch (Exception e) { |
| System.err.println("An error occurred:"); |
| e.printStackTrace(); |
| return; |
| } |
| } |
| |
| private static void printDiff(PrintStream ps, File newerLogFile, File olderLogFile, |
| boolean csv, int thresh, boolean ignore) throws IOException, SAXException { |
| // read and merge newer log |
| RootEntry newerRoot = LogEntry.readLog(newerLogFile); |
| MergeRunsVisitor mergeVisitor = new MergeRunsVisitor(null); |
| newerRoot.accept(mergeVisitor); |
| newerRoot = mergeVisitor.getMergedRoot(); |
| |
| // read and merge older log |
| RootEntry olderRoot = LogEntry.readLog(olderLogFile); |
| olderRoot.accept(mergeVisitor); |
| olderRoot = mergeVisitor.getMergedRoot(); |
| |
| // format options |
| StringBuffer options = new StringBuffer(); |
| if (thresh != 0) { |
| options.append("-t "); |
| options.append(Integer.toString(thresh)); |
| options.append(" "); |
| } |
| if (ignore) options.append("-i "); |
| |
| // format log file |
| if (csv) { |
| DelimitedValuesWriter writer = new DelimitedValuesWriter(ps, ",", true /*quoted*/); |
| // print header |
| writer.printRecord(new String[] { "", "Newer", "Older" }); |
| writer.printRecord(new String[] { "Log File", newerLogFile.toString(), olderLogFile.toString() }); |
| writer.printRecord(new String[] { "Generated", newerRoot.getTimestamp(), olderRoot.getTimestamp() }); |
| writer.printRecord(new String[] { "SDK Build", newerRoot.getSDKBuildId(), olderRoot.getSDKBuildId() }); |
| writer.endRecord(); |
| writer.printRecord(new String[] { "Options", "'" + options.toString() }); |
| writer.endRecord(); |
| writer.printRecord(new String[] { "", "", "", |
| "Newer", "", "", "", |
| "Older", "", "", "", |
| "", "", "" }); |
| writer.printRecord(new String[] { "Case", "Group", "Task", |
| "Runs", "Avg. (ms)", "95% C.I. (ms)", "95% C.I. (%)", |
| "Runs", "Avg. (ms)", "95% C.I. (ms)", "95% C.I. (%)", |
| "Change", "Diff (ms)", "Diff (%)" }); |
| // print quoted CSV data |
| PrintCSVDiffVisitor diffVisitor = new PrintCSVDiffVisitor(writer, olderRoot, thresh, ignore); |
| newerRoot.accept(diffVisitor); |
| } else { |
| // print header |
| ps.println("=== LOG DIFF ==="); |
| ps.println("Newer File: " + newerLogFile); |
| ps.println(" Generated: " + newerRoot.getTimestamp()); |
| ps.println(" SDK Build: " + newerRoot.getSDKBuildId()); |
| ps.println("Older File: " + olderLogFile); |
| ps.println(" Generated: " + olderRoot.getTimestamp()); |
| ps.println(" SDK Build: " + olderRoot.getSDKBuildId()); |
| ps.println("Options: " + options.toString()); |
| ps.println(); |
| // compute and print the differences |
| PrintTextDiffVisitor diffVisitor = new PrintTextDiffVisitor(ps, olderRoot, thresh, ignore); |
| newerRoot.accept(diffVisitor); |
| } |
| } |
| |
| private static class Parser extends ArgumentParser { |
| public File newerLogFile = null; |
| public File olderLogFile = null; |
| public File outputFile = null; |
| public boolean csv = false; |
| public int thresh = 0; |
| public boolean ignore = false; |
| |
| protected boolean handleFinished() { |
| return newerLogFile != null && olderLogFile != null; |
| } |
| protected boolean handleArgument(int index, String arg) { |
| if (index == 0) { |
| newerLogFile = new File(arg); |
| } else if (index == 1) { |
| olderLogFile = new File(arg); |
| } else { |
| return false; |
| } |
| return true; |
| } |
| protected boolean handleOption(String option, String arg) { |
| if ("-out".equals(option)) { |
| if (arg == null) return false; |
| outputFile = new File(arg); |
| } else if ("-csv".equals(option)) { |
| if (arg != null) return false; |
| csv = true; |
| } else if ("-t".equals(option)) { |
| if (arg == null) return false; |
| try { |
| thresh = Integer.parseInt(arg, 10); |
| } catch (NumberFormatException e) { |
| return false; |
| } |
| if (thresh < 0) return false; |
| } else if ("-i".equals(option)) { |
| if (arg != null) return false; |
| ignore = true; |
| } else { |
| return false; |
| } |
| return true; |
| } |
| } |
| } |