110 lines
3.6 KiB
C#
110 lines
3.6 KiB
C#
using System.Collections.Generic;
|
|
|
|
using Codice.Client.Commands;
|
|
using Codice.Client.Commands.WkTree;
|
|
using Codice.Client.Common.Locks;
|
|
using Codice.Client.Common.WkTree;
|
|
using Codice.CM.Common;
|
|
using Codice.CM.WorkspaceServer;
|
|
|
|
namespace Unity.PlasticSCM.Editor.AssetsOverlays.Cache
|
|
{
|
|
internal static class SearchLocks
|
|
{
|
|
internal static Dictionary<WorkspaceTreeNode, LockInfo> GetLocksInfo(
|
|
WorkspaceInfo wkInfo,
|
|
Dictionary<MountPointWithPath, List<WorkspaceTreeNode>> locksCandidates)
|
|
{
|
|
Dictionary<WorkspaceTreeNode, LockInfo> result =
|
|
new Dictionary<WorkspaceTreeNode, LockInfo>();
|
|
|
|
ServerLocks.ForWorkingBranchOnRepoByItem locksForWorkingBranchOnRepoByItem =
|
|
new ServerLocks.ForWorkingBranchOnRepoByItem();
|
|
|
|
foreach (KeyValuePair<MountPointWithPath, List<WorkspaceTreeNode>> each in locksCandidates)
|
|
{
|
|
FillRepositoryLocks(
|
|
wkInfo, each.Key, each.Value,
|
|
locksForWorkingBranchOnRepoByItem, result);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
static void FillRepositoryLocks(
|
|
WorkspaceInfo wkInfo,
|
|
MountPointWithPath mount,
|
|
List<WorkspaceTreeNode> candidates,
|
|
ServerLocks.ForWorkingBranchOnRepoByItem locksForWorkingBranchOnRepoByItem,
|
|
Dictionary<WorkspaceTreeNode, LockInfo> locks)
|
|
{
|
|
if (candidates.Count == 0)
|
|
return;
|
|
|
|
LockRule lockRule = ServerLocks.GetLockRule(mount.RepSpec);
|
|
|
|
if (lockRule == null)
|
|
return;
|
|
|
|
candidates = GetLockableCandidates(candidates, lockRule);
|
|
|
|
if (candidates.Count == 0)
|
|
return;
|
|
|
|
BranchInfo workingBranch = CheckoutBranchSolver.Get(wkInfo).
|
|
GetWorkingBranchWithoutBranchExpansionByMount(mount);
|
|
|
|
if (workingBranch == null)
|
|
return;
|
|
|
|
ServerLocks.GetLocksForRepoByItemId(
|
|
mount.RepSpec, workingBranch.Id, locksForWorkingBranchOnRepoByItem);
|
|
|
|
Dictionary<long, LockInfo> lockByItemCache;
|
|
if (!locksForWorkingBranchOnRepoByItem.TryGetLocks(
|
|
mount.RepSpec, workingBranch.Id, out lockByItemCache))
|
|
return;
|
|
|
|
if (lockByItemCache.Count == 0)
|
|
return;
|
|
|
|
foreach (WorkspaceTreeNode candidate in candidates)
|
|
{
|
|
LockInfo serverLock;
|
|
if (!lockByItemCache.TryGetValue(
|
|
candidate.RevInfo.ItemId, out serverLock))
|
|
continue;
|
|
|
|
locks[candidate] = serverLock;
|
|
}
|
|
}
|
|
|
|
static List<WorkspaceTreeNode> GetLockableCandidates(
|
|
List<WorkspaceTreeNode> candidates,
|
|
LockRule lockRule)
|
|
{
|
|
List<WorkspaceTreeNode> result = new List<WorkspaceTreeNode>();
|
|
|
|
LockedFilesFilter filter = new LockedFilesFilter(lockRule.Rules);
|
|
|
|
foreach (WorkspaceTreeNode candidate in candidates)
|
|
{
|
|
string cmPath = WorkspaceNodeOperations.GetCmPath(candidate);
|
|
|
|
if (cmPath == null)
|
|
{
|
|
//The node could not be on the head tree (like copied items) so when we
|
|
//cannot calculate the path we assume that it's lockable.
|
|
result.Add(candidate);
|
|
continue;
|
|
}
|
|
|
|
if (filter.IsLockable(cmPath))
|
|
result.Add(candidate);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|