intelligen / java-diff-utils

Automatically exported from code.google.com/p/java-diff-utils
0 stars 0 forks source link

Added lines directly after deleted lines don't show #17

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
I've found, by chance, that when you do a diff where the modified file adds 
lines right after deleted lines, the additions don't show in the diff. If the 
additions are elsewhere they will show. The two attached files show this 
discrepancy. I used the Chunk.java class from the source.

I removed lines 65-71, and added the following at line 65:
    //add a new line here
I also removed lines 113-117, and added the same line at 113 (which is now 107 
in the modified file).

Also note that I deleted lines starting at 65 and 113, not 64 and 112 as is 
reported by the diff algorithm.

I used the code below, which is a modified version of "Task 1: Compute the 
difference between to files and print its deltas" 

I can only assume this is an issue with the implementation of the MyersDiff 
algorithm (MyersDiff.java) as my program just follows the basic test. 

Any ideas? I'm looking at the MyersDiff.java code, but it looks like I may need 
to read up on the Algorithm first.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import difflib.Chunk;
import difflib.Delta;
import difflib.DiffUtils;
import difflib.InsertDelta;
import difflib.Patch;

public class DiffTest1 {

    // Helper method for get the file content
    private static List<String> fileToLines(String filename) {
            List<String> lines = new LinkedList<String>();
            String line = "";
            try {
                    BufferedReader in = new BufferedReader(new FileReader(filename));
                    while ((line = in.readLine()) != null) {
                            lines.add(line);
                    }
            } catch (IOException e) {
                    e.printStackTrace();
            }
            return lines;
    }

    public static void main(String[] args) {
            List<String> original = fileToLines("Chunk1.java");
            List<String> revised  = fileToLines("Chunk2.java");

            // Compute diff. Get the Patch object. Patch is the container for computed deltas.
            Patch patch = DiffUtils.diff(original, revised);
            for (Delta delta: patch.getDeltas()) {
                System.out.println(delta);
            }

            //print out a detailed list of changes
            try {
                for (Delta delta: patch.getDeltas()) {
                    if(delta instanceof InsertDelta){
                        System.out.println("(+ at " + delta.getOriginal().getPosition() + ")");
                        Chunk ck = delta.getRevised();

                        for(String sl: (List<String>)ck.getLines()){
                            System.out.println(sl);
                        }

                    }else{
                        System.out.println("(- at " + delta.getOriginal().getPosition() + ")");
                        Chunk ck = delta.getOriginal();

                        for(String sl: (List<String>)ck.getLines()){
                            System.out.println(sl);
                        }
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

    }

}

Original issue reported on code.google.com by aprestw...@gmail.com on 13 Apr 2011 at 4:40

Attachments:

GoogleCodeExporter commented 9 years ago
Sorry, false alarm. After reviewing the code and output more I found it is 
working correctly, I wasn't :/. I wasn't processing ChangeDeltas correctly as I 
was treating them as DeleteDeltas (was looking for inserts and deletes).
Sorry for any confusion, here is the modified code.

public class DiffTest1 {

    // Helper method for get the file content
    private static List<String> fileToLines(String filename) {
            List<String> lines = new LinkedList<String>();
            String line = "";
            try {
                    BufferedReader in = new BufferedReader(new FileReader(filename));
                    while ((line = in.readLine()) != null) {
                            lines.add(line);
                    }
            } catch (IOException e) {
                    e.printStackTrace();
            }
            return lines;
    }

    public static void main(String[] args) {
            List<String> original = fileToLines("Chunk1.java");
            List<String> revised  = fileToLines("Chunk2.java");
            //List<String> original = fileToLines("Test.java");
            //List<String> revised  = fileToLines("Test2.java");

            // Compute diff. Get the Patch object. Patch is the container for computed deltas.
            Patch patch = DiffUtils.diff(original, revised);
            System.out.println("Changes: " + patch.getDeltas().size());
            for (Delta delta: patch.getDeltas()) {
                System.out.println(delta);
            }

            //print out a detailed list of changes
            try {
                for (Delta delta: patch.getDeltas()) {
                    System.out.println("(at " + delta.getOriginal().getPosition() + ")");
                    if(delta instanceof InsertDelta){

                        Chunk ck = delta.getRevised();

                        for(String sl: (List<String>)ck.getLines()){
                            System.out.println("(+)"+sl);
                        }

                    }else if(delta instanceof DeleteDelta){
                        Chunk ck = delta.getOriginal();

                        for(String sl: (List<String>)ck.getLines()){
                            System.out.println("(-)"+sl);
                        }
                    }else{
                        //change
                        Chunk ck = delta.getOriginal();

                        for(String sl: (List<String>)ck.getLines()){
                            System.out.println("(-)"+sl);
                        }
                        ck = delta.getRevised();

                        for(String sl: (List<String>)ck.getLines()){
                            System.out.println("(+)"+sl);
                        }
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

    }

}

Original comment by aprestw...@gmail.com on 13 Apr 2011 at 8:20

GoogleCodeExporter commented 9 years ago

Original comment by dm.naume...@gmail.com on 20 May 2011 at 10:03