/// <summary> /// Execute the task. /// </summary> /// <returns></returns> public override bool Execute() { ArrayList inPathList = new ArrayList(); ArrayList outOfPathList = new ArrayList(); string conePath; try { conePath = OpportunisticIntern.InternStringIfPossible(System.IO.Path.GetFullPath(_path.ItemSpec)); conePath = FileUtilities.EnsureTrailingSlash(conePath); } catch (Exception e) when(ExceptionHandling.IsIoRelatedException(e)) { Log.LogErrorWithCodeFromResources(null, "", 0, 0, 0, 0, "FindUnderPath.InvalidParameter", "Path", _path.ItemSpec, e.Message); return(false); } int conePathLength = conePath.Length; Log.LogMessageFromResources(MessageImportance.Low, "FindUnderPath.ComparisonPath", Path.ItemSpec); foreach (ITaskItem item in Files) { string fullPath; try { fullPath = OpportunisticIntern.InternStringIfPossible(System.IO.Path.GetFullPath(item.ItemSpec)); } catch (Exception e) when(ExceptionHandling.IsIoRelatedException(e)) { Log.LogErrorWithCodeFromResources(null, "", 0, 0, 0, 0, "FindUnderPath.InvalidParameter", "Files", item.ItemSpec, e.Message); return(false); } // Compare the left side of both strings to see if they're equal. if (String.Compare(conePath, 0, fullPath, 0, conePathLength, StringComparison.OrdinalIgnoreCase) == 0) { // If we should use the absolute path, update the item contents // Since ItemSpec, which fullPath comes from, is unescaped, re-escape when setting // item.ItemSpec, since the setter for ItemSpec expects an escaped value. if (_updateToAbsolutePaths) { item.ItemSpec = EscapingUtilities.Escape(fullPath); } inPathList.Add(item); } else { outOfPathList.Add(item); } } InPath = (ITaskItem[])inPathList.ToArray(typeof(ITaskItem)); OutOfPath = (ITaskItem[])outOfPathList.ToArray(typeof(ITaskItem)); return(true); }
/// <summary> /// Parse the given <paramref name="fileSpec" /> into a <see cref="MSBuildGlob" /> using a given /// <paramref name="globRoot" />. /// </summary> /// <param name="globRoot"> /// The root of the glob. /// The fixed directory part of the glob and the match arguments (<see cref="IsMatch" /> and <see cref="MatchInfo" />) /// will get normalized against this root. /// If empty, the current working directory is used. /// Cannot be null, and cannot contain invalid path arguments. /// </param> /// <param name="fileSpec">The string to parse</param> /// <returns></returns> public static MSBuildGlob Parse(string globRoot, string fileSpec) { ErrorUtilities.VerifyThrowArgumentNull(globRoot, nameof(globRoot)); ErrorUtilities.VerifyThrowArgumentNull(fileSpec, nameof(fileSpec)); ErrorUtilities.VerifyThrowArgumentInvalidPath(globRoot, nameof(globRoot)); if (globRoot == string.Empty) { globRoot = Directory.GetCurrentDirectory(); } globRoot = OpportunisticIntern.InternStringIfPossible(FileUtilities.NormalizePath(globRoot).WithTrailingSlash()); var lazyState = new Lazy <GlobState>(() => { string fixedDirectoryPart = null; string wildcardDirectoryPart = null; string filenamePart = null; string matchFileExpression; bool needsRecursion; bool isLegalFileSpec; FileMatcher.Default.GetFileSpecInfo( fileSpec, out fixedDirectoryPart, out wildcardDirectoryPart, out filenamePart, out matchFileExpression, out needsRecursion, out isLegalFileSpec, (fixedDirPart, wildcardDirPart, filePart) => { var normalizedFixedPart = NormalizeTheFixedDirectoryPartAgainstTheGlobRoot(fixedDirPart, globRoot); return(Tuple.Create(normalizedFixedPart, wildcardDirPart, filePart)); }); // compile the regex since it's expected to be used multiple times var regex = isLegalFileSpec ? new Regex(matchFileExpression, FileMatcher.DefaultRegexOptions | RegexOptions.Compiled) : null; return(new GlobState(globRoot, fileSpec, isLegalFileSpec, fixedDirectoryPart, wildcardDirectoryPart, filenamePart, matchFileExpression, needsRecursion, regex)); }, true); return(new MSBuildGlob(lazyState)); }