public bool TryRunInstaller(InstallActionWrapper installActionWrapper, out string error) { string localError; this.TryGetGitVersion(out GitVersion newGitVersion, out localError); if (!installActionWrapper( () => { if (!this.TryInstallUpgrade(GitAssetId, newGitVersion.ToString(), out localError)) { return(false); } return(true); }, $"Installing Git version: {newGitVersion}")) { error = localError; return(false); } if (!installActionWrapper( () => { if (!this.TryInstallUpgrade(GVFSAssetId, this.newestVersion.ToString(), out localError)) { return(false); } return(true); }, $"Installing GVFS version: {this.newestVersion}")) { error = localError; return(false); } this.LogVersionInfo(this.newestVersion, newGitVersion, "Newly Installed Version"); error = null; return(true); }
public override bool TryRunInstaller(InstallActionWrapper installActionWrapper, out string error) { string localError = null; int installerExitCode; bool installSuccessful = true; using (ITracer activity = this.tracer.StartActivity(nameof(this.TryRunInstaller), EventLevel.Informational)) { InstallActionInfo currentInstallAction = null; try { string platformKey = InstallManifest.WindowsPlatformKey; if (!this.TryRecursivelyDeleteInstallerDirectory(out error)) { return(false); } if (!this.noVerify) { if (!this.nuGetFeed.VerifyPackage(this.DownloadedPackagePath)) { error = "Package signature validation failed. Check the upgrade logs for more details."; activity.RelatedError(error); this.fileSystem.DeleteFile(this.DownloadedPackagePath); return(false); } } this.UnzipPackage(); this.installManifest = InstallManifest.FromJsonFile(Path.Combine(this.ExtractedInstallerPath, ContentDirectoryName, InstallManifestFileName)); if (!this.installManifest.PlatformInstallManifests.TryGetValue(platformKey, out InstallManifestPlatform platformInstallManifest) || platformInstallManifest == null) { activity.RelatedError($"Extracted InstallManifest from JSON, but there was no entry for {platformKey}."); error = $"No entry in the manifest for the current platform ({platformKey}). Please verify the upgrade package."; return(false); } activity.RelatedInfo($"Extracted InstallManifest from JSON. InstallActions: {platformInstallManifest.InstallActions.Count}"); foreach (InstallActionInfo entry in platformInstallManifest.InstallActions) { currentInstallAction = entry; string installerPath = Path.Combine(this.ExtractedInstallerPath, ContentDirectoryName, entry.InstallerRelativePath); string args = entry.Args ?? string.Empty; // Replace tokens on args string processedArgs = NuGetUpgrader.ReplaceArgTokens(args, this.UpgradeInstanceId, ProductUpgraderInfo.GetLogDirectoryPath()); activity.RelatedInfo( "Running install action: Name: {0}, Version: {1}, InstallerPath: {2} RawArgs: {3}, ProcessedArgs: {4}", entry.Name, entry.Version, installerPath, args, processedArgs); string progressMessage = string.IsNullOrWhiteSpace(entry.Version) ? $"Running {entry.Name}" : $"Running {entry.Name} (version {entry.Version})"; installActionWrapper( () => { if (!this.dryRun) { this.RunInstaller(installerPath, processedArgs, out installerExitCode, out localError); } else { // We add a sleep here to ensure // the message for this install // action is written to the // console. Even though the // message is written with a delay // of 0, the messages are not // always written out. If / when // we can ensure that the message // is written out to console, then // we can remove this sleep. Thread.Sleep(1500); installerExitCode = 0; } installSuccessful = installerExitCode == 0; return(installSuccessful); }, progressMessage); if (!installSuccessful) { break; } } } catch (Exception ex) { localError = ex.Message; installSuccessful = false; } if (!installSuccessful) { string installActionName = string.IsNullOrEmpty(currentInstallAction?.Name) ? "installer" : currentInstallAction.Name; error = string.IsNullOrEmpty(localError) ? $"The {installActionName} failed, but no error message was provided by the failing command." : $"The {installActionName} failed with the following error: {localError}"; activity.RelatedError($"Could not complete all install actions. The following error was encountered: {error}"); return(false); } else { activity.RelatedInfo($"Install actions completed successfully."); error = null; return(true); } } }