public override void OnGUI() { // Install path GUILayout.Label(GitInstallTitle, EditorStyles.boldLabel); EditorGUI.BeginDisabledGroup(IsBusy || Parent.IsBusy); { GUILayout.BeginVertical(); { GUILayout.BeginHorizontal(); { EditorGUI.BeginChangeCheck(); { gitPath = EditorGUILayout.TextField(PathToGit, gitPath); gitPath = gitPath != null?gitPath.Trim() : gitPath; if (GUILayout.Button(BrowseButton, EditorStyles.miniButton, GUILayout.Width(Styles.BrowseButtonWidth))) { GUI.FocusControl(null); var newPath = EditorUtility.OpenFilePanel(GitInstallBrowseTitle, !String.IsNullOrEmpty(gitPath) ? gitPath.ToSPath().Parent : "", Environment.ExecutableExtension.TrimStart('.')); if (!string.IsNullOrEmpty(newPath)) { gitPath = newPath.ToSPath().ToString(); } } } if (EditorGUI.EndChangeCheck()) { changingManually = ViewHasChanges; } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); { EditorGUI.BeginChangeCheck(); { gitLfsPath = EditorGUILayout.TextField(PathToGitLfs, gitLfsPath); gitLfsPath = gitLfsPath != null?gitLfsPath.Trim() : gitLfsPath; if (GUILayout.Button(BrowseButton, EditorStyles.miniButton, GUILayout.Width(Styles.BrowseButtonWidth))) { GUI.FocusControl(null); var newPath = EditorUtility.OpenFilePanel(GitInstallBrowseTitle, !String.IsNullOrEmpty(gitLfsPath) ? gitLfsPath.ToSPath().Parent : "", Environment.ExecutableExtension.TrimStart('.')); if (!string.IsNullOrEmpty(newPath)) { gitLfsPath = newPath.ToSPath().ToString(); } } } if (EditorGUI.EndChangeCheck()) { changingManually = ViewHasChanges; errorMessage = ""; } } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); GUILayout.BeginHorizontal(); { EditorGUI.BeginDisabledGroup(!changingManually && !resetToBundled && !resetToSystem); { if (GUILayout.Button(GitPathSaveButton, GUILayout.ExpandWidth(false))) { GUI.FocusControl(null); isBusy = true; ValidateAndSetGitInstallPath(); } } EditorGUI.EndDisabledGroup(); // disable the button if the paths are already pointing to the bundled git // both on windows, only lfs on mac EditorGUI.BeginDisabledGroup( (!Environment.IsWindows || gitPath == installDetails.GitExecutablePath) && gitLfsPath == installDetails.GitLfsExecutablePath); { if (GUILayout.Button(SetToBundledGitButton, GUILayout.ExpandWidth(false))) { GUI.FocusControl(null); if (Environment.IsWindows) { gitPath = installDetails.GitExecutablePath; } gitLfsPath = installDetails.GitLfsExecutablePath; resetToBundled = ViewHasChanges; resetToSystem = false; changingManually = false; errorMessage = ""; } } EditorGUI.EndDisabledGroup(); //Find button - for attempting to locate a new install if (GUILayout.Button(FindSystemGitButton, GUILayout.ExpandWidth(false))) { GUI.FocusControl(null); isBusy = true; TaskManager.With(() => { var gitInstaller = new GitInstaller(Platform); return(gitInstaller.FindSystemGit(new GitInstaller.GitInstallationState())); }, "Locating git...") .FinallyInUI((success, ex, state) => { if (success) { if (state.GitIsValid) { gitPath = state.GitExecutablePath; } if (state.GitLfsIsValid) { gitLfsPath = state.GitLfsExecutablePath; } } else { Logger.Error(ex); } isBusy = false; resetToBundled = false; resetToSystem = ViewHasChanges; changingManually = false; errorMessage = ""; Redraw(); }) .Start(); } } GUILayout.EndHorizontal(); if (!String.IsNullOrEmpty(errorMessage)) { GUILayout.BeginHorizontal(); { GUILayout.Label(errorMessage, Styles.ErrorLabel); } GUILayout.EndHorizontal(); } } EditorGUI.EndDisabledGroup(); }
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(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.RunSynchronously(); } SetupGit(state); progress.UpdateProgress(80, 100, "Initializing repository..."); if (state.GitIsValid && state.GitLfsIsValid) { RestartRepository(); } progress.UpdateProgress(100, 100, "Initialized"); } 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(); }
private void ValidateAndSetGitInstallPath() { if (resetToBundled) { TaskManager.With(() => { var state = Environment.GitDefaultInstallation.GetDefaults(); var gitInstaller = new GitInstaller(Platform, state); state = gitInstaller.RunSynchronously(); if (state.GitIsValid && state.GitLfsIsValid) { Manager.SetupGit(state); Manager.RestartRepository(); } return(state); }, "Setting up git... ") .FinallyInUI((success, exception, state) => { if (!success) { Logger.Error(exception, ErrorInstallingInternalGit); errorMessage = ErrorValidatingGitPath; } else { refresh = true; } isBusy = false; resetToBundled = false; resetToSystem = false; changingManually = false; Redraw(); }).Start(); } else { var newState = new GitInstaller.GitInstallationState(); newState.GitExecutablePath = gitPath.ToSPath(); newState.GitLfsExecutablePath = gitLfsPath.ToSPath(); var installer = new GitInstaller(Platform, newState); installer.Progress(UpdateProgress); TaskManager.With(() => { return(installer.RunSynchronously()); }) .Then(state => { if (state.GitIsValid && state.GitLfsIsValid) { Manager.SetupGit(state); Manager.RestartRepository(); } return(state); }) .FinallyInUI((success, ex, state) => { if (!success) { Logger.Error(ex, ErrorValidatingGitPath); return; } if (!state.GitIsValid || !state.GitLfsIsValid) { var errorMessageStringBuilder = new StringBuilder(); Logger.Warning( "Software versions do not meet minimums Git:{0} (Minimum:{1}) GitLfs:{2} (Minimum:{3})", state.GitVersion, Constants.MinimumGitVersion, state.GitLfsVersion, Constants.MinimumGitLfsVersion); if (state.GitVersion == TheVersion.Default) { errorMessageStringBuilder.Append(ErrorGitNotFoundMessage); } else if (state.GitLfsVersion == TheVersion.Default) { errorMessageStringBuilder.Append(ErrorGitLfsNotFoundMessage); } else { if (state.GitVersion < Constants.MinimumGitVersion) { errorMessageStringBuilder.AppendFormat(ErrorMinimumGitVersionMessageFormat, state.GitVersion, Constants.MinimumGitVersion); } if (state.GitLfsVersion < Constants.MinimumGitLfsVersion) { if (errorMessageStringBuilder.Length > 0) { errorMessageStringBuilder.Append(Environment.NewLine); } errorMessageStringBuilder.AppendFormat(ErrorMinimumGitLfsVersionMessageFormat, state.GitLfsVersion, Constants.MinimumGitLfsVersion); } } errorMessage = errorMessageStringBuilder.ToString(); } else { Logger.Trace("Software versions meet minimums Git:{0} GitLfs:{1}", state.GitVersion, state.GitLfsVersion); refresh = true; } isBusy = false; resetToBundled = false; resetToSystem = false; changingManually = false; Redraw(); }).Start(); } }