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;
}