diff --git a/src/Basic.CompilerLog.UnitTests/ProgramTests.cs b/src/Basic.CompilerLog.UnitTests/ProgramTests.cs index f2a453f..ba048e8 100644 --- a/src/Basic.CompilerLog.UnitTests/ProgramTests.cs +++ b/src/Basic.CompilerLog.UnitTests/ProgramTests.cs @@ -83,11 +83,15 @@ private void AssertCorrectReader(ICompilerCallReader reader, string logFilePath) public (int ExitCode, string Output) RunCompLogEx(string args, string? currentDirectory = null) { + var savedCurrentDirectory = Constants.CurrentDirectory; + var savedLocalAppDataDirectory = Constants.LocalAppDataDirectory; + try { var writer = new System.IO.StringWriter(); currentDirectory ??= RootDirectory; Constants.CurrentDirectory = currentDirectory; + Constants.LocalAppDataDirectory = Path.Combine(currentDirectory, "localappdata"); Constants.Out = writer; Constants.OnCompilerCallReader = OnCompilerCallReader; var assembly = typeof(FilterOptionSet).Assembly; @@ -95,10 +99,16 @@ private void AssertCorrectReader(ICompilerCallReader reader, string logFilePath) var main = program!.GetMethod("
$", BindingFlags.Static | BindingFlags.NonPublic); Assert.NotNull(main); var ret = main!.Invoke(null, new[] { args.Split(' ', StringSplitOptions.RemoveEmptyEntries) }); + if (Directory.Exists(Constants.LocalAppDataDirectory)) + { + Assert.Empty(Directory.EnumerateFileSystemEntries(Constants.LocalAppDataDirectory)); + } return ((int)ret!, writer.ToString()); } finally { + Constants.CurrentDirectory = savedCurrentDirectory; + Constants.LocalAppDataDirectory = savedLocalAppDataDirectory; Constants.Out = Console.Out; Constants.OnCompilerCallReader = _ => { }; } @@ -362,7 +372,8 @@ public void ResponseMultiTarget() [Fact] public void ResponseNoLogArgument() { - var (exitCode, output) = RunCompLogEx($"rsp -o {RootDirectory}", Path.GetDirectoryName(Fixture.ConsoleProjectPath)!); + var consoleDir = Path.GetDirectoryName(Fixture.ConsoleProjectPath)!; + var (exitCode, output) = RunCompLogEx($"rsp -o {RootDirectory}", consoleDir); TestOutputHelper.WriteLine(output); Assert.Equal(Constants.ExitSuccess, exitCode); Assert.True(File.Exists(Path.Combine(RootDirectory, "console", "build.rsp"))); diff --git a/src/Basic.CompilerLog/Constants.cs b/src/Basic.CompilerLog/Constants.cs index c038837..697baf2 100644 --- a/src/Basic.CompilerLog/Constants.cs +++ b/src/Basic.CompilerLog/Constants.cs @@ -11,6 +11,9 @@ internal static class Constants internal const int ExitSuccess = 0; internal static string CurrentDirectory { get; set; } = Environment.CurrentDirectory; + internal static string LocalAppDataDirectory { get; set; } = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + "Basic.CompilerLog"); internal static TextWriter Out { get; set; } = Console.Out; internal static Action OnCompilerCallReader = _ => { }; diff --git a/src/Basic.CompilerLog/Program.cs b/src/Basic.CompilerLog/Program.cs index 0a8daf7..1e1b74b 100644 --- a/src/Basic.CompilerLog/Program.cs +++ b/src/Basic.CompilerLog/Program.cs @@ -14,6 +14,8 @@ ? ("help", Enumerable.Empty()) : (args[0], args.Skip(1)); +var appDataDirectory = Path.Combine(LocalAppDataDirectory, Guid.NewGuid().ToString()); + try { return command.ToLower() switch @@ -41,6 +43,13 @@ RunHelp(null); return ExitFailure; } +finally +{ + if (Directory.Exists(appDataDirectory)) + { + Directory.Delete(appDataDirectory, recursive: true); + } +} int RunCreate(IEnumerable args) { @@ -730,7 +739,7 @@ string GetLogFilePath(List extra, bool includeCompilerLogs = true) case ".sln": case ".csproj": case ".vbproj": - return GetLogFilePathAfterBuild(baseDirectory, logFilePath, args); + return GetLogFilePathAfterBuild(appDataDirectory, baseDirectory, logFilePath, args); default: throw new OptionException($"Not a valid log file {logFilePath}", "log"); } @@ -740,12 +749,14 @@ string GetLogFilePath(List extra, bool includeCompilerLogs = true) ? FindFirstFileWithPattern(baseDirectory, "*.complog", "*.binlog", "*.sln", "*.csproj", ".vbproj") : FindFirstFileWithPattern(baseDirectory, "*.binlog", "*.sln", "*.csproj", ".vbproj"); - static string GetLogFilePathAfterBuild(string baseDirectory, string buildFileName, IEnumerable buildArgs) + static string GetLogFilePathAfterBuild(string appDataDirectory, string baseDirectory, string buildFileName, IEnumerable buildArgs) { - var path = GetResolvedPath(baseDirectory, buildFileName); + Directory.CreateDirectory(appDataDirectory); + var binlogFilePath = Path.Combine(appDataDirectory, "build.binlog"); + var buildFilePath = GetResolvedPath(baseDirectory, buildFileName); var tag = buildArgs.Any() ? "" : "-t:Rebuild"; - var args = $"build {path} -bl:build.binlog -nr:false {tag} {string.Join(' ', buildArgs)}"; - WriteLine($"Building {path}"); + var args = $"build {buildFilePath} -bl:\"{binlogFilePath}\" -nr:false {tag} {string.Join(' ', buildArgs)}"; + WriteLine($"Building {buildFilePath}"); WriteLine($"dotnet {args}"); var result = DotnetUtil.Command(args, baseDirectory); WriteLine(result.StandardOut); @@ -755,7 +766,7 @@ static string GetLogFilePathAfterBuild(string baseDirectory, string buildFileNam WriteLine("Build Failed!"); } - return Path.Combine(baseDirectory, "build.binlog"); + return binlogFilePath; } static OptionException CreateOptionException() => new("Need a file to analyze", "log"); @@ -830,4 +841,4 @@ static string GetResolvedPath(string baseDirectory, string path) } static void Write(string str) => Constants.Out.Write(str); -static void WriteLine(string line) => Constants.Out.WriteLine(line); +static void WriteLine(string line) => Constants.Out.WriteLine(line); \ No newline at end of file