P4: for IDEA-66666 Perforce: Commit Changes... falsely claims ''No Changes detected'' with Work Offline Option Enabled.

- prompt that Perforce is offline before commit dialog is shown; do not show commit dialog if Perforce is the only active VCS for the project and it is still oflline after prompt and, probably, going online attempt
This commit is contained in:
irengrig
2011-05-26 13:29:26 +04:00
parent 5e9f4725ab
commit f6800da593
8 changed files with 70 additions and 3 deletions
@@ -15,8 +15,10 @@
*/
package com.intellij.openapi.vcs.checkin;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.CheckinProjectPanel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author irengrig
@@ -35,4 +37,7 @@ public interface BaseCheckinHandlerFactory {
*/
@NotNull
CheckinHandler createHandler(final CheckinProjectPanel panel);
@Nullable
BeforeCheckinDialogHandler createSystemReadyHandler(Project project);
}
@@ -0,0 +1,13 @@
package com.intellij.openapi.vcs.checkin;
/**
* @author irengrig
* Date: 5/24/11
* Time: 7:23 PM
*/
public interface BeforeCheckinDialogHandler {
/**
* @return false to cancel commit
*/
boolean beforeCommitDialogShownCallback();
}
@@ -17,6 +17,7 @@
package com.intellij.openapi.vcs.checkin;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.CheckinProjectPanel;
import org.jetbrains.annotations.NotNull;
@@ -44,4 +45,9 @@ public abstract class CheckinHandlerFactory implements BaseCheckinHandlerFactory
*/
@NotNull
public abstract CheckinHandler createHandler(final CheckinProjectPanel panel);
@Override
public BeforeCheckinDialogHandler createSystemReadyHandler(Project project) {
return null;
}
}
@@ -16,6 +16,7 @@
package com.intellij.openapi.vcs.checkin;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.CheckinProjectPanel;
import com.intellij.openapi.vcs.VcsKey;
import org.jetbrains.annotations.NotNull;
@@ -47,4 +48,9 @@ public abstract class VcsCheckinHandlerFactory implements BaseCheckinHandlerFact
public VcsKey getKey() {
return myKey;
}
@Override
public BeforeCheckinDialogHandler createSystemReadyHandler(Project project) {
return null;
}
}
@@ -16,7 +16,10 @@
package com.intellij.openapi.vcs.impl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.checkin.BaseCheckinHandlerFactory;
import com.intellij.openapi.vcs.checkin.VcsCheckinHandlerFactory;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -37,6 +40,8 @@ public abstract class CheckinHandlersManager {
* @return the list of registered factories.
*/
public abstract List<BaseCheckinHandlerFactory> getRegisteredCheckinHandlerFactories();
public abstract List<VcsCheckinHandlerFactory> getMatchingVcsFactories(@NotNull final List<AbstractVcs> keys);
/**
* Registers a factory which provides callbacks to run before and after VCS checkin operations.
*
@@ -15,7 +15,10 @@
*/
package com.intellij.openapi.vcs.impl;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.checkin.BaseCheckinHandlerFactory;
import com.intellij.openapi.vcs.checkin.VcsCheckinHandlerFactory;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
@@ -29,6 +32,11 @@ public class Dummy extends CheckinHandlersManager {
return Collections.emptyList();
}
@Override
public List<VcsCheckinHandlerFactory> getMatchingVcsFactories(@NotNull List<AbstractVcs> keys) {
return Collections.emptyList();
}
@Override
public void registerCheckinHandlerFactory(BaseCheckinHandlerFactory factory) {
}
@@ -127,6 +127,16 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj
private static boolean commit(final Project project, final List<Change> changes, final LocalChangeList initialSelection,
final List<CommitExecutor> executors, final boolean showVcsCommit, final String comment) {
final AbstractVcs[] allActiveVcss = ProjectLevelVcsManager.getInstance(project).getAllActiveVcss();
final List<VcsCheckinHandlerFactory> factoryList =
CheckinHandlersManager.getInstance(project).getMatchingVcsFactories(Arrays.<AbstractVcs>asList(allActiveVcss));
for (BaseCheckinHandlerFactory factory : factoryList) {
final BeforeCheckinDialogHandler handler = factory.createSystemReadyHandler(project);
if (handler != null) {
if (! handler.beforeCommitDialogShownCallback()) return false;
}
}
final ChangeListManager manager = ChangeListManager.getInstance(project);
final LocalChangeList defaultList = manager.getDefaultChangeList();
final ArrayList<LocalChangeList> changeLists = new ArrayList<LocalChangeList>(manager.getChangeListsCopy());
@@ -25,7 +25,9 @@ import com.intellij.openapi.vcs.VcsKey;
import com.intellij.openapi.vcs.checkin.BaseCheckinHandlerFactory;
import com.intellij.openapi.vcs.checkin.CheckinHandlerFactory;
import com.intellij.openapi.vcs.checkin.VcsCheckinHandlerFactory;
import com.intellij.util.SmartList;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
@@ -39,14 +41,14 @@ import java.util.List;
*/
public class CheckinHandlersManagerImpl extends CheckinHandlersManager {
private final List<BaseCheckinHandlerFactory> myRegisteredBeforeCheckinHandlers;
private final MultiMap<VcsKey, BaseCheckinHandlerFactory> myVcsMap;
private final MultiMap<VcsKey, VcsCheckinHandlerFactory> myVcsMap;
private final Project myProject;
private final ProjectLevelVcsManager myVcsManager;
public CheckinHandlersManagerImpl(final Project project, final ProjectLevelVcsManager vcsManager) {
myProject = project;
myVcsManager = vcsManager;
myVcsMap = new MultiMap<VcsKey, BaseCheckinHandlerFactory>();
myVcsMap = new MultiMap<VcsKey, VcsCheckinHandlerFactory>();
myRegisteredBeforeCheckinHandlers = new ArrayList<BaseCheckinHandlerFactory>();
StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new DumbAwareRunnable() {
@@ -69,7 +71,7 @@ public class CheckinHandlersManagerImpl extends CheckinHandlersManager {
new ArrayList<BaseCheckinHandlerFactory>(myRegisteredBeforeCheckinHandlers.size() + allActiveVcss.length);
list.addAll(myRegisteredBeforeCheckinHandlers);
for (AbstractVcs vcs : allActiveVcss) {
final Collection<BaseCheckinHandlerFactory> factories = myVcsMap.get(vcs.getKeyInstanceMethod());
final Collection<VcsCheckinHandlerFactory> factories = myVcsMap.get(vcs.getKeyInstanceMethod());
if (factories != null && ! factories.isEmpty()) {
list.addAll(factories);
}
@@ -77,6 +79,18 @@ public class CheckinHandlersManagerImpl extends CheckinHandlersManager {
return list;
}
@Override
public List<VcsCheckinHandlerFactory> getMatchingVcsFactories(@NotNull List<AbstractVcs> vcsList) {
final SmartList<VcsCheckinHandlerFactory> result = new SmartList<VcsCheckinHandlerFactory>();
for (AbstractVcs vcs : vcsList) {
final Collection<VcsCheckinHandlerFactory> factories = myVcsMap.get(vcs.getKeyInstanceMethod());
if (factories != null && ! factories.isEmpty()) {
result.addAll(factories);
}
}
return result;
}
@Override
public void registerCheckinHandlerFactory(BaseCheckinHandlerFactory factory) {
myRegisteredBeforeCheckinHandlers.add(factory);