[git tests] refresh correctly: with marking dirty
[idea/community.git] / plugins / git4idea / tests / git4idea / tests / GitCommitTest.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package git4idea.tests;
17
18 import com.intellij.openapi.vcs.VcsException;
19 import com.intellij.openapi.vcs.changes.Change;
20 import com.intellij.openapi.vcs.changes.ChangeListManager;
21 import com.intellij.openapi.vcs.changes.LocalChangeList;
22 import com.intellij.openapi.vcs.checkin.CheckinEnvironment;
23 import com.intellij.util.ObjectUtils;
24 import com.intellij.util.containers.ContainerUtil;
25 import git4idea.test.GitSingleRepoTest;
26 import git4idea.test.GitTestUtil;
27 import org.jetbrains.annotations.Nullable;
28 import org.testng.annotations.Test;
29
30 import java.io.File;
31 import java.io.IOException;
32 import java.util.List;
33
34 import static com.intellij.openapi.vcs.Executor.overwrite;
35 import static git4idea.test.GitExecutor.*;
36
37 public class GitCommitTest extends GitSingleRepoTest {
38
39   /**
40    * Tests that merge commit after resolving a conflict works fine if there is a file with spaces in its path.
41    * IDEA-50318
42    */
43   @Test
44   public void testMergeCommitWithSpacesInPath() throws IOException {
45     final String PATH = "dir with spaces/file with spaces.txt";
46     GitTestUtil.createFileStructure(myProjectRoot, PATH);
47     addCommit("created some file structure");
48
49     git("branch feature");
50
51     File file = new File(myProjectPath, PATH);
52     assertTrue("File doesn't exist!", file.exists());
53     overwrite(file, "my content");
54     addCommit("modified in master");
55
56     checkout("feature");
57     overwrite(file, "brother content");
58     addCommit("modified in feature");
59
60     checkout("master");
61     git("merge feature", true); // ignoring non-zero exit-code reporting about conflicts
62     overwrite(file, "merged content"); // manually resolving conflict
63     git("add .");
64
65     final ChangeListManager changeListManager = ChangeListManager.getInstance(myProject);
66     updateChangeListManager();
67     final LocalChangeList changeList = changeListManager.getDefaultChangeList();
68     changeList.setComment("Commit message");
69     List<Change> changes = ContainerUtil.newArrayList(changeListManager.getChangesIn(myProjectRoot));
70     assertTrue(!changes.isEmpty());
71
72     CheckinEnvironment checkingEnv = ObjectUtils.assertNotNull(myVcs.getCheckinEnvironment());
73     List<VcsException> exceptions = checkingEnv.commit(changes, "comment");
74     assertNoExceptions(exceptions);
75
76     updateChangeListManager();
77     assertTrue(changeListManager.getChangesIn(myProjectRoot).isEmpty());
78   }
79
80   private static void assertNoExceptions(@Nullable List<VcsException> exceptions) {
81     VcsException ex = ContainerUtil.getFirstItem(exceptions);
82     if (ex != null) {
83       LOG.error(ex);
84       fail("Exception during executing the commit: " + ex.getMessage());
85     }
86   }
87 }