@@ -30,10 +30,55 @@ public TfsWorkItemTypeValidatorTool(
3030 Options . Normalize ( ) ;
3131 }
3232
33- public bool ValidateWorkItemTypes (
33+ public bool ValidateReflectedWorkItemIdField (
3434 List < WorkItemType > sourceWits ,
3535 List < WorkItemType > targetWits ,
3636 string reflectedWorkItemIdField )
37+ {
38+ Log . LogInformation ( "Validating presence of reflected work item ID field '{reflectedWorkItemIdField}'"
39+ + " in target work item types." , reflectedWorkItemIdField ) ;
40+ bool isValid = true ;
41+ List < WorkItemType > wits = GetTargetWitsToValidate ( sourceWits , targetWits ) ;
42+ foreach ( WorkItemType targetWit in wits )
43+ {
44+ if ( targetWit . FieldDefinitions . Contains ( reflectedWorkItemIdField ) )
45+ {
46+ Log . LogDebug ( " '{targetWit}' contains reflected work item ID field '{fieldName}'." ,
47+ targetWit . Name , reflectedWorkItemIdField ) ;
48+ }
49+ else
50+ {
51+ Log . LogError ( " '{targetWit}' does not contain reflected work item ID field '{fieldName}'." ,
52+ targetWit . Name , reflectedWorkItemIdField ) ;
53+ isValid = false ;
54+ }
55+ }
56+ LogReflectedWorkItemIdValidationResult ( isValid , reflectedWorkItemIdField ) ;
57+ return isValid ;
58+ }
59+
60+ private List < WorkItemType > GetTargetWitsToValidate ( List < WorkItemType > sourceWits , List < WorkItemType > targetWits )
61+ {
62+ List < WorkItemType > targetWitsToValidate = [ ] ;
63+ foreach ( WorkItemType sourceWit in sourceWits )
64+ {
65+ string sourceWitName = sourceWit . Name ;
66+ if ( ! ShouldValidateWorkItemType ( sourceWitName ) )
67+ {
68+ continue ;
69+ }
70+ string targetWitName = GetTargetWorkItemType ( sourceWitName ) ;
71+ WorkItemType targetWit = targetWits
72+ . FirstOrDefault ( wit => wit . Name . Equals ( targetWitName , StringComparison . OrdinalIgnoreCase ) ) ;
73+ if ( targetWit is not null )
74+ {
75+ targetWitsToValidate . Add ( targetWit ) ;
76+ }
77+ }
78+ return targetWitsToValidate ;
79+ }
80+
81+ public bool ValidateWorkItemTypes ( List < WorkItemType > sourceWits , List < WorkItemType > targetWits )
3782 {
3883 LogWorkItemTypes ( sourceWits , targetWits ) ;
3984
@@ -61,10 +106,6 @@ public bool ValidateWorkItemTypes(
61106 }
62107 else
63108 {
64- if ( ! ValidateReflectedWorkItemIdField ( targetWit , reflectedWorkItemIdField ) )
65- {
66- isValid = false ;
67- }
68109 if ( ! ValidateWorkItemTypeFields ( sourceWit , targetWit ) )
69110 {
70111 isValid = false ;
@@ -75,22 +116,6 @@ public bool ValidateWorkItemTypes(
75116 return isValid ;
76117 }
77118
78- private bool ValidateReflectedWorkItemIdField ( WorkItemType targetWit , string reflectedWorkItemIdField )
79- {
80- if ( targetWit . FieldDefinitions . Contains ( reflectedWorkItemIdField ) )
81- {
82- Log . LogDebug ( " '{targetWit}' contains reflected work item ID field '{fieldName}'." ,
83- targetWit . Name , reflectedWorkItemIdField ) ;
84- }
85- else
86- {
87- Log . LogWarning ( " '{targetWit}' does not contain reflected work item ID field '{fieldName}'." ,
88- targetWit . Name , reflectedWorkItemIdField ) ;
89- return false ;
90- }
91- return true ;
92- }
93-
94119 private bool ValidateWorkItemTypeFields ( WorkItemType sourceWit , WorkItemType targetWit )
95120 {
96121 bool result = true ;
@@ -266,6 +291,21 @@ private void LogWorkItemTypes(ICollection<WorkItemType> sourceWits, ICollection<
266291 string . Join ( ", " , targetWits . Select ( wit => wit . Name ) ) ) ;
267292 }
268293
294+ private void LogReflectedWorkItemIdValidationResult ( bool isValid , string reflectedWorkItemIdField )
295+ {
296+ if ( isValid )
297+ {
298+ Log . LogInformation ( "All work item types have reflected work item ID field '{reflectedWorkItemIdField}'." ,
299+ reflectedWorkItemIdField ) ;
300+ return ;
301+ }
302+
303+ const string message = "Reflected work item ID field is mandatory for work item migration."
304+ + " You can configure name of this field in target TFS endpoint settings as 'ReflectedWorkItemIdField' property."
305+ + " Your current configured name of the field is '{reflectedWorkItemIdField}'." ;
306+ Log . LogError ( message , reflectedWorkItemIdField ) ;
307+ }
308+
269309 private void LogValidationResult ( bool isValid )
270310 {
271311 if ( isValid )
0 commit comments