diff --git a/appsettings.json b/appsettings.json
index 1bfc0ef6e..e1ec0f92e 100644
--- a/appsettings.json
+++ b/appsettings.json
@@ -192,118 +192,138 @@
"FieldMappingTool": {
"Enabled": true,
"FieldMaps": [
- {
- "FieldMapType": "FieldMergeMap",
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFields": [ "Custom.FieldA", "Custom.FieldB" ],
- "targetField": "Custom.FieldC",
- "formatExpression": "{0} \n {1}"
- },
- {
- "FieldMapType": "FieldValueMap",
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "System.State",
- "targetField": "System.State",
- "defaultValue": "New",
- "valueMapping": {
- "Active": "InProgress",
- "Resolved": "InProgress",
- "Closed": "Done"
+ {
+ "FieldMapType": "FieldCalculationMap",
+ "ApplyTo": [ "Bug", "Task" ],
+ "expression": "[effort] * [rate]",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ },
+ {
+ "FieldMapType": "FieldMergeMap",
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceFields": [ "Custom.FieldA", "Custom.FieldB" ],
+ "targetField": "Custom.FieldC",
+ "formatExpression": "{0} \n {1}"
+ },
+ {
+ "FieldMapType": "FieldValueMap",
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "System.State",
+ "targetField": "System.State",
+ "defaultValue": "New",
+ "valueMapping": {
+ "Active": "InProgress",
+ "Resolved": "InProgress",
+ "Closed": "Done"
+ }
+ },
+ {
+ "FieldMapType": "FieldToFieldMap",
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "Microsoft.VSTS.Common.BacklogPriority",
+ "targetField": "Microsoft.VSTS.Common.StackRank",
+ "defaultValue": 42
}
- },
- {
- "FieldMapType": "FieldToFieldMap",
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "Microsoft.VSTS.Common.BacklogPriority",
- "targetField": "Microsoft.VSTS.Common.StackRank",
- "defaultValue": 42
- }
],
"FieldMapSamples": {
- "FieldClearMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "targetField": "Custom.FieldC"
- },
- "FieldMergeMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFields": [ "Custom.FieldA", "Custom.FieldB" ],
- "targetField": "Custom.FieldC",
- "formatExpression": "{0} \n {1}"
- },
- "FieldLiteralMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "targetField": "Custom.SomeField",
- "value": "New field value"
- },
- "MultiValueConditionalMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFieldsAndValues": {
- "Field1": "Value1",
- "Field2": "Value2"
+ "FieldCalculationMap": {
+ "FieldMapType": "FieldCalculationMap",
+ "ApplyTo": [ "Bug", "Task" ],
+ "expression": "[effort] * [rate]",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ },
+ "FieldClearMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "targetField": "Custom.FieldC"
+ },
+ "FieldMergeMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceFields": [ "Custom.FieldA", "Custom.FieldB" ],
+ "targetField": "Custom.FieldC",
+ "formatExpression": "{0} \n {1}"
+ },
+ "FieldLiteralMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "targetField": "Custom.SomeField",
+ "value": "New field value"
+ },
+ "MultiValueConditionalMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceFieldsAndValues": {
+ "Field1": "Value1",
+ "Field2": "Value2"
+ },
+ "targetFieldsAndValues": {
+ "Field1": "Value1",
+ "Field2": "Value2"
+ }
},
"targetFieldsAndValues": {
- "Field1": "Value1",
- "Field2": "Value2"
- }
- },
- "targetFieldsAndValues": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "targetField": "Custom.ReflectedWorkItemId"
- },
- "FieldValueMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "System.State",
- "targetField": "System.State",
- "defaultValue": "StateB",
- "valueMapping": {
- "StateA": "StateB"
- }
- },
- "FieldToFieldMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "Microsoft.VSTS.Common.BacklogPriority",
- "targetField": "Microsoft.VSTS.Common.StackRank",
- "defaultValue": 42
- },
- "FieldToFieldMultiMap": {
- "ApplyTo": [ "SomeWorkItemType", "SomeOtherWorkItemType" ],
- "SourceToTargetMappings": {
- "SourceField1": "TargetField1",
- "SourceField2": "TargetField2"
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "targetField": "Custom.ReflectedWorkItemId"
+ },
+ "FieldValueMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "System.State",
+ "targetField": "System.State",
+ "defaultValue": "StateB",
+ "valueMapping": {
+ "StateA": "StateB"
+ }
+ },
+ "FieldToFieldMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "Microsoft.VSTS.Common.BacklogPriority",
+ "targetField": "Microsoft.VSTS.Common.StackRank",
+ "defaultValue": 42
+ },
+ "FieldToFieldMultiMap": {
+ "ApplyTo": [ "SomeWorkItemType", "SomeOtherWorkItemType" ],
+ "SourceToTargetMappings": {
+ "SourceField1": "TargetField1",
+ "SourceField2": "TargetField2"
+ }
+ },
+ "FieldToTagMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "System.State",
+ "formatExpression": "ScrumState:{0}"
+ },
+ "FieldToTagFieldMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceFields": [
+ "System.Description",
+ "Microsoft.VSTS.Common.AcceptanceCriteria"
+ ],
+ "targetField": "System.Description",
+ "formatExpression": "{0}
Acceptance Criteria
{1}"
+ },
+ "RegexFieldMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "COMPANY.PRODUCT.Release",
+ "targetField": "COMPANY.DEVISION.MinorReleaseVersion",
+ "pattern": "PRODUCT \\d{4}.(\\d{1})",
+ "replacement": "$1"
+ },
+ "FieldValueToTagMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "sourceField": "Microsoft.VSTS.CMMI.Blocked",
+ "pattern": "Yes",
+ "formatExpression": "{0}"
+ },
+ "TreeToTagMap": {
+ "ApplyTo": [ "SomeWorkItemType" ],
+ "toSkip": 3,
+ "timeTravel": 1
}
- },
- "FieldToTagMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "System.State",
- "formatExpression": "ScrumState:{0}"
- },
- "FieldToTagFieldMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFields": [
- "System.Description",
- "Microsoft.VSTS.Common.AcceptanceCriteria"
- ],
- "targetField": "System.Description",
- "formatExpression": "{0}
Acceptance Criteria
{1}"
- },
- "RegexFieldMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "COMPANY.PRODUCT.Release",
- "targetField": "COMPANY.DEVISION.MinorReleaseVersion",
- "pattern": "PRODUCT \\d{4}.(\\d{1})",
- "replacement": "$1"
- },
- "FieldValueToTagMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "Microsoft.VSTS.CMMI.Blocked",
- "pattern": "Yes",
- "formatExpression": "{0}"
- },
- "TreeToTagMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "toSkip": 3,
- "timeTravel": 1
- }
}
},
"TfsChangeSetMappingTool": {
diff --git a/docs/_data/reference.fieldmaps.fieldcalculationmap.yaml b/docs/_data/reference.fieldmaps.fieldcalculationmap.yaml
index be7d1c87a..22f018eeb 100644
--- a/docs/_data/reference.fieldmaps.fieldcalculationmap.yaml
+++ b/docs/_data/reference.fieldmaps.fieldcalculationmap.yaml
@@ -26,7 +26,31 @@ configurationSamples:
- name: sample
order: 1
description:
- code: There is no sample, but you can check the classic below for a general feel.
+ code: >-
+ {
+ "MigrationTools": {
+ "Version": "16.0",
+ "CommonTools": {
+ "FieldMappingTool": {
+ "FieldMaps": [
+ {
+ "ApplyTo": [
+ "Bug",
+ "Task"
+ ],
+ "expression": "[effort] * [rate]",
+ "FieldMapType": "FieldCalculationMap",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ }
+ ]
+ }
+ }
+ }
+ }
sampleFor: MigrationTools.Tools.FieldCalculationMapOptions
- name: classic
order: 3
@@ -34,11 +58,16 @@ configurationSamples:
code: >-
{
"$type": "FieldCalculationMapOptions",
- "expression": null,
- "parameters": {},
- "targetField": null,
+ "expression": "[effort] * [rate]",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost",
"ApplyTo": [
- "*"
+ "*",
+ "Bug",
+ "Task"
]
}
sampleFor: MigrationTools.Tools.FieldCalculationMapOptions
diff --git a/docs/_data/reference.tools.fieldmappingtool.yaml b/docs/_data/reference.tools.fieldmappingtool.yaml
index 4b58d116f..6c0b9c556 100644
--- a/docs/_data/reference.tools.fieldmappingtool.yaml
+++ b/docs/_data/reference.tools.fieldmappingtool.yaml
@@ -33,6 +33,19 @@ configurationSamples:
"FieldMappingTool": {
"Enabled": "True",
"FieldMaps": [
+ {
+ "ApplyTo": [
+ "Bug",
+ "Task"
+ ],
+ "expression": "[effort] * [rate]",
+ "FieldMapType": "FieldCalculationMap",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ },
{
"ApplyTo": [
"SomeWorkItemType"
@@ -70,6 +83,19 @@ configurationSamples:
}
],
"FieldMapSamples": {
+ "FieldCalculationMap": {
+ "ApplyTo": [
+ "Bug",
+ "Task"
+ ],
+ "expression": "[effort] * [rate]",
+ "FieldMapType": "FieldCalculationMap",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ },
"FieldClearMap": {
"ApplyTo": [
"SomeWorkItemType"
diff --git a/docs/collections/_reference/reference.fieldmaps.fieldcalculationmap.md b/docs/collections/_reference/reference.fieldmaps.fieldcalculationmap.md
index de6f197f0..e279d960a 100644
--- a/docs/collections/_reference/reference.fieldmaps.fieldcalculationmap.md
+++ b/docs/collections/_reference/reference.fieldmaps.fieldcalculationmap.md
@@ -27,7 +27,31 @@ configurationSamples:
- name: sample
order: 1
description:
- code: There is no sample, but you can check the classic below for a general feel.
+ code: >-
+ {
+ "MigrationTools": {
+ "Version": "16.0",
+ "CommonTools": {
+ "FieldMappingTool": {
+ "FieldMaps": [
+ {
+ "ApplyTo": [
+ "Bug",
+ "Task"
+ ],
+ "expression": "[effort] * [rate]",
+ "FieldMapType": "FieldCalculationMap",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ }
+ ]
+ }
+ }
+ }
+ }
sampleFor: MigrationTools.Tools.FieldCalculationMapOptions
- name: classic
order: 3
@@ -35,11 +59,16 @@ configurationSamples:
code: >-
{
"$type": "FieldCalculationMapOptions",
- "expression": null,
- "parameters": {},
- "targetField": null,
+ "expression": "[effort] * [rate]",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost",
"ApplyTo": [
- "*"
+ "*",
+ "Bug",
+ "Task"
]
}
sampleFor: MigrationTools.Tools.FieldCalculationMapOptions
diff --git a/docs/collections/_reference/reference.tools.fieldmappingtool.md b/docs/collections/_reference/reference.tools.fieldmappingtool.md
index 823af7d4f..59943b49d 100644
--- a/docs/collections/_reference/reference.tools.fieldmappingtool.md
+++ b/docs/collections/_reference/reference.tools.fieldmappingtool.md
@@ -34,6 +34,19 @@ configurationSamples:
"FieldMappingTool": {
"Enabled": "True",
"FieldMaps": [
+ {
+ "ApplyTo": [
+ "Bug",
+ "Task"
+ ],
+ "expression": "[effort] * [rate]",
+ "FieldMapType": "FieldCalculationMap",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ },
{
"ApplyTo": [
"SomeWorkItemType"
@@ -71,6 +84,19 @@ configurationSamples:
}
],
"FieldMapSamples": {
+ "FieldCalculationMap": {
+ "ApplyTo": [
+ "Bug",
+ "Task"
+ ],
+ "expression": "[effort] * [rate]",
+ "FieldMapType": "FieldCalculationMap",
+ "parameters": {
+ "effort": "Custom.EstimatedHours",
+ "rate": "Custom.HourlyRate"
+ },
+ "targetField": "Custom.EstimatedCost"
+ },
"FieldClearMap": {
"ApplyTo": [
"SomeWorkItemType"
diff --git a/src/MigrationTools.ConsoleDataGenerator/ClassDataLoader.cs b/src/MigrationTools.ConsoleDataGenerator/ClassDataLoader.cs
index 2a945a067..b00e3a6ad 100644
--- a/src/MigrationTools.ConsoleDataGenerator/ClassDataLoader.cs
+++ b/src/MigrationTools.ConsoleDataGenerator/ClassDataLoader.cs
@@ -188,8 +188,12 @@ static string ConvertSectionWithPathToJson(IConfiguration configuration, IConfig
if (currentObject[key] is JArray array)
{
JObject itemObject = sectionObject as JObject ?? new JObject();
- // Add ObjectName and OptionFor to the object
- itemObject.AddFirst(new JProperty(option.ConfigurationMetadata.ObjectName, option.ConfigurationMetadata.OptionFor));
+ if (!itemObject.ContainsKey(option.ConfigurationMetadata.ObjectName))
+ {
+ // Add ObjectName and OptionFor to the object
+ itemObject.AddFirst(new JProperty(option.ConfigurationMetadata.ObjectName, option.ConfigurationMetadata.OptionFor));
+ }
+
array.Add(itemObject);
}
}
diff --git a/src/MigrationTools.ConsoleDataGenerator/appsettings.json b/src/MigrationTools.ConsoleDataGenerator/appsettings.json
deleted file mode 100644
index 1bfc0ef6e..000000000
--- a/src/MigrationTools.ConsoleDataGenerator/appsettings.json
+++ /dev/null
@@ -1,504 +0,0 @@
-{
- "Serilog": {
- "Using": [
- "Serilog.Sinks.Console"
- ],
- "MinimumLevel": {
- "Default": "Information",
- "Override": {
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Verbose"
- }
- }
- },
- "MigrationTools": {
- "EndpointDefaults": {
- "TfsEndpoint": {
- "Collection": "",
- "Project": "",
- "AllowCrossProjectLinking": false,
- "ReflectedWorkItemIdField": "Custom.ReflectedWorkItemId",
- "Authentication": {
- "AuthenticationMode": "AccessToken",
- "AccessToken": "",
- "NetworkCredentials": {
- "UserName": "",
- "Password": "",
- "Domain": ""
- }
- },
- "AuthenticationMode": "AccessToken",
- "LanguageMaps": {
- "AreaPath": "Area",
- "IterationPath": "Iteration"
- }
- },
- "TfsTeamProjectEndpoint": {
- "Collection": "",
- "Project": "",
- "AllowCrossProjectLinking": false,
- "ReflectedWorkItemIdField": "Custom.ReflectedWorkItemId",
- "Authentication": {
- "AuthenticationMode": "AccessToken",
- "AccessToken": "",
- "NetworkCredentials": {
- "UserName": "",
- "Password": "",
- "Domain": ""
- }
- },
- "AuthenticationMode": "AccessToken",
- "LanguageMaps": {
- "AreaPath": "Area",
- "IterationPath": "Iteration"
- }
- }
- },
- "EndpointSamples": {
- "TfsTeamProjectEndpoint": {
- "Collection": "https://dev.azure.com/nkdagility-preview/",
- "Project": "migrationSource1",
- "AllowCrossProjectLinking": false,
- "ReflectedWorkItemIdField": "Custom.ReflectedWorkItemId",
- "Authentication": {
- "AuthenticationMode": "AccessToken",
- "AccessToken": "jklsadhjksahfkjsdhjksahsadjhksadhsad",
- "NetworkCredentials": {
- "UserName": "",
- "Password": "",
- "Domain": ""
- }
- }
- },
- "TfsEndpoint": {
- "Collection": "https://dev.azure.com/nkdagility-preview/",
- "Project": "migrationSource1",
- "AllowCrossProjectLinking": false,
- "ReflectedWorkItemIdField": "Custom.ReflectedWorkItemId",
- "Authentication": {
- "AuthenticationMode": "AccessToken",
- "AccessToken": "jklsadhjksahfkjsdhjksahsadjhksadhsad",
- "NetworkCredentials": {
- "UserName": "",
- "Password": "",
- "Domain": ""
- }
- },
- "LanguageMaps": {
- "AreaPath": "Area",
- "IterationPath": "Iteration"
- }
- },
- "AzureDevOpsEndpoint": {
- "AuthenticationMode": "AccessToken",
- "AccessToken": "jklsadhjksahfkjsdhjksahsadjhksadhsad",
- "Organisation": "https://dev.azure.com/xxx/",
- "Project": "myProject",
- "ReflectedWorkItemIdField": "Custom.ReflectedWorkItemId"
- }
- },
- "CommonTools": {
- "FieldMappingTool": {
- "Enabled": false,
- "FieldMaps": [],
- "FieldMapDefaults": {
- "ApplyTo": [ "*" ]
- }
- },
- "TfsChangeSetMappingTool": {
- "Enabled": false,
- "File": null
- },
- "TfsNodeStructureTool": {
- "Enabled": true,
- "Areas": {
- "Filters": [],
- "Mappings": {
- }
- },
- "Iterations": {
- "Filters": [],
- "Mappings": {
- }
- },
- "ShouldCreateMissingRevisionPaths": true,
- "ReplicateAllExistingNodes": true
- },
- "TfsTeamSettingsTool": {
- "Enabled": true,
- "MigrateTeamSettings": true,
- "UpdateTeamSettings": true,
- "MigrateTeamCapacities": true,
- "Teams": []
- },
- "TfsWorkItemLinkTool": {
- "Enabled": true,
- "FilterIfLinkCountMatches": true,
- "SaveAfterEachLinkIsAdded": false
- },
- "TfsRevisionManagerTool": {
- "Enabled": true,
- "ReplayRevisions": true,
- "MaxRevisions": 0
- },
- "TfsAttachmentTool": {
- "RefName": "TfsAttachmentTool",
- "Enabled": true,
- "ExportBasePath": "c:\\temp\\WorkItemAttachmentExport",
- "MaxAttachmentSize": 480000000
- },
- "StringManipulatorTool": {
- "Enabled": true,
- "MaxStringLength": 1000000,
- "Manipulators": []
- },
- "TfsUserMappingTool": {
- "Enabled": false,
- "UserMappingFile": "C:\\temp\\userExport.json",
- "IdentityFieldsToCheck": [
- "System.AssignedTo",
- "System.ChangedBy",
- "System.CreatedBy",
- "Microsoft.VSTS.Common.ActivatedBy",
- "Microsoft.VSTS.Common.ResolvedBy",
- "Microsoft.VSTS.Common.ClosedBy"
- ]
- },
- "WorkItemTypeMappingTool": {
- "Enabled": false,
- "Mappings": {
- "Source Work Item Type Name": "Target Work Item Type Name"
- }
- },
- "TfsWorkItemEmbededLinkTool": {
- "Enabled": true
- },
- "TfsEmbededImagesTool": {
- "Enabled": true
- },
- "TfsGitRepositoryTool": {
- "Enabled": true,
- "Mappings": {
- }
- }
- },
- "CommonToolSamples": {
- "TfsGitRepositoryTool": {
- "Enabled": true,
- "Mappings": {
- "RepoInSource": "RepoInTarget"
- }
- },
- "FieldMappingTool": {
- "Enabled": true,
- "FieldMaps": [
- {
- "FieldMapType": "FieldMergeMap",
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFields": [ "Custom.FieldA", "Custom.FieldB" ],
- "targetField": "Custom.FieldC",
- "formatExpression": "{0} \n {1}"
- },
- {
- "FieldMapType": "FieldValueMap",
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "System.State",
- "targetField": "System.State",
- "defaultValue": "New",
- "valueMapping": {
- "Active": "InProgress",
- "Resolved": "InProgress",
- "Closed": "Done"
- }
- },
- {
- "FieldMapType": "FieldToFieldMap",
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "Microsoft.VSTS.Common.BacklogPriority",
- "targetField": "Microsoft.VSTS.Common.StackRank",
- "defaultValue": 42
- }
- ],
- "FieldMapSamples": {
- "FieldClearMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "targetField": "Custom.FieldC"
- },
- "FieldMergeMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFields": [ "Custom.FieldA", "Custom.FieldB" ],
- "targetField": "Custom.FieldC",
- "formatExpression": "{0} \n {1}"
- },
- "FieldLiteralMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "targetField": "Custom.SomeField",
- "value": "New field value"
- },
- "MultiValueConditionalMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFieldsAndValues": {
- "Field1": "Value1",
- "Field2": "Value2"
- },
- "targetFieldsAndValues": {
- "Field1": "Value1",
- "Field2": "Value2"
- }
- },
- "targetFieldsAndValues": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "targetField": "Custom.ReflectedWorkItemId"
- },
- "FieldValueMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "System.State",
- "targetField": "System.State",
- "defaultValue": "StateB",
- "valueMapping": {
- "StateA": "StateB"
- }
- },
- "FieldToFieldMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "Microsoft.VSTS.Common.BacklogPriority",
- "targetField": "Microsoft.VSTS.Common.StackRank",
- "defaultValue": 42
- },
- "FieldToFieldMultiMap": {
- "ApplyTo": [ "SomeWorkItemType", "SomeOtherWorkItemType" ],
- "SourceToTargetMappings": {
- "SourceField1": "TargetField1",
- "SourceField2": "TargetField2"
- }
- },
- "FieldToTagMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "System.State",
- "formatExpression": "ScrumState:{0}"
- },
- "FieldToTagFieldMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceFields": [
- "System.Description",
- "Microsoft.VSTS.Common.AcceptanceCriteria"
- ],
- "targetField": "System.Description",
- "formatExpression": "{0}
Acceptance Criteria
{1}"
- },
- "RegexFieldMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "COMPANY.PRODUCT.Release",
- "targetField": "COMPANY.DEVISION.MinorReleaseVersion",
- "pattern": "PRODUCT \\d{4}.(\\d{1})",
- "replacement": "$1"
- },
- "FieldValueToTagMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "sourceField": "Microsoft.VSTS.CMMI.Blocked",
- "pattern": "Yes",
- "formatExpression": "{0}"
- },
- "TreeToTagMap": {
- "ApplyTo": [ "SomeWorkItemType" ],
- "toSkip": 3,
- "timeTravel": 1
- }
- }
- },
- "TfsChangeSetMappingTool": {
- "Enabled": true,
- "File": "c:\\changesetmappings.json"
- },
- "TfsNodeStructureTool": {
- "Enabled": true,
- "Areas": {
- "Filters": [ "*\\Team 1,*\\Team 1\\**" ],
- "Mappings": {
- "^migrationSource1([\\\\]?.*)$": "MigrationTest5$1",
- "^Skypoint Cloud([\\\\]?.*)$": "MigrationTest5$1",
- "^7473924d-c47f-4089-8f5c-077c728b576e([\\\\]?.*)$": "MigrationTest5$1"
- }
- },
- "Iterations": {
- "Filters": [ "*\\Sprint*", "*\\Sprint*\\**" ],
- "Mappings": {
- "^migrationSource1([\\\\]?.*)$": "MigrationTest5$1",
- "^Skypoint Cloud([\\\\]?.*)$": "MigrationTest5$1",
- "^7473924d-c47f-4089-8f5c-077c728b576e([\\\\]?.*)$": "MigrationTest5$1"
- }
- },
- "ShouldCreateMissingRevisionPaths": true,
- "ReplicateAllExistingNodes": true
- },
- "TfsTeamSettingsTool": {
- "Enabled": true,
- "MigrateTeamSettings": true,
- "UpdateTeamSettings": true,
- "MigrateTeamCapacities": true,
- "Teams": [ "Team 1", "Team 2" ]
- },
- "TfsWorkItemLinkTool": {
- "Enabled": true,
- "FilterIfLinkCountMatches": true,
- "SaveAfterEachLinkIsAdded": false
- },
- "TfsRevisionManagerTool": {
- "Enabled": true,
- "ReplayRevisions": true,
- "MaxRevisions": 0
- },
- "TfsAttachmentTool": {
- "RefName": "TfsAttachmentTool",
- "Enabled": true,
- "ExportBasePath": "c:\\temp\\WorkItemAttachmentExport",
- "MaxAttachmentSize": 480000000
- },
- "StringManipulatorTool": {
- "Enabled": true,
- "MaxStringLength": 1000000,
- "Manipulators": [
- {
- "$type": "RegexStringManipulator",
- "Enabled": true,
- "Pattern": "[^( -~)\n\r\t]+",
- "Replacement": "",
- "Description": "Remove invalid characters from the end of the string"
- }
- ]
- },
- "TfsUserMappingTool": {
- "Enabled": true,
- "UserMappingFile": "C:\\temp\\userExport.json",
- "IdentityFieldsToCheck": [
- "System.AssignedTo",
- "System.ChangedBy",
- "System.CreatedBy",
- "Microsoft.VSTS.Common.ActivatedBy",
- "Microsoft.VSTS.Common.ResolvedBy",
- "Microsoft.VSTS.Common.ClosedBy"
- ]
- },
- "WorkItemTypeMappingTool": {
- "Enabled": true,
- "Mappings": {
- "User Story": "Product Backlog Item"
- }
- },
- "TfsWorkItemEmbededLinkTool": {
- "Enabled": true
- },
- "TfsEmbededImagesTool": {
- "Enabled": true
- }
- },
- "ProcessorDefaults": {
- "AzureDevOpsPipelineProcessor": {
- "Enabled": false,
- "MigrateBuildPipelines": true,
- "MigrateReleasePipelines": true,
- "MigrateTaskGroups": true,
- "MigrateVariableGroups": true,
- "MigrateServiceConnections": true,
- "BuildPipelines": null,
- "ReleasePipelines": null,
- "SourceName": "sourceName",
- "TargetName": "targetName"
- },
- "TfsWorkItemMigrationProcessor": {
- "Enabled": false,
- "UpdateCreatedDate": true,
- "UpdateCreatedBy": true,
- "WIQLQuery": "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan','Shared Steps','Shared Parameter','Feedback Request') ORDER BY [System.ChangedDate] desc",
- "FixHtmlAttachmentLinks": true,
- "WorkItemCreateRetryLimit": 5,
- "FilterWorkItemsThatAlreadyExistInTarget": false,
- "PauseAfterEachWorkItem": false,
- "AttachRevisionHistory": false,
- "GenerateMigrationComment": true,
- "SourceName": "Source",
- "TargetName": "Target",
- "WorkItemIDs": [],
- "MaxGracefulFailures": 0,
- "SkipRevisionWithInvalidIterationPath": false,
- "SkipRevisionWithInvalidAreaPath": false
- }
- },
- "ProcessorSamples": {
- "AzureDevOpsPipelineProcessor": {
- "Enabled": false,
- "MigrateBuildPipelines": true,
- "MigrateReleasePipelines": true,
- "MigrateTaskGroups": true,
- "MigrateVariableGroups": true,
- "MigrateServiceConnections": true,
- "BuildPipelines": null,
- "ReleasePipelines": null,
- "SourceName": "sourceName",
- "TargetName": "targetName"
- },
- "TfsWorkItemMigrationProcessor": {
- "Enabled": false,
- "WIQLQuery": "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan','Shared Steps','Shared Parameter','Feedback Request') ORDER BY [System.ChangedDate] desc",
- "FilterWorkItemsThatAlreadyExistInTarget": false,
- "SourceName": "Source",
- "TargetName": "Target"
- },
- "ExportUsersForMappingProcessor": {
- "Enabled": true,
- "WIQLQuery": "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan','Shared Steps','Shared Parameter','Feedback Request') ORDER BY [System.ChangedDate] desc",
- "OnlyListUsersInWorkItems": true,
- "SourceName": "Source",
- "TargetName": "Target"
- }
- },
- "Infrastructure": {
- "ClassNameChangeMappings": {
- "TfsGitRepositoryTool": "TfsGitRepositoryTool",
- "TfsTeamSettingsEnricher": "TfsTeamSettingsTool",
- "TfsWorkItemLinkEnricher": "TfsWorkItemLinkTool",
- "TfsAttachmentEnricher": "TfsAttachmentTool",
- "StringManipulatorEnricher": "StringManipulatorTool",
- "TfsUserMappingEnricher": "TfsUserMappingTool",
- "FieldBlankMap": "FieldClearMap",
- "FieldtoTagMap": "FieldToTagFieldMap",
- "TreeToTagMap": "TreeToTagFieldMap",
- "TeamMigration": "TfsTeamSettingsProcessor",
- "WorkItemQueryMigration": "TfsSharedQueryProcessor",
- "WorkItemMigration": "TfsWorkItemMigrationProcessor",
- "WorkItemMigrationContext": "TfsWorkItemMigrationProcessor",
- "TfsTeamProjectConfig": "TfsTeamProjectEndpoint",
- "WorkItemGitRepoMappingTool": "TfsGitRepositoryTool",
- "WorkItemFieldMappingTool": "FieldMappingTool",
- "CreateTeamFolders": "TfsCreateTeamFoldersProcessor",
- "ExportProfilePicture": "TfsExportProfilePictureFromADProcessor",
- "ExportProfilePictureFromAD": "TfsExportProfilePictureFromADProcessor",
- "ImportProfilePicture": "TfsImportProfilePictureProcessor",
- "ImportProfilePictureFromAD": "TfsImportProfilePictureProcessor",
- "ExportUsersForMapping": "TfsExportUsersForMappingProcessor",
- "ExportUsersForMappingContext": "TfsExportUsersForMappingProcessor",
- "ExportTeamListProcessor": "TfsExportTeamListProcessor",
- "ExportTeamList": "TfsExportTeamListProcessor",
- "ExportUsersForMappingProcessor": "TfsExportUsersForMappingProcessor",
- "TestConfigurationsMigration": "TfsTestConfigurationsMigrationProcessor",
- "TestConfigurationsMigrationProcessor": "TfsTestConfigurationsMigrationProcessor",
- "TestConfigurationsMigrationContext": "TfsTestConfigurationsMigrationProcessor",
- "TestPlansAndSuitesMigration": "TfsTestPlansAndSuitesMigrationProcessor",
- "TestPlansAndSuitesMigrationProcessor": "TfsTestPlansAndSuitesMigrationProcessor",
- "TestPlansAndSuitesMigrationContext": "TfsTestPlansAndSuitesMigrationProcessor",
- "TestVariablesMigration": "TfsTestVariablesMigrationProcessor",
- "TestVariablesMigrationProcessor": "TfsTestVariablesMigrationProcessor",
- "TestVariablesMigrationContext": "TfsTestVariablesMigrationProcessor",
- "WorkItemBulkEditProcessor": "TfsWorkItemBulkEditProcessor",
- "WorkItemUpdate": "TfsWorkItemBulkEditProcessor",
- "WorkItemDelete": "TfsWorkItemDeleteProcessor",
- "WorkItemDeleteProcessor": "TfsWorkItemDeleteProcessor",
- "WorkItemPostProcessingContext": "TfsWorkItemOverwriteProcessor",
- "WorkItemPostProcessing": "TfsWorkItemOverwriteProcessor",
- "WorkItemPostProcessingProcessor": "TfsWorkItemOverwriteProcessor",
- "WorkItemUpdateAreasAsTagsContext": "TfsWorkItemOverwriteProcessor",
- "WorkItemUpdateAreasAsTagsProcessor": "TfsWorkItemOverwriteProcessor"
- }
- }
- }
-}