diff --git a/src/AutoMerge.Tests/AutoMerge.Tests.csproj b/src/AutoMerge.Tests/AutoMerge.Tests.csproj index 4a22bf7..e0bdd64 100644 --- a/src/AutoMerge.Tests/AutoMerge.Tests.csproj +++ b/src/AutoMerge.Tests/AutoMerge.Tests.csproj @@ -57,7 +57,6 @@ - diff --git a/src/AutoMerge.Tests/JsonParserTests.cs b/src/AutoMerge.Tests/JsonParserTests.cs deleted file mode 100644 index 4ed1b50..0000000 --- a/src/AutoMerge.Tests/JsonParserTests.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Xunit; - -namespace AutoMerge.Tests -{ - public class JsonParserTests - { - [Fact] - public void WhenValueHasNewLine_ShouldCorrectParse() - { - var value = string.Format("{0}Patch Back", Environment.NewLine); - var json = string.Format("{{\"comment_format\": \"{0}\"}}", value); - - var values = JsonParser.ParseJson(json); - - Assert.NotEmpty(values); - Assert.Equal(value, values["comment_format"]); - } - } -} diff --git a/src/AutoMerge/AutoMerge.csproj b/src/AutoMerge/AutoMerge.csproj index 86dd076..2782745 100644 --- a/src/AutoMerge/AutoMerge.csproj +++ b/src/AutoMerge/AutoMerge.csproj @@ -47,6 +47,7 @@ ..\..\lib\System.Windows.Interactivity.WPF.2.0.20525\lib\net40\Microsoft.Expression.Interactions.dll True + @@ -215,10 +216,8 @@ + - - - SplitButton.xaml diff --git a/src/AutoMerge/AutoMergePackage.cs b/src/AutoMerge/AutoMergePackage.cs index ac206e5..5a8d99e 100644 --- a/src/AutoMerge/AutoMergePackage.cs +++ b/src/AutoMerge/AutoMergePackage.cs @@ -1,4 +1,5 @@ -using System.Diagnostics; +using System.ComponentModel.Composition; +using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; using Microsoft.VisualStudio.Shell; @@ -38,7 +39,6 @@ public AutoMergePackage() } - ///////////////////////////////////////////////////////////////////////////// // Overridden Package Implementation #region Package Members diff --git a/src/AutoMerge/AutoMergePage.cs b/src/AutoMerge/AutoMergePage.cs index 4be3ddb..e1b5a46 100644 --- a/src/AutoMerge/AutoMergePage.cs +++ b/src/AutoMerge/AutoMergePage.cs @@ -15,5 +15,7 @@ public AutoMergePage() { Title = Resources.AutoMergePageName; } + + } } diff --git a/src/AutoMerge/Branches/BranchFactory.cs b/src/AutoMerge/Branches/BranchFactory.cs index 2cb119a..974558f 100644 --- a/src/AutoMerge/Branches/BranchFactory.cs +++ b/src/AutoMerge/Branches/BranchFactory.cs @@ -11,18 +11,21 @@ public class BranchFactory private readonly ChangesetVersionSpec _changesetVersion; private readonly BranchValidator _branchValidator; private readonly IEventAggregator _eventAggregator; + private readonly Settings _settings; public BranchFactory(string sourceBranch, string sourceFolder, ChangesetVersionSpec changesetVersion, BranchValidator branchValidator, - IEventAggregator eventAggregator) + IEventAggregator eventAggregator, + Settings settings) { _sourceBranch = sourceBranch; _sourceFolder = sourceFolder; _changesetVersion = changesetVersion; _branchValidator = branchValidator; _eventAggregator = eventAggregator; + _settings = settings; } public MergeInfoViewModel CreateTargetBranchInfo(ItemIdentifier targetBranch, ItemIdentifier targetPath) @@ -37,7 +40,7 @@ public MergeInfoViewModel CreateSourceBranch() private MergeInfoViewModel CreateBranch(string targetBranch, string targetPath) { - var mergeInfo = new MergeInfoViewModel(_eventAggregator) + var mergeInfo = new MergeInfoViewModel(_eventAggregator, _settings.BranchNameMatches) { SourceBranch = _sourceBranch, TargetBranch = targetBranch, @@ -45,6 +48,7 @@ private MergeInfoViewModel CreateBranch(string targetBranch, string targetPath) TargetPath = targetPath, ChangesetVersionSpec = _changesetVersion, ValidationResult = BranchValidationResult.Success, + Aliases = _settings.BranchNameMatches }; if (_sourceBranch != targetBranch) diff --git a/src/AutoMerge/Branches/BranchesSection.cs b/src/AutoMerge/Branches/BranchesSection.cs index 300928f..661cc32 100644 --- a/src/AutoMerge/Branches/BranchesSection.cs +++ b/src/AutoMerge/Branches/BranchesSection.cs @@ -1,5 +1,7 @@ -using AutoMerge.Base; +using System.ComponentModel.Composition; +using AutoMerge.Base; using Microsoft.TeamFoundation.Controls; +using Microsoft.VisualStudio.ComponentModelHost; namespace AutoMerge { @@ -11,9 +13,12 @@ protected override object CreateView(SectionInitializeEventArgs e) return new BranchesView(); } + [Import] + public Settings Settings { get; set; } + protected override ITeamExplorerSection CreateViewModel(SectionInitializeEventArgs e) { - var viewModel = base.CreateViewModel(e) ?? new BranchesViewModel(new VsLogger(ServiceProvider)); + var viewModel = base.CreateViewModel(e) ?? new BranchesViewModel(Settings, new VsLogger(ServiceProvider)); return viewModel; } diff --git a/src/AutoMerge/Branches/BranchesViewModel.cs b/src/AutoMerge/Branches/BranchesViewModel.cs index 88e2e5a..fa946f6 100644 --- a/src/AutoMerge/Branches/BranchesViewModel.cs +++ b/src/AutoMerge/Branches/BranchesViewModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel.Composition; using System.Globalization; using System.Linq; using System.Reflection; @@ -16,6 +17,7 @@ using Microsoft.TeamFoundation.VersionControl.Client; using Microsoft.TeamFoundation.VersionControl.Common; using Microsoft.TeamFoundation.WorkItemTracking.Client; +using Microsoft.VisualStudio.ComponentModelHost; using Microsoft.VisualStudio.Shell.Interop; using TeamExplorerSectionViewModelBase = AutoMerge.Base.TeamExplorerSectionViewModelBase; @@ -24,13 +26,14 @@ namespace AutoMerge public sealed class BranchesViewModel : TeamExplorerSectionViewModelBase { private readonly IEventAggregator _eventAggregator; + private readonly Settings _settings; private ChangesetService _changesetService; private Workspace _workspace; private ChangesetViewModel _changeset; private bool _merging; - public BranchesViewModel(ILogger logger) + public BranchesViewModel(Settings settings, ILogger logger) : base(logger) { Title = Resources.BrancheSectionName; @@ -42,6 +45,7 @@ public BranchesViewModel(ILogger logger) SelectWorkspaceCommand = new DelegateCommand(SelectWorkspaceExecute); OpenSourceControlExplorerCommand = new DelegateCommand(OpenSourceControlExplorerExecute, OpenSourceControlExplorerCanExecute); + _settings = settings; _eventAggregator = EventAggregatorFactory.Get(); _merging = false; } @@ -212,7 +216,7 @@ protected async override Task InitializeAsync(object sender, SectionInitializeEv MergeMode.Merge, MergeMode.MergeAndCheckIn }; - MergeMode = Settings.Instance.LastMergeOperation; + MergeMode = _settings.LastMergeOperation; await RefreshAsync(); } @@ -307,6 +311,8 @@ private ObservableCollection GetBranches(ITeamFoundationCont var sourceTopFolder = CalculateTopFolder(changes); var mergesRelationships = GetMergesRelationships(sourceTopFolder, versionControl); + + if (mergesRelationships.Count > 0) { var sourceBranchIdentifier = changesetViewModel.Branches.Select(b => new ItemIdentifier(b)).First(); @@ -323,7 +329,7 @@ private ObservableCollection GetBranches(ITeamFoundationCont var branchValidator = new BranchValidator(workspace, trackMerges); var branchFactory = new BranchFactory(sourceBranch, sourceTopFolder, changesetVersionSpec, branchValidator, - _eventAggregator); + _eventAggregator, _settings); var sourceBranchInfo = versionControl.QueryBranchObjects(sourceBranchIdentifier, RecursionType.None)[0]; if (sourceBranchInfo.Properties != null && sourceBranchInfo.Properties.ParentBranch != null @@ -581,7 +587,7 @@ private async void MergeExecute(MergeMode? mergeMode) if (!mergeMode.HasValue) return; MergeMode = mergeMode.Value; - Settings.Instance.LastMergeOperation = mergeMode.Value; + _settings.LastMergeOperation = mergeMode.Value; switch (mergeMode) { case MergeMode.Merge: @@ -615,8 +621,8 @@ private async Task MergeAndCheckInExecute(bool checkInIfSuccess) Message = string.Empty }; var mergePath = string.Format("MERGE {0} -> {1}", - BranchHelper.GetShortBranchName(resultModel.BranchInfo.SourceBranch), - BranchHelper.GetShortBranchName(resultModel.BranchInfo.TargetBranch)); + BranchHelper.GetShortBranchName(resultModel.BranchInfo.SourceBranch, _settings.BranchNameMatches), + BranchHelper.GetShortBranchName(resultModel.BranchInfo.TargetBranch, _settings.BranchNameMatches)); switch (resultModel.MergeResult) { case MergeResult.CheckInEvaluateFail: @@ -769,7 +775,7 @@ private List MergeExecuteInternal(bool checkInIfSuccess) var pendingChanges = GetChangesetPendingChanges(changeset.Changes); var mergeRelationships = GetMergeRelationships(pendingChanges, targetBranches, versionControl); - var commentFormater = new CommentFormater(Settings.Instance.CommentFormat); + var commentFormater = new CommentFormater(_settings.CommentFormat, _settings.BranchNameMatches); foreach (var mergeInfo in mergeInfos.Where(b => b.Checked)) { var mergeResultModel = new MergeResultModel diff --git a/src/AutoMerge/Branches/MergeInfoViewModel.cs b/src/AutoMerge/Branches/MergeInfoViewModel.cs index 5dbf1ab..7a8f55b 100644 --- a/src/AutoMerge/Branches/MergeInfoViewModel.cs +++ b/src/AutoMerge/Branches/MergeInfoViewModel.cs @@ -1,4 +1,5 @@ using System; +using AutoMerge.Configuration; using AutoMerge.Events; using AutoMerge.Prism.Events; using Microsoft.TeamFoundation.VersionControl.Client; @@ -8,11 +9,13 @@ namespace AutoMerge public class MergeInfoViewModel { private readonly IEventAggregator _eventAggregator; + private readonly BranchNameMatch[] _aliases; internal bool _checked; - public MergeInfoViewModel(IEventAggregator eventAggregator) + public MergeInfoViewModel(IEventAggregator eventAggregator, BranchNameMatch[] aliases) { _eventAggregator = eventAggregator; + _aliases = aliases; } public bool Checked @@ -43,7 +46,7 @@ public string DisplayBranchName { get { - return BranchHelper.GetShortBranchName(TargetBranch); + return BranchHelper.GetShortBranchName(TargetBranch, _aliases); } } @@ -58,5 +61,7 @@ public bool IsSourceBranch return string.Equals(SourceBranch, TargetBranch, StringComparison.OrdinalIgnoreCase); } } - } + + public Configuration.BranchNameMatch[] Aliases { get; set; } + } } diff --git a/src/AutoMerge/CommentFormater.cs b/src/AutoMerge/CommentFormater.cs index 2445a7c..1b952ca 100644 --- a/src/AutoMerge/CommentFormater.cs +++ b/src/AutoMerge/CommentFormater.cs @@ -1,27 +1,30 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using AutoMerge.Configuration; namespace AutoMerge { public class CommentFormater { private readonly CommentFormat _format; + private readonly BranchNameMatch[] _aliases; - public CommentFormater(CommentFormat format) + public CommentFormater(CommentFormat format, BranchNameMatch[] aliases) { _format = format; + _aliases = aliases; } public string Format(TrackMergeInfo trackMergeInfo, string targetBranch, MergeOption mergeOption) { var comment = mergeOption == MergeOption.KeepTarget ? _format.DiscardFormat : _format.Format; comment = comment - .Replace("{OriginalBranch}", BranchHelper.GetShortBranchName(trackMergeInfo.OriginaBranch)) + .Replace("{OriginalBranch}", BranchHelper.GetShortBranchName(trackMergeInfo.OriginaBranch, _aliases)) .Replace("{OriginalBranchFull}", trackMergeInfo.OriginaBranch) - .Replace("{SourceBranch}", BranchHelper.GetShortBranchName(trackMergeInfo.SourceBranch)) + .Replace("{SourceBranch}", BranchHelper.GetShortBranchName(trackMergeInfo.SourceBranch, _aliases)) .Replace("{SourceBranchFull}", trackMergeInfo.SourceBranch) - .Replace("{TargetBranch}", BranchHelper.GetShortBranchName(targetBranch)) + .Replace("{TargetBranch}", BranchHelper.GetShortBranchName(targetBranch, _aliases)) .Replace("{TargetBranchFull}", targetBranch) .Replace("{FromOriginalToTarget}", FromOriginalToTarget(trackMergeInfo, targetBranch)) .Replace("{FromOriginalToTargetFull}", FromOriginalToTargetFull(trackMergeInfo, targetBranch)) @@ -41,7 +44,7 @@ private string GetWorkItemIds(List sourceWorkItemIds) private string FromOriginalToTarget(TrackMergeInfo trackMergeInfo, string targetBranch) { var mergePath = trackMergeInfo.FromOriginalToSourceBranches.Concat(new[] { trackMergeInfo.SourceBranch, targetBranch }) - .Select(fullBranchName => BranchHelper.GetShortBranchName(fullBranchName)); + .Select(fullBranchName => BranchHelper.GetShortBranchName(fullBranchName, _aliases)); var mergePathString = string.Join(_format.BranchDelimiter, mergePath); return mergePathString; } diff --git a/src/AutoMerge/Configuration/BranchNameMatch.cs b/src/AutoMerge/Configuration/BranchNameMatch.cs new file mode 100644 index 0000000..8933e3b --- /dev/null +++ b/src/AutoMerge/Configuration/BranchNameMatch.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutoMerge.Configuration +{ + public class BranchNameMatch + { + public string match { get; set; } + public string alias { get; set; } + } +} diff --git a/src/AutoMerge/Configuration/FileSettingProvider.cs b/src/AutoMerge/Configuration/FileSettingProvider.cs deleted file mode 100644 index 61cb332..0000000 --- a/src/AutoMerge/Configuration/FileSettingProvider.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.IO; - -namespace AutoMerge -{ - internal class FileSettingProvider : ISettingProvider - { - public T ReadValue(string key) - { - if (key == null) - throw new ArgumentNullException("key"); - - T value; - if (!TryReadValue(key, out value)) - throw new InvalidOperationException(string.Format("Setting {0} not found", key)); - - return value; - } - - public bool TryReadValue(string key, out T value) - { - if (key == null) - throw new ArgumentNullException("key"); - - value = default(T); - var path = GetSettingFilePath(); - var settingJson = File.ReadAllText(path); - var settings = JsonParser.ParseJson(settingJson); - - string stringValue; - if (!settings.TryGetValue(key, out stringValue)) - return false; - - value = (T) Convert.ChangeType(stringValue, typeof(T)); - return true; - } - - public void WriteValue(string key, T value) - { - if (key == null) - throw new ArgumentNullException("key"); - - var path = GetSettingFilePath(); - var settingJson = File.ReadAllText(path); - var settings = JsonParser.ParseJson(settingJson); - - settings[key] = value.ToString(); - - settingJson = JsonParser.ToJson(settings); - File.WriteAllText(path, settingJson); - } - - private static string GetSettingFilePath() - { - var roamingPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - var autoMergeFolder = Path.Combine(roamingPath, "Visual Studio Auto Merge"); - if (!Directory.Exists(autoMergeFolder)) - { - Directory.CreateDirectory(autoMergeFolder); - } - var settingFilePath = Path.Combine(autoMergeFolder, "automerge.conf"); - if (!File.Exists(settingFilePath)) - { - using (File.Create(settingFilePath)) - { - } - } - return settingFilePath; - } - } -} diff --git a/src/AutoMerge/Configuration/ISettingProvider.cs b/src/AutoMerge/Configuration/ISettingProvider.cs deleted file mode 100644 index 64ce808..0000000 --- a/src/AutoMerge/Configuration/ISettingProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace AutoMerge -{ - internal interface ISettingProvider - { - T ReadValue(string key); - bool TryReadValue(string key, out T value); - void WriteValue(string key, T value); - } -} diff --git a/src/AutoMerge/Configuration/JsonParser.cs b/src/AutoMerge/Configuration/JsonParser.cs deleted file mode 100644 index 366c8e8..0000000 --- a/src/AutoMerge/Configuration/JsonParser.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web.Script.Serialization; - -namespace AutoMerge -{ - public static class JsonParser - { - public static Dictionary ParseJson(string jsonText) - { - var jss = new JavaScriptSerializer(); - return jss.Deserialize>(jsonText); - } - - public static string ToJson(Dictionary dict) - { - var entries = dict.Select(d => - string.Format("\"{0}\": \"{1}\"", d.Key, d.Value)); - return "{" + Environment.NewLine + " " + string.Join(",\r\n ", entries) + Environment.NewLine + "}"; - } - } -} diff --git a/src/AutoMerge/Configuration/Settings.cs b/src/AutoMerge/Configuration/Settings.cs index afca987..cf98a58 100644 --- a/src/AutoMerge/Configuration/Settings.cs +++ b/src/AutoMerge/Configuration/Settings.cs @@ -1,14 +1,25 @@ -using System; +using System.ComponentModel.Composition; +using System.IO; using System.Linq; +using System.Web.Script.Serialization; +using AutoMerge.Configuration; +using Microsoft.VisualStudio.OLE.Interop; +using Microsoft.VisualStudio.Settings; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Settings; +using IServiceProvider = System.IServiceProvider; namespace AutoMerge { - internal class Settings + [Export] + public class Settings { - private readonly ISettingProvider _settingProvider; - private static readonly Lazy _instance; - private MergeMode? _lastMergeOperation; + private readonly string[] _mergeOperationDefaultValues; + private readonly WritableSettingsStore _vsSettingsProvider; + private BranchNameMatch[] _aliases; + + private const string collectionKey = "AutoMerge"; private const string lastMergeOperationKey = "last_operation"; private const string mergeModeMerge = "merge"; @@ -18,7 +29,6 @@ internal class Settings private const string mergeOperationDefaultLast = "last"; private const string mergeOperationDefaultMerge = mergeModeMerge; private const string mergeOperationDefaultMergeCheckin = mergeModeMergeAndCheckin; - private readonly string[] _mergeOperationDefaultValues; private const string commentFormatKey = "comment_format"; private const string commentFormatDefault = "MERGE {FromOriginalToTarget} ({OriginalComment})"; @@ -26,25 +36,31 @@ internal class Settings private const string commentFormatDiscardDefault = "DISCARD {" + commentFormatKey + "}"; private const string branchDelimiterKey = "branch_delimiter"; private const string branchDelimiterDefault = " -> "; + private const string branchNameMatchesKey = "branch_overrides"; - static Settings() + private static WritableSettingsStore GetWritableSettingsStore(IServiceProvider vsServiceProvider) { - _instance = new Lazy(() => new Settings()); + var shellSettingsManager = new ShellSettingsManager(vsServiceProvider); + return shellSettingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); } - private Settings() + [ImportingConstructor] + public Settings(SVsServiceProvider serviceProvider) { - _settingProvider = new FileSettingProvider(); - _mergeOperationDefaultValues = new[] - {mergeOperationDefaultLast, mergeOperationDefaultMerge, mergeOperationDefaultMergeCheckin}; - } + _vsSettingsProvider = GetWritableSettingsStore(serviceProvider); - public static Settings Instance - { - get { return _instance.Value; } + if (!_vsSettingsProvider.CollectionExists(collectionKey)) + { + _vsSettingsProvider.CreateCollection(collectionKey); + } + + _mergeOperationDefaultValues = new[] { mergeOperationDefaultLast, mergeOperationDefaultMerge, mergeOperationDefaultMergeCheckin }; + + BranchNameMatches = BranchNameMatches ?? new BranchNameMatch[0]; } - public MergeMode LastMergeOperation { + public MergeMode LastMergeOperation + { get { return LastMergeOperationGet(); @@ -57,38 +73,40 @@ public MergeMode LastMergeOperation { public CommentFormat CommentFormat { - get { return CommentFormatGet(); } - } - - private CommentFormat CommentFormatGet() - { - string commentFormat; - if (!_settingProvider.TryReadValue(commentFormatKey, out commentFormat)) + get { - commentFormat = commentFormatDefault; + return new CommentFormat + { + Format = _vsSettingsProvider.GetString(collectionKey, commentFormatKey, commentFormatDefault), + BranchDelimiter = _vsSettingsProvider.GetString(collectionKey, branchDelimiterKey, branchDelimiterDefault), + DiscardFormat = _vsSettingsProvider.GetString(collectionKey, commentFormatDiscardKey, commentFormatDiscardDefault) + }; } + } - string commentFormatDiscard; - if (!_settingProvider.TryReadValue(commentFormatDiscardKey, out commentFormatDiscard)) + public BranchNameMatch[] BranchNameMatches + { + get { - commentFormatDiscard = commentFormatDiscardDefault; - } + if (_aliases != null) + return _aliases; - commentFormatDiscard = commentFormatDiscard.Replace("{" + commentFormatKey + "}", commentFormat); + var json = _vsSettingsProvider.GetString(collectionKey, branchNameMatchesKey, ""); + if (string.IsNullOrWhiteSpace(json)) + return null; - string branchDelimiter; - if (!_settingProvider.TryReadValue(branchDelimiterKey, out branchDelimiter)) - { - branchDelimiter = branchDelimiterDefault; + var serializer = new JavaScriptSerializer(); + var result = serializer.Deserialize(json); + _aliases = result; + return result; } - - return new CommentFormat + set { - Format = commentFormat, - BranchDelimiter = branchDelimiter, - DiscardFormat = commentFormatDiscard - }; - + _aliases = value; + var serializer = new JavaScriptSerializer(); + var result = serializer.Serialize(_aliases); + _vsSettingsProvider.SetString(collectionKey, branchNameMatchesKey, result); + } } private MergeMode LastMergeOperationGet() @@ -99,13 +117,9 @@ private MergeMode LastMergeOperationGet() { if (!_lastMergeOperation.HasValue) { - string stringValue; - if (!_settingProvider.TryReadValue(lastMergeOperationKey, out stringValue)) - { - stringValue = mergeModeMergeAndCheckin; - } - - _lastMergeOperation = ToMergeMode(stringValue); + _lastMergeOperation = + ToMergeMode(_vsSettingsProvider.GetString(collectionKey, lastMergeOperationKey, + mergeModeMergeAndCheckin)); } result = _lastMergeOperation.Value; @@ -123,7 +137,7 @@ private void LastMergeOperationSet(MergeMode mergeMode) if (_lastMergeOperation != mergeMode) { var stringValue = ToString(mergeMode); - _settingProvider.WriteValue(lastMergeOperationKey, stringValue); + _vsSettingsProvider.SetString(collectionKey, lastMergeOperationKey, stringValue); _lastMergeOperation = mergeMode; } } @@ -150,15 +164,12 @@ private static string ToString(MergeMode mergeMode) private string MergeOperationDefaultGet() { - string mergeOperationDefaultValue; - if (!_settingProvider.TryReadValue(mergeOperationDefaultKey, out mergeOperationDefaultValue)) - { - mergeOperationDefaultValue = mergeOperationDefaultLast; - _settingProvider.WriteValue(mergeOperationDefaultKey, mergeOperationDefaultValue); - } + var mergeOperationDefaultValue = _vsSettingsProvider.GetString(collectionKey, mergeOperationDefaultKey, mergeOperationDefaultLast); if (!_mergeOperationDefaultValues.Contains(mergeOperationDefaultValue)) - mergeOperationDefaultValue = "mergeOperationDefaultLast"; + mergeOperationDefaultValue = mergeOperationDefaultLast; + + _vsSettingsProvider.SetString(collectionKey, mergeOperationDefaultKey, mergeOperationDefaultValue); return mergeOperationDefaultValue; } diff --git a/src/AutoMerge/Helpers/BranchHelper.cs b/src/AutoMerge/Helpers/BranchHelper.cs index 870d090..c9990f7 100644 --- a/src/AutoMerge/Helpers/BranchHelper.cs +++ b/src/AutoMerge/Helpers/BranchHelper.cs @@ -1,26 +1,39 @@ using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using AutoMerge.Configuration; namespace AutoMerge { internal static class BranchHelper { - public static string GetShortBranchName(string branchFullName) - { - var pos = branchFullName.LastIndexOf('/'); - var name = branchFullName.Substring(pos + 1); - return name; - } + public static string GetShortBranchName(string branchFullName, BranchNameMatch[] aliases) + { + + foreach (var branchNameMatch in (aliases ?? new BranchNameMatch[0]) + .Concat(new[] { new BranchNameMatch { match = "/([^/]+)$", alias = "$1" } })) // default match + { + var regex = new Regex(branchNameMatch.match); + var match = regex.Match(branchFullName); + if (match.Success) + { + return match.Result(branchNameMatch.alias); //return first match + } + } + + return branchFullName; // return full name if nothing matched + } - public static string GetDisplayBranchName(List branches) + public static string GetDisplayBranchName(List branches, BranchNameMatch[] aliases) { if (branches == null || branches.Count == 0) return string.Empty; if (branches.Count == 1) { - return GetShortBranchName(branches[0]); + return GetShortBranchName(branches[0], aliases); } return "multi"; } } -} \ No newline at end of file +} diff --git a/src/AutoMerge/RecentChangesets/ChangesetProviderBase.cs b/src/AutoMerge/RecentChangesets/ChangesetProviderBase.cs index 17627e5..a762657 100644 --- a/src/AutoMerge/RecentChangesets/ChangesetProviderBase.cs +++ b/src/AutoMerge/RecentChangesets/ChangesetProviderBase.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.TeamFoundation.VersionControl.Client; +using Microsoft.VisualStudio.ComponentModelHost; namespace AutoMerge { @@ -10,11 +11,15 @@ public abstract class ChangesetProviderBase : IChangesetProvider { private readonly IServiceProvider _serviceProvider; private readonly Lazy _changesetService; + private readonly Settings _settings; protected ChangesetProviderBase(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; _changesetService = new Lazy(InitChangesetService); + + var componentModel = (IComponentModel)_serviceProvider.GetService(typeof (SComponentModel)); + _settings = componentModel.DefaultExportProvider.GetExportedValue(); } public Task> GetChangesets(string userLogin) @@ -26,13 +31,15 @@ public Task> GetChangesets(string userLogin) protected ChangesetViewModel ToChangesetViewModel(Changeset tfsChangeset, ChangesetService changesetService) { + var branches = changesetService.GetAssociatedBranches(tfsChangeset.ChangesetId) + .Select(i => i.Item) + .ToList(); var changesetViewModel = new ChangesetViewModel { ChangesetId = tfsChangeset.ChangesetId, Comment = tfsChangeset.Comment, - Branches = changesetService.GetAssociatedBranches(tfsChangeset.ChangesetId) - .Select(i => i.Item) - .ToList() + Branches = branches, + DisplayBranchName = BranchHelper.GetDisplayBranchName(branches, _settings.BranchNameMatches) }; return changesetViewModel; diff --git a/src/AutoMerge/RecentChangesets/ChangesetViewModel.cs b/src/AutoMerge/RecentChangesets/ChangesetViewModel.cs index 244e551..a466c82 100644 --- a/src/AutoMerge/RecentChangesets/ChangesetViewModel.cs +++ b/src/AutoMerge/RecentChangesets/ChangesetViewModel.cs @@ -4,15 +4,17 @@ namespace AutoMerge { public class ChangesetViewModel { + public ChangesetViewModel() + { + + } + public int ChangesetId { get; set; } public string Comment { get; set; } public List Branches { get; set; } - public string DisplayBranchName - { - get { return BranchHelper.GetDisplayBranchName(Branches); } - } + public string DisplayBranchName { get; set; } } -} \ No newline at end of file +} diff --git a/src/AutoMerge/source.extension.vsixmanifest b/src/AutoMerge/source.extension.vsixmanifest index 60d1017..3031b4a 100644 --- a/src/AutoMerge/source.extension.vsixmanifest +++ b/src/AutoMerge/source.extension.vsixmanifest @@ -1,11 +1,11 @@  - + Auto Merge for Visual Studio 2013 Easy way to merge changeset LICENSE.txt - RELEASE_NOTES.md + https://github.com/CDuke/AutoMerge/blob/master/RELEASE_NOTES.md Resources/merge.png Resources/preview.png merge code, merge, merging, branch, changeset, merge by work item, tfs