diff --git a/src/AutoMerge/Branches/BranchValidator.cs b/src/AutoMerge/Branches/BranchValidator.cs index e889443..a9a2cc8 100644 --- a/src/AutoMerge/Branches/BranchValidator.cs +++ b/src/AutoMerge/Branches/BranchValidator.cs @@ -1,111 +1,113 @@ -using System.Collections.Generic; -using System.Linq; using Microsoft.TeamFoundation.VersionControl.Client; +using System; +using System.Collections.Generic; +using System.Linq; namespace AutoMerge -{ - public class BranchValidator - { - private readonly Workspace _workspace; - private readonly IEnumerable _trackMerges; - - public BranchValidator(Workspace workspace, IEnumerable trackMerges) - { - _workspace = workspace; - _trackMerges = trackMerges; - } - - public MergeInfoViewModel Validate(MergeInfoViewModel branchInfo) - { - branchInfo.ValidationResult = ValidateItem(_workspace, branchInfo, _trackMerges); - branchInfo.ValidationMessage = ToMessage(branchInfo.ValidationResult); - - return branchInfo; - } - - private static BranchValidationResult ValidateItem(Workspace workspace, MergeInfoViewModel mergeInfoViewModel, IEnumerable trackMerges) - { - var result = BranchValidationResult.Success; - - if (result == BranchValidationResult.Success) - { - var isMerged = IsMerged(mergeInfoViewModel.SourcePath, mergeInfoViewModel.TargetPath, trackMerges); - if (isMerged) - result = BranchValidationResult.AlreadyMerged; - } - - if (result == BranchValidationResult.Success) - { - var userHasAccess = UserHasAccess(workspace.VersionControlServer, mergeInfoViewModel.TargetPath); - if (!userHasAccess) - result = BranchValidationResult.NoAccess; - } - - if (result == BranchValidationResult.Success) - { - var isMapped = IsMapped(workspace, mergeInfoViewModel.TargetPath); - if (!isMapped) - result = BranchValidationResult.BranchNotMapped; - } - - if (result == BranchValidationResult.Success) - { - var hasLocalChanges = HasLocalChanges(workspace, mergeInfoViewModel.TargetPath); - if (hasLocalChanges) - result = BranchValidationResult.ItemHasLocalChanges; - } - return result; - } - - private static bool IsMerged(string sourcePath, string targetPath, IEnumerable trackMerges) - { - if (trackMerges == null) - return false; - - return trackMerges.Any(m => (m.TargetItem.Item == sourcePath && m.SourceItem.Item.ServerItem == targetPath) - || (m.TargetItem.Item == targetPath && m.SourceItem.Item.ServerItem == sourcePath)); - } - - private static bool UserHasAccess(VersionControlServer versionControlServer, string targetPath) - { - var permissions = versionControlServer.GetEffectivePermissions(versionControlServer.AuthorizedUser, targetPath); - - if (permissions == null || permissions.Length < 4) - return false; - - return permissions.Contains("Read") - && permissions.Contains("PendChange") - && permissions.Contains("Checkin") - && permissions.Contains("Merge"); - } - - private static bool IsMapped(Workspace workspace, string targetItem) - { - return workspace.IsServerPathMapped(targetItem); - } - - private static bool HasLocalChanges(Workspace workspace, string targetPath) - { - return workspace.GetPendingChangesEnumerable(targetPath, RecursionType.Full).Any(); - } - - private static string ToMessage(BranchValidationResult validationResult) - { - switch (validationResult) - { - case BranchValidationResult.Success: - return null; - case BranchValidationResult.AlreadyMerged: - return "Already merged"; - case BranchValidationResult.BranchNotMapped: - return "Branch not mapped"; - case BranchValidationResult.ItemHasLocalChanges: - return "Folder has local changes. Check-in or undo it"; - case BranchValidationResult.NoAccess: - return "You have not rights for edit"; - default: - return "Unknown error"; - } - } - } +{ + public class BranchValidator + { + private readonly Workspace _workspace; + private readonly IEnumerable _trackMerges; + + public BranchValidator(Workspace workspace, IEnumerable trackMerges) + { + _workspace = workspace; + _trackMerges = trackMerges; + } + + public MergeInfoViewModel Validate(MergeInfoViewModel branchInfo) + { + branchInfo.ValidationResult = ValidateItem(_workspace, branchInfo, _trackMerges); + branchInfo.ValidationMessage = ToMessage(branchInfo.ValidationResult); + + return branchInfo; + } + + private static BranchValidationResult ValidateItem(Workspace workspace, MergeInfoViewModel mergeInfoViewModel, IEnumerable trackMerges) + { + var result = BranchValidationResult.Success; + + if (result == BranchValidationResult.Success) + { + var isMerged = IsMerged(mergeInfoViewModel.SourcePath, mergeInfoViewModel.TargetPath, trackMerges); + if (isMerged) + result = BranchValidationResult.AlreadyMerged; + } + + if (result == BranchValidationResult.Success) + { + var userHasAccess = UserHasAccess(workspace.VersionControlServer, mergeInfoViewModel.TargetPath); + if (!userHasAccess) + result = BranchValidationResult.NoAccess; + } + + if (result == BranchValidationResult.Success) + { + var isMapped = IsMapped(workspace, mergeInfoViewModel.TargetPath); + if (!isMapped) + result = BranchValidationResult.BranchNotMapped; + } + + if (result == BranchValidationResult.Success) + { + var hasLocalChanges = HasLocalChanges(workspace, mergeInfoViewModel.TargetPath); + if (hasLocalChanges) + result = BranchValidationResult.ItemHasLocalChanges; + } + return result; + } + + private static bool IsMerged(string sourcePath, string targetPath, IEnumerable trackMerges) + { + if (trackMerges == null) + return false; + + return trackMerges.Any(m => + (string.Equals(m.TargetItem.Item, sourcePath, StringComparison.OrdinalIgnoreCase) && string.Equals(m.SourceItem.Item.ServerItem, targetPath, StringComparison.OrdinalIgnoreCase)) + || (string.Equals(m.TargetItem.Item, targetPath, StringComparison.OrdinalIgnoreCase) && string.Equals(m.SourceItem.Item.ServerItem, sourcePath, StringComparison.OrdinalIgnoreCase))); + } + + private static bool UserHasAccess(VersionControlServer versionControlServer, string targetPath) + { + var permissions = versionControlServer.GetEffectivePermissions(versionControlServer.AuthorizedUser, targetPath); + + if (permissions == null || permissions.Length < 4) + return false; + + return permissions.Contains("Read") + && permissions.Contains("PendChange") + && permissions.Contains("Checkin") + && permissions.Contains("Merge"); + } + + private static bool IsMapped(Workspace workspace, string targetItem) + { + return workspace.IsServerPathMapped(targetItem); + } + + private static bool HasLocalChanges(Workspace workspace, string targetPath) + { + return workspace.GetPendingChangesEnumerable(targetPath, RecursionType.Full).Any(); + } + + private static string ToMessage(BranchValidationResult validationResult) + { + switch (validationResult) + { + case BranchValidationResult.Success: + return null; + case BranchValidationResult.AlreadyMerged: + return "Already merged"; + case BranchValidationResult.BranchNotMapped: + return "Branch not mapped"; + case BranchValidationResult.ItemHasLocalChanges: + return "Folder has local changes. Check-in or undo it"; + case BranchValidationResult.NoAccess: + return "You have not rights for edit"; + default: + return "Unknown error"; + } + } + } } diff --git a/src/AutoMerge/Branches/BranchesViewModel.cs b/src/AutoMerge/Branches/BranchesViewModel.cs index 8e2c7ab..845db86 100644 --- a/src/AutoMerge/Branches/BranchesViewModel.cs +++ b/src/AutoMerge/Branches/BranchesViewModel.cs @@ -5,10 +5,13 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; + using AutoMerge.Events; using AutoMerge.Prism.Command; using AutoMerge.Prism.Events; + using EnvDTE80; + using Microsoft.TeamFoundation.Client; using Microsoft.TeamFoundation.Common.Internal; using Microsoft.TeamFoundation.Controls; @@ -17,6 +20,7 @@ using Microsoft.TeamFoundation.VersionControl.Common; using Microsoft.TeamFoundation.WorkItemTracking.Client; using Microsoft.VisualStudio.Shell.Interop; + using TeamExplorerSectionViewModelBase = AutoMerge.Base.TeamExplorerSectionViewModelBase; namespace AutoMerge @@ -406,7 +410,7 @@ private TrackMergeInfo GetTrackMergeInfo(VersionControlServer versionControl, { FromOriginalToSourceBranches = new List(), }; - var trackMerges = allTrackMerges.Where(m => m.TargetItem.Item == sourcePath).ToArray(); + var trackMerges = allTrackMerges.Where(m => string.Equals(m.TargetItem.Item, sourcePath, StringComparison.OrdinalIgnoreCase)).ToArray(); if (!trackMerges.IsNullOrEmpty()) { var changesetIds = trackMerges.Select(t => t.SourceChangeset.ChangesetId).ToArray(); @@ -478,7 +482,8 @@ private static ItemIdentifier GetTargetPath(ICollection mergesRe private static bool IsTargetPath(ItemIdentifier mergeRelations, ItemIdentifier branch) { - return mergeRelations.Item.Contains(branch.Item + "/"); + return mergeRelations.Item.IndexOf(branch.Item + '/', StringComparison.OrdinalIgnoreCase) >= 0 || + string.Compare(mergeRelations.Item, branch.Item, StringComparison.OrdinalIgnoreCase) == 0; } private static string CalculateTopFolder(IList changes) @@ -523,7 +528,7 @@ private static string CalculateTopFolder(IList changes) private static string FindShareFolder(string topFolder, string changeFolder) { - if ((topFolder == null) || topFolder.Contains(changeFolder)) + if ((topFolder == null) || topFolder.IndexOf(changeFolder, StringComparison.OrdinalIgnoreCase) >= 0) { return changeFolder; } @@ -884,11 +889,11 @@ private static List GetMergeRelationships(List pen foreach (var shareFolderRelationship in shareFolderRelationships.Where(r => !r.IsDeleted)) { var targetBranch = - targetBranches.FirstOrDefault(branch => shareFolderRelationship.Item.Contains(branch)); + targetBranches.FirstOrDefault(branch => shareFolderRelationship.Item.IndexOf(branch, StringComparison.OrdinalIgnoreCase) >= 0); if (targetBranch != null) { var sourceRelationship = sourceRelationships - .FirstOrDefault(r => r.Item.Contains(targetBranch)); + .FirstOrDefault(r => r.Item.IndexOf(targetBranch, StringComparison.OrdinalIgnoreCase) >= 0); mergeRelationships.Add(new MergeRelation { Item = pendingChange.ServerItem, @@ -999,7 +1004,7 @@ private MergeResult MergeByFile(Change[] changes, string targetBranch, List r.Item == change.Item.ServerItem && r.Target.StartsWith(targetBranch)); + r => r.Item == change.Item.ServerItem && r.Target.StartsWith(targetBranch, StringComparison.OrdinalIgnoreCase)); if (mergeRelation != null) { var recursionType = CalculateRecursionType(mergeRelation); @@ -1076,7 +1081,7 @@ private static List GetPendingChanges(string target, Workspace wo { var allPendingChanges = workspace.GetPendingChangesEnumerable(target, RecursionType.Full); var targetPendingChanges = allPendingChanges - .Where(p => p.IsMerge && p.ServerItem.Contains(target)) + .Where(p => p.IsMerge && p.ServerItem.IndexOf(target, StringComparison.OrdinalIgnoreCase) >= 0) .ToList(); return targetPendingChanges; } @@ -1086,7 +1091,7 @@ private static List GetPendingChangesByFile(List m var itemSpecs = new List(); foreach (var mergeRelationship in mergeRelationships) { - if (mergeRelationship.Target.StartsWith(targetBranch)) + if (mergeRelationship.Target.StartsWith(targetBranch, StringComparison.OrdinalIgnoreCase)) { var recursionType = CalculateRecursionType(mergeRelationship); itemSpecs.Add(new ItemSpec(mergeRelationship.Target, recursionType)); @@ -1110,7 +1115,7 @@ private static bool GetLatest(string targetPath, List mergeRelati var getLatestFiles = new List(); foreach (var mergeRelationship in mergeRelationships.Where(r => r.TargetItemType == ItemType.File && r.GetLatesPath != null)) { - if (mergeRelationship.GetLatesPath.StartsWith(targetPath)) + if (mergeRelationship.GetLatesPath.StartsWith(targetPath, StringComparison.OrdinalIgnoreCase)) getLatestFiles.Add(mergeRelationship.GetLatesPath); }