Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 3
0
        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();
            }
        }