forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFileSyncManager.js
More file actions
1 lines (1 loc) · 4.93 KB
/
FileSyncManager.js
File metadata and controls
1 lines (1 loc) · 4.93 KB
1
define(function(require,exports,module){var ProjectManager=require("project/ProjectManager"),DocumentManager=require("document/DocumentManager"),MainViewManager=require("view/MainViewManager"),Async=require("utils/Async"),Dialogs=require("widgets/Dialogs"),DefaultDialogs=require("widgets/DefaultDialogs"),Strings=require("strings"),StringUtils=require("utils/StringUtils"),FileUtils=require("file/FileUtils"),FileSystemError=require("filesystem/FileSystemError"),_alreadyChecking=!1,_restartPending=!1,toReload,toClose,editConflicts,deleteConflicts;function findExternalChanges(docs){function checkDoc(doc){var result=new $.Deferred;return doc.isUntitled()?result.resolve():doc.file.donotWatch?result.resolve():doc.file.stat(function(err,stat){if(err)err===FileSystemError.NOT_FOUND?(-1!==doc.keepChangesTime&&(doc.isDirty?deleteConflicts.push({doc:doc,fileTime:-1}):toClose.push(doc)),result.resolve()):(console.log("Error checking modification status of "+doc.file.fullPath,err),result.reject());else{var fileTime=stat.mtime.getTime();fileTime!==doc.diskTimestamp.getTime()&&doc.keepChangesTime!==fileTime&&(doc.isDirty?editConflicts.push({doc:doc,fileTime:fileTime}):toReload.push(doc)),result.resolve()}}),result.promise()}return toReload=[],toClose=[],editConflicts=[],deleteConflicts=[],Async.doInParallel(docs,checkDoc,!0)}function syncUnopenWorkingSet(){var unopenWorkingSetFiles=MainViewManager.getWorkingSet(MainViewManager.ALL_PANES).filter(function(wsFile){return!DocumentManager.getOpenDocumentForPath(wsFile.fullPath)});function checkWorkingSetFile(file){var result=new $.Deferred;return file.stat(function(err,stat){err?err===FileSystemError.NOT_FOUND?(DocumentManager.notifyFileDeleted(file),result.resolve()):(console.log("Error checking for deletion of "+file.fullPath,err),result.reject()):result.resolve()}),result.promise()}return Async.doInParallel(unopenWorkingSetFiles,checkWorkingSetFile,!1)}function reloadDoc(doc){var promise=FileUtils.readAsText(doc.file);return promise.done(function(text,readTimestamp){doc.refreshText(text,readTimestamp)}),promise.fail(function(error){console.log("Error reloading contents of "+doc.file.fullPath,error)}),promise}function reloadChangedDocs(){return Async.doInParallel(toReload,reloadDoc,!1)}function showReloadError(error,doc){return Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,Strings.ERROR_RELOADING_FILE_TITLE,StringUtils.format(Strings.ERROR_RELOADING_FILE,StringUtils.breakableUrl(doc.file.fullPath),FileUtils.getFileErrorString(error)))}function closeDeletedDocs(){toClose.forEach(function(doc){DocumentManager.notifyFileDeleted(doc.file)})}function presentConflicts(title){var allConflicts=editConflicts.concat(deleteConflicts);function presentConflict(docInfo,i){var result=new $.Deferred,promise=result.promise(),doc=docInfo.doc,fileTime=docInfo.fileTime,toClose,dialogId,message,buttons;return _restartPending?(result.resolve(),promise):(i<editConflicts.length?(toClose=!1,dialogId=DefaultDialogs.DIALOG_ID_EXT_CHANGED,message=StringUtils.format(Strings.EXT_MODIFIED_MESSAGE,StringUtils.breakableUrl(ProjectManager.makeProjectRelativeIfPossible(doc.file.fullPath))),buttons=[{className:Dialogs.DIALOG_BTN_CLASS_LEFT,id:Dialogs.DIALOG_BTN_DONTSAVE,text:Strings.RELOAD_FROM_DISK},{className:Dialogs.DIALOG_BTN_CLASS_PRIMARY,id:Dialogs.DIALOG_BTN_CANCEL,text:Strings.KEEP_CHANGES_IN_EDITOR}]):(toClose=!0,dialogId=DefaultDialogs.DIALOG_ID_EXT_DELETED,message=StringUtils.format(Strings.EXT_DELETED_MESSAGE,StringUtils.breakableUrl(ProjectManager.makeProjectRelativeIfPossible(doc.file.fullPath))),buttons=[{className:Dialogs.DIALOG_BTN_CLASS_LEFT,id:Dialogs.DIALOG_BTN_DONTSAVE,text:Strings.CLOSE_DONT_SAVE},{className:Dialogs.DIALOG_BTN_CLASS_PRIMARY,id:Dialogs.DIALOG_BTN_CANCEL,text:Strings.KEEP_CHANGES_IN_EDITOR}]),Dialogs.showModalDialog(dialogId,title,message,buttons).done(function(id){id===Dialogs.DIALOG_BTN_DONTSAVE?toClose?(DocumentManager.notifyFileDeleted(doc.file),result.resolve()):reloadDoc(doc).done(function(){result.resolve()}).fail(function(error){showReloadError(error,doc).done(function(){result.reject()})}):(_restartPending||(doc.keepChangesTime=fileTime),result.resolve())}),promise)}return Async.doSequentially(allConflicts,presentConflict,!1)}function syncOpenDocuments(title){if(title=title||Strings.EXT_MODIFIED_TITLE,_alreadyChecking)return _restartPending=!0,Dialogs.cancelModalDialogIfOpen(DefaultDialogs.DIALOG_ID_EXT_CHANGED),void Dialogs.cancelModalDialogIfOpen(DefaultDialogs.DIALOG_ID_EXT_DELETED);var allDocs;_alreadyChecking=!0,findExternalChanges(DocumentManager.getAllOpenDocuments()).done(function(){syncUnopenWorkingSet().always(function(){reloadChangedDocs().always(function(){closeDeletedDocs(),presentConflicts(title).always(function(){_restartPending?(_restartPending=!1,_alreadyChecking=!1,syncOpenDocuments()):(_alreadyChecking=!1,(editConflicts.length>0||deleteConflicts.length>0)&&MainViewManager.focusActivePane())})})})}).fail(function(){_alreadyChecking=!1})}exports.syncOpenDocuments=syncOpenDocuments});