blob: f18b6a578ecb9a326c43a165bf51aefd25c730b0 [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed 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.jetbrains.idea.svn;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.NullableFunction;
import junit.framework.Assert;
import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: Irina.Chernushina
* Date: 2/28/13
* Time: 11:59 AM
*/
public class SvnCommitTest extends Svn17TestCase {
private SvnVcs myVcs;
private VcsDirtyScopeManager myDirtyScopeManager;
private ChangeListManager myChangeListManager;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
myVcs = SvnVcs.getInstance(myProject);
myDirtyScopeManager = VcsDirtyScopeManager.getInstance(myProject);
myChangeListManager = ChangeListManager.getInstance(myProject);
}
@Test
public void testSimpleCommit() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
run2variants(new MyRunner() {
private String myName = "a.txt";
@Override
protected void run() throws Exception {
final VirtualFile file = createFileInCommand(myWorkingCopyDir, myName, "123");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFile(file, FileStatus.ADDED);
}
@Override
protected void cleanup() throws Exception {
myName = "b.txt";
}
});
}
@Test
public void testCommitRename() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
run2variants(new MyRunner() {
private String myName = "a.txt";
private String myRenamedName = "aRenamed.txt";
@Override
protected void run() throws Exception {
final VirtualFile file = createFileInCommand(myWorkingCopyDir, myName, "123");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFile(file, FileStatus.ADDED);
renameFileInCommand(file, myRenamedName);
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFile(file, FileStatus.MODIFIED);
}
@Override
protected void cleanup() throws Exception {
myName = "b.txt";
myRenamedName = "bRenamed.txt";
}
});
}
@Test
public void testRenameReplace() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
run2variants(new MyRunner() {
private String myName = "a.txt";
private String myName2 = "aRenamed.txt";
@Override
protected void run() throws Exception {
final VirtualFile file = createFileInCommand(myWorkingCopyDir, myName, "123");
final VirtualFile file2 = createFileInCommand(myWorkingCopyDir, myName2, "1235");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(file, file2);
renameFileInCommand(file, file.getName() + "7.txt");
renameFileInCommand(file2, myName);
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(file, file2);
}
@Override
protected void cleanup() throws Exception {
myName = "b.txt";
myName2 = "bRenamed.txt";
}
});
}
@Test
public void testRenameFolder() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
run2variants(new MyRunner() {
private String folder = "f";
@Override
protected void run() throws Exception {
final VirtualFile dir = createDirInCommand(myWorkingCopyDir, folder);
final VirtualFile file = createFileInCommand(dir, "a.txt", "123");
final VirtualFile file2 = createFileInCommand(dir, "b.txt", "1235");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(dir, file, file2);
renameFileInCommand(dir, dir.getName() + "dd");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(dir, file, file2);
}
@Override
protected void cleanup() throws Exception {
folder = "f1";
}
});
}
@Test
public void testCommitDeletion() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
run2variants(new MyRunner() {
private String folder = "f";
@Override
protected void run() throws Exception {
final VirtualFile dir = createDirInCommand(myWorkingCopyDir, folder);
final VirtualFile file = createFileInCommand(dir, "a.txt", "123");
final VirtualFile file2 = createFileInCommand(dir, "b.txt", "1235");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(dir, file, file2);
final FilePath dirPath = new FilePathImpl(new File(dir.getPath()), true);
deleteFileInCommand(dir);
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinPaths(dirPath);
}
@Override
protected void cleanup() throws Exception {
folder = "f1";
}
});
}
@Test
public void testSameRepoPlusInnerCopyCommitNative() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
prepareInnerCopy(false);
final MyRunner runner = new MyRunner() {
@Override
protected void run() throws Exception {
final File file1 = new File(myWorkingCopyDir.getPath(), "source/s1.txt");
final File fileInner = new File(myWorkingCopyDir.getPath(), "source/inner1/inner2/inner/t11.txt");
Assert.assertTrue(file1.exists());
Assert.assertTrue(fileInner.exists());
final VirtualFile vf1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file1);
final VirtualFile vf2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fileInner);
Assert.assertNotNull(vf1);
Assert.assertNotNull(vf2);
editFileInCommand(vf1, "2317468732ghdwwe7y348rf");
editFileInCommand(vf2, "2317468732ghdwwe7y348rf csdjcjksw");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
final HashSet<String> strings = checkinFiles(vf1, vf2);
System.out.println("" + StringUtil.join(strings, "\n"));
Assert.assertEquals(1, strings.size());
}
@Override
protected void cleanup() throws Exception {
}
};
setNativeAcceleration(true);
runner.run();
}
@Test
public void testSameRepoPlusInnerCopyCommitSvnkit() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
prepareInnerCopy(false);
final MyRunner runner = new MyRunner() {
@Override
protected void run() throws Exception {
final File file1 = new File(myWorkingCopyDir.getPath(), "source/s1.txt");
final File fileInner = new File(myWorkingCopyDir.getPath(), "source/inner1/inner2/inner/t11.txt");
Assert.assertTrue(file1.exists());
Assert.assertTrue(fileInner.exists());
final VirtualFile vf1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file1);
final VirtualFile vf2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fileInner);
Assert.assertNotNull(vf1);
Assert.assertNotNull(vf2);
editFileInCommand(vf1, "2317468732ghdwwe7y348rf");
editFileInCommand(vf2, "2317468732ghdwwe7y348rf csdjcjksw");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
final HashSet<String> strings = checkinFiles(vf1, vf2);
System.out.println("" + StringUtil.join(strings, "\n"));
Assert.assertEquals(1, strings.size());
}
@Override
protected void cleanup() throws Exception {
}
};
setNativeAcceleration(true);
runner.run();
}
@Test
public void testAnotherRepoPlusInnerCopyCommitNative() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
prepareInnerCopy(true);
final MyRunner runner = new MyRunner() {
@Override
protected void run() throws Exception {
final File file1 = new File(myWorkingCopyDir.getPath(), "source/s1.txt");
final File fileInner = new File(myWorkingCopyDir.getPath(), "source/inner1/inner2/inner/t11.txt");
Assert.assertTrue(file1.exists());
Assert.assertTrue(fileInner.exists());
final VirtualFile vf1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file1);
final VirtualFile vf2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fileInner);
Assert.assertNotNull(vf1);
Assert.assertNotNull(vf2);
editFileInCommand(vf1, "2317468732ghdwwe7y348rf");
editFileInCommand(vf2, "2317468732ghdwwe7y348rf csdjcjksw");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(vf1, vf2);
}
@Override
protected void cleanup() throws Exception {
}
};
setNativeAcceleration(true);
runner.run();
}
@Test
public void testAnotherRepoPlusInnerCopyCommitSvnkit() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
prepareInnerCopy(true);
final MyRunner runner = new MyRunner() {
@Override
protected void run() throws Exception {
final File file1 = new File(myWorkingCopyDir.getPath(), "source/s1.txt");
final File fileInner = new File(myWorkingCopyDir.getPath(), "source/inner1/inner2/inner/t11.txt");
Assert.assertTrue(file1.exists());
Assert.assertTrue(fileInner.exists());
final VirtualFile vf1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file1);
final VirtualFile vf2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fileInner);
Assert.assertNotNull(vf1);
Assert.assertNotNull(vf2);
editFileInCommand(vf1, "2317468732ghdwwe7y348rf");
editFileInCommand(vf2, "2317468732ghdwwe7y348rf csdjcjksw");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(vf1, vf2);
}
@Override
protected void cleanup() throws Exception {
}
};
setNativeAcceleration(true);
runner.run();
}
@Test
public void testPlusExternalCopyCommitNative() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
prepareExternal();
final MyRunner runner = new MyRunner() {
@Override
protected void run() throws Exception {
final File file1 = new File(myWorkingCopyDir.getPath(), "source/s1.txt");
final File fileInner = new File(myWorkingCopyDir.getPath(), "source/external/t11.txt");
Assert.assertTrue(file1.exists());
Assert.assertTrue(fileInner.exists());
final VirtualFile vf1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file1);
final VirtualFile vf2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fileInner);
Assert.assertNotNull(vf1);
Assert.assertNotNull(vf2);
editFileInCommand(vf1, "2317468732ghdwwe7y348rf");
editFileInCommand(vf2, "2317468732ghdwwe7y348rf csdjcjksw");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(vf1, vf2);
}
@Override
protected void cleanup() throws Exception {
}
};
setNativeAcceleration(true);
runner.run();
}
@Test
public void testPlusExternalCopyCommitSvnkit() throws Exception {
enableSilentOperation(VcsConfiguration.StandardConfirmation.ADD);
enableSilentOperation(VcsConfiguration.StandardConfirmation.REMOVE);
prepareExternal();
final MyRunner runner = new MyRunner() {
@Override
protected void run() throws Exception {
final File file1 = new File(myWorkingCopyDir.getPath(), "source/s1.txt");
final File fileInner = new File(myWorkingCopyDir.getPath(), "source/external/t11.txt");
Assert.assertTrue(file1.exists());
Assert.assertTrue(fileInner.exists());
final VirtualFile vf1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file1);
final VirtualFile vf2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fileInner);
Assert.assertNotNull(vf1);
Assert.assertNotNull(vf2);
editFileInCommand(vf1, "2317468732ghdwwe7y348rf");
editFileInCommand(vf2, "2317468732ghdwwe7y348rf csdjcjksw");
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
checkinFiles(vf1, vf2);
}
@Override
protected void cleanup() throws Exception {
}
};
setNativeAcceleration(false);
runner.run();
}
private void checkinPaths(FilePath... files) {
final List<Change> changes = new ArrayList<Change>();
for (FilePath file : files) {
final Change change = myChangeListManager.getChange(file);
Assert.assertNotNull(change);
changes.add(change);
}
final List<VcsException> exceptions = myVcs.getCheckinEnvironment().commit(changes, "test comment list");
Assert.assertTrue(exceptions == null || exceptions.isEmpty());
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
for (FilePath file : files) {
final Change changeA = myChangeListManager.getChange(file);
Assert.assertNull(changeA);
}
}
private HashSet<String> checkinFiles(VirtualFile... files) {
final List<Change> changes = new ArrayList<Change>();
for (VirtualFile file : files) {
final Change change = myChangeListManager.getChange(file);
Assert.assertNotNull(change);
changes.add(change);
}
final HashSet<String> feedback = new HashSet<String>();
final List<VcsException> exceptions = myVcs.getCheckinEnvironment().commit(changes, "test comment list",
new NullableFunction<Object, Object>() {
@Nullable
@Override
public Object fun(Object o) {
return null;
}
}, feedback);
if (exceptions !=null && ! exceptions.isEmpty()) {
exceptions.get(0).printStackTrace();
}
Assert.assertTrue(exceptions == null || exceptions.isEmpty());
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
for (VirtualFile file : files) {
final Change changeA = myChangeListManager.getChange(file);
Assert.assertNull(changeA);
}
return feedback;
}
protected void checkinFile(VirtualFile file, FileStatus status) {
final Change change = myChangeListManager.getChange(file);
Assert.assertNotNull(change);
Assert.assertEquals(status, change.getFileStatus());
final List<VcsException> exceptions = myVcs.getCheckinEnvironment().commit(Collections.singletonList(change), "test comment");
Assert.assertTrue(exceptions == null || exceptions.isEmpty());
myDirtyScopeManager.markEverythingDirty();
myChangeListManager.ensureUpToDate(false);
final Change changeA = myChangeListManager.getChange(file);
Assert.assertNull(changeA);
}
protected void run2variants(final MyRunner runner) throws Exception {
// TODO: Change this to run different variants separately. See SvnTestCase.myUseAcceleration.
setNativeAcceleration(false);
runner.run();
runner.cleanup();
setNativeAcceleration(true);
runner.run();
}
private static abstract class MyRunner {
protected abstract void run() throws Exception;
protected abstract void cleanup() throws Exception;
}
}