//////////////////////////////////////////////////////////////////////////// // ADOBE SYSTEMS INCORPORATED // Copyright 2010 Adobe Systems Incorporated // All Rights Reserved // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the // terms of the Adobe license agreement accompanying it. If you have received this file from a // source other than Adobe, then your use, modification, or distribution of it requires the prior // written permission of Adobe. // Adobe Photoshop QE / DI Pro Tools Team // Email: DL-PS-External-Bugs-Tools@adobe.com // Script File: MigrateAllPresets.jsx // Script Dev: Kaori Mikawa, Barkin Aygun // Script QE: Kyoko Itoda, Irina Satanovskaya // This script carries over your presets and workspaces files from CC, CS6, CS5.1, CS5, CS4 and CS3 in order, // not picking up already existing ones. // It does it quietly, and within Photoshop, is designed to run in first launch ///////////////////////////////////////////////////////////////////////////// /* // BEGIN__HARVEST_EXCEPTION_ZSTRING $$$/JavaScripts/MigratePresets/Menu=Migrate Presets... help // END__HARVEST_EXCEPTION_ZSTRING */ #target photoshop; $.localize = true; try{ app.bringToFront(); app.displayDialogs = DialogModes.NO; var migrationComplete = false; var errorToQuit; // try to use variables to rev version. Still need to search for these CC%20 or the CC YYYY below in zstring format var versioncurrentsuite = "CC 2017"; var versioncurrentps = 18; var versionstrs = new Array("CC 2015.5", "CC 2015", "CC 2014", "CC", "CS6", "CS5.1", "CS5", "CS4", "CS3"); var versionflags = new Array(); for (i = 0; i < versionstrs.length; i++) { versionflags.push(false); } const kUserCancelError = "cancel"; var activesetfiles = new Array("Brushes.psp","Swatches.psp","Gradients.psp", "Styles.psp","Patterns.psp","Contours.psp", "CustomShapes.psp","Actions Palette.psp", "ToolPresets.psp","Default Type Styles.psp"); //ZSTRING var titleFileMigration = localize("$$$/MigratePresets/DialogTitle=Migrate Presets"); var msgCompleteError = localize("$$$/MigratePresets/MessageError=An error occurred when migrating the presets. Preset migration failed."); var msgAdmin = localize("$$$/MigratePresets/MessageAdmin=Administrative privileges are required to migrate these presets."); var msgWrongVersion = localize("$$$/MigratePresets/MessageWrongVersion=This script is intended for Photoshop CC 2017. Launch Photoshop CC 2017 and try again."); var noFileSelected = localize("$$$/MigratePresets/MessageNoFile=No file is selected to migrate."); var msgMigrate =localize("$$$/MigratePresets/MessageConfirm=Would you like to migrate presets from the following versions?^n"); var titleConfirmDialog = localize("$$$/MigratePresets/ConfirmTitle=Migrate Presets From Previous Versions of Adobe Photoshop"); var determiningProgressText = localize("$$$/MigratePresets/MessageDetermining=Determining which presets to migrate"); var migratingProgressText = localize("$$$/MigratePresets/MessageMigrating=Migrating presets"); var searchingProgressText = localize("$$$/MigratePresets/MessageSearching=Searching for presets to migrate"); var curOS = getCurOS($.os); var appVer = getAppVer(); var dirCommonFiles = getDirCommonFiles(); var dirUserData = getDirUserData(); var dirUserPreferencesMac = getDirUserPreferencesMac(); var dirUserPresets = new Folder(dirUserData + "/Adobe/Adobe Photoshop " + versioncurrentsuite + "/Presets"); var dirUserSettings = new Folder(); var dirUserWorkspaces = new Folder(); var dirUserWorkspacesModified = new Folder(); if(curOS.match("mac")){ dirUserSettings = new Folder(dirUserPreferencesMac + "/Adobe Photoshop " + versioncurrentsuite + " Settings"); dirUserWorkspaces = new Folder(dirUserPreferencesMac + "/Adobe Photoshop " + versioncurrentsuite + " Settings/WorkSpaces"); dirUserWorkspacesModified = new Folder(dirUserPreferencesMac + "/Adobe Photoshop " + versioncurrentsuite + " Settings/WorkSpaces (Modified)"); }else{ dirUserSettings = new Folder(dirUserData + "/Adobe/Adobe Photoshop " + versioncurrentsuite + "/Adobe Photoshop " + versioncurrentsuite + " Settings"); dirUserWorkspaces = new Folder(dirUserData + "/Adobe/Adobe Photoshop " + versioncurrentsuite + "/Adobe Photoshop " + versioncurrentsuite + " Settings/WorkSpaces"); dirUserWorkspacesModified = new Folder(dirUserData + "/Adobe/Adobe Photoshop " + versioncurrentsuite + "/Adobe Photoshop " + versioncurrentsuite + " Settings/WorkSpaces (Modified)"); } var fileItems = new Array(); var fileToMigrate = new Array(); var objFolderName = ""; // ----------------------------------------- // User Presets // ----------------------------------------- var arrayUserFolderPresetsTo = new Array(); var arrayUserFolderPresetsFrom = new Array(); var arrayUserFolderPresetsDiff = new Array(); var arrayUserFolderPresetsDiffDont = new Array(); var userFolderPresetsDiffTotal = 0; // ----------------------------------------- // User Workspaces // ----------------------------------------- var arrayUserFolderWorkspacesTo = new Array(); var arrayUserFolderWorkspacesFrom = new Array(); var arrayUserFolderWorkspacesDiff = new Array(); var arrayUserFolderWorkspacesDiffDont = new Array(); var userFolderWorkspacesDiffTotal = 0; // ----------------------------------------- // User Workspaces // ----------------------------------------- var arrayUserFolderWorkspacesModifiedTo = new Array(); var arrayUserFolderWorkspacesModifiedFrom = new Array(); var arrayUserFolderWorkspacesModifiedDiff = new Array(); var arrayUserFolderWorkspacesModifiedDiffDont = new Array(); var userFolderWorkspacesModifiedDiffTotal = 0; // ----------------------------------------- // Settings // ----------------------------------------- var arraySettingsTo = new Array(); var arraySettingsFrom = new Array(); var arraySettingsDiff = new Array(); var arraySettingsDiffDont = new Array(); var userFolderSettingsDiffTotal = 0; var result = "success"; // Eliminate versions w/out settings folder from our list so we don't allot part of the progress bar to them. quickCheckSettingsAvailable(); var migrateResult = new Object(); app.doProgress(searchingProgressText, "checkMigrateIsNecessary(migrateResult)"); if (migrateResult.migrateNecessary) { if(appVer == versioncurrentps){ for (i = 0; i < versionstrs.length; i++){ if (versionflags[i] == true) { msgMigrate = msgMigrate + "Adobe Photoshop " + versionstrs[i] +"\n"; } } if (confirm(msgMigrate, false, titleConfirmDialog)) { // Force the progress to show immediately because we may be copying very // large files, during which PS does not get a chance to pop the dialog // after the normal delay. app.doForcedProgress(determiningProgressText, "migrateAll(versioncurrentsuite)"); } else { result = "failure"; } }else{ alert(msgWrongVersion, titleFileMigration); } } else { // Exit quietly. PS will inform the user that no presets were migrated based on // this return value. result = "nothing"; } result; }catch(e){ if (e != kUserCancelError) alertScriptError("Line: " + e.line +" - "+ e); } /**************************************** * dirUserSettingFromForVersion ****************************************/ function dirUserSettingFromForVersion(versionstr) { return new Folder(dirUserSettings.toString().replace(/CC%202017/g,versionstr)); } /**************************************** * quickCheckSettingsAvailable * Does a quick check to determine which versions have settings folders available. We will skip * all other versions. ****************************************/ function quickCheckSettingsAvailable() { for (i = 0; i < versionstrs.length; i++){ if (dirUserSettingFromForVersion(versionstrs[i]).exists) versionflags[i] = true; } } /**************************************** * countTrueVersionFlags ****************************************/ function countTrueVersionFlags() { var count = 0; for (i = 0; i < versionstrs.length; i++){ if (versionflags[i] == true) count++; } return count; } /**************************************** * checkMigrateIsNecessary ****************************************/ function checkMigrateIsNecessary(outResult) { var currentTask = 0; var totalTasks = countTrueVersionFlags(); outResult.migrateNecessary= false; for (i = 0; i < versionstrs.length; i++){ // Some versions may have already be eliminated by quickCheckSettingsAvailable() if (versionflags[i] == false) continue; if (!app.doProgressSubTask(currentTask++, totalTasks, "refreshDiffData(versionstrs[i], true)")) throw kUserCancelError; if (arrayUserFolderPresetsDiff.length == 0 && arrayUserFolderWorkspacesDiff.length == 0 && arrayUserFolderWorkspacesModifiedDiff.length == 0 && arraySettingsDiff.length == 0) { versionflags[i] = false; } else { versionflags[i] = true; outResult.migrateNecessary = true; // quickCheckSettingsAvailable() may have set multiple version flags to true, but we // really only want to offer migration from the most last installed version before // this version, so clear all the remaining version flags for (j = (i + 1); j < versionstrs.length; j++) versionflags[j] = false; break; // this should break at first possible sync } } } /**************************************** * migrateAll ****************************************/ function migrateAll (versionstrcur){ var currentTask = 0; var totalTasks = countTrueVersionFlags(); for (i = 0; i < versionstrs.length; i++) { if (versionflags[i] == true) { app.doProgressSubTask(currentTask++, totalTasks, "migrateAllForVersion(versionstrs[i], versionstrcur)"); } } } /**************************************** * migrateAllForVersion ****************************************/ function migrateAllForVersion(versionstr, versionstrcur){ // We will allot task segment length unevenly, giving the majority to getting the diff data // and copying the user presets because those are the ones that are most like to be big tasks. var doneTasks = 0; var refreshTaskLen = 4, copyPresetsLen = 3, copyWSLen = 1, copyWSMLen = 1, copySettingsLen = 1; var totalTaskLengths = refreshTaskLen + copyPresetsLen + copyWSLen + copyWSMLen + copySettingsLen; if (!app.doProgressSegmentTask(refreshTaskLen, doneTasks, totalTaskLengths, "refreshDiffData(versionstr, false)")) throw kUserCancelError; doneTasks += refreshTaskLen; if (arrayUserFolderPresetsDiff.length == 0 && arrayUserFolderWorkspacesDiff.length == 0 && arrayUserFolderWorkspacesModifiedDiff.length == 0 && arraySettingsDiff.length == 0) { return; } app.changeProgressText(migratingProgressText); if (!app.doProgressSegmentTask(copyPresetsLen, doneTasks, totalTaskLengths, "migrateFiles(arrayUserFolderPresetsDiff, versionstr, versionstrcur)")) throw kUserCancelError; doneTasks += copyPresetsLen; if (!app.doProgressSegmentTask(copyWSLen, doneTasks, totalTaskLengths, "migrateFiles(arrayUserFolderWorkspacesDiff, versionstr, versionstrcur)")) throw kUserCancelError; doneTasks += copyWSLen; if (!app.doProgressSegmentTask(copyWSMLen, doneTasks, totalTaskLengths, "migrateFiles(arrayUserFolderWorkspacesModifiedDiff, versionstr, versionstrcur)")) throw kUserCancelError; doneTasks += copyWSMLen; if (!app.doProgressSegmentTask(copySettingsLen, doneTasks, totalTaskLengths, "migrateFiles(arraySettingsDiff, versionstr, versionstrcur)")) throw kUserCancelError; doneTasks += copySettingsLen; } /**************************************** * refreshListBoxes ****************************************/ function refreshDiffData(versionstr, justCheck){ // We will allot task segment length unevenly, giving the majority to checking user presets // because it is the one that is most like to be a big task. var doneTasks = 0; var totalTaskLengths = 10; var resultObj = new Object(); if (!app.doProgressSegmentTask(1, doneTasks++, totalTaskLengths, "refreshDiffDataSettingsFiles(versionstr, justCheck, resultObj)")) throw kUserCancelError; // if settings folder for an app does not exist, we shouldn't check the other folders as that app isn't "installed" if (!resultObj.folderExists) return; if (arraySettingsDiff.length > 0 && justCheck) return; if (!app.doProgressSegmentTask(1, doneTasks++, totalTaskLengths, "refreshDiffDataUserWorkspaces(versionstr,justCheck)")) throw kUserCancelError; if (arrayUserFolderWorkspacesDiff.length > 0 && justCheck) return; if (!app.doProgressSegmentTask(1, doneTasks++, totalTaskLengths, "refreshDiffDataUserWorkspacesModified(versionstr,justCheck)")) throw kUserCancelError; if (arrayUserFolderWorkspacesModifiedDiff.length > 0 && justCheck) return; if (!app.doProgressSegmentTask(7, doneTasks, totalTaskLengths, "refreshDiffDataUserPresets(versionstr,justCheck)")) throw kUserCancelError; if (arrayUserFolderPresetsDiff.length > 0 && justCheck) return; } function refreshDiffDataSettingsFiles(versionstr, justCheck, outResult) { dirUserSettingsFrom = dirUserSettingFromForVersion(versionstr); outResult.folderExists = dirUserSettingsFrom.exists; if (dirUserSettingsFrom.exists) { arraySettingsTo = getSettingsContents(dirUserSettings); arraySettingsFrom = getSettingsContents(dirUserSettingsFrom) arraySettingsDiff = getMissingFiles(arraySettingsFrom, arraySettingsTo, justCheck); arraySettingsDiffDont = new Array(); } } function refreshDiffDataUserWorkspaces(versionstr, justCheck) { dirUserWorkspacesFrom = new Folder(dirUserWorkspaces.toString().replace(/CC%202017/g,versionstr)); if (dirUserWorkspacesFrom.exists) { arrayUserFolderWorkspacesTo = getDirContents(dirUserWorkspaces.getFiles()); arrayUserFolderWorkspacesFrom = getDirContents(dirUserWorkspacesFrom.getFiles()); // Extensions were added to workspace files in 15.0, so ensure that we are looking for files // with extensions when looking for conflicts in the folders. We don't have to worry about adding // extensions when we copy the files because Photoshop will add them. var forcedFromExt = ".psw"; arrayUserFolderWorkspacesDiff = getMissingFiles(arrayUserFolderWorkspacesFrom,arrayUserFolderWorkspacesTo,justCheck,forcedFromExt); arrayUserFolderWorkspacesDiffDont = new Array(); } } function refreshDiffDataUserWorkspacesModified(versionstr,justCheck) { dirUserWorkspacesModifiedFrom = new Folder(dirUserWorkspacesModified.toString().replace(/CC%202017/g,versionstr)); if (dirUserWorkspacesModifiedFrom.exists) { arrayUserFolderWorkspacesModifiedTo = getDirContents(dirUserWorkspacesModified.getFiles()); arrayUserFolderWorkspacesModifiedFrom = getDirContents(dirUserWorkspacesModifiedFrom.getFiles()); // Extensions were added to workspace files in 15.0, so ensure that we are looking for files // with extensions when looking for conflicts in the folders. We don't have to worry about adding // extensions when we copy the files because Photoshop will add them. var forcedFromExt = ".psw"; arrayUserFolderWorkspacesModifiedDiff = getMissingFiles(arrayUserFolderWorkspacesModifiedFrom,arrayUserFolderWorkspacesModifiedTo,justCheck,forcedFromExt); arrayUserFolderWorkspacesModifiedDiffDont = new Array(); } } function refreshDiffDataUserPresets(versionstr,justCheck) { dirUserPresetsFrom = new Folder(dirUserPresets.toString().replace(/CC%202017/g,versionstr)); if (dirUserPresetsFrom.exists) { arrayUserFolderPresetsTo = getDirContents(dirUserPresets.getFiles()); arrayUserFolderPresetsFrom = getDirContents(dirUserPresetsFrom.getFiles()); arrayUserFolderPresetsDiff = getMissingFiles(arrayUserFolderPresetsFrom,arrayUserFolderPresetsTo, justCheck); arrayUserFolderPresetsDiffDont = new Array(); } } /**************************************** * migrateFiles ****************************************/ function migrateFiles(filesToMigrate, versionstr, versionstrcurrent){ //quietly return if there is nothing to migrate if(filesToMigrate.length == 0){ return; } var migrationRes = doMigrateFiles(versionstrcurrent); if(!migrationRes){ alert(msgCompleteError, titleFileMigration, true); } function doMigrateFiles(version_cur){ try{ // the version "CC xxxx" is actually represented as "CC%20xxxx" var old_ver = versionstr.replace( RegExp(" ", "gi"), "%20" ); var new_ver = version_cur.replace( RegExp(" ", "gi"), "%20" ); for(var i=0; i 0) { settingsItems.push(new Array(searchresult[0].parent.name, searchresult[0])); } } objItem = null; searchresult = null; return settingsItems; } /**************************************** * getDirContents ****************************************/ function getDirContents(tmpFolderItems) { fileItems = new Array(); getFiles(tmpFolderItems,fileItems); // Disabling sort because it is quite slow, we can't update progress during sorting, // and we do not take advantage of the fact that the array is sorted. // outFileItems.sort(); return fileItems; } /**************************************** * getFiles ****************************************/ function getFiles(tmpFolderItems,fileItems) { var objItem; for (var i=0;i