| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- using System.Collections.Generic;
- using PlasticGui.WorkspaceWindow.Merge;
- namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
- {
- internal class UnityIncomingChangesTree
- {
- internal static UnityIncomingChangesTree BuildIncomingChangeCategories(
- MergeChangesTree tree)
- {
- return new UnityIncomingChangesTree(tree);
- }
- UnityIncomingChangesTree(
- MergeChangesTree tree)
- {
- mInnerTree = tree;
- mMetaCache.Build(mInnerTree.GetNodes());
- }
- internal List<MergeChangesCategory> GetNodes()
- {
- return mInnerTree.GetNodes();
- }
- internal bool HasMeta(MergeChangeInfo changeInfo)
- {
- return mMetaCache.ContainsMeta(changeInfo);
- }
- internal MergeChangeInfo GetMetaChange(MergeChangeInfo change)
- {
- return mMetaCache.GetExistingMeta(change);
- }
- internal void FillWithMeta(List<MergeChangeInfo> changes)
- {
- changes.AddRange(
- mMetaCache.GetExistingMeta(changes));
- }
- internal void Sort(string key, bool isAscending)
- {
- mInnerTree.Sort(key, isAscending);
- }
- internal void ResolveUserNames(
- MergeChangesTree.ResolveUserName resolveUserName)
- {
- mInnerTree.ResolveUserNames(resolveUserName);
- }
- MetaCache mMetaCache = new MetaCache();
- MergeChangesTree mInnerTree;
- class MetaCache
- {
- internal bool ContainsMeta(MergeChangeInfo changeInfo)
- {
- string key = BuildKey.ForMetaChange(changeInfo);
- return mCache.ContainsKey(key);
- }
- internal MergeChangeInfo GetExistingMeta(MergeChangeInfo change)
- {
- MergeChangeInfo result;
- if (!mCache.TryGetValue(BuildKey.ForMetaChange(change), out result))
- return null;
- return result;
- }
- internal List<MergeChangeInfo> GetExistingMeta(
- List<MergeChangeInfo> changes)
- {
- List<MergeChangeInfo> result = new List<MergeChangeInfo>();
- foreach (MergeChangeInfo change in changes)
- {
- string key = BuildKey.ForMetaChange(change);
- MergeChangeInfo metaChange;
- if (!mCache.TryGetValue(key, out metaChange))
- continue;
- result.Add(metaChange);
- }
- return result;
- }
- internal void Build(List<MergeChangesCategory> incomingChangesCategories)
- {
- mCache.Clear();
- foreach (MergeChangesCategory category in incomingChangesCategories)
- {
- ExtractMetaToCache(category, mCache);
- }
- }
- static void ExtractMetaToCache(
- MergeChangesCategory category,
- Dictionary<string, MergeChangeInfo> cache)
- {
- List<MergeChangeInfo> changes = category.GetChanges();
- HashSet<string> indexedKeys = BuildIndexedKeys(
- changes);
- for (int i = changes.Count - 1; i >= 0; i--)
- {
- MergeChangeInfo currentChange = changes[i];
- string path = currentChange.GetPath();
- if (!MetaPath.IsMetaPath(path))
- continue;
- string realPath = MetaPath.GetPathFromMetaPath(path);
- if (!indexedKeys.Contains(BuildKey.BuildCacheKey(
- currentChange.CategoryType, realPath)))
- continue;
- // found foo.c and foo.c.meta - move .meta to cache
- cache.Add(BuildKey.ForChange(currentChange), currentChange);
- changes.RemoveAt(i);
- }
- }
- static HashSet<string> BuildIndexedKeys(
- List<MergeChangeInfo> changes)
- {
- HashSet<string> result = new HashSet<string>();
- foreach (MergeChangeInfo change in changes)
- {
- if (MetaPath.IsMetaPath(change.GetPath()))
- continue;
- result.Add(BuildKey.ForChange(change));
- }
- return result;
- }
- Dictionary<string, MergeChangeInfo> mCache =
- new Dictionary<string, MergeChangeInfo>();
- static class BuildKey
- {
- internal static string ForChange(
- MergeChangeInfo change)
- {
- return BuildCacheKey(
- change.CategoryType,
- change.GetPath());
- }
- internal static string ForMetaChange(
- MergeChangeInfo change)
- {
- return BuildCacheKey(
- change.CategoryType,
- MetaPath.GetMetaPath(change.GetPath()));
- }
- internal static string BuildCacheKey(
- MergeChangesCategory.Type type,
- string path)
- {
- return string.Concat(type, ":", path);
- }
- }
- }
- }
- }
|