VCS: option to turn off background checks for "changed on server"

This commit is contained in:
Irina Chernushina
2009-09-23 18:37:36 +04:00
parent 921f2f6e78
commit 914f26ecfe
6 changed files with 103 additions and 50 deletions
@@ -532,3 +532,4 @@ annotation.switch.to.merged.text=Show merge sources
all.vcs.init.message.text=Initializing VCS...
switch.to.changelist=Switch &to changelist (''{0}'')
move.to.changelist=&Move changes to active changelist (''{0}'')
vcs.config.track.changed.on.server=Check "changed on server" conflicts in background
@@ -61,6 +61,7 @@ public final class VcsConfiguration implements PersistentStateComponent<Element>
public boolean PERFORM_CHECKOUT_IN_BACKGROUND = true;
public boolean PERFORM_ADD_REMOVE_IN_BACKGROUND = true;
public boolean PERFORM_ROLLBACK_IN_BACKGROUND = false;
public volatile boolean CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND = true;
public VcsShowConfirmationOption.Value MOVE_TO_FAILED_COMMIT_CHANGELIST = VcsShowConfirmationOption.Value.SHOW_CONFIRMATION;
public enum StandardOption {
@@ -0,0 +1,62 @@
package com.intellij.openapi.vcs.changes;
import com.intellij.lifecycle.ControlledAlarmFactory;
import com.intellij.lifecycle.SlowlyClosingAlarm;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Getter;
import com.intellij.util.Alarm;
import java.util.concurrent.atomic.AtomicBoolean;
public class ControlledCycle implements Runnable {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.ControlledCycle");
private final Alarm mySimpleAlarm;
private final SlowlyClosingAlarm myControlledAlarm;
// this interval is also to check for not initialized paths, so it is rather small
private static final int ourRefreshInterval = 10000;
private final Runnable myRunnable;
private final AtomicBoolean myActive;
public ControlledCycle(final Project project, final Getter<Boolean> runnable) {
myActive = new AtomicBoolean(false);
myRunnable = new Runnable() {
boolean shouldBeContinued = true;
public void run() {
try {
shouldBeContinued = Boolean.TRUE.equals(runnable.get());
} catch (ProcessCanceledException e) {
//
} catch (RuntimeException e) {
LOG.info(e);
}
if (! shouldBeContinued) {
myActive.set(false);
} else {
mySimpleAlarm.addRequest(ControlledCycle.this, ourRefreshInterval);
}
}
};
mySimpleAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD, project);
myControlledAlarm = ControlledAlarmFactory.createOnApplicationPooledThread(project);
}
public void start() {
final boolean wasSet = myActive.compareAndSet(false, true);
if (wasSet) {
mySimpleAlarm.addRequest(this, ourRefreshInterval);
}
}
public void run() {
try {
myControlledAlarm.checkShouldExit();
myControlledAlarm.addRequest(myRunnable);
} catch (ProcessCanceledException e) {
//
}
}
}
@@ -1,20 +1,17 @@
package com.intellij.openapi.vcs.changes;
import com.intellij.lifecycle.ControlledAlarmFactory;
import com.intellij.lifecycle.SlowlyClosingAlarm;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Getter;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.changes.ui.RemoteStatusChangeNodeDecorator;
import com.intellij.openapi.vcs.update.UpdateFilesHelper;
import com.intellij.openapi.vcs.update.UpdatedFiles;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.util.Alarm;
import com.intellij.util.Consumer;
import com.intellij.util.messages.Topic;
@@ -38,6 +35,7 @@ public class RemoteRevisionsCache implements PlusMinus<Pair<String, AbstractVcs>
private final Project myProject;
private final Object myLock;
private final Map<String, RemoteDifferenceStrategy> myKinds;
private ControlledCycle myControlledCycle;
public static RemoteRevisionsCache getInstance(final Project project) {
return ServiceManager.getService(project, RemoteRevisionsCache.class);
@@ -62,16 +60,27 @@ public class RemoteRevisionsCache implements PlusMinus<Pair<String, AbstractVcs>
}
});
updateKinds();
final MyRecursiveUpdateRequest request = new MyRecursiveUpdateRequest(project, new Runnable() {
public void run() {
boolean somethingChanged = myRemoteRevisionsNumbersCache.updateStep();
somethingChanged |= myRemoteRevisionsStateCache.updateStep();
if (somethingChanged) {
myProject.getMessageBus().syncPublisher(REMOTE_VERSION_CHANGED).run();
myControlledCycle = new ControlledCycle(project, new Getter<Boolean>() {
public Boolean get() {
final boolean shouldBeDone = VcsConfiguration.getInstance(myProject).CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND;
if (shouldBeDone) {
boolean somethingChanged = myRemoteRevisionsNumbersCache.updateStep();
somethingChanged |= myRemoteRevisionsStateCache.updateStep();
if (somethingChanged) {
myProject.getMessageBus().syncPublisher(REMOTE_VERSION_CHANGED).run();
}
}
return shouldBeDone;
}
});
request.start();
if ((! myProject.isDefault()) && VcsConfiguration.getInstance(myProject).CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND) {
myControlledCycle.start();
}
}
public void startRefreshInBackground() {
if (myProject.isDefault()) return;
myControlledCycle.start();
}
private void updateKinds() {
@@ -86,44 +95,6 @@ public class RemoteRevisionsCache implements PlusMinus<Pair<String, AbstractVcs>
}
}
private static class MyRecursiveUpdateRequest implements Runnable {
private final Alarm mySimpleAlarm;
private final SlowlyClosingAlarm myControlledAlarm;
// this interval is also to check for not initialized paths, so it is rather small
private static final int ourRefreshInterval = 1000;
private final Runnable myRunnable;
private MyRecursiveUpdateRequest(final Project project, final Runnable runnable) {
myRunnable = new Runnable() {
public void run() {
try {
runnable.run();
} catch (ProcessCanceledException e) {
//
} catch (RuntimeException e) {
LOG.info(e);
}
mySimpleAlarm.addRequest(MyRecursiveUpdateRequest.this, ourRefreshInterval);
}
};
mySimpleAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD, project);
myControlledAlarm = ControlledAlarmFactory.createOnApplicationPooledThread(project);
}
public void start() {
mySimpleAlarm.addRequest(this, ourRefreshInterval);
}
public void run() {
try {
myControlledAlarm.checkShouldExit();
myControlledAlarm.addRequest(myRunnable);
} catch (ProcessCanceledException e) {
//
}
}
}
public void directoryMappingChanged() {
updateKinds();
myRemoteRevisionsNumbersCache.directoryMappingChanged();
@@ -16,7 +16,7 @@
<properties/>
<border type="none"/>
<children>
<grid id="42f34" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="42f34" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -84,6 +84,14 @@
</component>
</children>
</grid>
<component id="9e0bc" class="javax.swing.JCheckBox" binding="myTrackChangedOnServer">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/VcsBundle" key="vcs.config.track.changed.on.server"/>
</properties>
</component>
</children>
</grid>
<vspacer id="ca331">
@@ -5,6 +5,7 @@ import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.VcsConfiguration;
import com.intellij.openapi.vcs.VcsShowOptionsSettingImpl;
import com.intellij.openapi.vcs.changes.RemoteRevisionsCache;
import org.jetbrains.annotations.Nls;
import javax.swing.*;
@@ -23,6 +24,7 @@ public class VcsBackgroundOperationsConfigurationPanel implements Configurable {
private JCheckBox myCbAddRemoveInBackground;
private JCheckBox myCbCheckoutInBackground;
private JCheckBox myPerformRevertInBackgroundCheckBox;
private JCheckBox myTrackChangedOnServer;
public VcsBackgroundOperationsConfigurationPanel(final Project project) {
@@ -40,6 +42,10 @@ public class VcsBackgroundOperationsConfigurationPanel implements Configurable {
settings.PERFORM_EDIT_IN_BACKGROUND = myCbEditInBackground.isSelected();
settings.PERFORM_ADD_REMOVE_IN_BACKGROUND = myCbAddRemoveInBackground.isSelected();
settings.PERFORM_ROLLBACK_IN_BACKGROUND = myPerformRevertInBackgroundCheckBox.isSelected();
if ((! settings.CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND) && myTrackChangedOnServer.isSelected()) {
RemoteRevisionsCache.getInstance(myProject).startRefreshInBackground();
}
settings.CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND = myTrackChangedOnServer.isSelected();
for (VcsShowOptionsSettingImpl setting : myPromptOptions.keySet()) {
setting.setValue(myPromptOptions.get(setting).isSelected());
@@ -71,6 +77,9 @@ public class VcsBackgroundOperationsConfigurationPanel implements Configurable {
if (settings.PERFORM_ROLLBACK_IN_BACKGROUND != myPerformRevertInBackgroundCheckBox.isSelected()) {
return true;
}
if (settings.CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND != myTrackChangedOnServer.isSelected()) {
return true;
}
return false;
}
@@ -83,6 +92,7 @@ public class VcsBackgroundOperationsConfigurationPanel implements Configurable {
myCbEditInBackground.setSelected(settings.PERFORM_EDIT_IN_BACKGROUND);
myCbAddRemoveInBackground.setSelected(settings.PERFORM_ADD_REMOVE_IN_BACKGROUND);
myPerformRevertInBackgroundCheckBox.setSelected(settings.PERFORM_ROLLBACK_IN_BACKGROUND);
myTrackChangedOnServer.setSelected(settings.CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND);
for (VcsShowOptionsSettingImpl setting : myPromptOptions.keySet()) {
myPromptOptions.get(setting).setSelected(setting.getValue());
}