/// <summary> /// Combines the current path with the file name of a <see cref="FilePath"/>. /// </summary> /// <param name="path">The path.</param> /// <returns>A combination of the current path and the file name of the provided <see cref="FilePath"/>.</returns> public FilePath GetFilePath(FilePath path) { if (path == null) { throw new ArgumentNullException(nameof(path)); } return new FilePath(System.IO.Path.Combine(FullPath, path.GetFilename().FullPath)); }
/// <summary> /// Combines the current path with the file name of a <see cref="FilePath"/>. The current file provider /// is maintained. /// </summary> /// <param name="path">The path.</param> /// <returns>A combination of the current path and the file name of the provided <see cref="FilePath"/>.</returns> public FilePath GetFilePath(FilePath path) { if (path == null) { throw new ArgumentNullException(nameof(path)); } return(new FilePath(Provider, System.IO.Path.Combine(FullPath, path.GetFilename().FullPath))); }
public static FilePath Resolve(DirectoryPath source, FilePath target) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (target == null) { throw new ArgumentNullException(nameof(target)); } return(Resolve(source, target.GetDirectory()).GetFilePath(target.GetFilename())); }
public void Can_Get_Filename_From_Path() { // Given FilePath path = new FilePath("/input/test.txt"); // When FilePath result = path.GetFilename(); // Then Assert.AreEqual("test.txt", result.FullPath); }
private int Run(string[] args) { AssemblyInformationalVersionAttribute versionAttribute = Attribute.GetCustomAttribute(typeof(Program).Assembly, typeof(AssemblyInformationalVersionAttribute)) as AssemblyInformationalVersionAttribute; Console.WriteLine("Wyam version {0}", versionAttribute == null ? "unknown" : versionAttribute.InformationalVersion); // Parse the command line bool hasParseArgsErrors; if (!ParseArgs(args, out hasParseArgsErrors)) { return hasParseArgsErrors ? (int)ExitCode.CommandLineError : (int)ExitCode.Normal; } // It's not a serious console app unless there's some ASCII art OutputLogo(); // Fix the root folder and other files DirectoryPath currentDirectory = Environment.CurrentDirectory; _rootPath = _rootPath == null ? currentDirectory : currentDirectory.Combine(_rootPath); _logFilePath = _logFilePath == null ? null : _rootPath.CombineFile(_logFilePath); _configFilePath = _rootPath.CombineFile(_configFilePath ?? "config.wyam"); // Get the engine Engine engine = GetEngine(); if (engine == null) { return (int)ExitCode.CommandLineError; } // Pause if (_pause) { Trace.Information("Pause requested, hit any key to continue"); Console.ReadKey(); } // Configure and execute if (!Configure(engine)) { return (int)ExitCode.ConfigurationError; } if (_verifyConfig) { Trace.Information("No errors. Exiting."); return (int)ExitCode.Normal; } Console.WriteLine($"Root path:{Environment.NewLine} {engine.FileSystem.RootPath}"); Console.WriteLine($"Input path(s):{Environment.NewLine} {string.Join(Environment.NewLine + " ", engine.FileSystem.InputPaths)}"); Console.WriteLine($"Output path:{Environment.NewLine} {engine.FileSystem.OutputPath}"); if (!Execute(engine)) { return (int)ExitCode.ExecutionError; } bool messagePump = false; // Start the preview server IDisposable previewServer = null; if (_preview) { messagePump = true; try { var rootPath = _previewRoot == null ? engine.FileSystem.GetOutputDirectory().Path.FullPath : _previewRoot.FullPath; Trace.Information("Preview server listening on port {0} and serving from path {1}", _previewPort, rootPath); previewServer = Preview(engine, rootPath); } catch (Exception ex) { Trace.Critical("Error while running preview server: {0}", ex.Message); } } // Start the watchers IDisposable inputFolderWatcher = null; IDisposable configFileWatcher = null; if (_watch) { messagePump = true; Trace.Information("Watching paths(s) {0}", string.Join(", ", engine.FileSystem.InputPaths)); inputFolderWatcher = new ActionFileSystemWatcher(engine.FileSystem.GetOutputDirectory().Path, engine.FileSystem.GetInputDirectories().Select(x => x.Path), true, "*.*", path => { _changedFiles.Enqueue(path); _messageEvent.Set(); }); if (_configFilePath != null) { Trace.Information("Watching configuration file {0}", _configFilePath); Engine closureEngine = engine; configFileWatcher = new ActionFileSystemWatcher(engine.FileSystem.GetOutputDirectory().Path, new[] { _configFilePath.GetDirectory() }, false, _configFilePath.GetFilename().FullPath, path => { if (closureEngine.FileSystem.PathComparer.Equals((FilePath)path, _configFilePath)) { _newEngine.Set(); _messageEvent.Set(); } }); } } // Start the message pump if an async process is running ExitCode exitCode = ExitCode.Normal; if (messagePump) { // Start the key listening thread Trace.Information("Hit any key to exit"); var thread = new Thread(() => { Console.ReadKey(); _exit.Set(); _messageEvent.Set(); }) { IsBackground = true }; thread.Start(); // Wait for activity while (true) { _messageEvent.WaitOne(); // Blocks the current thread until a signal if (_exit) { break; } // See if we need a new engine if (_newEngine) { // Get a new engine Trace.Information("Configuration file {0} has changed, re-running", _configFilePath); engine.Dispose(); engine = GetEngine(); // Configure and execute if (!Configure(engine)) { exitCode = ExitCode.ConfigurationError; break; } Console.WriteLine($"Root path:{Environment.NewLine} {engine.FileSystem.RootPath}"); Console.WriteLine($"Input path(s):{Environment.NewLine} {string.Join(Environment.NewLine + " ", engine.FileSystem.InputPaths)}"); Console.WriteLine($"Root path:{Environment.NewLine} {engine.FileSystem.OutputPath}"); if (!Execute(engine)) { exitCode = ExitCode.ExecutionError; break; } // Clear the changed files since we just re-ran string changedFile; while (_changedFiles.TryDequeue(out changedFile)) { } _newEngine.Unset(); } else { // Execute if files have changed HashSet<string> changedFiles = new HashSet<string>(); string changedFile; while (_changedFiles.TryDequeue(out changedFile)) { if (changedFiles.Add(changedFile)) { Trace.Verbose("{0} has changed", changedFile); } } if (changedFiles.Count > 0) { Trace.Information("{0} files have changed, re-executing", changedFiles.Count); if (!Execute(engine)) { exitCode = ExitCode.ExecutionError; break; } } } // Check one more time for exit if (_exit) { break; } Trace.Information("Hit any key to exit"); _messageEvent.Reset(); } // Shutdown Trace.Information("Shutting down"); engine.Dispose(); inputFolderWatcher?.Dispose(); configFileWatcher?.Dispose(); previewServer?.Dispose(); } return (int)exitCode; }