Exemple #1
0
        private static CommandStatus RunScript(IWin32Window owner, GitModule module, ScriptInfo scriptInfo, IGitUICommands uiCommands, RevisionGridControl revisionGrid)
        {
            if (scriptInfo.AskConfirmation && MessageBox.Show(owner, $"Do you want to execute '{scriptInfo.Name}'?", "Script", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                return(false);
            }

            string originalCommand = scriptInfo.Command;

            (string argument, bool abort) = ScriptOptionsParser.Parse(scriptInfo.Arguments, module, owner, revisionGrid);
            if (abort)
            {
                return(false);
            }

            string command = OverrideCommandWhenNecessary(originalCommand);

            command = ExpandCommandVariables(command, module);

            if (scriptInfo.IsPowerShell)
            {
                PowerShellHelper.RunPowerShell(command, argument, module.WorkingDir, scriptInfo.RunInBackground);
                return(new CommandStatus(true, false));
            }

            if (command.StartsWith(PluginPrefix))
            {
                command = command.Replace(PluginPrefix, "");
                foreach (var plugin in PluginRegistry.Plugins)
                {
                    if (plugin.Description.ToLower().Equals(command, StringComparison.CurrentCultureIgnoreCase))
                    {
                        var eventArgs = new GitUIEventArgs(owner, uiCommands);
                        return(new CommandStatus(true, plugin.Execute(eventArgs)));
                    }
                }

                return(false);
            }

            if (command.StartsWith(NavigateToPrefix))
            {
                if (revisionGrid == null)
                {
                    return(false);
                }

                command = command.Replace(NavigateToPrefix, string.Empty);
                if (!command.IsNullOrEmpty())
                {
                    var revisionRef = new Executable(command, module.WorkingDir).GetOutputLines(argument).FirstOrDefault();

                    if (revisionRef != null)
                    {
                        revisionGrid.GoToRef(revisionRef, true);
                    }
                }

                return(new CommandStatus(true, false));
            }

            if (!scriptInfo.RunInBackground)
            {
                FormProcess.ShowStandardProcessDialog(owner, command, argument, module.WorkingDir, null, true);
            }
            else
            {
                if (originalCommand.Equals("{openurl}", StringComparison.CurrentCultureIgnoreCase))
                {
                    Process.Start(argument);
                }
                else
                {
                    new Executable(command, module.WorkingDir).Start(argument);
                }
            }

            return(new CommandStatus(true, !scriptInfo.RunInBackground));
        }
Exemple #2
0
        internal static bool RunScript(IWin32Window owner, GitModule aModule, ScriptInfo scriptInfo, RevisionGrid revisionGrid)
        {
            string originalCommand = scriptInfo.Command;
            string argument        = scriptInfo.Arguments;

            string command = OverrideCommandWhenNecessary(originalCommand);
            var    allSelectedRevisions = new List <GitRevision>();

            GitRevision selectedRevision = null;
            GitRevision currentRevision  = null;

            var selectedLocalBranches  = new List <IGitRef>();
            var selectedRemoteBranches = new List <IGitRef>();
            var selectedRemotes        = new List <string>();
            var selectedBranches       = new List <IGitRef>();
            var selectedTags           = new List <IGitRef>();
            var currentLocalBranches   = new List <IGitRef>();
            var currentRemoteBranches  = new List <IGitRef>();
            var currentRemote          = "";
            var currentBranches        = new List <IGitRef>();
            var currentTags            = new List <IGitRef>();

            foreach (string option in Options)
            {
                if (string.IsNullOrEmpty(argument) || !argument.Contains(option))
                {
                    continue;
                }
                if (option.StartsWith("{c") && currentRevision == null)
                {
                    currentRevision = GetCurrentRevision(aModule, revisionGrid, currentTags, currentLocalBranches, currentRemoteBranches, currentBranches, currentRevision);

                    if (currentLocalBranches.Count == 1)
                    {
                        currentRemote = aModule.GetSetting(string.Format(SettingKeyString.BranchRemote, currentLocalBranches[0].Name));
                    }
                    else
                    {
                        currentRemote = aModule.GetCurrentRemote();
                        if (string.IsNullOrEmpty(currentRemote))
                        {
                            currentRemote = aModule.GetSetting(string.Format(SettingKeyString.BranchRemote,
                                                                             askToSpecify(currentLocalBranches, "Current Revision Branch")));
                        }
                    }
                }
                else if (option.StartsWith("{s") && selectedRevision == null && revisionGrid != null)
                {
                    allSelectedRevisions = revisionGrid.GetSelectedRevisions();
                    allSelectedRevisions.Reverse(); // Put first clicked revisions first
                    selectedRevision = CalculateSelectedRevision(revisionGrid, selectedRemoteBranches, selectedRemotes, selectedLocalBranches, selectedBranches, selectedTags);
                }

                string remote;
                string url;
                switch (option)
                {
                case "{sHashes}":
                    argument = argument.Replace(option,
                                                string.Join(" ", allSelectedRevisions.Select(revision => revision.Guid).ToArray()));
                    break;

                case "{sTag}":
                    if (selectedTags.Count == 1)
                    {
                        argument = argument.Replace(option, selectedTags[0].Name);
                    }
                    else if (selectedTags.Count != 0)
                    {
                        argument = argument.Replace(option, askToSpecify(selectedTags, "Selected Revision Tag"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{sBranch}":
                    if (selectedBranches.Count == 1)
                    {
                        argument = argument.Replace(option, selectedBranches[0].Name);
                    }
                    else if (selectedBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    askToSpecify(selectedBranches, "Selected Revision Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{sLocalBranch}":
                    if (selectedLocalBranches.Count == 1)
                    {
                        argument = argument.Replace(option, selectedLocalBranches[0].Name);
                    }
                    else if (selectedLocalBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    askToSpecify(selectedLocalBranches,
                                                                 "Selected Revision Local Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{sRemoteBranch}":
                    if (selectedRemoteBranches.Count == 1)
                    {
                        argument = argument.Replace(option, selectedRemoteBranches[0].Name);
                    }
                    else if (selectedRemoteBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    askToSpecify(selectedRemoteBranches,
                                                                 "Selected Revision Remote Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{sRemote}":
                    if (selectedRemotes.Count == 0)
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }
                    if (selectedRemotes.Count == 1)
                    {
                        remote = selectedRemotes[0];
                    }
                    else
                    {
                        remote = askToSpecify(selectedRemotes, "Selected Revision Remote");
                    }
                    argument = argument.Replace(option, remote);
                    break;

                case "{sRemoteUrl}":
                    if (selectedRemotes.Count == 0)
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }
                    if (selectedRemotes.Count == 1)
                    {
                        remote = selectedRemotes[0];
                    }
                    else
                    {
                        remote = askToSpecify(selectedRemotes, "Selected Revision Remote");
                    }
                    url      = aModule.GetSetting(string.Format(SettingKeyString.RemoteUrl, remote));
                    argument = argument.Replace(option, url);
                    break;

                case "{sRemotePathFromUrl}":
                    if (selectedRemotes.Count == 0)
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }
                    if (selectedRemotes.Count == 1)
                    {
                        remote = selectedRemotes[0];
                    }
                    else
                    {
                        remote = askToSpecify(selectedRemotes, "Selected Revision Remote");
                    }
                    url      = aModule.GetSetting(string.Format(SettingKeyString.RemoteUrl, remote));
                    argument = argument.Replace(option, GetRemotePath(url));
                    break;

                case "{sHash}":
                    argument = argument.Replace(option, selectedRevision.Guid);
                    break;

                case "{sMessage}":
                    argument = argument.Replace(option, selectedRevision.Subject);
                    break;

                case "{sAuthor}":
                    argument = argument.Replace(option, selectedRevision.Author);
                    break;

                case "{sCommitter}":
                    argument = argument.Replace(option, selectedRevision.Committer);
                    break;

                case "{sAuthorDate}":
                    argument = argument.Replace(option, selectedRevision.AuthorDate.ToString());
                    break;

                case "{sCommitDate}":
                    argument = argument.Replace(option, selectedRevision.CommitDate.ToString());
                    break;

                case "{cTag}":
                    if (currentTags.Count == 1)
                    {
                        argument = argument.Replace(option, currentTags[0].Name);
                    }
                    else if (currentTags.Count != 0)
                    {
                        argument = argument.Replace(option, askToSpecify(currentTags, "Current Revision Tag"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{cBranch}":
                    if (currentBranches.Count == 1)
                    {
                        argument = argument.Replace(option, currentBranches[0].Name);
                    }
                    else if (currentBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    askToSpecify(currentBranches, "Current Revision Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{cLocalBranch}":
                    if (currentLocalBranches.Count == 1)
                    {
                        argument = argument.Replace(option, currentLocalBranches[0].Name);
                    }
                    else if (currentLocalBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    askToSpecify(currentLocalBranches,
                                                                 "Current Revision Local Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{cRemoteBranch}":
                    if (currentRemoteBranches.Count == 1)
                    {
                        argument = argument.Replace(option, currentRemoteBranches[0].Name);
                    }
                    else if (currentRemoteBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    askToSpecify(currentRemoteBranches,
                                                                 "Current Revision Remote Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }
                    break;

                case "{cHash}":
                    argument = argument.Replace(option, currentRevision.Guid);
                    break;

                case "{cMessage}":
                    argument = argument.Replace(option, currentRevision.Subject);
                    break;

                case "{cAuthor}":
                    argument = argument.Replace(option, currentRevision.Author);
                    break;

                case "{cCommitter}":
                    argument = argument.Replace(option, currentRevision.Committer);
                    break;

                case "{cAuthorDate}":
                    argument = argument.Replace(option, currentRevision.AuthorDate.ToString());
                    break;

                case "{cCommitDate}":
                    argument = argument.Replace(option, currentRevision.CommitDate.ToString());
                    break;

                case "{cDefaultRemote}":
                    if (string.IsNullOrEmpty(currentRemote))
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }
                    argument = argument.Replace(option, currentRemote);
                    break;

                case "{cDefaultRemoteUrl}":
                    if (string.IsNullOrEmpty(currentRemote))
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }
                    url      = aModule.GetSetting(string.Format(SettingKeyString.RemoteUrl, currentRemote));
                    argument = argument.Replace(option, url);
                    break;

                case "{cDefaultRemotePathFromUrl}":
                    if (string.IsNullOrEmpty(currentRemote))
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }
                    url      = aModule.GetSetting(string.Format(SettingKeyString.RemoteUrl, currentRemote));
                    argument = argument.Replace(option, GetRemotePath(url));
                    break;

                case "{UserInput}":
                    using (SimplePrompt Prompt = new SimplePrompt())
                    {
                        Prompt.ShowDialog();
                        argument = argument.Replace(option, Prompt.UserInput);
                    }
                    break;

                case "{WorkingDir}":
                    argument = argument.Replace(option, aModule.WorkingDir);
                    break;
                }
            }
            command = ExpandCommandVariables(command, aModule);

            if (scriptInfo.IsPowerShell)
            {
                PowerShellHelper.RunPowerShell(command, argument, aModule.WorkingDir, scriptInfo.RunInBackground);
                return(false);
            }

            if (command.StartsWith(PluginPrefix))
            {
                command = command.Replace(PluginPrefix, "");
                foreach (var plugin in Plugin.LoadedPlugins.Plugins)
                {
                    if (plugin.Description.ToLower().Equals(command, StringComparison.CurrentCultureIgnoreCase))
                    {
                        var eventArgs = new GitUIEventArgs(owner, revisionGrid.UICommands, argument);
                        return(plugin.Execute(eventArgs));
                    }
                }
                return(false);
            }

            if (!scriptInfo.RunInBackground)
            {
                FormProcess.ShowStandardProcessDialog(owner, command, argument, aModule.WorkingDir, null, true);
            }
            else
            {
                if (originalCommand.Equals("{openurl}", StringComparison.CurrentCultureIgnoreCase))
                {
                    Process.Start(argument);
                }
                else
                {
                    aModule.RunExternalCmdDetached(command, argument);
                }
            }

            return(!scriptInfo.RunInBackground);
        }
Exemple #3
0
        private static CommandStatus RunScriptInternal(IWin32Window owner, IGitModule module, string?scriptKey, IGitUICommands uiCommands, RevisionGridControl?revisionGrid)
        {
            if (Strings.IsNullOrEmpty(scriptKey))
            {
                return(false);
            }

            ScriptInfo?scriptInfo = ScriptManager.GetScript(scriptKey);

            if (scriptInfo is null)
            {
                ThreadHelper.AssertOnUIThread();
                throw new UserExternalOperationException($"{TranslatedStrings.ScriptErrorCantFind}: '{scriptKey}'",
                                                         new ExternalOperationException(command: null, arguments: null, module.WorkingDir, innerException: null));
            }

            if (Strings.IsNullOrEmpty(scriptInfo.Command))
            {
                return(false);
            }

            string?arguments = scriptInfo.Arguments;

            if (!Strings.IsNullOrEmpty(arguments) && revisionGrid is null)
            {
                string?optionDependingOnSelectedRevision
                    = ScriptOptionsParser.Options.FirstOrDefault(option => ScriptOptionsParser.DependsOnSelectedRevision(option) &&
                                                                 ScriptOptionsParser.Contains(arguments, option));
                if (optionDependingOnSelectedRevision is not null)
                {
                    ThreadHelper.AssertOnUIThread();
                    throw new UserExternalOperationException($"{TranslatedStrings.ScriptText}: '{scriptKey}'{Environment.NewLine}'{optionDependingOnSelectedRevision}' {TranslatedStrings.ScriptErrorOptionWithoutRevisionGridText}",
                                                             new ExternalOperationException(scriptInfo.Command, arguments, module.WorkingDir, innerException: null));
                }
            }

            if (scriptInfo.AskConfirmation &&
                MessageBox.Show(owner, $"{TranslatedStrings.ScriptConfirmExecute}: '{scriptInfo.Name}'?", TranslatedStrings.ScriptText,
                                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                return(false);
            }

            string?originalCommand = scriptInfo.Command;

            (string?argument, bool abort) = ScriptOptionsParser.Parse(scriptInfo.Arguments, module, owner, revisionGrid);
            if (abort)
            {
                ThreadHelper.AssertOnUIThread();
                throw new UserExternalOperationException($"{TranslatedStrings.ScriptText}: '{scriptKey}'{Environment.NewLine}{TranslatedStrings.ScriptErrorOptionWithoutRevisionText}",
                                                         new ExternalOperationException(scriptInfo.Command, arguments, module.WorkingDir, innerException: null));
            }

            Validates.NotNull(argument);

            string command = OverrideCommandWhenNecessary(originalCommand);

            command = ExpandCommandVariables(command, module);

            if (scriptInfo.IsPowerShell)
            {
                PowerShellHelper.RunPowerShell(command, argument, module.WorkingDir, scriptInfo.RunInBackground);

                // 'RunPowerShell' always runs the script detached (yet).
                // Hence currently, it does not make sense to set 'needsGridRefresh' to '!scriptInfo.RunInBackground'.
                return(new CommandStatus(executed: true, needsGridRefresh: false));
            }

            if (command.StartsWith(PluginPrefix))
            {
                command = command.Replace(PluginPrefix, string.Empty);

                lock (PluginRegistry.Plugins)
                {
                    foreach (var plugin in PluginRegistry.Plugins)
                    {
                        if (string.Equals(plugin.Name, command, StringComparison.CurrentCultureIgnoreCase))
                        {
                            var eventArgs = new GitUIEventArgs(owner, uiCommands);
                            return(new CommandStatus(executed: true, needsGridRefresh: plugin.Execute(eventArgs)));
                        }
                    }
                }

                return(false);
            }

            if (command.StartsWith(NavigateToPrefix))
            {
                if (revisionGrid is null)
                {
                    return(false);
                }

                command = command.Replace(NavigateToPrefix, string.Empty);
                if (!Strings.IsNullOrEmpty(command))
                {
                    var revisionRef = new Executable(command, module.WorkingDir).GetOutputLines(argument).FirstOrDefault();

                    if (revisionRef is not null)
                    {
                        revisionGrid.GoToRef(revisionRef, true);
                    }
                }

                return(new CommandStatus(executed: true, needsGridRefresh: false));
            }

            if (!scriptInfo.RunInBackground)
            {
                bool success = FormProcess.ShowDialog(owner, command, argument, module.WorkingDir, null, true);
                if (!success)
                {
                    return(false);
                }
            }
            else
            {
                if (originalCommand.Equals("{openurl}", StringComparison.CurrentCultureIgnoreCase))
                {
                    OsShellUtil.OpenUrlInDefaultBrowser(argument);
                }
                else
                {
                    // It is totally valid to have a command without an argument, e.g.:
                    //    Command  : myscript.cmd
                    //    Arguments: <blank>
                    new Executable(command, module.WorkingDir).Start(argument ?? string.Empty);
                }
            }

            return(new CommandStatus(executed: true, needsGridRefresh: !scriptInfo.RunInBackground));
        }
Exemple #4
0
        private static bool RunScript(IWin32Window owner, GitModule module, ScriptInfo scriptInfo, RevisionGridControl revisionGrid)
        {
            if (scriptInfo.AskConfirmation && MessageBox.Show(owner, $"Do you want to execute '{scriptInfo.Name}'?", "Script", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                return(false);
            }

            string originalCommand = scriptInfo.Command;
            string argument        = scriptInfo.Arguments;

            string command = OverrideCommandWhenNecessary(originalCommand);
            IReadOnlyList <GitRevision> allSelectedRevisions = Array.Empty <GitRevision>();

            GitRevision selectedRevision = null;
            GitRevision currentRevision  = null;

            var selectedLocalBranches  = new List <IGitRef>();
            var selectedRemoteBranches = new List <IGitRef>();
            var selectedRemotes        = new List <string>();
            var selectedBranches       = new List <IGitRef>();
            var selectedTags           = new List <IGitRef>();
            var currentLocalBranches   = new List <IGitRef>();
            var currentRemoteBranches  = new List <IGitRef>();
            var currentRemote          = "";
            var currentBranches        = new List <IGitRef>();
            var currentTags            = new List <IGitRef>();

            foreach (string option in _options)
            {
                if (string.IsNullOrEmpty(argument) || !argument.Contains(option))
                {
                    continue;
                }

                if (option.StartsWith("{c") && currentRevision == null)
                {
                    currentRevision = GetCurrentRevision(module, revisionGrid, currentTags, currentLocalBranches, currentRemoteBranches, currentBranches, currentRevision);

                    if (currentLocalBranches.Count == 1)
                    {
                        currentRemote = module.GetSetting(string.Format(SettingKeyString.BranchRemote, currentLocalBranches[0].Name));
                    }
                    else
                    {
                        currentRemote = module.GetCurrentRemote();
                        if (string.IsNullOrEmpty(currentRemote))
                        {
                            currentRemote = module.GetSetting(string.Format(SettingKeyString.BranchRemote,
                                                                            AskToSpecify(currentLocalBranches, "Current Revision Branch")));
                        }
                    }
                }
                else if (option.StartsWith("{s") && selectedRevision == null && revisionGrid != null)
                {
                    allSelectedRevisions = revisionGrid.GetSelectedRevisions();
                    selectedRevision     = CalculateSelectedRevision(revisionGrid, selectedRemoteBranches, selectedRemotes, selectedLocalBranches, selectedBranches, selectedTags);
                }

                string remote;
                string url;
                switch (option)
                {
                case "{sHashes}":
                    argument = argument.Replace(option,
                                                string.Join(" ", allSelectedRevisions.Select(revision => revision.Guid).ToArray()));
                    break;

                case "{sTag}":
                    if (selectedTags.Count == 1)
                    {
                        argument = argument.Replace(option, selectedTags[0].Name);
                    }
                    else if (selectedTags.Count != 0)
                    {
                        argument = argument.Replace(option, AskToSpecify(selectedTags, "Selected Revision Tag"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{sBranch}":
                    if (selectedBranches.Count == 1)
                    {
                        argument = argument.Replace(option, selectedBranches[0].Name);
                    }
                    else if (selectedBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    AskToSpecify(selectedBranches, "Selected Revision Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{sLocalBranch}":
                    if (selectedLocalBranches.Count == 1)
                    {
                        argument = argument.Replace(option, selectedLocalBranches[0].Name);
                    }
                    else if (selectedLocalBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    AskToSpecify(selectedLocalBranches,
                                                                 "Selected Revision Local Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{sRemoteBranch}":
                    if (selectedRemoteBranches.Count == 1)
                    {
                        argument = argument.Replace(option, selectedRemoteBranches[0].Name);
                    }
                    else if (selectedRemoteBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    AskToSpecify(selectedRemoteBranches,
                                                                 "Selected Revision Remote Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{sRemote}":
                    if (selectedRemotes.Count == 0)
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }

                    remote = selectedRemotes.Count == 1
                            ? selectedRemotes[0]
                            : AskToSpecify(selectedRemotes, "Selected Revision Remote");

                    argument = argument.Replace(option, remote);
                    break;

                case "{sRemoteUrl}":
                    if (selectedRemotes.Count == 0)
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }

                    remote = selectedRemotes.Count == 1
                            ? selectedRemotes[0]
                            : AskToSpecify(selectedRemotes, "Selected Revision Remote");

                    url      = module.GetSetting(string.Format(SettingKeyString.RemoteUrl, remote));
                    argument = argument.Replace(option, url);
                    break;

                case "{sRemotePathFromUrl}":
                    if (selectedRemotes.Count == 0)
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }

                    remote = selectedRemotes.Count == 1
                            ? selectedRemotes[0]
                            : AskToSpecify(selectedRemotes, "Selected Revision Remote");

                    url      = module.GetSetting(string.Format(SettingKeyString.RemoteUrl, remote));
                    argument = argument.Replace(option, GetRemotePath(url));
                    break;

                case "{sHash}":
                    argument = argument.Replace(option, selectedRevision.Guid);
                    break;

                case "{sMessage}":
                    argument = argument.Replace(option, selectedRevision.Subject);
                    break;

                case "{sAuthor}":
                    argument = argument.Replace(option, selectedRevision.Author);
                    break;

                case "{sCommitter}":
                    argument = argument.Replace(option, selectedRevision.Committer);
                    break;

                case "{sAuthorDate}":
                    argument = argument.Replace(option, selectedRevision.AuthorDate.ToString());
                    break;

                case "{sCommitDate}":
                    argument = argument.Replace(option, selectedRevision.CommitDate.ToString());
                    break;

                case "{cTag}":
                    if (currentTags.Count == 1)
                    {
                        argument = argument.Replace(option, currentTags[0].Name);
                    }
                    else if (currentTags.Count != 0)
                    {
                        argument = argument.Replace(option, AskToSpecify(currentTags, "Current Revision Tag"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{cBranch}":
                    if (currentBranches.Count == 1)
                    {
                        argument = argument.Replace(option, currentBranches[0].Name);
                    }
                    else if (currentBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    AskToSpecify(currentBranches, "Current Revision Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{cLocalBranch}":
                    if (currentLocalBranches.Count == 1)
                    {
                        argument = argument.Replace(option, currentLocalBranches[0].Name);
                    }
                    else if (currentLocalBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    AskToSpecify(currentLocalBranches,
                                                                 "Current Revision Local Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{cRemoteBranch}":
                    if (currentRemoteBranches.Count == 1)
                    {
                        argument = argument.Replace(option, currentRemoteBranches[0].Name);
                    }
                    else if (currentRemoteBranches.Count != 0)
                    {
                        argument = argument.Replace(option,
                                                    AskToSpecify(currentRemoteBranches,
                                                                 "Current Revision Remote Branch"));
                    }
                    else
                    {
                        argument = argument.Replace(option, "");
                    }

                    break;

                case "{cHash}":
                    argument = argument.Replace(option, currentRevision.Guid);
                    break;

                case "{cMessage}":
                    argument = argument.Replace(option, currentRevision.Subject);
                    break;

                case "{cAuthor}":
                    argument = argument.Replace(option, currentRevision.Author);
                    break;

                case "{cCommitter}":
                    argument = argument.Replace(option, currentRevision.Committer);
                    break;

                case "{cAuthorDate}":
                    argument = argument.Replace(option, currentRevision.AuthorDate.ToString());
                    break;

                case "{cCommitDate}":
                    argument = argument.Replace(option, currentRevision.CommitDate.ToString());
                    break;

                case "{cDefaultRemote}":
                    if (string.IsNullOrEmpty(currentRemote))
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }

                    argument = argument.Replace(option, currentRemote);
                    break;

                case "{cDefaultRemoteUrl}":
                    if (string.IsNullOrEmpty(currentRemote))
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }

                    url      = module.GetSetting(string.Format(SettingKeyString.RemoteUrl, currentRemote));
                    argument = argument.Replace(option, url);
                    break;

                case "{cDefaultRemotePathFromUrl}":
                    if (string.IsNullOrEmpty(currentRemote))
                    {
                        argument = argument.Replace(option, "");
                        break;
                    }

                    url      = module.GetSetting(string.Format(SettingKeyString.RemoteUrl, currentRemote));
                    argument = argument.Replace(option, GetRemotePath(url));
                    break;

                case "{UserInput}":
                    using (var prompt = new SimplePrompt())
                    {
                        prompt.ShowDialog();
                        argument = argument.Replace(option, prompt.UserInput);
                    }

                    break;

                case "{UserFiles}":
                    using (FormFilePrompt prompt = new FormFilePrompt())
                    {
                        if (prompt.ShowDialog(owner) != DialogResult.OK)
                        {
                            return(false);
                        }

                        argument = argument.Replace(option, prompt.FileInput);
                        break;
                    }

                case "{WorkingDir}":
                    argument = argument.Replace(option, module.WorkingDir);
                    break;
                }
            }

            command = ExpandCommandVariables(command, module);

            if (scriptInfo.IsPowerShell)
            {
                PowerShellHelper.RunPowerShell(command, argument, module.WorkingDir, scriptInfo.RunInBackground);
                return(false);
            }

            if (command.StartsWith(PluginPrefix))
            {
                command = command.Replace(PluginPrefix, "");
                foreach (var plugin in PluginRegistry.Plugins)
                {
                    if (plugin.Description.ToLower().Equals(command, StringComparison.CurrentCultureIgnoreCase))
                    {
                        var eventArgs = new GitUIEventArgs(owner, revisionGrid.UICommands);
                        return(plugin.Execute(eventArgs));
                    }
                }

                return(false);
            }

            if (command.StartsWith(NavigateToPrefix))
            {
                command = command.Replace(NavigateToPrefix, string.Empty);
                if (!command.IsNullOrEmpty())
                {
                    var revisionRef = new Executable(command, module.WorkingDir).GetOutputLines(argument).FirstOrDefault();

                    if (revisionRef != null)
                    {
                        revisionGrid.GoToRef(revisionRef, true);
                    }
                }

                return(false);
            }

            if (!scriptInfo.RunInBackground)
            {
                FormProcess.ShowStandardProcessDialog(owner, command, argument, module.WorkingDir, null, true);
            }
            else
            {
                if (originalCommand.Equals("{openurl}", StringComparison.CurrentCultureIgnoreCase))
                {
                    Process.Start(argument);
                }
                else
                {
                    new Executable(command, module.WorkingDir).Start(argument);
                }
            }

            return(!scriptInfo.RunInBackground);
        }
        private static CommandStatus RunScript(IWin32Window owner, IGitModule module, ScriptInfo scriptInfo, IGitUICommands uiCommands,
                                               RevisionGridControl revisionGrid, Action <string> showError)
        {
            if (scriptInfo.AskConfirmation && MessageBox.Show(owner, $"Do you want to execute '{scriptInfo.Name}'?", "Script", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                return(false);
            }

            string originalCommand = scriptInfo.Command;

            (string argument, bool abort) = ScriptOptionsParser.Parse(scriptInfo.Arguments, module, owner, revisionGrid);
            if (abort)
            {
                showError($"There must be a revision in order to substitute the argument option(s) for the script to run.");
                return(false);
            }

            string command = OverrideCommandWhenNecessary(originalCommand);

            command = ExpandCommandVariables(command, module);

            if (scriptInfo.IsPowerShell)
            {
                PowerShellHelper.RunPowerShell(command, argument, module.WorkingDir, scriptInfo.RunInBackground);

                // 'RunPowerShell' always runs the script detached (yet).
                // Hence currently, it does not make sense to set 'needsGridRefresh' to '!scriptInfo.RunInBackground'.
                return(new CommandStatus(executed: true, needsGridRefresh: false));
            }

            if (command.StartsWith(PluginPrefix))
            {
                command = command.Replace(PluginPrefix, "");

                lock (PluginRegistry.Plugins)
                {
                    foreach (var plugin in PluginRegistry.Plugins)
                    {
                        if (plugin.Description.ToLower().Equals(command, StringComparison.CurrentCultureIgnoreCase))
                        {
                            var eventArgs = new GitUIEventArgs(owner, uiCommands);
                            return(new CommandStatus(executed: true, needsGridRefresh: plugin.Execute(eventArgs)));
                        }
                    }
                }

                return(false);
            }

            if (command.StartsWith(NavigateToPrefix))
            {
                if (revisionGrid == null)
                {
                    return(false);
                }

                command = command.Replace(NavigateToPrefix, string.Empty);
                if (!command.IsNullOrEmpty())
                {
                    var revisionRef = new Executable(command, module.WorkingDir).GetOutputLines(argument).FirstOrDefault();

                    if (revisionRef != null)
                    {
                        revisionGrid.GoToRef(revisionRef, true);
                    }
                }

                return(new CommandStatus(executed: true, needsGridRefresh: false));
            }

            if (!scriptInfo.RunInBackground)
            {
                FormProcess.ShowStandardProcessDialog(owner, command, argument, module.WorkingDir, null, true);
            }
            else
            {
                if (originalCommand.Equals("{openurl}", StringComparison.CurrentCultureIgnoreCase))
                {
                    Process.Start(argument);
                }
                else
                {
                    new Executable(command, module.WorkingDir).Start(argument);
                }
            }

            return(new CommandStatus(executed: true, needsGridRefresh: !scriptInfo.RunInBackground));
        }
Exemple #6
0
        private static CommandStatus RunScript(IWin32Window owner, IGitModule module, string scriptKey, IGitUICommands uiCommands,
                                               RevisionGridControl revisionGrid, Action <string> showError)
        {
            if (string.IsNullOrEmpty(scriptKey))
            {
                return(false);
            }

            var scriptInfo = ScriptManager.GetScript(scriptKey);

            if (scriptInfo is null)
            {
                showError("Cannot find script: " + scriptKey);
                return(false);
            }

            if (string.IsNullOrEmpty(scriptInfo.Command))
            {
                return(false);
            }

            string arguments = scriptInfo.Arguments;

            if (!string.IsNullOrEmpty(arguments) && revisionGrid is null)
            {
                string optionDependingOnSelectedRevision
                    = ScriptOptionsParser.Options.FirstOrDefault(option => ScriptOptionsParser.DependsOnSelectedRevision(option) &&
                                                                 ScriptOptionsParser.Contains(arguments, option));
                if (optionDependingOnSelectedRevision is object)
                {
                    showError($"Option {optionDependingOnSelectedRevision} is only supported when started with revision grid available.");
                    return(false);
                }
            }

            if (scriptInfo.AskConfirmation && MessageBox.Show(owner, $"Do you want to execute '{scriptInfo.Name}'?", "Script", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                return(false);
            }

            string originalCommand = scriptInfo.Command;

            (string argument, bool abort) = ScriptOptionsParser.Parse(scriptInfo.Arguments, module, owner, revisionGrid);
            if (abort)
            {
                showError($"There must be a revision in order to substitute the argument option(s) for the script to run.");
                return(false);
            }

            string command = OverrideCommandWhenNecessary(originalCommand);

            command = ExpandCommandVariables(command, module);

            if (scriptInfo.IsPowerShell)
            {
                PowerShellHelper.RunPowerShell(command, argument, module.WorkingDir, scriptInfo.RunInBackground);

                // 'RunPowerShell' always runs the script detached (yet).
                // Hence currently, it does not make sense to set 'needsGridRefresh' to '!scriptInfo.RunInBackground'.
                return(new CommandStatus(executed: true, needsGridRefresh: false));
            }

            if (command.StartsWith(PluginPrefix))
            {
                command = command.Replace(PluginPrefix, "");

                lock (PluginRegistry.Plugins)
                {
                    foreach (var plugin in PluginRegistry.Plugins)
                    {
                        if (plugin.Description.ToLower().Equals(command, StringComparison.CurrentCultureIgnoreCase))
                        {
                            var eventArgs = new GitUIEventArgs(owner, uiCommands);
                            return(new CommandStatus(executed: true, needsGridRefresh: plugin.Execute(eventArgs)));
                        }
                    }
                }

                return(false);
            }

            if (command.StartsWith(NavigateToPrefix))
            {
                if (revisionGrid is null)
                {
                    return(false);
                }

                command = command.Replace(NavigateToPrefix, string.Empty);
                if (!string.IsNullOrEmpty(command))
                {
                    var revisionRef = new Executable(command, module.WorkingDir).GetOutputLines(argument).FirstOrDefault();

                    if (revisionRef != null)
                    {
                        revisionGrid.GoToRef(revisionRef, true);
                    }
                }

                return(new CommandStatus(executed: true, needsGridRefresh: false));
            }

            if (!scriptInfo.RunInBackground)
            {
                FormProcess.ShowDialog(owner, command, argument, module.WorkingDir, null, true);
            }
            else
            {
                if (originalCommand.Equals("{openurl}", StringComparison.CurrentCultureIgnoreCase))
                {
                    Process.Start(argument);
                }
                else
                {
                    // It is totally valid to have a command without an argument, e.g.:
                    //    Command  : myscript.cmd
                    //    Arguments: <blank>
                    new Executable(command, module.WorkingDir).Start(argument ?? string.Empty);
                }
            }

            return(new CommandStatus(executed: true, needsGridRefresh: !scriptInfo.RunInBackground));
        }