package org.jmeld.vc.svn;
import org.jmeld.diff.*;
import org.jmeld.util.*;
import org.jmeld.vc.*;
import org.jmeld.vc.util.*;
import java.io.*;
import java.util.regex.*;
public class DiffCmd
extends VcCmd<DiffData>
{
// Instance variables:
private File file;
private boolean recursive;
private BufferedReader reader;
private String unreadLine;
public DiffCmd(File file, boolean recursive)
{
this.file = file;
this.recursive = recursive;
}
public Result execute()
{
super.execute("svn", "diff", "--non-interactive", "--no-diff-deleted",
recursive ? "" : "-N", file.getPath());
return getResult();
}
protected void build(byte[] data)
{
String path;
JMRevision revision;
JMDelta delta;
DiffData diffData;
diffData = new DiffData();
reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(
data)));
try
{
for (;;)
{
path = readIndex();
if (path == null)
{
break;
}
System.out.println("path = " + path);
revision = new JMRevision(null, null);
diffData.addTarget(path, revision);
readLine(); // =====================================
readLine(); // --- <Path> (revision ...)
readLine(); // +++ <Path> (working copy)
for (;;)
{
delta = readDelta();
if (delta == null)
{
break;
}
revision.add(delta);
}
}
}
catch (IOException ex)
{
ex.printStackTrace();
setResult(Result.FALSE("Parse failed"));
}
setResultData(diffData);
}
private String readIndex()
throws IOException
{
final String indexMarker = "Index: ";
String line;
line = readLine();
if (line == null || !line.startsWith(indexMarker))
{
return null;
}
return line.substring(indexMarker.length());
}
private JMDelta readDelta()
throws IOException
{
final Pattern deltaPattern = Pattern
.compile("@@ -(\\d*),(\\d*) \\+(\\d*),(\\d*) @@");
String line;
Matcher m;
JMDelta delta;
JMChunk originalChunk;
JMChunk revisedChunk;
// @@ <LineNumberRevision>,<NumberOfLines> <lineNumberWorkingCopy>,<NumberOfLines> @@
line = readLine();
if (line == null)
{
return null;
}
m = deltaPattern.matcher(line);
if (!m.matches())
{
unreadLine(line);
return null;
}
originalChunk = new JMChunk(Integer.valueOf(m.group(1)), Integer.valueOf(m
.group(2)));
revisedChunk = new JMChunk(Integer.valueOf(m.group(3)), Integer.valueOf(m
.group(4)));
delta = new JMDelta(originalChunk, revisedChunk);
while ((line = readLine()) != null)
{
if (line.startsWith(" "))
{
continue;
}
if (line.startsWith("+"))
{
continue;
}
if (line.startsWith("-"))
{
continue;
}
unreadLine(line);
break;
}
System.out.println("delta = " + delta);
return delta;
}
private void unreadLine(String unreadLine)
{
this.unreadLine = unreadLine;
}
private String readLine()
throws IOException
{
String line;
if (unreadLine != null)
{
line = unreadLine;
unreadLine = null;
return line;
}
return reader.readLine();
}
public static void main(String[] args)
{
DiffCmd cmd;
DiffIF result;
File file = parseFile(args);
if (file == null) {
return;
}
result = new SubversionVersionControl()
.executeDiff(file, true);
if (result != null)
{
for (DiffIF.TargetIF target : result.getTargetList())
{
System.out.println(target.getPath() + " " + target.getRevision());
}
}
}
}