1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-02 14:45:25 +02:00

[249544] Save conflict dialog appears when saving files in the editor

This commit is contained in:
David McKnight 2008-10-21 15:40:03 +00:00
parent 7c2f603436
commit 75683349f6
2 changed files with 33 additions and 116 deletions

View file

@ -191,6 +191,8 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
remoteFile, false, new NullProgressMonitor());
}
boolean openEditorAfterUpload = false;
// get associated editable
SystemEditableRemoteFile editable = getEditedFile(remoteFile);
if (editable != null && storedModifiedStamp == 0)
@ -209,7 +211,15 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
{
editable = new SystemEditableRemoteFile(remoteFile);
}
openEditorAfterUpload = true;
editable.setLocalResourceProperties();
}
upload(fs, remoteFile, tempFile, properties, storedModifiedStamp, editable, monitor);
if (openEditorAfterUpload){
// moving this to after the upload because otherwise it queries the remote file and that messes up the timestamps needed by upload
final SystemEditableRemoteFile fEditable = editable;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
@ -223,7 +233,7 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
if (fEditable.checkOpenInEditor() != ISystemEditableRemoteObject.NOT_OPEN)
{
try {
fEditable.openEditor();
fEditable.openEditor(); // open e
}
catch (PartInitException e) {
}
@ -232,10 +242,7 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
fEditable.addAsListener();
}
});
editable.setLocalResourceProperties();
}
upload(fs, remoteFile, tempFile, properties, storedModifiedStamp, editable, monitor);
}
}
catch (SystemMessageException e) {
@ -255,8 +262,12 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
{
try
{
// make sure the remote file is the current cached version
remoteFile = fs.getRemoteFileObject(remoteFile.getAbsolutePath(), monitor);
// get the remote modified timestamp
long remoteModifiedStamp = remoteFile.getLastModified();
boolean remoteFileDeleted = !remoteFile.exists();
// compare timestamps
@ -276,7 +287,7 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
}
catch (RemoteFileSecurityException e)
{
{
DisplaySystemMessageAction msgAction = new DisplaySystemMessageAction(e.getSystemMessage());
Display.getDefault().syncExec(msgAction);
}
@ -292,28 +303,28 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
Display.getDefault().syncExec(msgAction);
}
// requery the file so get the new timestamp
remoteFile.markStale(true);
remoteFile =fs.getRemoteFileObject(remoteFile.getAbsolutePath(), monitor);
IRemoteFile parent = remoteFile.getParentRemoteFile();
long ts = remoteFile.getLastModified();
// set the stored timestamp to be the same as the remote timestamp
properties.setRemoteFileTimeStamp(ts);
ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry();
// refresh
if (parent != null)
{
registry.fireEvent(new SystemResourceChangeEvent(parent, ISystemResourceChangeEvents.EVENT_REFRESH, null));
}
// waiting to make sure the file's timestamp is uptodate
remoteFile = waitForTimestampToBeUpToDate(remoteFile,remoteModifiedStamp, monitor);
registry.fireEvent(new SystemResourceChangeEvent(remoteFile, ISystemResourceChangeEvents.EVENT_PROPERTY_CHANGE, remoteFile));
long ts = remoteFile.getLastModified();
// set the stored timestamp to be the same as the remote timestamp
properties.setRemoteFileTimeStamp(ts);
// indicate that the temp file is no longer dirty
properties.setDirty(false);
editable.updateDirtyIndicator();
@ -373,53 +384,4 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
e.printStackTrace();
}
}
private IRemoteFile waitForTimestampToBeUpToDate(IRemoteFile remoteFile, long originalTimestamp, IProgressMonitor monitor)
{
IRemoteFileSubSystem fs = remoteFile.getParentRemoteFileSubSystem();
String path = remoteFile.getAbsolutePath();
try {
long timestamp = originalTimestamp;
boolean fileUpdated = false;
boolean timestampChanging = true;
int MAX_TIMES_CHECKED = 100; // make sure we don't wait indefinitely
int timesChecked = 0;
while ((timestampChanging || !fileUpdated) && !monitor.isCanceled()){ // wait until the timestamp stops changing AND timestamp did change at least once
try {
Thread.sleep(500); // sleep
}
catch (InterruptedException e){
}
// query the remote file again
remoteFile.markStale(true);
remoteFile = fs.getRemoteFileObject(path, monitor);
// what's the timestamp now?
long nextTimestamp = remoteFile.getLastModified();
timestampChanging = (timestamp != nextTimestamp);
if (!fileUpdated){ // indicate the file has changed if the timestamp has
fileUpdated = timestampChanging;
}
timestamp = nextTimestamp;
timesChecked++;
if (timesChecked >= MAX_TIMES_CHECKED){ // we're not expecting this, but it's better to timeout than to hang on this
SystemBasePlugin.logError("timeout waiting for timestamp after upload of "+ path); //$NON-NLS-1$
return remoteFile;
}
}
}
catch (SystemMessageException e){
}
return remoteFile;
}
}

