Skip to content

Commit

Permalink
✨ (config): add GitRepoMappingTool for repository mappings
Browse files Browse the repository at this point in the history
♻️ (refactor): replace TfsGitRepoMappings with GitRepoMappingTool

📝 (docs): update documentation for GitRepoMappingTool

🔧 (config): remove deprecated GitRepoMapContainer

Introduce a new configuration section `GitRepoMappingTool` to handle repository mappings, replacing the old `TfsGitRepoMappings`. This change centralizes repository mapping logic, making it more maintainable and easier to configure. Updated the documentation to reflect these changes and removed the deprecated `GitRepoMapContainer` to clean up the codebase.

✨ (GitRepoMappingTool): add GitRepoMappingTool and its options for work item processing

Introduce a new `GitRepoMappingTool` class to process string fields of work items, allowing for data cleanup and regex replacements. This tool is configurable via `GitRepoMappingToolOptions`.

♻️ (ServiceCollectionExtensions): register GitRepoMappingTool in service collection

Update `ServiceCollectionExtensions` to register the new `GitRepoMappingTool` and its options, ensuring it is available for dependency injection.

🔥 (EngineConfiguration, Containers): remove deprecated GitRepoMapContainer and UserMapContainer

Remove the old `GitRepoMapContainer` and `UserMapContainer` classes, along with the `GitRepoMapping` property from `EngineConfiguration`. These are replaced by the new `GitRepoMappingTool`.

The changes introduce a more flexible and maintainable way to handle Git repository mappings within the migration tools, replacing the older container-based approach with a more modern and configurable tool.
  • Loading branch information
