public async Task EmptyRun() { using var tmpFolder = Utility.GetTempFolder(); using var dataFolder = Utility.SetupDataFolder(tmpFolder, GameRelease.Oblivion); var output = Utility.TypicalOutputFile(tmpFolder); await Runner.Run( workingDirectory : tmpFolder.Dir.Path, outputPath : output, dataFolder : dataFolder.Dir.Path, loadOrder : Utility.TypicalLoadOrder(GameRelease.Oblivion, dataFolder.Dir), release : GameRelease.Oblivion, patchers : ListExt.Empty <IPatcherRun>()); Assert.False(File.Exists(output)); }
public GitPatcherState( IDriverRepositoryPreparationFollower driverRepositoryPreparation, IRunnerRepositoryPreparation runnerRepositoryState, IRunnableStateProvider runnableStateProvider, IPatcherRunnabilityCliState runnabilityCliState, IInstalledSdkFollower dotNetInstalled, IEnvironmentErrorsVm envErrors, IMissingMods missingMods, ILogger logger) { State = Observable.CombineLatest( driverRepositoryPreparation.DriverInfo .Select(x => x.ToUnit()), runnerRepositoryState.State, runnableStateProvider.WhenAnyValue(x => x.State) .Select(x => x.ToUnit()), runnabilityCliState.Runnable, dotNetInstalled.DotNetSdkInstalled .Select(x => (x, true)) .StartWith((new DotNetVersion(string.Empty, false), false)), envErrors.WhenAnyFallback(x => x.ActiveError !.ErrorString), missingMods.Missing .QueryWhenChanged() .Throttle(TimeSpan.FromMilliseconds(200), RxApp.MainThreadScheduler) .StartWith(ListExt.Empty <ModKey>()), (driver, runner, checkout, runnability, dotnet, envError, reqModsMissing) => { if (driver.IsHaltingError) { return(driver); } if (runner.IsHaltingError) { return(runner); } if (!dotnet.Item2) { return(new ConfigurationState(ErrorResponse.Fail("Determining DotNet SDK installed")) { IsHaltingError = false }); } if (!dotnet.Item1.Acceptable) { return(new ConfigurationState(ErrorResponse.Fail("No DotNet SDK installed"))); } if (envError != null) { return(new ConfigurationState(ErrorResponse.Fail(envError))); } if (reqModsMissing.Count > 0) { return(new ConfigurationState(ErrorResponse.Fail( $"Required mods missing from load order:{Environment.NewLine}{string.Join(Environment.NewLine, reqModsMissing)}"))); } if (runnability.RunnableState.Failed) { return(runnability.BubbleError()); } if (checkout.RunnableState.Failed) { return(checkout.BubbleError()); } logger.Information("State returned success!"); return(ConfigurationState.Success); }) .Replay(1) .RefCount(); }
public PatcherRunnabilityCliState( ICompilationProvider compilationProvider, IProfileDataFolderVm dataFolder, IProfileLoadOrder loadOrder, IExecuteRunnabilityCheck checkRunnability, ITemporaryLoadOrderProvider temporaryLoadOrderProvider, ILogger logger) { Runnable = Observable.CombineLatest( compilationProvider.State, dataFolder.WhenAnyValue(x => x.Path), loadOrder.LoadOrder.Connect() .QueryWhenChanged() .StartWith(ListExt.Empty <ReadOnlyModListingVM>()), (comp, data, loadOrder) => (comp, data, loadOrder)) .Select(i => { return(Observable.Create <ConfigurationState <RunnerRepoInfo> >(async(observer, cancel) => { if (i.comp.RunnableState.Failed) { observer.OnNext(i.comp); return; } logger.Information("Checking runnability"); // Return early with the values, but mark not complete observer.OnNext(new ConfigurationState <RunnerRepoInfo>(i.comp.Item) { IsHaltingError = false, RunnableState = ErrorResponse.Fail("Checking runnability") }); try { using var tmpLoadOrder = temporaryLoadOrderProvider.Get( i.loadOrder.Select <ReadOnlyModListingVM, IModListingGetter>(lvm => lvm)); var runnability = await checkRunnability.Check( path: i.comp.Item.ProjPath, directExe: false, cancel: cancel, buildMetaPath: i.comp.Item.MetaPath, loadOrderPath: tmpLoadOrder.File).ConfigureAwait(false); if (runnability.Failed) { logger.Information($"Checking runnability failed: {runnability.Reason}"); observer.OnNext(runnability.BubbleFailure <RunnerRepoInfo>()); return; } // Return things again, without error logger.Information("Checking runnability succeeded"); observer.OnNext(i.comp); } catch (Exception ex) { var str = $"Error checking runnability on runner repository: {ex}"; logger.Error(str); observer.OnNext(ErrorResponse.Fail(str).BubbleFailure <RunnerRepoInfo>()); } observer.OnCompleted(); })); }) .Switch() .Replay(1) .RefCount(); }