From f6800da5937b97f83c1a18f76d2289ec348f9f4e Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 25 May 2011 19:02:01 +0400 Subject: [PATCH] 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 --- .../checkin/BaseCheckinHandlerFactory.java | 5 +++++ .../checkin/BeforeCheckinDialogHandler.java | 13 ++++++++++++ .../vcs/checkin/CheckinHandlerFactory.java | 6 ++++++ .../vcs/checkin/VcsCheckinHandlerFactory.java | 6 ++++++ .../vcs/impl/CheckinHandlersManager.java | 5 +++++ .../com/intellij/openapi/vcs/impl/Dummy.java | 8 ++++++++ .../changes/ui/CommitChangeListDialog.java | 10 ++++++++++ .../vcs/impl/CheckinHandlersManagerImpl.java | 20 ++++++++++++++++--- 8 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BeforeCheckinDialogHandler.java diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BaseCheckinHandlerFactory.java b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BaseCheckinHandlerFactory.java index f19d44af35e4..0b07d00a63d2 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BaseCheckinHandlerFactory.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BaseCheckinHandlerFactory.java @@ -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); } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BeforeCheckinDialogHandler.java b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BeforeCheckinDialogHandler.java new file mode 100644 index 000000000000..cbb51c59b205 --- /dev/null +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/BeforeCheckinDialogHandler.java @@ -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(); +} diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/CheckinHandlerFactory.java b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/CheckinHandlerFactory.java index a4685b8e32aa..36a3dbfd7991 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/CheckinHandlerFactory.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/CheckinHandlerFactory.java @@ -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; + } } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/VcsCheckinHandlerFactory.java b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/VcsCheckinHandlerFactory.java index e12f60b842b5..09a8fdc7deff 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/VcsCheckinHandlerFactory.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/checkin/VcsCheckinHandlerFactory.java @@ -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; + } } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/impl/CheckinHandlersManager.java b/platform/vcs-api/src/com/intellij/openapi/vcs/impl/CheckinHandlersManager.java index 496e8cb4968a..1f384e69fa2b 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/impl/CheckinHandlersManager.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/impl/CheckinHandlersManager.java @@ -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 getRegisteredCheckinHandlerFactories(); + + public abstract List getMatchingVcsFactories(@NotNull final List keys); /** * Registers a factory which provides callbacks to run before and after VCS checkin operations. * diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/impl/Dummy.java b/platform/vcs-api/src/com/intellij/openapi/vcs/impl/Dummy.java index 208c7daf6e98..5fda349ff298 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/impl/Dummy.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/impl/Dummy.java @@ -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 getMatchingVcsFactories(@NotNull List keys) { + return Collections.emptyList(); + } + @Override public void registerCheckinHandlerFactory(BaseCheckinHandlerFactory factory) { } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java index 1e3defb44fff..5b4421f3c0e8 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java @@ -127,6 +127,16 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj private static boolean commit(final Project project, final List changes, final LocalChangeList initialSelection, final List executors, final boolean showVcsCommit, final String comment) { + final AbstractVcs[] allActiveVcss = ProjectLevelVcsManager.getInstance(project).getAllActiveVcss(); + final List factoryList = + CheckinHandlersManager.getInstance(project).getMatchingVcsFactories(Arrays.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 changeLists = new ArrayList(manager.getChangeListsCopy()); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/CheckinHandlersManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/CheckinHandlersManagerImpl.java index 9f27efeb4fb9..053af4e2f089 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/CheckinHandlersManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/CheckinHandlersManagerImpl.java @@ -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 myRegisteredBeforeCheckinHandlers; - private final MultiMap myVcsMap; + private final MultiMap myVcsMap; private final Project myProject; private final ProjectLevelVcsManager myVcsManager; public CheckinHandlersManagerImpl(final Project project, final ProjectLevelVcsManager vcsManager) { myProject = project; myVcsManager = vcsManager; - myVcsMap = new MultiMap(); + myVcsMap = new MultiMap(); myRegisteredBeforeCheckinHandlers = new ArrayList(); StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new DumbAwareRunnable() { @@ -69,7 +71,7 @@ public class CheckinHandlersManagerImpl extends CheckinHandlersManager { new ArrayList(myRegisteredBeforeCheckinHandlers.size() + allActiveVcss.length); list.addAll(myRegisteredBeforeCheckinHandlers); for (AbstractVcs vcs : allActiveVcss) { - final Collection factories = myVcsMap.get(vcs.getKeyInstanceMethod()); + final Collection 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 getMatchingVcsFactories(@NotNull List vcsList) { + final SmartList result = new SmartList(); + for (AbstractVcs vcs : vcsList) { + final Collection factories = myVcsMap.get(vcs.getKeyInstanceMethod()); + if (factories != null && ! factories.isEmpty()) { + result.addAll(factories); + } + } + return result; + } + @Override public void registerCheckinHandlerFactory(BaseCheckinHandlerFactory factory) { myRegisteredBeforeCheckinHandlers.add(factory);