MrHinsh committed Aug 15, 2024
1 parent b13aeed commit 6ac1378
Show file tree
Hide file tree
Showing 14 changed files with 132 additions and 95 deletions.
6 changes: 6 additions & 0 deletions appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@
},
"TfsEmbededImagesEnricher": {
"Enabled": true
},
"GitRepoMappingTool": {
"Enabled": true,
"Mappings": {
"Source Repo Name": "Target Repo Name"
}
}
},
"ProcessorDefaults": {
Expand Down
6 changes: 3 additions & 3 deletions configuration.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@
}
]
},
"TfsGitRepoMappings": {
"GitRepoMappingTool": {
"Enabled": true,
"WorkItemGitRepos": {
"sourceRepoName": "targetRepoName"
"Mappings": {
"Source Repo Name": "Target Repo Name"
}
},
"TfsNodeStructure": {
Expand Down
23 changes: 17 additions & 6 deletions docs/Reference/Generated/MigrationTools.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using MigrationTools._EngineV1.Clients;
using MigrationTools.DataContracts;
using MigrationTools.ProcessorEnrichers;
using MigrationTools.ProcessorEnrichers.WorkItemProcessorEnrichers;
using MigrationTools.Processors;

namespace MigrationTools.Enrichers
Expand Down Expand Up @@ -87,7 +88,8 @@ public override int Enrich(WorkItemData sourceWorkItem, WorkItemData targetWorkI
}

Log.LogInformation("GitRepositoryEnricher: Enriching {Id} To fix Git Repo Links", targetWorkItem.Id);
var changeSetMappings = Engine.Source.GetService<TfsChangeSetMappingTool>();
var changeSetMappings = Services.GetService<TfsChangeSetMappingTool>();
var gitRepoMaps = Services.GetService<GitRepoMappingTool>();
List<ExternalLink> newEL = new List<ExternalLink>();
List<ExternalLink> removeEL = new List<ExternalLink>();
int count = 0;
Expand Down Expand Up @@ -116,7 +118,7 @@ public override int Enrich(WorkItemData sourceWorkItem, WorkItemData targetWorkI
{
var anyProjectSourceRepoInfo = TfsGitRepositoryInfo.Create(el, allSourceRepos, changeSetMappings, Engine, sourceWorkItem?.ProjectName);
// if repo is found in a different project and the repo Name is listed in repo mappings, use it
if (anyProjectSourceRepoInfo.GitRepo != null && Engine.GitRepoMaps.Items.ContainsKey(anyProjectSourceRepoInfo.GitRepo.Name))
if (anyProjectSourceRepoInfo.GitRepo != null && gitRepoMaps.Mappings.ContainsKey(anyProjectSourceRepoInfo.GitRepo.Name))
{
sourceRepoInfo = anyProjectSourceRepoInfo;
}
Expand All @@ -128,15 +130,15 @@ public override int Enrich(WorkItemData sourceWorkItem, WorkItemData targetWorkI

if (sourceRepoInfo.GitRepo != null)
{
string targetRepoName = GetTargetRepoName(Engine.GitRepoMaps.Items, sourceRepoInfo);
string targetRepoName = GetTargetRepoName(gitRepoMaps.Mappings, sourceRepoInfo);
string sourceProjectName = sourceRepoInfo?.GitRepo?.ProjectReference?.Name ?? Engine.Target.Config.AsTeamProjectConfig().Project;
string targetProjectName = Engine.Target.Config.AsTeamProjectConfig().Project;

TfsGitRepositoryInfo targetRepoInfo = TfsGitRepositoryInfo.Create(targetRepoName, sourceRepoInfo, targetRepos);
// if repo was not found in the target project, try to find it in the whole target project collection
if (targetRepoInfo.GitRepo == null)
{
if (Engine.GitRepoMaps.Items.Values.Contains(targetRepoName))
if (gitRepoMaps.Mappings.Values.Contains(targetRepoName))
{
var anyTargetRepoInCollectionInfo = TfsGitRepositoryInfo.Create(targetRepoName, sourceRepoInfo, allTargetRepos);
if (anyTargetRepoInCollectionInfo.GitRepo != null)
Expand Down
16 changes: 0 additions & 16 deletions src/MigrationTools.Host/MigrationToolHost.cs
Original file line number Diff line number Diff line change
@@ -1,39 +1,26 @@
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WorkerService;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using MigrationTools._EngineV1.Configuration;
using MigrationTools.Host.CustomDiagnostics;
using MigrationTools.Host.Services;
using MigrationTools.Options;
using Serilog;
using Serilog.Core;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;
using Spectre.Console.Cli;
using Serilog.Filters;
using MigrationTools.Host.Commands;
using System.Diagnostics;
using System.Text.RegularExpressions;
using MigrationTools.Services;
using Spectre.Console.Extensions.Hosting;
using System.Configuration;
using NuGet.Protocol.Plugins;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using static System.Collections.Specialized.BitVector32;
using System.Text.Json;
using MigrationTools.Enrichers;
using Newtonsoft.Json;
using static MigrationTools.ConfigurationExtensions;

namespace MigrationTools.Host
Expand Down Expand Up @@ -117,7 +104,6 @@ public static IHostBuilder CreateDefaultBuilder(string[] args, Action<IConfigura
Log.Warning("!!ACTION REQUIRED!! You are using a deprecated version of the configuration, please update to v16. backward compatability will be removed in a future version.");
//logger.LogCritical("The config file {ConfigFile} uses an outdated format. We are continuing to support this format through a grace period. Use '{ExecutableName}.exe init' to create a new configuration file and port over your old configuration.", configFile, Assembly.GetEntryAssembly().GetName().Name);
var parsed = reader.BuildFromFile(configFile); // TODO revert tp
options.GitRepoMapping = parsed.GitRepoMapping;
options.Processors = parsed.Processors;
options.Source = parsed.Source;
options.Target = parsed.Target;
Expand All @@ -127,8 +113,6 @@ public static IHostBuilder CreateDefaultBuilder(string[] args, Action<IConfigura
// This code Converts the new config format to the v1 and v2 runtme format.
options.Version = configuration.GetValue<string>("MigrationTools:Version");
options.GitRepoMapping = configuration.GetSection("MigrationTools:CommonEnrichers:TfsGitRepoMappings:WorkItemGitRepos").Get<Dictionary<string, string>>();
options.Processors = configuration.GetSection("MigrationTools:Processors")?.ToMigrationToolsList<IProcessorConfig>(child => child.GetMigrationToolsOption<IProcessorConfig>("ProcessorType"));
options.Source = configuration.GetSection("MigrationTools:Source")?.GetMigrationToolsOption<IMigrationClientConfig>("EndpointType");
Expand Down
1 change: 0 additions & 1 deletion src/MigrationTools.Tests/ServiceProviderHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ internal static ServiceProvider GetWorkItemMigrationProcessor()

// Containers
services.AddSingleton<ProcessorContainer>();
services.AddSingleton<GitRepoMapContainer>();

services.AddSingleton<ITelemetryLogger, TelemetryClientAdapter>();

Expand Down
2 changes: 0 additions & 2 deletions src/MigrationTools/IMigrationEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,5 @@ public interface IMigrationEngine
IMigrationClient Source { get; }

IMigrationClient Target { get; }

GitRepoMapContainer GitRepoMaps { get; }
}
}
4 changes: 0 additions & 4 deletions src/MigrationTools/MigrationEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ public MigrationEngine(
IOptions<NetworkCredentialsOptions> networkCredentials,
IOptions<EngineConfiguration> config,
ProcessorContainer processors,
GitRepoMapContainer gitRepoMaps,
ITelemetryLogger telemetry,
ILogger<MigrationEngine> logger)
{
Expand All @@ -37,12 +36,10 @@ public MigrationEngine(
_services = services;
_networkCredentials = networkCredentials.Value;
Processors = processors;
GitRepoMaps = gitRepoMaps;
_telemetryLogger = telemetry;
_engineConfiguration = config.Value;
}

public GitRepoMapContainer GitRepoMaps { get; }

public ProcessorContainer Processors { get; }

Expand Down Expand Up @@ -90,7 +87,6 @@ public ProcessingStatus Run()
ProcessingStatus ps = ProcessingStatus.Running;

Processors.EnsureConfigured();
GitRepoMaps.EnsureConfigured();

_logger.LogInformation("Beginning run of {ProcessorCount} processors", Processors.Count.ToString());
foreach (_EngineV1.Containers.IProcessor process in Processors.Items)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using MigrationTools.DataContracts;
using MigrationTools.Enrichers;
using MigrationTools.Processors;
using static Microsoft.VisualStudio.Services.Graph.GraphResourceIds.Users;

namespace MigrationTools.ProcessorEnrichers.WorkItemProcessorEnrichers
{
/// <summary>
/// Used to process the String fields of a work item. This is useful for cleaning up data. It will limit fields to a max length and apply regex replacements based on what is configured. Each regex replacement is applied in order and can be enabled or disabled.
/// </summary>
public class GitRepoMappingTool : WorkItemProcessorEnricher
{
private Serilog.ILogger contextLog;
private GitRepoMappingToolOptions _options;

public ReadOnlyDictionary<string, string> Mappings { get; private set; }

public GitRepoMappingTool(IOptions<GitRepoMappingToolOptions> options, IServiceProvider services, ILogger<StringManipulatorEnricher> logger, ITelemetryLogger telemetryLogger)
: base(services, logger, telemetryLogger)
{
if (options is null)
{
throw new ArgumentNullException(nameof(options));
}
_options = options.Value;
Mappings = new ReadOnlyDictionary<string, string>( _options.Mappings);
contextLog = Serilog.Log.ForContext<StringManipulatorEnricher>();
}

[Obsolete]
public override void Configure(IProcessorEnricherOptions options)

Check warning on line 38 in src/MigrationTools/ProcessorEnrichers/WorkItemProcessorEnrichers/GitRepoMappingTool.cs

View workflow job for this annotation

GitHub Actions / Build, Test, Sonar Cloud Analysis, & Package

Obsolete member 'GitRepoMappingTool.Configure(IProcessorEnricherOptions)' overrides non-obsolete member 'WorkItemProcessorEnricher.Configure(IProcessorEnricherOptions)'
{
if (options is null)
{
throw new ArgumentNullException(nameof(options));
}
if (!(options is StringManipulatorEnricherOptions))
{
throw new InvalidCastException(nameof(options));
}
_options = (GitRepoMappingToolOptions)options;
}

protected override void EntryForProcessorType(IProcessor processor)
{
throw new NotImplementedException();
}

protected override void RefreshForProcessorType(IProcessor processor)
{
throw new NotImplementedException();
}
public override void ProcessorExecutionWithFieldItem(IProcessor processor, FieldItem fieldItem)
{


}


}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using MigrationTools.Options;
using MigrationTools.ProcessorEnrichers.WorkItemProcessorEnrichers;

namespace MigrationTools.Enrichers
{
public class GitRepoMappingToolOptions : ProcessorEnricherOptions
{
public const string ConfigurationSectionName = "MigrationTools:CommonEnrichers:GitRepoMappingTool";

public override Type ToConfigure => typeof(GitRepoMappingTool);


/// <summary>
/// List of work item mappings.
/// </summary>
/// <default>{}</default>
public Dictionary<string, string> Mappings { get; set; }

public override void SetDefaults()
{
Enabled = true;
Mappings = new Dictionary<string, string> { { "Default", "Default2" } };
}
}

}
3 changes: 2 additions & 1 deletion src/MigrationTools/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ public static void AddMigrationToolServices(this IServiceCollection context, ICo
Console.WriteLine("!!ACTION REQUIRED!! You are using a deprecated version of the configuration, please update to v16. backward compatability will be removed in a future version.");
context.AddSingleton<StringManipulatorEnricher>().AddSingleton<IOptions<StringManipulatorEnricherOptions>>(Microsoft.Extensions.Options.Options.Create(configuration.GetSectionCommonEnrichers_v15<StringManipulatorEnricherOptions>(StringManipulatorEnricherOptions.ConfigurationSectionName)));
context.AddSingleton<WorkItemTypeMappingEnricher>().AddSingleton<IOptions<WorkItemTypeMappingEnricherOptions>>(Microsoft.Extensions.Options.Options.Create(configuration.GetSectionCommonEnrichers_v15<WorkItemTypeMappingEnricherOptions>(WorkItemTypeMappingEnricherOptions.ConfigurationSectionName)));
context.AddSingleton< GitRepoMappingTool>().AddSingleton<IOptions<GitRepoMappingToolOptions>>(Microsoft.Extensions.Options.Options.Create(configuration.GetSectionCommonEnrichers_v15<GitRepoMappingToolOptions>(GitRepoMappingToolOptions.ConfigurationSectionName)));
break;
case ConfigurationExtensions.MigrationConfigVersion.v16:
context.AddSingleton<StringManipulatorEnricher>().AddOptions<StringManipulatorEnricherOptions>().Bind(configuration.GetSection(StringManipulatorEnricherOptions.ConfigurationSectionName));
context.AddSingleton<WorkItemTypeMappingEnricher>().AddOptions<WorkItemTypeMappingEnricherOptions>().Bind(configuration.GetSection(WorkItemTypeMappingEnricherOptions.ConfigurationSectionName));
context.AddSingleton<GitRepoMappingTool>().AddOptions<GitRepoMappingToolOptions>().Bind(configuration.GetSection(GitRepoMappingToolOptions.ConfigurationSectionName));
break;
}
context.AddSingleton<FieldMappingTool>().AddSingleton<IConfigureOptions<FieldMappingToolOptions>, FieldMappingToolOptions.ConfigureOptions>();
Expand Down Expand Up @@ -69,7 +71,6 @@ public static void AddMigrationToolServicesLegacy(this IServiceCollection contex

// Containers
context.AddSingleton<ProcessorContainer>();
context.AddSingleton<GitRepoMapContainer>();
//Engine
context.AddSingleton<IMigrationEngine, MigrationEngine>();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ public EngineConfiguration()

public IMigrationClientConfig Source { get; set; }
public IMigrationClientConfig Target { get; set; }
public Dictionary<string, string> GitRepoMapping { get; set; } = new Dictionary<string, string>();

public string LogLevel { get; private set; }
public List<IProcessorConfig> Processors { get; set; }
public string Version { get; set; }
Expand Down
Loading

0 comments on commit 6ac1378

Please sign in to comment.