|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.vcs.profiles.commands; import org.openide.util.NbBundle; import org.netbeans.api.diff.Difference; import org.netbeans.modules.vcscore.VcsFileSystem; /** * Parser of differences produced by VCS commands. Several formats are handled. * * @author Martin Entlicher */ public class Diff extends AbstractDiffCommand { private static final String CVS_REVISION_STR = "retrieving revision"; private static final String VSS_DIFFING = "Diffing: "; private static final String VSS_AGAINST = "Against: "; private static final String CA_REP = "-REP "; private static final String CA_INS = "-INS "; private static final String CA_DEL = "-DEL "; private int lastLine1 = 0; private int lastLine2 = 0; private int lastDiff = 0; // for STCMD and PVCS private int lastDiffLine1 = 0; // for STCMD and PVCS private int lastDiffLine2 = 0; // for STCMD and PVCS private int caDocShift = 0; // the "shift" of the second document line numbers private StringBuffer firstText = new StringBuffer(); private StringBuffer secondText = new StringBuffer(); //static final long serialVersionUID =8341896634226664590L; /** Creates new Diff */ public Diff() { //setBundle(org.openide.util.NbBundle.getBundle(Diff.class)); } /** Set the VCS file system to use to execute commands. */ public void setFileSystem(VcsFileSystem fileSystem) { super.setFileSystem(fileSystem); } public void outputData(String[] elements) { switch(outputType) { case 0: match0(elements); // CVS break; case 1: match1(elements); // StarTeam break; case 2: match2(elements); // VSS break; case 3: match3(elements); // PVCS break; } } /** * Matches output compatible with Unix diff command. * @params elements The input to parse. */ public void matchUnixLike(String[] elements) { if (elements[0].startsWith("< ")) { firstText.append(elements[0].substring(2) + "\n"); return ; } else if (elements[0].startsWith("> ")) { secondText.append(elements[0].substring(2) + "\n"); return ; } else if (elements[0].startsWith("--")) { return ; } else { setTextOnLastDifference(firstText.toString(), secondText.toString()); firstText.delete(0, firstText.length()); secondText.delete(0, secondText.length()); } int index = 0, commaIndex = 0; int n1 = 0, n2 = 0, n3 = 0, n4 = 0; String nStr; if ((index = elements[0].indexOf('a')) >= 0) { //DiffAction action = new DiffAction(); try { n1 = Integer.parseInt(elements[0].substring(0, index)); index++; commaIndex = elements[0].indexOf(',', index); if (commaIndex < 0) { nStr = elements[0].substring(index, elements[0].length()); if (checkEmpty(nStr, elements[0])) return; n3 = Integer.parseInt(nStr); n4 = n3; } else { nStr = elements[0].substring(index, commaIndex); if (checkEmpty(nStr, elements[0])) return; n3 = Integer.parseInt(nStr); nStr = elements[0].substring(commaIndex+1, elements[0].length()); if (nStr == null || nStr.length() == 0) n4 = n3; else n4 = Integer.parseInt(nStr); } } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } return; } addDifference(new Difference(Difference.ADD, n1, 0, n3, n4)); //diff.addAddAction(n1, n3, n4); } else if ((index = elements[0].indexOf('d')) >= 0) { commaIndex = elements[0].lastIndexOf(',', index); try { if (commaIndex < 0) { n1 = Integer.parseInt(elements[0].substring(0, index)); n2 = n1; } else { nStr = elements[0].substring(0, commaIndex); if (checkEmpty(nStr, elements[0])) return; n1 = Integer.parseInt(nStr); nStr = elements[0].substring(commaIndex+1, index); if (checkEmpty(nStr, elements[0])) return; n2 = Integer.parseInt(nStr); } nStr = elements[0].substring(index+1, elements[0].length()); if (checkEmpty(nStr, elements[0])) return; n3 = Integer.parseInt(nStr); } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } return; } addDifference(new Difference(Difference.DELETE, n1, n2, n3, 0)); //diff.addDeleteAction(n1, n2, n3); } else if ((index = elements[0].indexOf('c')) >= 0) { commaIndex = elements[0].lastIndexOf(',', index); try { if (commaIndex < 0) { n1 = Integer.parseInt(elements[0].substring(0, index)); n2 = n1; } else { nStr = elements[0].substring(0, commaIndex); if (checkEmpty(nStr, elements[0])) return; n1 = Integer.parseInt(nStr); nStr = elements[0].substring(commaIndex+1, index); if (checkEmpty(nStr, elements[0])) return; n2 = Integer.parseInt(nStr); } index++; commaIndex = elements[0].indexOf(',', index); if (commaIndex < 0) { nStr = elements[0].substring(index, elements[0].length()); if (checkEmpty(nStr, elements[0])) return; n3 = Integer.parseInt(nStr); n4 = n3; } else { nStr = elements[0].substring(index, commaIndex); if (checkEmpty(nStr, elements[0])) return; n3 = Integer.parseInt(nStr); nStr = elements[0].substring(commaIndex+1, elements[0].length()); if (nStr == null || nStr.length() == 0) n4 = n3; else n4 = Integer.parseInt(nStr); } } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } return; } addDifference(new Difference(Difference.CHANGE, n1, n2, n3, n4)); //diff.addChangeAction(n1, n2, n3, n4); } } /** * Matches output in CA-LIBRARIAN format. * @params elements The input to parse. */ public void matchCALibrarian(String[] elements) { } /** * Matches output compatible with cvs diff command. * @params elements The input to parse. */ public void match0(String[] elements) { if (elements[0].indexOf(CVS_REVISION_STR) == 0) { String rev = elements[0].substring(CVS_REVISION_STR.length()).trim(); if (diffOutRev1 == null) diffOutRev1 = rev; else diffOutRev2 = rev; } else { matchUnixLike(elements); } } public void match2(String[] elements) { if (elements[0].indexOf(VSS_DIFFING) == 0) { if (elements[0].charAt(VSS_DIFFING.length()) == '$') { int index = elements[0].lastIndexOf(';'); if (index > 0) { String rev = elements[0].substring(index + 1); diffOutRev1 = rev; } } } else if (elements[0].indexOf(VSS_AGAINST) == 0) { if (elements[0].charAt(VSS_AGAINST.length()) == '$') { int index = elements[0].lastIndexOf(';'); if (index > 0) { String rev = elements[0].substring(index + 1); diffOutRev2 = rev; } } } else { matchUnixLike(elements); } } /** * Matches output compatible with stcmd (StarTeam command) diff command. * @params elements The input to parse. */ public void match1(String[] elements) { final int LINE1_POS = 8; final int LINE2_POS = 16; if (elements[0] == null || elements[0].length() < LINE2_POS) return; char firstChar = elements[0].charAt(0); if (firstChar != ' ' && firstChar != '-' && firstChar != '+' || elements[0].substring(0, 2).equals("--")) { lastLine1 = lastLine2 = 0; return; } int n1 = lastLine1; int n2 = lastLine2; String n1Str = elements[0].substring(1, LINE1_POS).trim(); String n2Str = elements[0].substring(LINE1_POS, LINE2_POS).trim(); try { if (firstChar != '+') n1 = Integer.parseInt(n1Str); if (firstChar != '-') n2 = Integer.parseInt(n2Str); } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } } lastLine1 = n1; lastLine2 = n2; if (elements[0].charAt(0) == '+' && elements[0].charAt(1) != '-') { // ADD if (lastDiff > 0) return; // last was add else if (lastDiff < 0) { // last was delete, it ends now //DiffAction action = new DiffAction(); //action.setDeleteAction(lastDiffLine1, n1, lastDiffLine2); addDifference(new Difference(Difference.DELETE, lastDiffLine1, n1, lastDiffLine2, 0)); //diff.addDeleteAction(lastDiffLine1, n1, lastDiffLine2); //diffActions.add(action); } lastDiff = 1; // anything > 0 lastDiffLine1 = n1; lastDiffLine2 = n2; } else if (elements[0].charAt(0) == '-' && elements[0].charAt(1) != '-') { // DELETE if (lastDiff < 0) return; // last was delete else if (lastDiff > 0) { // last was add, it ends now //DiffAction action = new DiffAction(); //action.setAddAction(lastDiffLine1, lastDiffLine2, n2); addDifference(new Difference(Difference.ADD, lastDiffLine1, 0, lastDiffLine2, n2)); //diff.addAddAction(lastDiffLine1, lastDiffLine2, n2); //diffActions.add(action); } lastDiff = -1; // anything < 0 lastDiffLine1 = n1; lastDiffLine2 = n2; } else { if (lastDiff > 0) { // ADD //DiffAction action = new DiffAction(); //action.setAddAction(lastDiffLine1, lastDiffLine2, n2 - 1); addDifference(new Difference(Difference.ADD, lastDiffLine1, 0, lastDiffLine2, n2 - 1)); //diff.addAddAction(lastDiffLine1, lastDiffLine2, n2 - 1); //diffActions.add(action); } else if (lastDiff < 0) { // DELETE //DiffAction action = new DiffAction(); //action.setDeleteAction(lastDiffLine1, n1 - 1, lastDiffLine2); addDifference(new Difference(Difference.DELETE, lastDiffLine1, n1 - 1, lastDiffLine2, 0)); //diff.addDeleteAction(lastDiffLine1, n1 - 1, lastDiffLine2); //diffActions.add(action); } lastDiff = 0; } } private void addCADiffAction() { switch (lastDiff) { case 1: addDifference(new Difference(Difference.CHANGE, lastLine1, lastLine2, lastDiffLine1, lastDiffLine2, null, secondText.toString())); //diff.addChangeAction(lastLine1, lastLine2, lastDiffLine1, lastDiffLine2); caDocShift -= lastLine2 - lastLine1 - (lastDiffLine2 - lastDiffLine1); //System.out.println("Change("+lastLine1+", "+lastLine2+", "+lastDiffLine1+", "+lastDiffLine2+"), caDocShift = "+caDocShift); break; case -1: addDifference(new Difference(Difference.DELETE, lastLine1, lastLine2, lastDiffLine1, 0, null, secondText.toString())); //diff.addDeleteAction(lastLine1, lastLine2, lastDiffLine1); caDocShift -= lastLine2 + 1 - lastLine1; //System.out.println("Delete("+lastLine1+", "+lastLine2+", "+lastDiffLine1+"), caDocShift = "+caDocShift); break; case 2: addDifference(new Difference(Difference.ADD, lastLine1, 0, lastDiffLine1, lastDiffLine2, null, secondText.toString())); //diff.addAddAction(lastLine1, lastDiffLine1, lastDiffLine2); caDocShift += lastDiffLine2 + 1 - lastDiffLine1; //System.out.println("Add("+lastLine1+", "+lastDiffLine1+", "+lastDiffLine2+"), caDocShift = "+caDocShift); break; } secondText.delete(0, secondText.length()); lastDiff = 0; } /** * Matches output of PVCS vdiff in CA-LIBRARIAN format. * @params elements The input to parse. */ public void match3(String[] elements) { //System.out.println("match3("+elements[0]+")"); if (elements.length == 0) return ; if (elements[0] == null) elements[0] = ""; int n1, n2; if (elements[0].indexOf(CA_REP) == 0) { if (lastDiff != 0) addCADiffAction(); int index = CA_REP.length(); int comma = elements[0].indexOf(',', index); if (comma < 0) return ; try { n1 = Integer.parseInt(elements[0].substring(index, comma)); n2 = Integer.parseInt(elements[0].substring(comma + 1)); } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } return; } lastDiff = 1; // Change lastLine1 = n1; // lines in the first document lastLine2 = n2; // lines in the first document lastDiffLine1 = n1 + caDocShift; lastDiffLine2 = lastDiffLine1 - 1; } else if (elements[0].indexOf(CA_INS) == 0) { if (lastDiff != 0) addCADiffAction(); int index = CA_INS.length(); try { n1 = Integer.parseInt(elements[0].substring(index)); } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } return; } lastDiff = 2; // Add lastLine1 = n1; // lines in the first document //lastLine2 = n2; // lines in the first document lastDiffLine1 = n1 + 1+ caDocShift; lastDiffLine2 = lastDiffLine1 - 1; } else if (elements[0].indexOf(CA_DEL) == 0) { if (lastDiff != 0) addCADiffAction(); int index = CA_DEL.length(); int comma = elements[0].indexOf(',', index); try { if (comma >= 0) { n1 = Integer.parseInt(elements[0].substring(index, comma)); n2 = Integer.parseInt(elements[0].substring(comma + 1)); } else { n1 = Integer.parseInt(elements[0].substring(index)); n2 = n1; } } catch (NumberFormatException e) { if (this.stderrListener != null) { String[] debugOut = { "NumberFormatException "+e.getMessage() }; stderrListener.outputData(debugOut); } return; } lastDiff = -1; // Delete lastLine1 = n1; // lines in the first document lastLine2 = n2; // lines in the first document lastDiffLine1 = n1 - 1 + caDocShift; lastDiffLine2 = lastDiffLine1; addCADiffAction(); } else { lastDiffLine2++; // All text output concerns the second file. secondText.append(elements[0] + "\n"); } } /** Perform a cleanup of actions after diff finishes. */ protected void diffFinished() { switch(outputType) { case 3: // PVCS if (lastDiff != 0) addCADiffAction(); break; } if (firstText.length() > 0 || secondText.length() > 0) { setTextOnLastDifference(firstText.toString(), secondText.toString()); } } protected String getTitleHeadRevision() { return NbBundle.getMessage(Diff.class, "Diff.titleHeadRevision"); } protected String getTitleWorkingRevision() { return NbBundle.getMessage(Diff.class, "Diff.titleWorkingFile"); } protected String getTitleRevision(String revNumber) { return NbBundle.getMessage(Diff.class, "Diff.titleRevision", revNumber); } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.