diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 425c8759ea1..3840200ff8b 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -110,6 +110,11 @@ export interface IFileService { */ backupFile(resource: URI, content: string): TPromise; + /** + * Discard the backup for the resource specified. + */ + discardBackup(resource: URI): TPromise; + /** * Discards all backups associated with this session. */ diff --git a/src/vs/workbench/common/editor/untitledEditorModel.ts b/src/vs/workbench/common/editor/untitledEditorModel.ts index c56db79b827..3b5e66d42a1 100644 --- a/src/vs/workbench/common/editor/untitledEditorModel.ts +++ b/src/vs/workbench/common/editor/untitledEditorModel.ts @@ -145,8 +145,6 @@ export class UntitledEditorModel extends StringEditorModel implements IEncodingS } private onModelContentChanged(): void { - this._onDidChangeContent.fire(); - // turn dirty if we were not if (!this.dirty) { this.dirty = true; @@ -159,6 +157,8 @@ export class UntitledEditorModel extends StringEditorModel implements IEncodingS this.dirty = false; this._onDidChangeDirty.fire(); } + + this._onDidChangeContent.fire(); } public dispose(): void { diff --git a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts b/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts index efe0af392f8..e95a4328a59 100644 --- a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts +++ b/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts @@ -306,8 +306,6 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil return; } - this._onDidContentChange.fire(void 0); - // The contents changed as a matter of Undo and the version reached matches the saved one // In this case we clear the dirty flag and emit a SAVED event to indicate this state. // Note: we currently only do this check when auto-save is turned off because there you see @@ -324,6 +322,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil this._onDidStateChange.fire(StateChange.REVERTED); } + this._onDidContentChange.fire(void 0); + return; } @@ -340,6 +340,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil diag('makeDirty() - prevented save because we are in conflict resolution mode', this.resource, new Date()); } } + + this._onDidContentChange.fire(void 0); } private makeDirty(): void { diff --git a/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts b/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts index 7b10b096c0c..ef73716f61f 100644 --- a/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts +++ b/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts @@ -76,8 +76,13 @@ export class DirtyFilesTracker implements IWorkbenchContribution { // TODO: Delay/throttle let untitledEditorInput = this.untitledEditorService.get(resource); untitledEditorInput.resolve().then((model) => { - // TODO: Deal with encoding? - this.fileService.backupFile(resource, model.getValue()); + if (model.isDirty()) { + // TODO: Deal with encoding? + this.fileService.backupFile(resource, model.getValue()); + } else { + console.log('discard'); + this.fileService.discardBackup(resource); + } }); } } @@ -100,12 +105,16 @@ export class DirtyFilesTracker implements IWorkbenchContribution { if (this.textFileService.isHotExitEnabled()) { let model = this.textFileService.models.get(resource); - this.fileService.backupFile(resource, model.getValue()); + if (model.isDirty()) { + this.fileService.backupFile(resource, model.getValue()); + } else { + console.log('discard'); + this.fileService.discardBackup(resource); + } } } private onTextFileDirty(e: TextFileModelChangeEvent): void { - console.log('onTextFileDirty', e); if ((this.textFileService.getAutoSaveMode() !== AutoSaveMode.AFTER_SHORT_DELAY) && !this.isDocumentedEdited) { this.updateDocumentEdited(); // no indication needed when auto save is enabled for short delay @@ -123,12 +132,6 @@ export class DirtyFilesTracker implements IWorkbenchContribution { if (!this.pendingDirtyHandle) { this.pendingDirtyHandle = setTimeout(() => this.doOpenDirtyResources(), 250); } - - if (this.textFileService.isHotExitEnabled()) { - console.log('trigger hot exit'); - // TODO: Delay/throttle - this.textFileService.backup(e.resource); - } } private doOpenDirtyResources(): void { diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index 50fb8bc05d9..0b1c233f277 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -236,6 +236,10 @@ export class FileService implements IFileService { return this.raw.backupFile(resource, content); } + public discardBackup(resource: uri): TPromise { + return this.raw.discardBackup(resource); + } + public discardBackups(): TPromise { return this.raw.discardBackups(); } diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index f7d45003d13..ec2b175c70f 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -437,14 +437,21 @@ export class FileService implements IFileService { public backupFile(resource: uri, content: string): TPromise { // TODO: Implement properly - var backupName = paths.basename(resource.fsPath); - var backupPath = paths.join(this.environmentService.userDataPath, 'File Backups', FileService.SESSION_BACKUP_ID, backupName); + const backupName = paths.basename(resource.fsPath); + const backupPath = paths.join(this.environmentService.userDataPath, 'File Backups', FileService.SESSION_BACKUP_ID, backupName); + const backupResource = uri.file(backupPath); - let backupResource = uri.file(backupPath); console.log(`Backing up to ${backupResource.fsPath}`); return this.updateContent(backupResource, content); } + public discardBackup(resource: uri): TPromise { + const backupName = paths.basename(resource.fsPath); + const backupPath = paths.join(this.environmentService.userDataPath, 'File Backups', FileService.SESSION_BACKUP_ID, backupName); + const backupResource = uri.file(backupPath); + return this.del(backupResource); + } + public discardBackups(): TPromise { return this.del(uri.file(paths.join(this.environmentService.userDataPath, 'File Backups', FileService.SESSION_BACKUP_ID))); }