/// <summary> /// View the changes between the revisions, if possible as a diff /// </summary> /// <param name="fileViewer">Current FileViewer</param> /// <param name="firstId">The first (A) commit</param> /// <param name="selectedRev">The selected (B) commit</param> /// <param name="file">The git item to view</param> /// <param name="defaultText">default text if no diff is possible</param> /// <param name="openWithDiffTool">The difftool command to open with</param> /// <returns>Task to view</returns> public static Task ViewChangesAsync(this FileViewer fileViewer, [CanBeNull] ObjectId firstId, [CanBeNull] GitRevision selectedRev, [CanBeNull] GitItemStatus file, [NotNull] string defaultText = "", [CanBeNull] Action openWithDiffTool = null) { if (!string.IsNullOrWhiteSpace(file?.ErrorMessage)) { // Present error (e.g. parsing Git) return(fileViewer.ViewTextAsync(file.Name, file.ErrorMessage)); } if (file == null || selectedRev?.ObjectId == null) { if (!string.IsNullOrWhiteSpace(defaultText)) { return(fileViewer.ViewTextAsync(file?.Name, defaultText, openWithDiffTool)); } fileViewer.Clear(); return(Task.CompletedTask); } firstId ??= selectedRev.FirstParentGuid; openWithDiffTool ??= OpenWithDiffTool; if (file.IsNew || firstId == null || FileHelper.IsImage(file.Name)) { // View blob guid from revision, or file for worktree return(fileViewer.ViewGitItemRevisionAsync(file, selectedRev.ObjectId, openWithDiffTool)); } string selectedPatch = GetSelectedPatch(fileViewer, firstId, selectedRev.ObjectId, file); return(file.IsSubmodule || selectedPatch == null ? fileViewer.ViewTextAsync(file.Name, text : selectedPatch ?? defaultText, openWithDifftool : openWithDiffTool) : fileViewer.ViewPatchAsync(file.Name, text: selectedPatch, openWithDifftool: openWithDiffTool)); void OpenWithDiffTool() { fileViewer.Module.OpenWithDifftool( file.Name, file.OldName, firstId?.ToString(), selectedRev?.ToString(), "", file.IsTracked); }
/// <summary> /// View the changes between the revisions, if possible as a diff /// </summary> /// <param name="fileViewer">Current FileViewer</param> /// <param name="item">The FileStatusItem to present changes for</param> /// <param name="defaultText">default text if no diff is possible</param> /// <param name="openWithDiffTool">The difftool command to open with</param> /// <returns>Task to view</returns> public static Task ViewChangesAsync(this FileViewer fileViewer, [CanBeNull] FileStatusItem item, [NotNull] string defaultText = "", [CanBeNull] Action openWithDiffTool = null) { if (item?.Item?.IsStatusOnly ?? false) { // Present error (e.g. parsing Git) return(fileViewer.ViewTextAsync(item.Item.Name, item.Item.ErrorMessage)); } if (item?.Item == null || item.SecondRevision?.ObjectId == null) { if (!string.IsNullOrWhiteSpace(defaultText)) { return(fileViewer.ViewTextAsync(item?.Item?.Name, defaultText)); } fileViewer.Clear(); return(Task.CompletedTask); } var firstId = item.FirstRevision?.ObjectId ?? item.SecondRevision.FirstParentId; openWithDiffTool ??= OpenWithDiffTool; if (item.Item.IsNew || firstId == null || FileHelper.IsImage(item.Item.Name)) { // View blob guid from revision, or file for worktree return(fileViewer.ViewGitItemRevisionAsync(item.Item, item.SecondRevision.ObjectId, openWithDiffTool)); } string selectedPatch = GetSelectedPatch(fileViewer, firstId, item.SecondRevision.ObjectId, item.Item) ?? defaultText; return(item.Item.IsSubmodule ? fileViewer.ViewTextAsync(item.Item.Name, text: selectedPatch, openWithDifftool: openWithDiffTool) : fileViewer.ViewPatchAsync(item.Item.Name, text: selectedPatch, openWithDifftool: openWithDiffTool)); void OpenWithDiffTool() { fileViewer.Module.OpenWithDifftool( item.Item.Name, item.Item.OldName, firstId?.ToString(), item.SecondRevision.ToString(), isTracked: item.Item.IsTracked); }
/// <summary> /// View the changes between the revisions, if possible as a diff /// </summary> /// <param name="fileViewer">Current FileViewer</param> /// <param name="item">The FileStatusItem to present changes for</param> /// <param name="defaultText">default text if no diff is possible</param> /// <param name="openWithDiffTool">The difftool command to open with</param> /// <returns>Task to view</returns> public static Task ViewChangesAsync(this FileViewer fileViewer, [CanBeNull] FileStatusItem item, [NotNull] string defaultText = "", [CanBeNull] Action openWithDiffTool = null) { if (item?.Item?.IsStatusOnly ?? false) { // Present error (e.g. parsing Git) return(fileViewer.ViewTextAsync(item.Item.Name, item.Item.ErrorMessage)); } if (item?.Item is null || item.SecondRevision?.ObjectId is null) { if (!string.IsNullOrWhiteSpace(defaultText)) { return(fileViewer.ViewTextAsync(item?.Item?.Name, defaultText)); } fileViewer.Clear(); return(Task.CompletedTask); } var firstId = item.FirstRevision?.ObjectId ?? item.SecondRevision.FirstParentId; openWithDiffTool ??= OpenWithDiffTool; if (item.Item.IsNew || firstId is null || FileHelper.IsImage(item.Item.Name)) { // View blob guid from revision, or file for worktree return(fileViewer.ViewGitItemRevisionAsync(item.Item, item.SecondRevision.ObjectId, openWithDiffTool)); } if (item.Item.IsRangeDiff) { // This command may take time, give an indication of what is going on // The sha are incorrect if baseA/baseB is set, to simplify the presentation fileViewer.ViewText("range-diff.sh", $"git range-diff {firstId}...{item.SecondRevision.ObjectId}"); string output = fileViewer.Module.GetRangeDiff( firstId, item.SecondRevision.ObjectId, item.BaseA, item.BaseB, fileViewer.GetExtraDiffArguments(isRangeDiff: true)); // Try set highlighting from first found filename var match = new Regex(@"\n\s*(@@|##)\s+(?<file>[^#:\n]+)").Match(output ?? ""); var filename = match.Groups["file"].Success ? match.Groups["file"].Value : item.Item.Name; return(fileViewer.ViewRangeDiffAsync(filename, output ?? defaultText)); } string selectedPatch = GetSelectedPatch(fileViewer, firstId, item.SecondRevision.ObjectId, item.Item) ?? defaultText; return(item.Item.IsSubmodule ? fileViewer.ViewTextAsync(item.Item.Name, text: selectedPatch, openWithDifftool: openWithDiffTool) : fileViewer.ViewPatchAsync(item, text: selectedPatch, openWithDifftool: openWithDiffTool)); void OpenWithDiffTool() { fileViewer.Module.OpenWithDifftool( item.Item.Name, item.Item.OldName, firstId?.ToString(), item.SecondRevision.ToString(), isTracked: item.Item.IsTracked); }
/// <summary> /// View the changes between the revisions, if possible as a diff. /// </summary> /// <param name="fileViewer">Current FileViewer.</param> /// <param name="item">The FileStatusItem to present changes for.</param> /// <param name="defaultText">default text if no diff is possible.</param> /// <param name="openWithDiffTool">The difftool command to open with.</param> /// <returns>Task to view.</returns> public static async Task ViewChangesAsync(this FileViewer fileViewer, FileStatusItem?item, CancellationToken cancellationToken, string defaultText = "", Action?openWithDiffTool = null) { if (item?.Item.IsStatusOnly ?? false) { // Present error (e.g. parsing Git) await fileViewer.ViewTextAsync(item.Item.Name, item.Item.ErrorMessage ?? ""); return; } if (item?.Item is null || item.SecondRevision?.ObjectId is null) { if (!string.IsNullOrWhiteSpace(defaultText)) { await fileViewer.ViewTextAsync(item?.Item?.Name, defaultText); return; } fileViewer.Clear(); return; } var firstId = item.FirstRevision?.ObjectId ?? item.SecondRevision.FirstParentId; openWithDiffTool ??= OpenWithDiffTool; if (item.Item.IsNew || firstId is null || (!item.Item.IsDeleted && FileHelper.IsImage(item.Item.Name))) { // View blob guid from revision, or file for worktree await fileViewer.ViewGitItemAsync(item, openWithDiffTool); return; } if (item.Item.IsRangeDiff) { // Git range-diff has cubic runtime complexity and can be slow and memory consuming, // give an indication of what is going on string range = item.BaseA is null || item.BaseB is null ? $"{firstId}...{item.SecondRevision.ObjectId}" : $"{item.BaseA}..{firstId} {item.BaseB}..{item.SecondRevision.ObjectId}"; await fileViewer.ViewTextAsync("range-diff.sh", $"git range-diff {range}"); string output = fileViewer.Module.GetRangeDiff( firstId, item.SecondRevision.ObjectId, item.BaseA, item.BaseB, fileViewer.GetExtraDiffArguments(isRangeDiff: true)); // Try set highlighting from first found filename Match match = new Regex(@"\n\s*(@@|##)\s+(?<file>[^#:\n]+)").Match(output ?? ""); string filename = match.Groups["file"].Success ? match.Groups["file"].Value : item.Item.Name; cancellationToken.ThrowIfCancellationRequested(); await fileViewer.ViewRangeDiffAsync(filename, output ?? defaultText); return; } string selectedPatch = (await GetSelectedPatchAsync(fileViewer, firstId, item.SecondRevision.ObjectId, item.Item)) ?? defaultText; cancellationToken.ThrowIfCancellationRequested(); if (item.Item.IsSubmodule) { await fileViewer.ViewTextAsync(item.Item.Name, text : selectedPatch, openWithDifftool : openWithDiffTool); } else { await fileViewer.ViewPatchAsync(item, text : selectedPatch, openWithDifftool : openWithDiffTool); } return; void OpenWithDiffTool() { fileViewer.Module.OpenWithDifftool( item.Item.Name, item.Item.OldName, firstId?.ToString(), item.SecondRevision.ToString(), isTracked: item.Item.IsTracked); }
public void CloseViewer() { Viewer.Clear(); DisplayExplorer(isHardDrive); }