void WriteCopyFile(CopyFile f) { var src = f.SourceName.String.IsValidPath() && File.Exists(Path.Combine(Path.GetDirectoryName(f.SourceName.Source.FullPath), f.SourceName.String)) ? f.SourceName.String : _env.ExpandSingleLine(f.SourceName.Source, f.SourceName.String).NativeToUnix(); var dst = _env.Combine(GetTargetName(f.SourceName, f.TargetName, f.Type)); if (!_disk.GetFullPath( f.SourceName.Source, ref src, PathFlags.AllowAbsolutePath | (f.Flags.HasFlag(CopyFileFlags.IsDirectory) ? PathFlags.IsDirectory : 0)) || f.Flags.HasFlag(CopyFileFlags.NoOverwrite) && File.Exists(dst)) { return; } if (f.Flags.HasFlag(CopyFileFlags.ProcessFile)) { using (var w = _disk.CreateBufferedText(dst)) w.Write(_env.Expand(new Source(f.SourceName.Source.Package, src, 1, 1), f.Preprocess(File.ReadAllText(src).Replace("\r\n", "\n")))); } else if (f.Flags.HasFlag(CopyFileFlags.IsDirectory)) { _disk.CopyDirectory(src, dst); } else { _disk.CopyFile(src, dst); } if (f.Flags.HasFlag(CopyFileFlags.IsExecutable)) { _disk.MakeExecutable(dst); } }