View file

@ -198,12 +198,15 @@ public class SystemUploadConflictAction extends SystemBaseAction implements Runn
{
IRemoteFileSubSystem fs = _remoteFile.getParentRemoteFileSubSystem();
SystemIFileProperties properties = new SystemIFileProperties(_tempFile);
long originalTimestamp = _remoteFile.getLastModified();
// making sure we have the same version as is in the cache
_remoteFile = fs.getRemoteFileObject(_remoteFile.getAbsolutePath(), monitor);
fs.upload(_tempFile.getLocation().makeAbsolute().toOSString(), _remoteFile, SystemEncodingUtil.ENCODING_UTF_8, monitor);
// wait for timestamp to update before re-fetching remote file
_remoteFile = waitForTimestampToBeUpToDate(_remoteFile, originalTimestamp, monitor);
_remoteFile.markStale(true);
_remoteFile = fs.getRemoteFileObject(_remoteFile.getAbsolutePath(), monitor);
long ts = _remoteFile.getLastModified();
properties.setRemoteFileTimeStamp(ts);
@ -220,56 +223,8 @@ public class SystemUploadConflictAction extends SystemBaseAction implements Runn
}
return Status.OK_STATUS;
}
private IRemoteFile waitForTimestampToBeUpToDate(IRemoteFile remoteFile, long originalTimestamp, IProgressMonitor monitor)
{
IRemoteFileSubSystem fs = remoteFile.getParentRemoteFileSubSystem();
String path = remoteFile.getAbsolutePath();
try {
long timestamp = originalTimestamp;
boolean fileUpdated = false;
boolean timestampChanging = true;
int MAX_TIMES_CHECKED = 100; // make sure we don't wait indefinitely
int timesChecked = 0;
while ((timestampChanging || !fileUpdated) && !monitor.isCanceled()){ // wait until the timestamp stops changing AND timestamp did change at least once
try {
Thread.sleep(500); // sleep
}
catch (InterruptedException e){
}
// query the remote file again
remoteFile.markStale(true);
remoteFile = fs.getRemoteFileObject(path, monitor);
// what's the timestamp now?
long nextTimestamp = remoteFile.getLastModified();
timestampChanging = (timestamp != nextTimestamp);
if (!fileUpdated){ // indicate the file has changed if the timestamp has
fileUpdated = timestampChanging;
}
timestamp = nextTimestamp;
timesChecked++;
if (timesChecked >= MAX_TIMES_CHECKED){ // we're not expecting this, but it's better to timeout than to hang on this
SystemBasePlugin.logError("timeout waiting for timestamp after upload of "+ path); //$NON-NLS-1$
return remoteFile;
}
}
}
catch (SystemMessageException e){
}
return remoteFile;
}
}
/**
* This is the default dialog used to handle upload conflicts