@@ -19,7 +19,9 @@ internal class AddJsonPropertyPostActionProcessor : PostActionProcessorBase
1919        private  const  string  ParentPropertyPathArgument  =  "parentPropertyPath" ; 
2020        private  const  string  NewJsonPropertyNameArgument  =  "newJsonPropertyName" ; 
2121        private  const  string  NewJsonPropertyValueArgument  =  "newJsonPropertyValue" ; 
22-         private  const  string  DetectRepoRootForFileCreation  =  "detectRepositoryRootForFileCreation" ; 
22+         private  const  string  DetectRepoRoot  =  "detectRepositoryRoot" ; 
23+         private  const  string  IncludeAllDirectoriesInSearch  =  "includeAllDirectoriesInSearch" ; 
24+         private  const  string  IncludeAllParentDirectoriesInSearch  =  "includeAllParentDirectoriesInSearch" ; 
2325
2426        private  static readonly  JsonSerializerOptions  SerializerOptions  =  new ( ) 
2527        { 
@@ -87,7 +89,33 @@ protected override bool ProcessInternal(
8789                return  false ; 
8890            } 
8991
90-             IReadOnlyList < string >  jsonFiles  =  FindFilesInCurrentFolderOrParentFolder ( environment . Host . FileSystem ,  outputBasePath ,  jsonFileName ) ; 
92+             if  ( ! bool . TryParse ( action . Args . GetValueOrDefault ( DetectRepoRoot ,  "false" ) ,  out  bool  detectRepoRoot ) ) 
93+             { 
94+                 Reporter . Error . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Error_ArgumentNotBoolean ,  DetectRepoRoot ) ) ; 
95+                 return  false ; 
96+             } 
97+ 
98+             if  ( ! bool . TryParse ( action . Args . GetValueOrDefault ( IncludeAllDirectoriesInSearch ,  "true" ) ,  out  bool  includeAllDirectories ) ) 
99+             { 
100+                 Reporter . Error . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Error_ArgumentNotBoolean ,  IncludeAllDirectoriesInSearch ) ) ; 
101+                 return  false ; 
102+             } 
103+ 
104+             string ?  repoRoot  =  detectRepoRoot  ?  GetRootDirectory ( environment . Host . FileSystem ,  outputBasePath )  :  null ; 
105+ 
106+             if  ( ! bool . TryParse ( action . Args . GetValueOrDefault ( IncludeAllParentDirectoriesInSearch ,  "false" ) ,  out  bool  includeAllParentDirectories ) ) 
107+             { 
108+                 Reporter . Error . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Error_ArgumentNotBoolean ,  IncludeAllParentDirectoriesInSearch ) ) ; 
109+                 return  false ; 
110+             } 
111+ 
112+             IReadOnlyList < string >  jsonFiles  =  FindFilesInCurrentFolderOrParentFolder ( 
113+                 environment . Host . FileSystem , 
114+                 outputBasePath , 
115+                 jsonFileName , 
116+                 includeAllDirectories  ?  SearchOption . AllDirectories  :  SearchOption . TopDirectoryOnly , 
117+                 includeAllParentDirectories  ?  int . MaxValue  :  1 , 
118+                 repoRoot ) ; 
91119
92120            if  ( jsonFiles . Count  ==  0 ) 
93121            { 
@@ -103,13 +131,7 @@ protected override bool ProcessInternal(
103131                    return  false ; 
104132                } 
105133
106-                 if  ( ! bool . TryParse ( action . Args . GetValueOrDefault ( DetectRepoRootForFileCreation ,  "false" ) ,  out  bool  detectRepoRoot ) ) 
107-                 { 
108-                     Reporter . Error . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Error_ArgumentNotBoolean ,  DetectRepoRootForFileCreation ) ) ; 
109-                     return  false ; 
110-                 } 
111- 
112-                 string  newJsonFilePath  =  Path . Combine ( detectRepoRoot  ?  GetRootDirectory ( environment . Host . FileSystem ,  outputBasePath )  :  outputBasePath ,  jsonFileName ) ; 
134+                 string  newJsonFilePath  =  Path . Combine ( repoRoot  ??  outputBasePath ,  jsonFileName ) ; 
113135                environment . Host . FileSystem . WriteAllText ( newJsonFilePath ,  "{}" ) ; 
114136                jsonFiles  =  new  List < string >  {  newJsonFilePath  } ; 
115137            } 
@@ -150,17 +172,19 @@ protected override bool ProcessInternal(
150172
151173        private  static JsonNode ?  AddElementToJson ( IPhysicalFileSystem  fileSystem ,  string  targetJsonFile ,  string ?  propertyPath ,  string  propertyPathSeparator ,  string  newJsonPropertyName ,  string  newJsonPropertyValue ,  IPostAction  action ) 
152174        { 
153-             JsonNode ?  jsonContent  =  JsonNode . Parse ( fileSystem . ReadAllText ( targetJsonFile ) ,  nodeOptions :  null ,  documentOptions :  DeserializerOptions ) ; 
175+             var  fileContent  =  fileSystem . ReadAllText ( targetJsonFile ) ; 
176+             JsonNode ?  jsonContent  =  JsonNode . Parse ( fileContent ,  nodeOptions :  null ,  documentOptions :  DeserializerOptions ) ; 
154177
155178            if  ( jsonContent  ==  null ) 
156179            { 
180+                 Reporter . Error . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Error_NullJson ,  fileContent ) ) ; 
157181                return  null ; 
158182            } 
159183
160184            if  ( ! bool . TryParse ( action . Args . GetValueOrDefault ( AllowPathCreationArgument ,  "false" ) ,  out  bool  createPath ) ) 
161185            { 
162186                Reporter . Error . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Error_ArgumentNotBoolean ,  AllowPathCreationArgument ) ) ; 
163-                 return  false ; 
187+                 return  null ; 
164188            } 
165189
166190            JsonNode ?  parentProperty  =  FindJsonNode ( jsonContent ,  propertyPath ,  propertyPathSeparator ,  createPath ) ; 
@@ -216,7 +240,10 @@ protected override bool ProcessInternal(
216240        private  static string [ ]  FindFilesInCurrentFolderOrParentFolder ( 
217241            IPhysicalFileSystem  fileSystem , 
218242            string  startPath , 
219-             string  matchPattern ) 
243+             string  matchPattern , 
244+             SearchOption  searchOption , 
245+             int  maxUpLevels , 
246+             string ?  repoRoot ) 
220247        { 
221248            string ?  directory  =  fileSystem . DirectoryExists ( startPath )  ?  startPath  :  Path . GetDirectoryName ( startPath ) ; 
222249
@@ -230,17 +257,24 @@ private static string[] FindFilesInCurrentFolderOrParentFolder(
230257            do 
231258            { 
232259                Reporter . Verbose . WriteLine ( string . Format ( LocalizableStrings . PostAction_ModifyJson_Verbose_AttemptingToFindJsonFile ,  matchPattern ,  directory ) ) ; 
233-                 string [ ]  filesInDir  =  fileSystem . EnumerateFileSystemEntries ( directory ,  matchPattern ,  SearchOption . AllDirectories ) . ToArray ( ) ; 
260+                 string [ ]  filesInDir  =  fileSystem . EnumerateFileSystemEntries ( directory ,  matchPattern ,  searchOption ) . ToArray ( ) ; 
234261
235262                if  ( filesInDir . Length  >  0 ) 
236263                { 
237264                    return  filesInDir ; 
238265                } 
239266
267+                 if  ( repoRoot  is  not null  &&  directory  ==  repoRoot ) 
268+                 { 
269+                     // The post action wants to detect the "repo root". 
270+                     // We have already processed up to the repo root and didn't find any matching files, so we shouldn't go up any further. 
271+                     return  Array . Empty < string > ( ) ; 
272+                 } 
273+ 
240274                directory  =  Path . GetPathRoot ( directory )  !=  directory  ?  Directory . GetParent ( directory ) ? . FullName  :  null ; 
241275                numberOfUpLevels ++ ; 
242276            } 
243-             while  ( directory  !=  null  &&  numberOfUpLevels  <=  1 ) ; 
277+             while  ( directory  !=  null  &&  numberOfUpLevels  <=  maxUpLevels ) ; 
244278
245279            return  Array . Empty < string > ( ) ; 
246280        } 
0 commit comments