e25e764df9f25515d138032b8f2b141a84c15a94
[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.project.Project;
19 import com.intellij.openapi.vcs.VcsException;
20 import com.intellij.openapi.vfs.VirtualFile;
21 import com.intellij.util.Consumer;
22 import git4idea.commands.GitCommand;
23 import git4idea.commands.GitSimpleHandler;
24 import git4idea.commands.StringScanner;
25 import git4idea.config.GitConfigUtil;
26 import git4idea.ui.GitUIUtil;
27 import git4idea.ui.StashInfo;
28 import org.jetbrains.annotations.NotNull;
29
30 import java.nio.charset.Charset;
31
32 /**
33  * The class contains utilities for creating and removing stashes.
34  */
35 public class GitStashUtils {
36
37   private GitStashUtils() {
38   }
39
40   /**
41    * Create stash for later use
42    *
43    * @param project the project to use
44    * @param root    the root
45    * @param message the message for the stash
46    * @return true if the stash was created, false otherwise
47    */
48   public static boolean saveStash(@NotNull Project project, @NotNull VirtualFile root, final String message) throws VcsException {
49     GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.STASH);
50     handler.setNoSSH(true);
51     handler.addParameters("save", message);
52     String output = handler.run();
53     return !output.startsWith("No local changes to save");
54   }
55
56   public static void loadStashStack(@NotNull Project project, @NotNull VirtualFile root, Consumer<StashInfo> consumer) {
57     loadStashStack(project, root, Charset.forName(GitConfigUtil.getLogEncoding(project, root)), consumer);
58   }
59
60   public static void loadStashStack(@NotNull Project project, @NotNull VirtualFile root, final Charset charset,
61                                     final Consumer<StashInfo> consumer) {
62     GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.STASH);
63     h.setSilent(true);
64     h.setNoSSH(true);
65     h.addParameters("list");
66     String out;
67     try {
68       h.setCharset(charset);
69       out = h.run();
70     }
71     catch (VcsException e) {
72       GitUIUtil.showOperationError(project, e, h.printableCommandLine());
73       return;
74     }
75     for (StringScanner s = new StringScanner(out); s.hasMoreData();) {
76       consumer.consume(new StashInfo(s.boundedToken(':'), s.boundedToken(':'), s.line().trim()));
77     }
78   }
79 }