blob: 499a456f005c5fc419a202860fd19e814cbb8fd3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.libs.git.jgit.commands;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.LogCommand;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit;
import org.netbeans.libs.git.GitClient;
import org.netbeans.libs.git.GitClient.ResetType;
import org.netbeans.libs.git.GitConflictDescriptor;
import org.netbeans.libs.git.GitStatus;
import org.netbeans.libs.git.GitStatus.Status;
import org.netbeans.libs.git.jgit.AbstractGitTestCase;
/**
*
* @author ondra
*/
public class ResetTest extends AbstractGitTestCase {
private File workDir;
private Repository repository;
public ResetTest (String testName) throws IOException {
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
workDir = getWorkingDirectory();
repository = getRepository(getLocalGitRepository());
}
public void testResetSoft () throws Exception {
File file1 = new File(workDir, "file1");
write(file1, "blablablabla");
File file2 = new File(workDir, "file2");
write(file2, "blablablabla in file2");
File[] files = new File[] { file1, file2 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files,NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
write(file1, "change in content");
add(file1);
commit(files);
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
client.reset(revision, ResetType.SOFT, NULL_PROGRESS_MONITOR);
assertEquals(revision, new Git(repository).log().call().iterator().next().getId().getName());
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
}
public void testResetMixed () throws Exception {
File file1 = new File(workDir, "file1");
write(file1, "blablablabla");
File file2 = new File(workDir, "file2");
write(file2, "blablablabla in file2");
File[] files = new File[] { file1, file2 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files,NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
write(file1, "change in content");
add(file1);
commit(files);
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
client.reset(revision, ResetType.MIXED, NULL_PROGRESS_MONITOR);
assertEquals(revision, new Git(repository).log().call().iterator().next().getId().getName());
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
}
public void testResetHard () throws Exception {
File file1 = new File(workDir, "file1");
write(file1, "blablablabla");
File file2 = new File(workDir, "file2");
write(file2, "blablablabla in file2");
File[] files = new File[] { file1, file2 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files,NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
write(file1, "change in content");
add(file1);
commit(files);
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
long ts = file2.lastModified();
Thread.sleep(1000);
client.reset(revision, ResetType.HARD, NULL_PROGRESS_MONITOR);
assertEquals(ts, file2.lastModified());
assertEquals(revision, new Git(repository).log().call().iterator().next().getId().getName());
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
}
public void testResetHardTypeConflict () throws Exception {
File file1 = new File(workDir, "file1");
write(file1, "blablablabla");
File file2 = new File(file1, "f");
File[] files = new File[] { file1, file2 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files,NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
client.remove(files, false, NULL_PROGRESS_MONITOR);
file1.mkdirs();
assertTrue(file1.isDirectory());
write(file2, "ssss");
write(new File(file1, "untracked"), "ssss");
add(file2);
commit(files);
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
RevCommit commitCurrent = logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
client.reset(revision, ResetType.HARD, NULL_PROGRESS_MONITOR);
assertEquals(revision, new Git(repository).log().call().iterator().next().getId().getName());
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertTrue(file1.isFile());
String currentRevision = commitCurrent.getId().getName();
client.reset(currentRevision, ResetType.HARD, NULL_PROGRESS_MONITOR);
assertEquals(currentRevision, new Git(repository).log().call().iterator().next().getId().getName());
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertTrue(file1.isDirectory());
}
public void testResetHardOverwritesModification () throws Exception {
File file1 = new File(workDir, "file1");
write(file1, "blablablabla");
File[] files = new File[] { file1 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files,NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
write(file1, "change in content");
add(file1);
commit(files);
write(file1, "hello, i have local modifications");
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
client.reset(revision, ResetType.HARD, NULL_PROGRESS_MONITOR);
assertEquals(revision, new Git(repository).log().call().iterator().next().getId().getName());
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertEquals("blablablabla", read(file1));
}
public void testResetHardRemoveFile () throws Exception {
File file1 = new File(workDir, "file1");
write(file1, "blablablabla");
File file2 = new File(workDir, "file2");
write(file2, "blablablabla");
File[] files = new File[] { file1 };
add(files);
commit(files);
GitClient client = getClient(workDir);
add(file2);
files = new File[] { file1, file2 };
commit(files);
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
assertTrue(file2.exists());
client.reset(revision, ResetType.HARD, NULL_PROGRESS_MONITOR);
assertEquals(revision, new Git(repository).log().call().iterator().next().getId().getName());
Map<File, GitStatus> statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertFalse(file2.exists());
}
public void testResetPaths () throws Exception {
File file1 = new File(workDir, "file1"); // index entry will be modified
write(file1, "blablablabla");
File file2 = new File(workDir, "file2"); // index entry will be left alone
write(file2, "blablablabla in file2");
File file3 = new File(workDir, "file3"); // index entry will be added
write(file3, "blablablabla in file3");
File file4 = new File(workDir, "file4"); // index entry will be removed
File[] files = new File[] { file1, file2, file3, file4 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(3, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file3, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
String content = "change in content";
write(file1, content);
write(file4, "blablablabla in file4");
client.add(files, NULL_PROGRESS_MONITOR);
commit(files);
write(file2, "change in content in file 2");
client.add(new File[] { file2 }, NULL_PROGRESS_MONITOR);
client.remove(new File[] { file3 }, false,NULL_PROGRESS_MONITOR);
LogCommand cmd = new Git(repository).log();
Iterator<RevCommit> logs = cmd.call().iterator();
logs.next();
RevCommit commit = logs.next();
String revision = commit.getId().getName();
client.reset(new File[] { file1, file3, file4 }, revision, true, NULL_PROGRESS_MONITOR);
// file1: modified HEAD-INDEX
// file2: stays modified HEAD-INDEX
// file3: removed in WT, normal HEAD-INDEX
// file4: removed in index, normal in WT
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(4, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
assertStatus(statuses, workDir, file3, true, Status.STATUS_NORMAL, Status.STATUS_REMOVED, Status.STATUS_REMOVED, false);
assertStatus(statuses, workDir, file4, true, Status.STATUS_REMOVED, Status.STATUS_ADDED, Status.STATUS_NORMAL, false);
assertEquals(content, read(file1));
}
public void testResetPaths_NonRecursive () throws Exception {
File folder = new File(workDir, "folder");
folder.mkdirs();
File file1 = new File(folder, "file1"); // index entry will be modified
write(file1, "blablablabla");
File subfolder = new File(folder, "subfolder");
subfolder.mkdirs();
File file2 = new File(subfolder, "file2"); // index entry will be left alone
write(file2, "blablablabla in file2");
File[] files = new File[] { file1, file2 };
add(files);
commit(files);
GitClient client = getClient(workDir);
Map<File, GitStatus> statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
String content = "change in content";
write(file1, content);
write(file2, content);
client.add(files, NULL_PROGRESS_MONITOR);
// children
client.reset(new File[] { folder }, "HEAD", false, NULL_PROGRESS_MONITOR);
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
write(file1, content);
// recursive
client.reset(new File[] { folder }, "HEAD", true, NULL_PROGRESS_MONITOR);
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
write(file1, content);
add(file1);
// non recursive on file
client.reset(new File[] { file1 }, "HEAD", false, NULL_PROGRESS_MONITOR);
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file1, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
}
public void testResetPathsChangeType () throws Exception {
File file = new File(workDir, "f"); // index entry will be modified
File file2 = new File(file, "file");
write(file, "blablablabla");
File[] files = new File[] { file, file2 };
add(files);
commit(files);
GitClient client = getClient(workDir);
client.remove(files, false, NULL_PROGRESS_MONITOR);
commit(files);
file.mkdirs();
write(file2, "aaaa");
add(file2);
commit(files);
Iterator<RevCommit> logs = new Git(repository).log().call().iterator();
String revisionCurrent = logs.next().getId().getName();
logs.next();
String revisionPrevious = logs.next().getId().getName();
client.reset(files, revisionPrevious, true, NULL_PROGRESS_MONITOR);
Map<File, GitStatus> statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, file, true, Status.STATUS_ADDED, Status.STATUS_REMOVED, Status.STATUS_NORMAL, false);
assertStatus(statuses, workDir, file2, true, Status.STATUS_REMOVED, Status.STATUS_ADDED, Status.STATUS_NORMAL, false);
client.reset(files, revisionCurrent, true, NULL_PROGRESS_MONITOR);
statuses = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, workDir, file2, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
}
// must not checkout from nested repositories
public void testResetNested () throws Exception {
File f = new File(workDir, "f");
write(f, "file");
GitClient client = getClient(workDir);
client.add(new File[] { f }, NULL_PROGRESS_MONITOR);
client.commit(new File[] { f }, "init commit", null, null, NULL_PROGRESS_MONITOR);
File nested = new File(workDir, "nested");
nested.mkdirs();
File f2 = new File(nested, "f");
write(f2, "file");
GitClient clientNested = getClient(nested);
clientNested.init(NULL_PROGRESS_MONITOR);
clientNested.add(new File[] { f2 }, NULL_PROGRESS_MONITOR);
clientNested.commit(new File[] { f2 }, "init commit", null, null, NULL_PROGRESS_MONITOR);
write(f, "change");
add(f);
write(f2, "change");
clientNested.add(new File[] { f2 }, NULL_PROGRESS_MONITOR);
client.reset(new File[] { workDir, nested }, "HEAD", true, NULL_PROGRESS_MONITOR);
Map<File, GitStatus> statuses = client.getStatus(new File[] { workDir }, NULL_PROGRESS_MONITOR);
assertEquals(2, statuses.size());
assertStatus(statuses, workDir, f, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
assertStatus(statuses, workDir, nested, false, Status.STATUS_NORMAL, Status.STATUS_ADDED, Status.STATUS_ADDED, false);
statuses = clientNested.getStatus(new File[] { nested }, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, nested, f2, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
client.reset("master", ResetType.MIXED, NULL_PROGRESS_MONITOR);
statuses = clientNested.getStatus(new File[] { nested }, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, nested, f2, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
client.reset("master", ResetType.HARD, NULL_PROGRESS_MONITOR);
statuses = clientNested.getStatus(new File[] { nested }, NULL_PROGRESS_MONITOR);
assertEquals(1, statuses.size());
assertStatus(statuses, nested, f2, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
}
public void testLineEndingsWindows () throws Exception {
if (!isWindows()) {
return;
}
// lets turn autocrlf on
Thread.sleep(1100);
StoredConfig cfg = repository.getConfig();
cfg.setString(ConfigConstants.CONFIG_CORE_SECTION, null, ConfigConstants.CONFIG_KEY_AUTOCRLF, "true");
cfg.save();
File f = new File(workDir, "f");
write(f, "a\r\nb\r\n");
File[] roots = new File[] { f };
GitClient client = getClient(workDir);
runExternally(workDir, Arrays.asList("git.cmd", "add", "f"));
List<String> res = runExternally(workDir, Arrays.asList("git.cmd", "status", "-s"));
assertEquals(Arrays.asList("A f"), res);
DirCacheEntry e1 = repository.readDirCache().getEntry("f");
runExternally(workDir, Arrays.asList("git.cmd", "commit", "-m", "hello"));
write(f, "a\r\nb\r\nc\r\n");
res = runExternally(workDir, Arrays.asList("git.cmd", "status", "-s"));
assertEquals(Arrays.asList(" M f"), res);
runExternally(workDir, Arrays.asList("git.cmd", "add", "f"));
res = runExternally(workDir, Arrays.asList("git.cmd", "status", "-s"));
assertEquals(Arrays.asList("M f"), res);
assertStatus(client.getStatus(roots, NULL_PROGRESS_MONITOR), workDir, f, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
client.reset(roots, "HEAD", true, NULL_PROGRESS_MONITOR);
assertStatus(client.getStatus(roots, NULL_PROGRESS_MONITOR), workDir, f, true, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, Status.STATUS_MODIFIED, false);
assertEquals(e1.getObjectId(), repository.readDirCache().getEntry("f").getObjectId());
res = runExternally(workDir, Arrays.asList("git.cmd", "status", "-s"));
assertEquals(Arrays.asList(" M f"), res);
runExternally(workDir, Arrays.asList("git.cmd", "add", "f"));
res = runExternally(workDir, Arrays.asList("git.cmd", "status", "-s"));
assertEquals(Arrays.asList("M f"), res);
assertStatus(client.getStatus(roots, NULL_PROGRESS_MONITOR), workDir, f, true, Status.STATUS_MODIFIED, Status.STATUS_NORMAL, Status.STATUS_MODIFIED, false);
client.reset("HEAD", ResetType.HARD, NULL_PROGRESS_MONITOR);
assertStatus(client.getStatus(roots, NULL_PROGRESS_MONITOR), workDir, f, true, Status.STATUS_NORMAL, Status.STATUS_NORMAL, Status.STATUS_NORMAL, false);
assertEquals(e1.getObjectId(), repository.readDirCache().getEntry("f").getObjectId());
res = runExternally(workDir, Arrays.asList("git.cmd", "status", "-s"));
assertEquals(0, res.size());
}
public void testResetConflict () throws Exception {
File file = new File(workDir, "file");
write(file, "init");
File[] files = new File[] { file };
add(files);
commit(files);
DirCache index = repository.lockDirCache();
DirCacheBuilder builder = index.builder();
DirCacheEntry e = index.getEntry(file.getName());
DirCacheEntry e1 = new DirCacheEntry(file.getName(), 1);
e1.setCreationTime(e.getCreationTime());
e1.setFileMode(e.getFileMode());
e1.setLastModified(e.getLastModified());
e1.setLength(e.getLength());
e1.setObjectId(e.getObjectId());
builder.add(e1);
builder.finish();
builder.commit();
GitClient client = getClient(workDir);
Map<File, GitStatus> status = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertTrue(status.get(file).isConflict());
assertEquals(GitConflictDescriptor.Type.BOTH_DELETED, status.get(file).getConflictDescriptor().getType());
client.reset(files, "HEAD", true, NULL_PROGRESS_MONITOR);
status = client.getStatus(files, NULL_PROGRESS_MONITOR);
assertFalse(status.get(file).isConflict());
}
}