IDEA-89881 git push to an alternative branch pushed to the tracked branch instead
[idea/community.git] / plugins / git4idea / src / git4idea / push / GitPushDialog.java
index 8d665304b9382dbb614140ba79ca9c114a10d250..53fd94158637463cd4008f31c6b8acd8cf9ec475 100644 (file)
@@ -27,17 +27,18 @@ import com.intellij.util.Consumer;
 import com.intellij.util.ui.UIUtil;
 import git4idea.GitBranch;
 import git4idea.GitUtil;
+import git4idea.branch.GitBranchUtil;
 import git4idea.history.browser.GitCommit;
 import git4idea.repo.GitRemote;
 import git4idea.repo.GitRepository;
+import git4idea.repo.GitRepositoryManager;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.awt.*;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
@@ -49,6 +50,7 @@ public class GitPushDialog extends DialogWrapper {
   private static final String DEFAULT_REMOTE = "origin";
 
   private Project myProject;
+  private final GitRepositoryManager myRepositoryManager;
   private final GitPusher myPusher;
   private final GitPushLog myListPanel;
   private GitCommitsByRepoAndBranch myGitCommitsToPush;
@@ -65,8 +67,9 @@ public class GitPushDialog extends DialogWrapper {
     super(project);
     myProject = project;
     myPusher = new GitPusher(myProject, new EmptyProgressIndicator());
+    myRepositoryManager = GitUtil.getRepositoryManager(myProject);
 
-    myRepositories = GitUtil.getRepositoryManager(myProject).getRepositories();
+    myRepositories = getRepositoriesWithRemotes();
 
     myLoadingPanel = new JBLoadingPanel(new BorderLayout(), this.getDisposable());
 
@@ -84,9 +87,21 @@ public class GitPushDialog extends DialogWrapper {
 
     init();
     setOKButtonText("Push");
+    setOKButtonMnemonic('P');
     setTitle("Git Push");
   }
 
+  @NotNull
+  private List<GitRepository> getRepositoriesWithRemotes() {
+    List<GitRepository> repositories = new ArrayList<GitRepository>();
+    for (GitRepository repository : myRepositoryManager.getRepositories()) {
+      if (!repository.getRemotes().isEmpty()) {
+        repositories.add(repository);
+      }
+    }
+    return repositories;
+  }
+
   @Override
   protected JComponent createCenterPanel() {
     JPanel optionsPanel = new JPanel(new BorderLayout());
@@ -211,7 +226,7 @@ public class GitPushDialog extends DialogWrapper {
       String remoteName = currentBranch.getTrackedRemoteName(repository.getProject(), repository.getRoot());
       String trackedBranchName = currentBranch.getTrackedBranchName(repository.getProject(), repository.getRoot());
       GitRemote remote = GitUtil.findRemoteByName(repository, remoteName);
-      GitBranch targetBranch = findRemoteBranchByName(repository, remote, trackedBranchName);
+      GitBranch targetBranch = GitBranchUtil.findRemoteBranchByName(repository, remote, trackedBranchName);
       if (remote == null || targetBranch == null) {
         Pair<GitRemote,GitBranch> remoteAndBranch = GitUtil.findMatchingRemoteBranch(repository, currentBranch);
         if (remoteAndBranch == null) {
@@ -226,7 +241,7 @@ public class GitPushDialog extends DialogWrapper {
       if (myRefspecPanel.turnedOn()) {
         String manualBranchName = myRefspecPanel.getBranchToPush();
         remote = myRefspecPanel.getSelectedRemote();
-        GitBranch manualBranch = findRemoteBranchByName(repository, remote, manualBranchName);
+        GitBranch manualBranch = GitBranchUtil.findRemoteBranchByName(repository, remote, manualBranchName);
         if (manualBranch == null) {
           if (!manualBranchName.startsWith("refs/remotes/")) {
             manualBranchName = myRefspecPanel.getSelectedRemote().getName() + "/" + manualBranchName;
@@ -242,24 +257,6 @@ public class GitPushDialog extends DialogWrapper {
     return defaultSpecs;
   }
 
-  @Nullable
-  private static GitBranch findRemoteBranchByName(@NotNull GitRepository repository, @Nullable GitRemote remote, @Nullable String name) {
-    if (name == null || remote == null) {
-      return null;
-    }
-    final String BRANCH_PREFIX = "refs/heads/";
-    if (name.startsWith(BRANCH_PREFIX)) {
-      name = name.substring(BRANCH_PREFIX.length());
-    }
-
-    for (GitBranch branch : repository.getBranches().getRemoteBranches()) {
-      if (branch.getName().equals(remote.getName() + "/" + name)) {
-        return branch;
-      }
-    }
-    return null;
-  }
-
   @Override
   public JComponent getPreferredFocusedComponent() {
     return myListPanel.getPreferredFocusComponent();