using UnityEditor; using UnityEngine; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Perforce.P4; namespace P4Connect { public partial class Engine { /// /// This class is private because you shouldn't use it directly, talk to the Engine instead! /// class Operations { public static IList RevertAndDelete(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); con.P4Client.RevertFiles(allFiles, null); var result = con.P4Client.DeleteFiles(allFiles, null); Utils.LogFiles(result, "Deleting {0}"); return result; } public static IList Delete(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); var result = con.P4Client.DeleteFiles(allFiles, null); Utils.LogFiles(result, "Deleting {0}"); return result; } public static IList Revert(PerforceConnection con, IList list, IList ignoreList) { #if DEBUG log.Debug("Revert:"); log.Debug(" file: "); log.Debug(list); log.Debug(" ignore: "); log.Debug(ignoreList); #endif AssetDatabase.StartAssetEditing(); var allFiles = NonNullFilesAndMeta(list); var allFilesMetaRaw = GetFileMetaData(con, allFiles, null); List allFilesMeta = new List(); Utils.GetMatchingMetaData(allFiles, allFilesMetaRaw, allFilesMeta); // Fix reverting a move/delete file, and while we're at it for (int i = 0; i < allFiles.Count; ++i) { if (allFilesMeta[i] != null && allFilesMeta[i].Action == FileAction.MoveDelete) { // See if the matching Move/Add is in the list var moveAddMetaList = GetFileMetaData(con, null, FileSpec.DepotSpec(allFilesMeta[i].MovedFile.Path)); if (moveAddMetaList != null && moveAddMetaList.Count > 0) { if (!allFiles.Any(f => f.LocalPath == moveAddMetaList[0].LocalPath)) { allFiles[i] = FileSpec.LocalSpec(moveAddMetaList[0].LocalPath.Path); } } } } // get directories from the list that need to be deleted List dirsToDelete = new List(); foreach (var fileAndMeta in list) { if (fileAndMeta.Meta != null) { string assetMetaPath = Utils.LocalPathToAssetPath(fileAndMeta.Meta.LocalPath.Path); string assetPath = Utils.AssetFromMeta(assetMetaPath); if (Utils.IsDirectory(assetPath)) { FileState metaState = GetFileState(fileAndMeta.Meta, con); if (metaState == FileState.MarkedForAdd || metaState == FileState.MarkedForAddMove) { // We should delete the folder once done dirsToDelete.Add(Utils.AssetPathToFullPath(assetPath)); } } } } var result = con.P4Client.RevertFiles(allFiles, new RevertCmdOptions(RevertFilesCmdFlags.None, -1)); Utils.LogFiles(result, "Reverting {0}"); // Delete folders foreach (string folder in dirsToDelete) { try { System.IO.Directory.Delete(folder, true); } catch (System.IO.DirectoryNotFoundException) { // Ignore missing folders, they may have already been deleted } } AssetDatabase.StopAssetEditing(); //AssetDatabase.Refresh(); #if DEBUG log.Debug("...Revert results: "); log.Debug(result); #endif return result; } public static List RevertIfUnchanged(PerforceConnection con, IList list, IList ignoreList) { List assetsToRevert = new List(); List metasToRevertIfUnchanged = new List(); foreach (var fileAndMeta in list) { if (fileAndMeta.File != null) assetsToRevert.Add(fileAndMeta.File); else metasToRevertIfUnchanged.Add(fileAndMeta.Meta); } // Revert orphan metas first List revertedFiles = new List(); if (metasToRevertIfUnchanged.Count > 0) { var res = con.P4Client.RevertFiles(metasToRevertIfUnchanged, new Options(RevertFilesCmdFlags.UnchangedOnly, -1)); if (res != null) revertedFiles.AddRange(res); } // Then assets if (assetsToRevert.Count > 0) { var res = con.P4Client.RevertFiles(assetsToRevert, new Options(RevertFilesCmdFlags.UnchangedOnly, -1)); if (res != null) revertedFiles.AddRange(res); } // Now revert metas associated with assets if (revertedFiles != null && revertedFiles.Count > 0) { List metasToRevert = new List(); for (int i = 0; i < revertedFiles.Count; ++i) { string metaPath = Utils.MetaFromAsset(revertedFiles[i].LocalPath.Path); var llist = list.ToList(); int metaIndex = llist.FindIndex(fm => { bool metaMatches = false; if (fm.Meta != null) { metaMatches = String.Compare(metaPath, fm.Meta.LocalPath.Path, StringComparison.InvariantCultureIgnoreCase) == 0; } return metaMatches; }); if (metaIndex != -1) { metasToRevert.Add(list[metaIndex].Meta); } } // Revert metas associated with assets if (metasToRevert.Count > 0) { var revertMetaResult = con.P4Client.RevertFiles(metasToRevert, new RevertCmdOptions(RevertFilesCmdFlags.None, -1)); if (revertMetaResult != null) revertedFiles.AddRange(revertMetaResult); } } if (revertedFiles.Count > 0) { Utils.LogFiles(revertedFiles, "Reverting (unchanged) {0}"); } return revertedFiles; } public static IList RevertAndCheckout(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); con.P4Client.RevertFiles(allFiles, null); var result = con.P4Client.EditFiles(allFiles, null); Utils.LogFiles(result, "Restoring {0}"); Utils.CheckForMissingFilesAndWarn(allFiles, result, "The following files could not be checked out:"); return result; } public static IList RevertAndCheckoutNoOverwrite(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); con.P4Client.RevertFiles(allFiles, new Options(RevertFilesCmdFlags.ServerOnly, -1)); var result = con.P4Client.EditFiles(allFiles, null); Utils.LogFiles(result, "Checking out {0} and keeping current modifications"); Utils.CheckForMissingFilesAndWarn(allFiles, result, "The following files could not be checked out:"); return result; } public static IList Add(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); // Check for wildcards var wild = VerifyWildcards(list); var result = new List(); if (wild != WildcardCheck.Cancel) { // Use text or binary based on the editor settings List textFiles = new List(); List binaryFiles = new List(); List unknownFiles = new List(); Utils.FilterTextAndBinary(allFiles, textFiles, binaryFiles, unknownFiles); AddFilesCmdFlags flags = AddFilesCmdFlags.None; if (wild == WildcardCheck.Force) { flags = AddFilesCmdFlags.KeepWildcards; } AddFilesCmdOptions optionsText = new AddFilesCmdOptions(flags, -1, new FileType(BaseFileType.Text, FileTypeModifier.None)); AddFilesCmdOptions optionsBinary = new AddFilesCmdOptions(flags, -1, new FileType(BaseFileType.Binary, FileTypeModifier.None)); AddFilesCmdOptions optionsUnknown = new AddFilesCmdOptions(flags, -1, null); if (textFiles.Count > 0) { var added = con.P4Client.AddFiles(textFiles, optionsText); if (added != null) result.AddRange(added); } if (binaryFiles.Count > 0) { var added = con.P4Client.AddFiles(binaryFiles, optionsBinary); if (added != null) result.AddRange(added); } if (unknownFiles.Count > 0) { var added = con.P4Client.AddFiles(unknownFiles, optionsUnknown); if (added != null) result.AddRange(added); } Utils.LogFiles(result, "Adding {0}"); } return result; } public static List RevertAndAddNoOverwrite(PerforceConnection con, List list, List moveToList) { var wild = VerifyWildcards(moveToList); List result = new List(); if (wild != WildcardCheck.Cancel) { AddFilesCmdFlags flags = wild == WildcardCheck.Force ? AddFilesCmdFlags.KeepWildcards : AddFilesCmdFlags.None; for (int i = 0; i < list.Count; ++i) { if (list[i].File != null) { con.P4Client.RevertFiles(new Options(RevertFilesCmdFlags.ServerOnly, -1), list[i].File); AddFilesCmdOptions options = null; switch (Utils.FilterTextAndBinary(moveToList[i].File)) { case Utils.FilterTextAndBinaryResult.Binary: options = new AddFilesCmdOptions(flags, -1, new FileType(BaseFileType.Binary, FileTypeModifier.None)); break; case Utils.FilterTextAndBinaryResult.Text: options = new AddFilesCmdOptions(flags, -1, new FileType(BaseFileType.Text, FileTypeModifier.None)); break; case Utils.FilterTextAndBinaryResult.Unknown: options = new AddFilesCmdOptions(flags, -1, null); break; } var added = con.P4Client.AddFiles(options, moveToList[i].File); if (added != null) result.AddRange(added); } if (list[i].Meta != null) { con.P4Client.RevertFiles(new Options(RevertFilesCmdFlags.ServerOnly, -1), list[i].Meta); AddFilesCmdOptions options = null; switch (Utils.FilterTextAndBinary(moveToList[i].Meta)) { case Utils.FilterTextAndBinaryResult.Binary: options = new AddFilesCmdOptions(flags, -1, new FileType(BaseFileType.Binary, FileTypeModifier.None)); break; case Utils.FilterTextAndBinaryResult.Text: options = new AddFilesCmdOptions(flags, -1, new FileType(BaseFileType.Text, FileTypeModifier.None)); break; case Utils.FilterTextAndBinaryResult.Unknown: options = new AddFilesCmdOptions(flags, -1, null); break; } var added = con.P4Client.AddFiles(options, moveToList[i].Meta); if (added != null) result.AddRange(added); } } Utils.LogFiles(result, moveToList, "Moving new file {0} to {1}"); } return result; } public static IList Checkout(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); IList result = new List(); if (allFiles.Count > 0) { result = con.P4Client.EditFiles(allFiles, null); Utils.LogFiles(result, "Checking out {0}"); Utils.CheckForMissingFilesAndWarn(allFiles, result, "The following files could not be checked out:"); } return result; } public static List Move(PerforceConnection con, IList list, IList moveToList) { var wild = VerifyWildcards(moveToList); List result = new List(); if (wild != WildcardCheck.Cancel) { MoveFileCmdFlags flags = wild == WildcardCheck.Force ? MoveFileCmdFlags.ServerOnly | MoveFileCmdFlags.Force : MoveFileCmdFlags.ServerOnly; Options options = new Options(flags, -1, null); for (int i = 0; i < list.Count; ++i) { if (list[i].File != null) { con.P4Client.EditFiles(new Options(EditFilesCmdFlags.ServerOnly, -1, null), list[i].File); var moved = con.P4Client.MoveFiles(list[i].File, moveToList[i].File, options); if (moved != null) result.AddRange(moved); } if (list[i].Meta != null) { con.P4Client.EditFiles(new Options(EditFilesCmdFlags.ServerOnly, -1, null), list[i].Meta); var moved = con.P4Client.MoveFiles(list[i].Meta, moveToList[i].Meta, options); if (moved != null) result.AddRange(moved); } } Utils.LogFiles(result, moveToList, "Moving/Renaming {0} to {1}"); } return result; } public static List RevertAndMove(PerforceConnection con, IList list, IList moveToList) { var wild = VerifyWildcards(moveToList); List result = new List(); if (wild != WildcardCheck.Cancel) { MoveFileCmdFlags flags = wild == WildcardCheck.Force ? MoveFileCmdFlags.ServerOnly | MoveFileCmdFlags.Force : MoveFileCmdFlags.ServerOnly; Options options = new Options(flags, -1, null); var allFiles = NonNullFilesAndMeta(list); con.P4Client.RevertFiles(allFiles, null); for (int i = 0; i < list.Count; ++i) { if (list[i].File != null) { con.P4Client.EditFiles(new Options(EditFilesCmdFlags.ServerOnly, -1, null), list[i].File); var moved = con.P4Client.MoveFiles(list[i].File, moveToList[i].File, options); if (moved != null) result.AddRange(moved); } if (list[i].Meta != null) { con.P4Client.EditFiles(new Options(EditFilesCmdFlags.ServerOnly, -1, null), list[i].Meta); var moved = con.P4Client.MoveFiles(list[i].Meta, moveToList[i].Meta, options); if (moved != null) result.AddRange(moved); } } Utils.LogFiles(result, moveToList, "Moving/Renaming {0} to {1}"); } return result; } public static List RevertAndMoveNoOverwrite(PerforceConnection con, IList list, IList moveToList) { var wild = VerifyWildcards(moveToList); List result = new List(); if (wild != WildcardCheck.Cancel) { MoveFileCmdFlags flags = wild == WildcardCheck.Force ? MoveFileCmdFlags.ServerOnly | MoveFileCmdFlags.Force : MoveFileCmdFlags.ServerOnly; Options options = new Options(flags, -1, null); var allFiles = NonNullFilesAndMeta(list); con.P4Client.RevertFiles(allFiles, new Options(RevertFilesCmdFlags.ServerOnly, -1)); for (int i = 0; i < list.Count; ++i) { if (list[i].File != null) { con.P4Client.EditFiles(new Options(EditFilesCmdFlags.ServerOnly, -1, null), list[i].File); var moved = con.P4Client.MoveFiles(list[i].File, moveToList[i].File, options); if (moved != null) result.AddRange(moved); } if (list[i].Meta != null) { con.P4Client.EditFiles(new Options(EditFilesCmdFlags.ServerOnly, -1, null), list[i].Meta); var moved = con.P4Client.MoveFiles(list[i].Meta, moveToList[i].Meta, options); if (moved != null) result.AddRange(moved); } } Utils.LogFiles(result, moveToList, "Moving/Renaming {0} to {1}"); } return result; } public static List MoveToNewLocation(PerforceConnection con, IList list, IList moveToList) { var wild = VerifyWildcards(moveToList); List result = new List(); if (wild != WildcardCheck.Cancel) { MoveFileCmdFlags flags = wild == WildcardCheck.Force ? MoveFileCmdFlags.ServerOnly | MoveFileCmdFlags.Force : MoveFileCmdFlags.ServerOnly; Options options = new Options(flags, -1, null); for (int i = 0; i < list.Count; ++i) { if (list[i].File != null) { var moved = con.P4Client.MoveFiles(list[i].File, moveToList[i].File, options); if (moved != null) result.AddRange(moved); } if (list[i].Meta != null) { var moved = con.P4Client.MoveFiles(list[i].Meta, moveToList[i].Meta, options); if (moved != null) result.AddRange(moved); } } Utils.LogFiles(result, moveToList, "Moving/Renaming {0} to {1}"); } return result; } public static IList GetLatest(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); var result = PerformGetLastestAndPostChecks(con, allFiles, null); return result; } public static IList ForceGetLatest(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); var result = PerformGetLastestAndPostChecks(con, allFiles, new Options(SyncFilesCmdFlags.Force, -1)); return result; } public static IList RevertAndGetLatest(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); con.P4Client.RevertFiles(allFiles, null); var result = PerformGetLastestAndPostChecks(con, allFiles, new Options(SyncFilesCmdFlags.Force, -1)); return result; } public static IList Lock(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); var result = con.P4Client.LockFiles(allFiles, null); Utils.LogFiles(result, "Locking {0}"); return result; } public static IList Unlock(PerforceConnection con, IList list, IList ignoreList) { var allFiles = NonNullFilesAndMeta(list); var result = con.P4Client.UnlockFiles(allFiles, null); Utils.LogFiles(result, "Unlocking {0}"); return result; } } } }