[Git] IDEA-51187 Auto-merge on unstash.
[idea/community.git] / plugins / git4idea / src / git4idea / stash / GitStashUtils.java
1 /*
2  * Copyright 2000-2009 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.stash;
17
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.vcs.VcsException;
21 import com.intellij.openapi.vfs.VirtualFile;
22 import com.intellij.util.Consumer;
23 import git4idea.commands.GitCommand;
24 import git4idea.commands.GitSimpleHandler;
25 import git4idea.commands.StringScanner;
26 import git4idea.config.GitConfigUtil;
27 import git4idea.ui.GitUIUtil;
28 import git4idea.ui.StashInfo;
29 import org.jetbrains.annotations.NotNull;
30
31 import java.nio.charset.Charset;
32
33 import static com.intellij.notification.NotificationType.WARNING;
34
35 /**
36  * The class contains utilities for creating and removing stashes.
37  */
38 public class GitStashUtils {
39
40   private static final Logger LOG = Logger.getInstance(GitStashUtils.class);
41
42   private GitStashUtils() {
43   }
44
45   /**
46    * Create stash for later use
47    *
48    * @param project the project to use
49    * @param root    the root
50    * @param message the message for the stash
51    * @return true if the stash was created, false otherwise
52    */
53   public static boolean saveStash(@NotNull Project project, @NotNull VirtualFile root, final String message) throws VcsException {
54     GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.STASH);
55     handler.setNoSSH(true);
56     handler.addParameters("save", message);
57     String output = handler.run();
58     return !output.startsWith("No local changes to save");
59   }
60
61   public static void loadStashStack(@NotNull Project project, @NotNull VirtualFile root, Consumer<StashInfo> consumer) {
62     loadStashStack(project, root, Charset.forName(GitConfigUtil.getLogEncoding(project, root)), consumer);
63   }
64
65   public static void loadStashStack(@NotNull Project project, @NotNull VirtualFile root, final Charset charset,
66                                     final Consumer<StashInfo> consumer) {
67     GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH);
68     h.setSilent(true);
69     h.setNoSSH(true);
70     h.addParameters("list");
71     String out;
72     try {
73       h.setCharset(charset);
74       out = h.run();
75     }
76     catch (VcsException e) {
77       GitUIUtil.showOperationError(project, e, h.printableCommandLine());
78       return;
79     }
80     for (StringScanner s = new StringScanner(out); s.hasMoreData();) {
81       consumer.consume(new StashInfo(s.boundedToken(':'), s.boundedToken(':'), s.line().trim()));
82     }
83   }
84
85   // drops stash (after completing conflicting merge during unstashing), shows a warning in case of error
86   public static void dropStash(Project project, VirtualFile root) {
87     final GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.STASH);
88     handler.setNoSSH(true);
89     handler.addParameters("drop");
90     String output = null;
91     try {
92       output = handler.run();
93     } catch (VcsException e) {
94       LOG.info("dropStash " + output, e);
95       GitUIUtil.notifyMessage(project, "Couldn't drop stash",
96                               "Couldn't drop stash after resolving conflicts.<br/>Please drop stash manually.",
97                               WARNING, false, handler.errors());
98     }
99   }
100
101 }