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<GitRef>(); var selectedRemoteBranches = new List<GitRef>(); var selectedRemotes = new List<string>(); var selectedBranches = new List<GitRef>(); var selectedTags = new List<GitRef>(); var currentLocalBranches = new List<GitRef>(); var currentRemoteBranches = new List<GitRef>(); var currentRemote = ""; var currentBranches = new List<GitRef>(); var currentTags = new List<GitRef>(); 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("branch.{0}.remote", currentLocalBranches[0].Name)); else { currentRemote = aModule.GetCurrentRemote(); if (string.IsNullOrEmpty(currentRemote)) currentRemote = aModule.GetSetting(string.Format("branch.{0}.remote", 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.GetPathSetting(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.GetPathSetting(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.Message); 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.Message); 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.GetPathSetting(string.Format(SettingKeyString.RemoteUrl, currentRemote)); argument = argument.Replace(option, url); break; case "{cDefaultRemotePathFromUrl}": if (string.IsNullOrEmpty(currentRemote)) { argument = argument.Replace(option, ""); break; } url = aModule.GetPathSetting(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.RunInBackground) FormProcess.ShowDialog(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; }
internal static void RunScript(IWin32Window owner, GitModule aModule, ScriptInfo scriptInfo, RevisionGrid revisionGrid) { string command = scriptInfo.Command; string argument = scriptInfo.Arguments; command = OverrideCommandWhenNecessary(command); GitRevision selectedRevision = null; GitRevision currentRevision = null; var selectedLocalBranches = new List<GitRef>(); var selectedRemoteBranches = new List<GitRef>(); var selectedRemotes = new List<string>(); var selectedBranches = new List<GitRef>(); var selectedTags = new List<GitRef>(); var currentLocalBranches = new List<GitRef>(); var currentRemoteBranches = new List<GitRef>(); var currentRemote = ""; var currentBranches = new List<GitRef>(); var currentTags = new List<GitRef>(); foreach (string option in Options) { if (string.IsNullOrEmpty(argument) || !argument.Contains(option)) continue; if (!option.StartsWith("{s") || selectedRevision != null) { currentRevision = GetCurrentRevision(aModule, revisionGrid, currentTags, currentLocalBranches, currentRemoteBranches, currentBranches, currentRevision, option); if (currentLocalBranches.Count == 1) currentRemote = aModule.GetSetting(string.Format("branch.{0}.remote", currentLocalBranches[0].Name)); else { currentRemote = aModule.GetCurrentRemote(); if (string.IsNullOrEmpty(currentRemote)) currentRemote = aModule.GetSetting(string.Format("branch.{0}.remote", askToSpecify(currentLocalBranches, "Current Revision Branch"))); } } else { selectedRevision = CalculateSelectedRevision(revisionGrid, selectedRemoteBranches, selectedRemotes, selectedLocalBranches, selectedBranches, selectedTags); } string remote; string url; switch (option) { 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.GetPathSetting(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.GetPathSetting(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.Message); 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.Message); 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.GetPathSetting(string.Format(SettingKeyString.RemoteUrl, currentRemote)); argument = argument.Replace(option, url); break; case "{cDefaultRemotePathFromUrl}": if (string.IsNullOrEmpty(currentRemote)) { argument = argument.Replace(option, ""); break; } url = aModule.GetPathSetting(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; } } if (scriptInfo.ShowProgress) FormProcess.ShowDialog(owner, command, argument, aModule.WorkingDir, null, true); else aModule.RunExternalCmdDetached(command, argument); }