From 753b3ced72e44dfbf495b32574469c2574adb558 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 10 Mar 2012 14:21:39 +0400 Subject: [PATCH] Fix pressing "Push" before completely loading the list of commits Selected repositories are gotten from GitPushLog, which can be not constructed yet. In that case use all repositories. --- .../src/git4idea/push/GitPushDialog.java | 7 +++-- .../src/git4idea/push/GitPushLog.java | 27 ++++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/plugins/git4idea/src/git4idea/push/GitPushDialog.java b/plugins/git4idea/src/git4idea/push/GitPushDialog.java index b8994e4840dd..079d0c7d987a 100644 --- a/plugins/git4idea/src/git4idea/push/GitPushDialog.java +++ b/plugins/git4idea/src/git4idea/push/GitPushDialog.java @@ -178,14 +178,13 @@ public class GitPushDialog extends DialogWrapper { try { LOG.info("collectInfoToPush..."); myPushSpecs = pushSpecsForCurrentOrEnteredBranches(); - LOG.info("PushSpecsForCurrentOrEnteredBranches: " + myPushSpecs); myGitCommitsToPush = myPusher.collectCommitsToPush(myPushSpecs); - LOG.info("Collected commits to push: " + logMessageForCommits(myGitCommitsToPush)); + LOG.info("collectInfoToPush | Collected commits to push: " + logMessageForCommits(myGitCommitsToPush)); return null; } catch (VcsException e) { myGitCommitsToPush = GitCommitsByRepoAndBranch.empty(); - LOG.error("Couldn't collect commits to push. Push spec: " + myPushSpecs, e); + LOG.error("collectInfoToPush | Couldn't collect commits to push. Push spec: " + myPushSpecs, e); return e.getMessage(); } } @@ -272,7 +271,7 @@ public class GitPushDialog extends DialogWrapper { // waiting for commit list loading, because this information is needed to correctly handle rejected push situation and correctly // notify about pushed commits // TODO optimize: don't refresh: information about pushed commits can be achieved from the successful push output - LOG.info("getPushInfo"); + LOG.info("getPushInfo start"); synchronized (COMMITS_LOADING_LOCK) { GitCommitsByRepoAndBranch selectedCommits; if (myGitCommitsToPush == null) { diff --git a/plugins/git4idea/src/git4idea/push/GitPushLog.java b/plugins/git4idea/src/git4idea/push/GitPushLog.java index f8ada332cb7b..1524ebc2aeeb 100644 --- a/plugins/git4idea/src/git4idea/push/GitPushLog.java +++ b/plugins/git4idea/src/git4idea/push/GitPushLog.java @@ -61,6 +61,7 @@ class GitPushLog extends JPanel implements TypeSafeDataProvider { private final DefaultTreeModel myTreeModel; private final CheckedTreeNode myRootNode; private final ReentrantReadWriteLock TREE_CONSTRUCTION_LOCK = new ReentrantReadWriteLock(); + private boolean myTreeWasConstructed; private final MyTreeCellRenderer myTreeCellRenderer; GitPushLog(@NotNull Project project, @NotNull Collection repositories, @NotNull final Consumer checkboxListener) { @@ -166,6 +167,7 @@ class GitPushLog extends JPanel implements TypeSafeDataProvider { myTree.setModel(myTreeModel); // TODO: why doesn't it repaint otherwise? TreeUtil.expandAll(myTree); selectFirstCommit(); + myTreeWasConstructed = true; } finally { TREE_CONSTRUCTION_LOCK.writeLock().unlock(); @@ -259,23 +261,28 @@ class GitPushLog extends JPanel implements TypeSafeDataProvider { try { TREE_CONSTRUCTION_LOCK.readLock().lock(); // wait for tree to be constructed - Collection selectedRepositories = new ArrayList(myAllRepositories.size()); - if (myRootNode.getChildCount() == 0) { // the method is requested before tree construction began => returning all repos. + if (!myTreeWasConstructed) { return myAllRepositories; } + else { + Collection selectedRepositories = new ArrayList(myAllRepositories.size()); + if (myRootNode.getChildCount() == 0) { // the method is requested before tree construction began => returning all repos. + return myAllRepositories; + } - for (int i = 0; i < myRootNode.getChildCount(); i++) { - TreeNode child = myRootNode.getChildAt(i); - if (child instanceof CheckedTreeNode) { - CheckedTreeNode node = (CheckedTreeNode)child; - if (node.isChecked()) { - if (node.getUserObject() instanceof GitRepository) { - selectedRepositories.add((GitRepository)node.getUserObject()); + for (int i = 0; i < myRootNode.getChildCount(); i++) { + TreeNode child = myRootNode.getChildAt(i); + if (child instanceof CheckedTreeNode) { + CheckedTreeNode node = (CheckedTreeNode)child; + if (node.isChecked()) { + if (node.getUserObject() instanceof GitRepository) { + selectedRepositories.add((GitRepository)node.getUserObject()); + } } } } + return selectedRepositories; } - return selectedRepositories; } finally { TREE_CONSTRUCTION_LOCK.readLock().unlock();