in org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/GitCompareFileRevisionEditorInput.java [178:271]
private DiffNode compare(ITypedElement actLeft, ITypedElement actRight, ITypedElement actAncestor) {
if (actLeft.getType().equals(ITypedElement.FOLDER_TYPE)) {
// return new MyDiffContainer(null, left,right);
DiffNode diffNode = new DiffNode(null, Differencer.CHANGE,
actAncestor, actLeft, actRight);
ITypedElement[] lc = (ITypedElement[])((IStructureComparator)actLeft).getChildren();
ITypedElement[] rc = (ITypedElement[])((IStructureComparator)actRight).getChildren();
ITypedElement[] ac = null;
if (actAncestor != null)
ac = (ITypedElement[]) ((IStructureComparator) actAncestor)
.getChildren();
int li=0;
int ri=0;
while (li<lc.length && ri<rc.length) {
ITypedElement ln = lc[li];
ITypedElement rn = rc[ri];
ITypedElement an = null;
if (ac != null)
an = ac[ri];
int compareTo = ln.getName().compareTo(rn.getName());
// TODO: Git ordering!
if (compareTo == 0) {
if (!ln.equals(rn))
diffNode.add(compare(ln,rn, an));
++li;
++ri;
} else if (compareTo < 0) {
DiffNode childDiffNode = new DiffNode(Differencer.ADDITION, an, ln, null);
diffNode.add(childDiffNode);
if (ln.getType().equals(ITypedElement.FOLDER_TYPE)) {
ITypedElement[] children = (ITypedElement[])((IStructureComparator)ln).getChildren();
if(children != null && children.length > 0) {
for (ITypedElement child : children) {
childDiffNode.add(addDirectoryFiles(child, Differencer.ADDITION));
}
}
}
++li;
} else {
DiffNode childDiffNode = new DiffNode(Differencer.DELETION, an, null, rn);
diffNode.add(childDiffNode);
if (rn.getType().equals(ITypedElement.FOLDER_TYPE)) {
ITypedElement[] children = (ITypedElement[])((IStructureComparator)rn).getChildren();
if(children != null && children.length > 0) {
for (ITypedElement child : children) {
childDiffNode.add(addDirectoryFiles(child, Differencer.DELETION));
}
}
}
++ri;
}
}
while (li<lc.length) {
ITypedElement ln = lc[li];
ITypedElement an = null;
if (ac != null)
an= ac[li];
DiffNode childDiffNode = new DiffNode(Differencer.ADDITION, an, ln, null);
diffNode.add(childDiffNode);
if (ln.getType().equals(ITypedElement.FOLDER_TYPE)) {
ITypedElement[] children = (ITypedElement[])((IStructureComparator)ln).getChildren();
if(children != null && children.length > 0) {
for (ITypedElement child : children) {
childDiffNode.add(addDirectoryFiles(child, Differencer.ADDITION));
}
}
}
++li;
}
while (ri<rc.length) {
ITypedElement rn = rc[ri];
ITypedElement an = null;
if (ac != null)
an = ac[ri];
DiffNode childDiffNode = new DiffNode(Differencer.DELETION, an, null, rn);
diffNode.add(childDiffNode);
if (rn.getType().equals(ITypedElement.FOLDER_TYPE)) {
ITypedElement[] children = (ITypedElement[])((IStructureComparator)rn).getChildren();
if(children != null && children.length > 0) {
for (ITypedElement child : children) {
childDiffNode.add(addDirectoryFiles(child, Differencer.DELETION));
}
}
}
++ri;
}
return diffNode;
} else {
if (actAncestor != null)
return new DiffNode(Differencer.CONFLICTING, actAncestor, actLeft, actRight);
else
return new DiffNode(actLeft, actRight);
}
}