/*******************************************************************************
* Copyright (C) 2011, Dariusz Luksza <dariusz@luksza.org>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.egit.core.synchronize;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.eclipse.egit.core.synchronize.ThreeWayDiffEntry.ChangeType;
import org.eclipse.egit.core.synchronize.ThreeWayDiffEntry.Direction;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.treewalk.EmptyTreeIterator;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.junit.Before;
import org.junit.Test;
public class ThreeWayDiffEntryTest extends LocalDiskRepositoryTestCase {
private Repository db;
@Before
@Override
// copied from org.eclipse.jgit.lib.RepositoryTestCase
public void setUp() throws Exception {
super.setUp();
db = createWorkRepository();
}
@Test
public void shouldListOutgoingAddition() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(c.getTree());
walk.addTree(new EmptyTreeIterator());
walk.addTree(new EmptyTreeIterator());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.OUTGOING));
assertThat(entry.getChangeType(), is(ChangeType.ADD));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListIncomingAddition() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(new EmptyTreeIterator());
walk.addTree(new EmptyTreeIterator());
walk.addTree(c.getTree());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.INCOMING));
assertThat(entry.getChangeType(), is(ChangeType.ADD));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListOutgoingDelete() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(new EmptyTreeIterator());
walk.addTree(c.getTree());
walk.addTree(c.getTree());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.OUTGOING));
assertThat(entry.getChangeType(), is(ChangeType.DELETE));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListIncomingDelete() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(c.getTree());
walk.addTree(c.getTree());
walk.addTree(new EmptyTreeIterator());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.INCOMING));
assertThat(entry.getChangeType(), is(ChangeType.DELETE));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListConflictingChange() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(new EmptyTreeIterator());
walk.addTree(c.getTree());
walk.addTree(new EmptyTreeIterator());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.CONFLICTING));
assertThat(entry.getChangeType(), is(ChangeType.MODIFY));
// assertThat(entry.getNewPath(), is("a.txt"));
// assertThat(entry.getOldPath(), is(DEV_NULL));
}
}
@Test
public void shouldListConflictingChange2() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(c.getTree());
walk.addTree(new EmptyTreeIterator());
walk.addTree(c.getTree());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.CONFLICTING));
assertThat(entry.getChangeType(), is(ChangeType.MODIFY));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListIncomingModify() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
RevCommit c1;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
writeTrashFile("a.txt", "new line");
c1 = git.commit().setAll(true).setMessage("second commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(c.getTree());
walk.addTree(c.getTree());
walk.addTree(c1.getTree());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.INCOMING));
assertThat(entry.getChangeType(), is(ChangeType.MODIFY));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListOutgoingModify() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
RevCommit c1;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
writeTrashFile("a.txt", "newe line");
c1 = git.commit().setAll(true).setMessage("second commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(c1.getTree());
walk.addTree(c.getTree());
walk.addTree(c.getTree());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.OUTGOING));
assertThat(entry.getChangeType(), is(ChangeType.MODIFY));
assertThat(entry.getPath(), is("a.txt"));
}
}
@Test
public void shouldListConflictingModify() throws Exception {
// given
writeTrashFile("a.txt", "content");
RevCommit c;
RevCommit c1;
try (Git git = new Git(db)) {
git.add().addFilepattern("a.txt").call();
c = git.commit().setMessage("initial commit").call();
writeTrashFile("a.txt", "new line");
c1 = git.commit().setAll(true).setMessage("second commit").call();
}
// when
try (TreeWalk walk = new TreeWalk(db)) {
walk.addTree(c1.getTree());
walk.addTree(c.getTree());
walk.addTree(c1.getTree());
List<ThreeWayDiffEntry> result = ThreeWayDiffEntry.scan(walk);
// then
assertThat(result, notNullValue());
assertThat(Integer.valueOf(result.size()), is(Integer.valueOf(1)));
ThreeWayDiffEntry entry = result.get(0);
assertThat(entry.getDirection(), is(Direction.CONFLICTING));
assertThat(entry.getChangeType(), is(ChangeType.MODIFY));
assertThat(entry.getPath(), is("a.txt"));
}
}
// copied from org.eclipse.jgit.lib.RepositoryTestCase
private File writeTrashFile(final String name, final String data)
throws IOException {
File path = new File(db.getWorkTree(), name);
write(path, data);
return path;
}
}