224 this INukeBuild
self,
225 ImportFolderItem
import,
226 ImportOptions? options =
null
229 var manifestPath =
import.From.GetFiles(
import.ManifestFilePattern).FirstOrDefault();
230 var to = options.UseSubfolder ? import.ToParent /
import.From.Name.ProcessSuffix(options.Suffixes) :
import.ToParent;
231 var instructions = import.Manifest ?? manifestPath?.ReadYaml<
ExportManifest>();
232 instructions = instructions.Combine(options.AddToAll);
233 if (!options.ImplicitImport)
235 instructions = instructions.Combine(options.AddToMain);
238 var result =
new List<ImportedItem>();
240 if (instructions ==
null)
242 var copyByDefault = options.CopyByDefault || options.ForceCopyLinks;
243 if (!options.Pretend)
246 import.From.Copy(to, ExistsPolicy.MergeAndOverwrite);
247 else to.LinksDirectory(
import.From);
249 var importMethod = copyByDefault ? ImportMethod.Copy : ImportMethod.Link;
250 result.Add(
new(
import.From, to, importMethod));
254 if (!to.DirectoryExists() && !options.Pretend) to.CreateDirectory();
257 IEnumerable<FileOrDirectory> list,
258 Func<AbsolutePath, AbsolutePath, FileOrDirectory, ImportedItem> handleDirectories,
259 Func<AbsolutePath, AbsolutePath, FileOrDirectory, ImportedItem> handleFiles
261 foreach (var glob
in list)
263 if (
string.IsNullOrWhiteSpace(glob.Directory) &&
string.IsNullOrWhiteSpace(glob.File))
266 var exclude = glob.Not.Concat(instructions.Not);
268 if (
string.IsNullOrWhiteSpace(glob.File))
269 import.From.SearchDirectories(glob.Directory!)
272 var dst = glob.GetDestination(
import.From, to, p, i, exclude);
273 if (dst ==
null)
return;
274 result.Add(handleDirectories(p, dst.ProcessSuffixPath(options.Suffixes, to), glob));
277 import.From.SearchFiles(glob.File!)
280 var dst = glob.GetDestination(
import.From, to, p, i, exclude);
281 if (dst ==
null)
return;
282 result.Add(handleFiles(p, dst.ProcessSuffixPath(options.Suffixes, to), glob));
287 ImportedItem HandleDirectoriesCopy(AbsolutePath src, AbsolutePath dst,
FileOrDirectory glob)
289 if (!options.Pretend) src.Copy(dst, ExistsPolicy.MergeAndOverwrite);
290 return new(src, dst, ImportMethod.Copy);
293 ImportedItem HandleFilesCopy(AbsolutePath src, AbsolutePath dst,
FileOrDirectory glob)
295 if (!options.Pretend)
297 src.Copy(dst, ExistsPolicy.FileOverwrite);
299 dst.ProcessSuffixContent(options.Suffixes);
301 return new(src, dst, ImportMethod.Copy);
304 ImportedItem HandleDirectoriesLink(AbsolutePath src, AbsolutePath dst,
FileOrDirectory glob)
306 if (!options.Pretend) dst.LinksDirectory(src);
307 return new(src, dst, ImportMethod.Link);
310 ImportedItem HandleFilesLink(AbsolutePath src, AbsolutePath dst,
FileOrDirectory glob)
312 if (!options.Pretend) dst.LinksFile(src);
313 return new(src, dst, ImportMethod.Link);
316 FileSystemTask(instructions.Copy, HandleDirectoriesCopy, HandleFilesCopy);
319 options.ForceCopyLinks ? HandleDirectoriesCopy : HandleDirectoriesLink,
320 options.ForceCopyLinks ? HandleFilesCopy : HandleFilesLink
323 foreach (var glob
in instructions.Use)
325 if (
string.IsNullOrWhiteSpace(glob.Directory) &&
string.IsNullOrWhiteSpace(glob.File))
328 var manifestFilePattern = glob.ManifestFilePattern ??
import.ManifestFilePattern;
330 var manifestGlob = glob.Directory !=
null
331 ? glob.Directory +
"/" + manifestFilePattern
334 var manifests =
import.From.SearchFiles(manifestGlob!)
335 .Select(p => p.Parent)
336 .Where(p => p !=
import.From)
339 if (!options.Pretend)
341 if (manifests.Count > 0)
343 "Folder {0} uses {1} importing\n {2}",
344 import.From, manifestGlob,
345 string.Join(
"\n ", manifests)
349 "Folder {0} attempted to import {1} but no importable subfolders were found (none of them had an export manifest file)",
350 import.From, manifestGlob
354 var exclude = glob.Not.Concat(instructions.Not);
356 manifests.ForEach((p, i) =>
358 var dst = glob.GetDestination(
import.From, to, p, i, exclude);
361 if (!options.Pretend) Log.Information(
"Ignoring folder {0}", p, dst);
364 if (!options.Pretend) Log.Information(
"Importing folder {0} -> {1}", p, dst);
367 (p, dst.Parent, Path.GetFileName(manifestGlob!)),
368 options with { UseSubfolder = true, ImplicitImport = true }