92 lines
3.0 KiB
C#
92 lines
3.0 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using Codice.Client.BaseCommands;
|
|
using Codice.CM.Common;
|
|
using Unity.PlasticSCM.Editor.AssetUtils;
|
|
|
|
namespace Unity.PlasticSCM.Editor
|
|
{
|
|
internal static class ProjectPackages
|
|
{
|
|
internal static bool ShouldBeResolvedFromPaths(
|
|
WorkspaceInfo wkInfo, List<string> updatedItems)
|
|
{
|
|
if (IsDynamicWorkspace(wkInfo))
|
|
return true;
|
|
|
|
return updatedItems.Any(ShouldPathBeResolved);
|
|
}
|
|
|
|
internal static bool ShouldBeResolvedFromUpdateReport(
|
|
WorkspaceInfo wkInfo, List<string> updatedItems)
|
|
{
|
|
if (IsDynamicWorkspace(wkInfo))
|
|
return true;
|
|
|
|
updatedItems = updatedItems.Select(GetPathFromUpdateReport).ToList();
|
|
|
|
return updatedItems.Any(ShouldPathBeResolved);
|
|
}
|
|
|
|
internal static bool ShouldBeResolvedFromUpdateProgress(
|
|
WorkspaceInfo wkInfo, UpdateProgress progress)
|
|
{
|
|
if (progress == null)
|
|
return false;
|
|
|
|
if (IsDynamicWorkspace(wkInfo))
|
|
return true;
|
|
|
|
return ShouldBeResolved(progress.AddedItems.Where(i => !i.IsDirectory))
|
|
|| ShouldBeResolved(progress.DeletedItems)
|
|
|| ShouldBeResolved(progress.ChangedItems.Where(i => !i.IsDirectory))
|
|
|| ShouldBeResolved(progress.MovedItems);
|
|
}
|
|
|
|
static bool IsDynamicWorkspace(WorkspaceInfo wkInfo)
|
|
{
|
|
// We cannot obtain the updated items from a dynamic workspace, so for the moment,
|
|
// we'll force the Packages reimport for these kind of workspaces.
|
|
return Codice.CM.WorkspaceServer.IsDynamicWorkspace.Check(wkInfo);
|
|
}
|
|
|
|
static bool ShouldBeResolved(IEnumerable<UpdateProgress.UpdatedItem> items)
|
|
{
|
|
return items.Select(i => i.Path).Any(ShouldPathBeResolved)
|
|
|| items.Any(i => i.IsDirectory);
|
|
}
|
|
|
|
static bool ShouldBeResolved(IEnumerable<UpdateProgress.UpdatedMovedItem> items)
|
|
{
|
|
return items.Select(i => i.DstPath).Any(ShouldPathBeResolved)
|
|
|| items.Any(i => i.IsDirectory);
|
|
}
|
|
|
|
static bool ShouldPathBeResolved(string path)
|
|
{
|
|
return AssetsPath.IsPackagesRootElement(path)
|
|
|| AssetsPath.IsScript(path);
|
|
}
|
|
|
|
static string GetPathFromUpdateReport(string item)
|
|
{
|
|
if (string.IsNullOrEmpty(item))
|
|
return string.Empty;
|
|
|
|
// For full workspaces we expect to receive the updated items with format <{UPDATE_TYPE}:{ITEM_PATH}>
|
|
if (!item.StartsWith("<") || !item.EndsWith(">"))
|
|
return string.Empty;
|
|
|
|
int startIndex = item.IndexOf(":") + 1;
|
|
|
|
if (startIndex == 0)
|
|
return string.Empty;
|
|
|
|
int endIndex = item.Length - 1;
|
|
|
|
return item.Substring(startIndex, endIndex - startIndex);
|
|
}
|
|
}
|
|
}
|