in src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PreviewTransformCommand.cs [178:270]
private void PreviewTransform(IVsHierarchy hier, string sourceFile, string transformFile)
{
if (string.IsNullOrWhiteSpace(sourceFile))
{
throw new ArgumentNullException(nameof(sourceFile));
}
if (string.IsNullOrWhiteSpace(transformFile))
{
throw new ArgumentNullException(nameof(transformFile));
}
if (!File.Exists(sourceFile))
{
throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_SourceFileNotFound, sourceFile), sourceFile);
}
if (!File.Exists(transformFile))
{
throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_TransformFileNotFound, transformFile), transformFile);
}
// Get our options
using (OptionsDialogPage optionsPage = new OptionsDialogPage())
using (AdvancedOptionsDialogPage advancedOptionsPage = new AdvancedOptionsDialogPage())
{
optionsPage.LoadSettingsFromStorage();
advancedOptionsPage.LoadSettingsFromStorage();
this.Logger.LogMessage("SlowCheetah PreviewTransform");
FileInfo sourceFileInfo = new FileInfo(sourceFile);
// Destination file
// This should be kept as a temp file in case a custom diff tool is being used
string destFile = PackageUtilities.GetTempFilename(true, sourceFileInfo.Extension);
this.TempFilesCreated.Add(destFile);
// Perform the transform and then display the result into the diffmerge tool that comes with VS.
this.ErrorListProvider.Tasks.Clear();
ITransformationLogger logger = new TransformationPreviewLogger(this.ErrorListProvider, hier);
ITransformer transformer = TransformerFactory.GetTransformer(sourceFile, logger);
if (!transformer.Transform(sourceFile, transformFile, destFile))
{
throw new TransformFailedException(Resources.Resources.TransformPreview_ErrorMessage);
}
// Does the customer want a preview? If not, just open an editor window
if (optionsPage.EnablePreview == false)
{
ProjectUtilities.GetDTE().ItemOperations.OpenFile(destFile);
}
else
{
// If the diffmerge service is available and no diff tool is specified, or diffmerge.exe is specifed we use the service
if (((IServiceProvider)this.ScPackage).GetService(typeof(SVsDifferenceService)) is IVsDifferenceService diffService && (!File.Exists(advancedOptionsPage.PreviewToolExecutablePath) || advancedOptionsPage.PreviewToolExecutablePath.EndsWith("diffmerge.exe", StringComparison.OrdinalIgnoreCase)))
{
if (!string.IsNullOrEmpty(advancedOptionsPage.PreviewToolExecutablePath) && !File.Exists(advancedOptionsPage.PreviewToolExecutablePath))
{
// If the user specified a preview tool, but it doesn't exist, log a warning
logger.LogWarning(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_CantFindPreviewTool, advancedOptionsPage.PreviewToolExecutablePath));
}
// Write all the labels for the diff tool
string sourceName = Path.GetFileName(sourceFile);
string leftLabel = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_LeftLabel, sourceName);
string rightLabel = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_RightLabel, sourceName, Path.GetFileName(transformFile));
string caption = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_Caption, sourceName);
string tooltip = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_ToolTip, sourceName);
diffService.OpenComparisonWindow2(sourceFile, destFile, caption, tooltip, leftLabel, rightLabel, null, null, (uint)__VSDIFFSERVICEOPTIONS.VSDIFFOPT_RightFileIsTemporary);
}
else if (string.IsNullOrEmpty(advancedOptionsPage.PreviewToolExecutablePath))
{
throw new ArgumentException(Resources.Resources.Error_NoPreviewToolSpecified);
}
else if (!File.Exists(advancedOptionsPage.PreviewToolExecutablePath))
{
throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_CantFindPreviewTool, advancedOptionsPage.PreviewToolExecutablePath), advancedOptionsPage.PreviewToolExecutablePath);
}
else
{
// Open a process with the specified diff tool
// Add quotes to the file names
ProcessStartInfo psi = new ProcessStartInfo(advancedOptionsPage.PreviewToolExecutablePath, string.Format(CultureInfo.CurrentCulture, advancedOptionsPage.PreviewToolCommandLine, $"\"{sourceFile}\"", $"\"{destFile}\""))
{
CreateNoWindow = true,
UseShellExecute = false
};
System.Diagnostics.Process.Start(psi);
}
}
}
}