Make HgPullCommand synchronous. This fixes IDEA-68096
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / command / HgPullCommand.java
1 // Copyright 2008-2010 Victor Iacoban
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software distributed under
10 // the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 // either express or implied. See the License for the specific language governing permissions and
12 // limitations under the License.
13 package org.zmlx.hg4idea.command;
14
15 import com.intellij.openapi.diagnostic.Logger;
16 import com.intellij.openapi.project.Project;
17 import com.intellij.openapi.vcs.VcsException;
18 import com.intellij.openapi.vfs.VirtualFile;
19 import org.apache.commons.lang.StringUtils;
20 import org.jetbrains.annotations.NotNull;
21 import org.zmlx.hg4idea.HgVcs;
22 import org.zmlx.hg4idea.execution.HgCommandExecutor;
23 import org.zmlx.hg4idea.execution.HgCommandResult;
24 import org.zmlx.hg4idea.util.HgErrorUtil;
25 import org.zmlx.hg4idea.util.HgUtil;
26
27 import java.util.LinkedList;
28 import java.util.List;
29
30 public class HgPullCommand {
31
32   private final Project project;
33   private final VirtualFile repo;
34
35   private String source;
36   private String revision;
37   private boolean update = true;
38   private boolean rebase = !update;
39   private static final Logger LOG = Logger.getInstance(HgPullCommand.class);
40   
41   public HgPullCommand(Project project, @NotNull VirtualFile repo) {
42     this.project = project;
43     this.repo = repo;
44   }
45
46   public void setRevision(String revision) {
47     this.revision = revision;
48   }
49
50   public void setUpdate(boolean update) {
51     this.update = update;
52   }
53
54   public void setRebase(boolean rebase) {
55     this.rebase = rebase;
56   }
57
58   public void setSource(String source) {
59     this.source = source;
60   }
61
62   public void execute() {
63     List<String> arguments = new LinkedList<String>();
64     if (update) {
65       arguments.add("--update");
66     } else if (rebase) {
67       arguments.add("--rebase");
68     }
69
70     if (StringUtils.isNotBlank(revision)) {
71       arguments.add("--rev");
72       arguments.add(revision);
73     }
74
75     arguments.add(source);
76
77     final HgCommandExecutor executor = new HgCommandExecutor(project);
78     executor.setShowOutput(true);
79     final HgCommandResult result = executor.executeInCurrentThread(repo, "pull", arguments);
80     if (HgErrorUtil.isAuthorizationError(result)) {
81       HgUtil.notifyError(project, "Authorization required", "http authorization required for <code>" + source + "</code>");
82     } else if (HgErrorUtil.isAbort(result)) {
83       if (result != null) {
84         LOG.error(new VcsException(result.getRawError()));
85       } else {
86         LOG.error("Error handing result of 'hg pull' execution.");
87       }
88     } else {
89       project.getMessageBus().syncPublisher(HgVcs.REMOTE_TOPIC).update(project);
90     }
91   }
92
93 }