LocalStatusCache.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Collections.Generic;
  2. using Codice;
  3. using Codice.Client.BaseCommands;
  4. using Codice.Client.BaseCommands.Config;
  5. using Codice.Client.Commands.WkTree;
  6. using Codice.Client.Common;
  7. using Codice.CM.Common;
  8. using PlasticGui;
  9. using PlasticGui.WorkspaceWindow;
  10. namespace Unity.PlasticSCM.Editor.AssetsOverlays.Cache
  11. {
  12. internal class LocalStatusCache
  13. {
  14. internal LocalStatusCache(WorkspaceInfo wkInfo)
  15. {
  16. mWkInfo = wkInfo;
  17. }
  18. internal AssetStatus GetStatus(string fullPath)
  19. {
  20. AssetStatus result;
  21. if (mStatusByPathCache.TryGetValue(fullPath, out result))
  22. return result;
  23. result = CalculateStatus(
  24. fullPath,
  25. mWkInfo.ClientPath,
  26. FilterManager.Get().GetIgnoredFilter(),
  27. FilterManager.Get().GetHiddenChangesFilter());
  28. mStatusByPathCache.Add(fullPath, result);
  29. return result;
  30. }
  31. internal void Clear()
  32. {
  33. FilterManager.Get().Reload();
  34. mStatusByPathCache.Clear();
  35. }
  36. static AssetStatus CalculateStatus(
  37. string fullPath,
  38. string wkPath,
  39. IgnoredFilesFilter ignoredFilter,
  40. HiddenChangesFilesFilter hiddenChangesFilter)
  41. {
  42. if (!IsOnWorkspace(fullPath, wkPath))
  43. return AssetStatus.None;
  44. bool wasDownloadEnabled = GlobalConfig.Instance.DisableDownload();
  45. try
  46. {
  47. WorkspaceTreeNode treeNode = PlasticGui.Plastic.API.GetWorkspaceTreeNode(fullPath);
  48. if (CheckWorkspaceTreeNodeStatus.IsPrivate(treeNode))
  49. {
  50. return ignoredFilter.IsIgnored(fullPath) ?
  51. AssetStatus.Ignored : AssetStatus.Private;
  52. }
  53. if (CheckWorkspaceTreeNodeStatus.IsAdded(treeNode))
  54. return AssetStatus.Added;
  55. AssetStatus result = AssetStatus.Controlled;
  56. if (CheckWorkspaceTreeNodeStatus.IsCheckedOut(treeNode) &&
  57. !CheckWorkspaceTreeNodeStatus.IsDirectory(treeNode))
  58. result |= AssetStatus.Checkout;
  59. if (hiddenChangesFilter.IsHiddenChanged(fullPath))
  60. result |= AssetStatus.HiddenChanged;
  61. return result;
  62. }
  63. finally
  64. {
  65. if (wasDownloadEnabled)
  66. GlobalConfig.Instance.EnableDownload();
  67. }
  68. }
  69. static bool IsOnWorkspace(string fullPath, string clientPath)
  70. {
  71. return PathHelper.IsContainedOn(fullPath, clientPath);
  72. }
  73. Dictionary<string, AssetStatus> mStatusByPathCache =
  74. BuildPathDictionary.ForPlatform<AssetStatus>();
  75. readonly WorkspaceInfo mWkInfo;
  76. }
  77. }