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: file: "+ Logger.FileAndMetaListToString(list.ToList()) + " ignore: " + Logger.FileAndMetaListToString(ignoreList.ToList()));
#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: " + Logger.FileSpecListToString(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)
{
AddFilesCmdFlags flags = AddFilesCmdFlags.None;
if (wild == WildcardCheck.Force)
{
flags = AddFilesCmdFlags.KeepWildcards;
}
// Use the Server Typemap
if (Config.UseTypemap)
{
if (wild == WildcardCheck.Force)
{
flags = AddFilesCmdFlags.KeepWildcards;
}
AddFilesCmdOptions options = new AddFilesCmdOptions(flags, -1, null);
var added = con.P4Client.AddFiles(allFiles, options);
if (added != null)
result.AddRange(added);
}
else // Use the built-in typemap
{
// 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);
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)
{
log.Debug("getlatest: " + Logger.FileAndMetaListToString(list.ToList()));
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;
}
}
}
}