private ITask <string> RunCredentialHelper(string action, string[] lines) { Logger.Trace("RunCredentialHelper helper:\"{0}\" action:\"{1}\"", credHelper, action); SimpleProcessTask task; if (credHelper.StartsWith('!')) { // it's a separate app, run it as such task = new SimpleProcessTask(taskManager.Token, credHelper.Substring(1).ToNPath(), action); } else { var args = $"credential-{credHelper} {action}"; task = new SimpleProcessTask(taskManager.Token, args); } task.Configure(processManager, true); task.OnStartProcess += proc => { foreach (var line in lines) { proc.StandardInput.WriteLine(line); } proc.StandardInput.Close(); }; return(task); }
private ITask <NPath[]> CalculateFolderDiff(ChangesTreeNode node) { var rightFile = node.Path.ToNPath(); var tmpDir = Manager.Environment.UnityProjectPath.Combine("Temp").CreateTempDirectory(); var changedFiles = treeChanges.GetLeafNodes(node).Select(x => x.Path.ToNPath()).ToList(); return(new FuncTask <List <NPath>, NPath[]>(TaskManager.Token, (s, files) => { var leftFolder = tmpDir.Combine("left", rightFile.FileName); var rightFolder = tmpDir.Combine("right", rightFile.FileName); foreach (var file in files) { var txt = new SimpleProcessTask(TaskManager.Token, "show HEAD:\"" + file.ToString(SlashMode.Forward) + "\"") .Configure(Manager.ProcessManager, false) .Catch(_ => true) .RunSynchronously(); if (txt != null) { leftFolder.Combine(file.RelativeTo(rightFile)).WriteAllText(txt); } if (file.FileExists()) { rightFolder.Combine(file.RelativeTo(rightFile)).WriteAllText(file.ReadAllText()); } } return new NPath[] { leftFolder, rightFolder }; }, () => changedFiles) { Message = "Calculating diff..." }); }
public void Run() { isBusy = true; progress.UpdateProgress(0, 100, "Initializing..."); if (firstRun) { UsageTracker.IncrementNumberOfStartups(); } var thread = new Thread(() => { GitInstallationState state = new GitInstallationState(); try { if (Environment.IsMac) { var getEnvPath = new SimpleProcessTask(TaskManager.Token, "bash".ToNPath(), "-c \"/usr/libexec/path_helper\"") .Configure(ProcessManager, dontSetupGit: true) .Catch(e => true); // make sure this doesn't throw if the task fails var path = getEnvPath.RunSynchronously(); if (getEnvPath.Successful) { Logger.Trace("Existing Environment Path Original:{0} Updated:{1}", Environment.Path, path); Environment.Path = path?.Split(new[] { "\"" }, StringSplitOptions.None)[1]; } } progress.UpdateProgress(20, 100, "Setting up octorun..."); Environment.OctorunScriptPath = new OctorunInstaller(Environment, TaskManager) .SetupOctorunIfNeeded(); progress.UpdateProgress(50, 100, "Setting up git..."); state = Environment.GitInstallationState; if (!state.GitIsValid && !state.GitLfsIsValid && FirstRun) { // importing old settings NPath gitExecutablePath = Environment.SystemSettings.Get(Constants.GitInstallPathKey, NPath.Default); if (gitExecutablePath.IsInitialized) { Environment.SystemSettings.Unset(Constants.GitInstallPathKey); state.GitExecutablePath = gitExecutablePath; state.GitInstallationPath = gitExecutablePath.Parent.Parent; Environment.GitInstallationState = state; } } var installer = new GitInstaller(Environment, ProcessManager, TaskManager.Token); installer.Progress.OnProgress += progressReporter.UpdateProgress; if (state.GitIsValid && state.GitLfsIsValid) { if (firstRun) { installer.ValidateGitVersion(state); if (state.GitIsValid) { installer.ValidateGitLfsVersion(state); } } } if (!state.GitIsValid || !state.GitLfsIsValid) { state = installer.SetupGitIfNeeded(); } SetupGit(state); progress.UpdateProgress(80, 100, "Initializing repository..."); if (state.GitIsValid && state.GitLfsIsValid) { RestartRepository(); } progress.UpdateProgress(100, 100, "Initialization failed"); } catch (Exception ex) { Logger.Error(ex, "A problem ocurred setting up Git"); progress.UpdateProgress(90, 100, "Initialization failed"); } new ActionTask <bool>(TaskManager.Token, (s, gitIsValid) => { InitializationComplete(); if (gitIsValid) { InitializeUI(); } }, () => state.GitIsValid && state.GitLfsIsValid) { Affinity = TaskAffinity.UI } .Start(); }); thread.Start(); }
public void Run(bool firstRun) { Logger.Trace("Run - CurrentDirectory {0}", NPath.CurrentDirectory); isBusy = true; var endTask = new ActionTask <GitInstaller.GitInstallationState>(CancellationToken, (_, state) => InitializeEnvironment(state)) { Affinity = TaskAffinity.UI }; ITask <string> setExistingEnvironmentPath; if (Environment.IsMac) { setExistingEnvironmentPath = new SimpleProcessTask(CancellationToken, "bash".ToNPath(), "-c \"/usr/libexec/path_helper\"") .Configure(ProcessManager, dontSetupGit: true) .Catch(e => true) // make sure this doesn't throw if the task fails .Then((success, path) => success ? path?.Split(new[] { "\"" }, StringSplitOptions.None)[1] : null); } else { setExistingEnvironmentPath = new FuncTask <string>(CancellationToken, () => null); } setExistingEnvironmentPath.OnEnd += (t, path, success, ex) => { if (path != null) { Logger.Trace("Existing Environment Path Original:{0} Updated:{1}", Environment.Path, path); Environment.Path = path; } }; var setupOctorun = new OctorunInstaller(Environment, TaskManager).SetupOctorunIfNeeded(); var setOctorunEnvironment = new ActionTask <NPath>(CancellationToken, (s, octorunPath) => Environment.OctorunScriptPath = octorunPath); var getGitFromSettings = new FuncTask <NPath>(CancellationToken, () => { var gitExecutablePath = SystemSettings.Get(Constants.GitInstallPathKey)?.ToNPath(); if (gitExecutablePath.HasValue && gitExecutablePath.Value.FileExists()) // we have a git path { Logger.Trace("Using git install path from settings: {0}", gitExecutablePath); return(gitExecutablePath.Value); } return(NPath.Default); }); getGitFromSettings.OnEnd += (t, path, _, __) => { if (path.IsInitialized) { var state = new GitInstaller.GitInstallationState { GitExecutablePath = path, GitIsValid = true }; endTask.PreviousResult = state; endTask.Start(); return; } Logger.Trace("Using portable git"); var setupGit = new GitInstaller(Environment, ProcessManager, TaskManager).SetupGitIfNeeded(); t.Then(setupGit); setupGit.Finally((s, state) => { endTask.PreviousResult = state; endTask.Start(); }); setupGit.Progress(progressReporter.UpdateProgress); // append installer task to top chain }; var setupChain = setExistingEnvironmentPath.Then(setupOctorun); setupChain.OnEnd += (t, path, _, __) => { t.GetEndOfChain().Then(setOctorunEnvironment).Then(getGitFromSettings); }; setupChain.Start(); }