public static string GetSelectedPatch(this FileViewer diffViewer, IList <GitRevision> revisions, GitItemStatus file) { if (revisions.Count == 0) { return(null); } string firstRevision = revisions[0].Guid; string secondRevision = revisions.Count == 2 ? revisions[1].Guid : null; return(GetSelectedPatch(diffViewer, firstRevision, secondRevision, file)); }
private void UpdateSelectedFileViewers(bool force = false) { var selectedRevisions = FileChanges.GetSelectedRevisions(); if (selectedRevisions.Count == 0) { return; } GitRevision revision = selectedRevisions[0]; var children = FileChanges.GetRevisionChildren(revision.ObjectId); var fileName = revision.Name; if (string.IsNullOrEmpty(fileName)) { fileName = FileName; } SetTitle(fileName); if (revision.IsArtificial) { tabControl1.SelectedTab = DiffTab; CommitInfoTabPage.Parent = null; BlameTab.Parent = null; ViewTab.Parent = null; } else { if (CommitInfoTabPage.Parent == null) { tabControl1.TabPages.Insert(0, CommitInfoTabPage); } if (ViewTab.Parent == null) { var index = tabControl1.TabPages.IndexOf(DiffTab); Debug.Assert(index != -1, "TabControl should contain diff tab page"); tabControl1.TabPages.Insert(index + 1, ViewTab); } if (BlameTab.Parent == null) { var index = tabControl1.TabPages.IndexOf(ViewTab); Debug.Assert(index != -1, "TabControl should contain view tab page"); tabControl1.TabPages.Insert(index + 1, BlameTab); } } if (tabControl1.SelectedTab == BlameTab) { Blame.LoadBlame(revision, children, fileName, FileChanges, BlameTab, Diff.Encoding, force: force); } else if (tabControl1.SelectedTab == ViewTab) { View.Encoding = Diff.Encoding; View.ViewGitItemRevisionAsync(fileName, revision.ObjectId); } else if (tabControl1.SelectedTab == DiffTab) { var file = new GitItemStatus { IsTracked = true, Name = fileName, IsSubmodule = GitModule.IsValidGitWorkingDir(_fullPathResolver.Resolve(fileName)) }; Diff.ViewChangesAsync(FileChanges.GetSelectedRevisions(), file, "You need to select at least one revision to view diff."); } else if (tabControl1.SelectedTab == CommitInfoTabPage) { CommitDiff.SetRevision(revision.ObjectId, fileName); } if (_buildReportTabPageExtension == null) { _buildReportTabPageExtension = new BuildReportTabPageExtension(tabControl1, _buildReportTabCaption.Text); } _buildReportTabPageExtension.FillBuildReport(selectedRevisions.Count == 1 ? revision : null); }
public GitItemStatusWithParent(GitItemStatus anItem, string aParentGuid) { Item = anItem; ParentGuid = aParentGuid; }
public static void ViewChanges(this FileViewer diffViewer, IList <GitRevision> revisions, GitItemStatus file, string defaultText) { var firstRevision = revisions.Count > 0 ? revisions[0] : null; string firstRevisionGuid = firstRevision == null ? null : firstRevision.Guid; string parentRevisionGuid = revisions.Count == 2 ? revisions[1].Guid : null; if (parentRevisionGuid == null && firstRevision != null && firstRevision.ParentGuids != null && firstRevision.ParentGuids.Length > 0) { parentRevisionGuid = firstRevision.ParentGuids[0]; } ViewChanges(diffViewer, firstRevisionGuid, parentRevisionGuid, file, defaultText); }
/// <summary> /// Parse the output from git-status --porcelain=2. /// </summary> /// <param name="getAllChangedFilesCommandOutput">output from the git command.</param> /// <returns>list with the parsed GitItemStatus.</returns> private static IReadOnlyList <GitItemStatus> GetAllChangedFilesFromString_v2(string getAllChangedFilesCommandOutput) { List <GitItemStatus> diffFiles = new(); if (string.IsNullOrEmpty(getAllChangedFilesCommandOutput)) { return(diffFiles); } string trimmedStatus = RemoveWarnings(getAllChangedFilesCommandOutput); // Split all files on '\0' var files = trimmedStatus.Split(Delimiters.Null, StringSplitOptions.RemoveEmptyEntries); for (int n = 0; n < files.Length; n++) { string line = files[n]; char entryType = line[0]; if (entryType == '?' || entryType == '!') { Debug.Assert(line.Length > 2 && line[1] == ' ', "Cannot parse for untracked:" + line); string fileName = line.Substring(2); UpdateItemStatus(entryType, false, "N...", fileName, null, null); } else if (entryType == '1' || entryType == '2' || entryType == 'u') { // Parse from git-status documentation, assuming SHA-1 is used // Ignore octal and treeGuid // 1 XY subm <mH> <mI> <mW> <hH> <hI> <path> // renamed: // 2 XY subm <mH> <mI> <mW> <hH> <hI> <X><score> <path><sep><origPath> // worktree (merge conflicts) // u XY subm <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path> char x = line[2]; char y = line[3]; string fileName; string?oldFileName = null; string?renamePercent = null; string subm = line.Substring(5, 4); if (entryType == '1') { Debug.Assert(line.Length > 113 && line[1] == ' ', "Cannot parse line:" + line); fileName = line.Substring(113); } else if (entryType == '2') { Debug.Assert(line.Length > 2 && n + 1 < files.Length, "Cannot parse renamed:" + line); // Find renamed files... string[] renames = line.Substring(114).Split(Delimiters.Space, 2); renamePercent = renames[0]; fileName = renames[1]; oldFileName = files[++n]; } else if (entryType == 'u') { Debug.Assert(line.Length > 161, "Cannot parse unmerged:" + line); fileName = line.Substring(161); } else { // illegal continue; } UpdateItemStatus(x, true, subm, fileName, oldFileName, renamePercent); UpdateItemStatus(y, false, subm, fileName, oldFileName, renamePercent); } } return(diffFiles); void UpdateItemStatus(char x, bool isIndex, string subm, string fileName, string?oldFileName, string?renamePercent) { if (x == '.') { return; } var staged = isIndex ? StagedStatus.Index : StagedStatus.WorkTree; GitItemStatus gitItemStatus = GitItemStatusConverter.FromStatusCharacter(staged, fileName, x); if (oldFileName is not null) { gitItemStatus.OldName = oldFileName; } if (renamePercent is not null) { gitItemStatus.RenameCopyPercentage = renamePercent; } if (subm[0] == 'S') { gitItemStatus.IsSubmodule = true; if (!isIndex) { // Slight modification on how the following flags are used // Changed commit gitItemStatus.IsChanged = subm[1] == 'C'; gitItemStatus.IsDirty = subm[2] == 'M' || subm[3] == 'U'; } } diffFiles.Add(gitItemStatus); } }
public static string GetSelectedPatch(this FileViewer diffViewer, string firstRevision, string secondRevision, GitItemStatus file) { if (!file.IsTracked) { var fullPath = Path.Combine(diffViewer.Module.WorkingDir, file.Name); if (Directory.Exists(fullPath) && GitModule.IsValidGitWorkingDir(fullPath)) { // git-status does not detect details for untracked and git-diff --no-index will not give info return(LocalizationHelpers.GetSubmoduleText(diffViewer.Module, file.Name.TrimEnd('/'), "")); } } if (file.IsSubmodule && file.SubmoduleStatus != null) { return(LocalizationHelpers.ProcessSubmoduleStatus(diffViewer.Module, file.SubmoduleStatus.Result)); } PatchApply.Patch patch = GetItemPatch(diffViewer.Module, file, firstRevision, secondRevision, diffViewer.GetExtraDiffArguments(), diffViewer.Encoding); if (patch == null) { return(string.Empty); } if (file.IsSubmodule) { return(LocalizationHelpers.ProcessSubmodulePatch(diffViewer.Module, file.Name, patch)); } return(patch.Text); }
public static string GetSelectedPatch(this FileViewer diffViewer, RevisionGrid grid, GitItemStatus file) { IList <GitRevision> revisions = grid.GetSelectedRevisions(); string firstRevision = revisions.Count > 0 ? revisions[0].Guid : null; string secondRevision = revisions.Count == 2 ? revisions[1].Guid : null; return(GetSelectedPatch(diffViewer, firstRevision, secondRevision, file)); }
private static PatchApply.Patch GetItemPatch(GitModule module, GitItemStatus file, string firstRevision, string secondRevision, string diffArgs, Encoding encoding) { return(module.GetSingleDiff(firstRevision, secondRevision, file.Name, file.OldName, diffArgs, encoding, true)); }
private static string?GetPrimarySortingPath(GitItemStatus itemStatus) { return(!string.IsNullOrEmpty(itemStatus.Name) ? itemStatus.Name : itemStatus.OldName); }
public void ViewCurrentChanges(GitItemStatus item) { ViewCurrentChanges(item.Name, item.OldName, item.IsStaged, item.IsSubmodule); }
public static Task ViewChangesAsync(this FileViewer diffViewer, IReadOnlyList <GitRevision> revisions, GitItemStatus file, string defaultText) { if (revisions.Count == 0) { return(Task.CompletedTask); } var selectedRevision = revisions[0]; var secondRevision = selectedRevision?.ObjectId; var firstRevision = revisions.Count >= 2 ? revisions[1].ObjectId : null; if (firstRevision == null && selectedRevision != null) { firstRevision = selectedRevision.FirstParentGuid; } return(ViewChangesAsync(diffViewer, firstRevision, secondRevision, file, defaultText, openWithDifftool: null /* use default */)); }
private void StashedSelectedIndexChanged(object sender, EventArgs e) { GitStash gitStash = Stashes.SelectedItem as GitStash; GitItemStatus stashedItem = Stashed.SelectedItem; EnablePartialStash(); using (WaitCursorScope.Enter()) { if (stashedItem != null && gitStash == _currentWorkingDirStashItem) { // current working directory View.ViewCurrentChanges(stashedItem); } else if (stashedItem != null) { if (stashedItem.IsNew) { if (!stashedItem.IsSubmodule) { View.ViewGitItemAsync(stashedItem.Name, stashedItem.TreeGuid); } else { ThreadHelper.JoinableTaskFactory.RunAsync( () => View.ViewTextAsync( stashedItem.Name, LocalizationHelpers.GetSubmoduleText(Module, stashedItem.Name, stashedItem.TreeGuid?.ToString()))); } } else { string extraDiffArguments = View.GetExtraDiffArguments(); Encoding encoding = View.Encoding; View.ViewPatchAsync( () => { Patch patch = Module.GetSingleDiff(gitStash.Name + "^", gitStash.Name, stashedItem.Name, stashedItem.OldName, extraDiffArguments, encoding, true, stashedItem.IsTracked); if (patch == null) { return(text: string.Empty, openWithDifftool: null /* not applicable */, filename: null); } if (stashedItem.IsSubmodule) { return(text: LocalizationHelpers.ProcessSubmodulePatch(Module, stashedItem.Name, patch), openWithDifftool: null /* not implemented */, filename: null); } return(text: patch.Text, openWithDifftool: null /* not implemented */, filename: stashedItem.Name); }); } } else { ThreadHelper.JoinableTaskFactory.RunAsync( () => View.ViewTextAsync("", "")); } } }
public static void ViewChanges(this FileViewer diffViewer, string revision, string parentRevision, GitItemStatus file, string defaultText) { diffViewer.ViewPatch(() => { string selectedPatch = diffViewer.GetSelectedPatch(revision, parentRevision, file); return(selectedPatch ?? defaultText); }); }
public static void ViewChanges(this FileViewer diffViewer, IList <GitRevision> revisions, GitItemStatus file, string defaultText) { if (revisions.Count == 1 && (revisions[0].ParentGuids == null || revisions[0].ParentGuids.Length == 0)) { if (file.TreeGuid.IsNullOrEmpty()) { diffViewer.ViewGitItemRevision(file.Name, revisions[0].Guid); } else if (!file.IsSubmodule) { diffViewer.ViewGitItem(file.Name, file.TreeGuid); } else { diffViewer.ViewText(file.Name, GitCommandHelpers.GetSubmoduleText(diffViewer.Module, file.Name, file.TreeGuid)); } } else { diffViewer.ViewPatch(() => { string selectedPatch = diffViewer.GetSelectedPatch(revisions, file); return(selectedPatch ?? defaultText); }); } }
private void UnstageFilesClick(object sender, EventArgs e) { EnableStageButtons(false); try { Cursor.Current = Cursors.WaitCursor; if (Staged.GitItemStatuses.Count > 10 && Staged.SelectedItems.Count == Staged.GitItemStatuses.Count) { Loading.Visible = true; LoadingStaged.Visible = true; GitCommandHelpers.ResetMixed("HEAD"); Initialize(); } else { toolStripProgressBar1.Visible = true; toolStripProgressBar1.Maximum = Staged.SelectedItems.Count * 2; toolStripProgressBar1.Value = 0; var files = new List <GitItemStatus>(); var allFiles = new List <GitItemStatus>(); foreach (var item in Staged.SelectedItems) { toolStripProgressBar1.Value = Math.Min(toolStripProgressBar1.Maximum - 1, toolStripProgressBar1.Value + 1); if (!item.IsNew) { toolStripProgressBar1.Value = Math.Min(toolStripProgressBar1.Maximum - 1, toolStripProgressBar1.Value + 1); GitCommandHelpers.UnstageFileToRemove(item.Name); if (item.IsRenamed) { GitCommandHelpers.UnstageFileToRemove(item.OldName); } } else { files.Add(item); } allFiles.Add(item); } GitCommandHelpers.UnstageFiles(files); InitializedStaged(); var stagedFiles = (List <GitItemStatus>)Staged.GitItemStatuses; var unStagedFiles = (List <GitItemStatus>)Unstaged.GitItemStatuses; Unstaged.GitItemStatuses = null; foreach (var item in allFiles) { var item1 = item; if (stagedFiles.Exists(i => i.Name == item1.Name)) { continue; } var item2 = item; if (unStagedFiles.Exists(i => i.Name == item2.Name)) { continue; } if (item.IsNew && !item.IsChanged && !item.IsDeleted) { item.IsTracked = false; } else { item.IsTracked = true; } if (item.IsRenamed) { GitItemStatus clone = new GitItemStatus(); clone.Name = item.OldName; clone.IsDeleted = true; clone.IsTracked = true; clone.IsStaged = false; unStagedFiles.Add(clone); item.IsRenamed = false; item.IsNew = true; item.IsTracked = false; item.OldName = string.Empty; } item.IsStaged = false; unStagedFiles.Add(item); } Staged.GitItemStatuses = stagedFiles; Unstaged.GitItemStatuses = unStagedFiles; toolStripProgressBar1.Value = toolStripProgressBar1.Maximum; } toolStripProgressBar1.Visible = false; } catch (Exception ex) { Trace.WriteLine(ex.Message); } EnableStageButtons(true); Cursor.Current = Cursors.Default; if (Settings.RevisionGraphShowWorkingDirChanges) { NeedRefresh = true; } }
void FileStatusListBox_MouseMove(object sender, MouseEventArgs e) { //DRAG // If the mouse moves outside the rectangle, start the drag. if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y)) { if (SelectedItems.Count > 0) { StringCollection fileList = new StringCollection(); foreach (GitItemStatus item in SelectedItems) { string fileName = GitCommands.Settings.WorkingDir + item.Name; fileList.Add(fileName.Replace('/', '\\')); } DataObject obj = new DataObject(); obj.SetFileDropList(fileList); // Proceed with the drag and drop, passing in the list item. DoDragDrop(obj, DragDropEffects.Copy); dragBoxFromMouseDown = Rectangle.Empty; } } //TOOLTIP ListBox listBox = sender as ListBox; if (listBox != null) { Point point = new Point(e.X, e.Y); int hoverIndex = listBox.IndexFromPoint(point); if (hoverIndex >= 0 && hoverIndex <= listBox.Items.Count) { GitItemStatus gitItemStatus = (GitItemStatus)listBox.Items[hoverIndex]; string text; if (gitItemStatus.IsRenamed || gitItemStatus.IsCopied) { text = string.Concat(gitItemStatus.Name, " (", gitItemStatus.OldName, ")"); } else { text = gitItemStatus.Name; } float fTextWidth = listBox.CreateGraphics().MeasureString(text, listBox.Font).Width + 17; //Use width-itemheight because the icon drawn in front of the text is the itemheight if (fTextWidth > (FileStatusListBox.Width - FileStatusListBox.ItemHeight)) { if (!DiffFilesTooltip.GetToolTip(listBox).Equals(gitItemStatus.ToString())) { DiffFilesTooltip.SetToolTip(listBox, gitItemStatus.ToString()); } } else { DiffFilesTooltip.RemoveAll(); } } else { DiffFilesTooltip.RemoveAll(); } } }
public static Task ViewChanges(this FileViewer diffViewer, string firstRevision, string secondRevision, GitItemStatus file, string defaultText) { if (firstRevision == null) { // The previous commit does not exist, nothing to compare with if (file.TreeGuid.IsNullOrEmpty()) { if (secondRevision.IsNullOrWhiteSpace()) { throw new ArgumentException(nameof(secondRevision)); } return(diffViewer.ViewGitItemRevision(file.Name, secondRevision)); } else { return(diffViewer.ViewGitItem(file.Name, file.TreeGuid)); } } else { return(diffViewer.ViewPatch(() => { string selectedPatch = diffViewer.GetSelectedPatch(firstRevision, secondRevision, file); return selectedPatch ?? defaultText; })); } }
public static void ViewChanges(this FileViewer diffViewer, IList <GitRevision> revisions, GitItemStatus file, string defaultText) { string revision = revisions.Count > 0 ? revisions[0].Guid : null; string parentRevision = revisions.Count == 2 ? revisions[1].Guid : null; if (parentRevision == null && revisions[0].ParentGuids != null && revisions[0].ParentGuids.Length > 0) { parentRevision = revisions[0].ParentGuids[0]; } ViewChanges(diffViewer, revision, parentRevision, file, defaultText); }
public static Task ViewChanges(this FileViewer diffViewer, IList <GitRevision> revisions, GitItemStatus file, string defaultText) { if (revisions.Count == 0) { return(Task.CompletedTask); } var selectedRevision = revisions[0]; string secondRevision = selectedRevision?.Guid; string firstRevision = revisions.Count >= 2 ? revisions[1].Guid : null; if (firstRevision == null && selectedRevision != null) { firstRevision = selectedRevision.FirstParentGuid; } return(ViewChanges(diffViewer, firstRevision, secondRevision, file, defaultText)); }
public FileStatusItem([CanBeNull] GitRevision firstRev, [NotNull] GitRevision secondRev, [NotNull] GitItemStatus item, [CanBeNull] ObjectId baseA = null, [CanBeNull] ObjectId baseB = null) { FirstRevision = firstRev; SecondRevision = secondRev ?? throw new ArgumentNullException(nameof(secondRev)); Item = item ?? throw new ArgumentNullException(nameof(item)); BaseA = baseA; BaseB = baseB; }
public static string GetSelectedPatch(this FileViewer diffViewer, string firstRevision, string secondRevision, GitItemStatus file) { if (firstRevision == null) { return(null); } //to simplify if-ology if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UnstagedGuid) { string temp = firstRevision; firstRevision = secondRevision; secondRevision = temp; } if (IsItemUntracked(file, firstRevision, secondRevision)) { var fullPath = Path.Combine(diffViewer.Module.WorkingDir, file.Name); if (Directory.Exists(fullPath) && GitModule.IsValidGitWorkingDir(fullPath)) { return(LocalizationHelpers.GetSubmoduleText(diffViewer.Module, file.Name.TrimEnd('/'), "")); } return(FileReader.ReadFileContent(fullPath, diffViewer.Encoding)); } if (file.IsSubmodule && file.SubmoduleStatus != null) { return(LocalizationHelpers.ProcessSubmoduleStatus(diffViewer.Module, file.SubmoduleStatus.Result)); } PatchApply.Patch patch = GetItemPatch(diffViewer.Module, file, firstRevision, secondRevision, diffViewer.GetExtraDiffArguments(), diffViewer.Encoding); if (patch == null) { return(string.Empty); } if (file.IsSubmodule) { return(LocalizationHelpers.ProcessSubmodulePatch(diffViewer.Module, file.Name, patch)); } return(patch.Text); }
private static async Task <string?> GetChangedFileTextAsync(GitModule module, GitItemStatus file) { var changes = await module.GetCurrentChangesAsync(file.Name, file.OldName, file.Staged == StagedStatus.Index, "-U1000000") .ConfigureAwait(false); if (changes is not null) { return(changes.Text); } var content = await module.GetFileContentsAsync(file).ConfigureAwaitRunInline(); if (content is not null) { return(content); } // Try to read the contents of the file: if it cannot be read, skip the operation silently. try { using var reader = File.OpenText(Path.Combine(module.WorkingDir, file.Name)); return(await reader.ReadToEndAsync()); } catch { return(""); } }
public static void ViewChanges(this FileViewer diffViewer, string revision, string parentRevision, GitItemStatus file, string defaultText) { if (parentRevision == null) { if (file.TreeGuid.IsNullOrEmpty()) { diffViewer.ViewGitItemRevision(file.Name, revision); } else if (!file.IsSubmodule) { diffViewer.ViewGitItem(file.Name, file.TreeGuid); } else { diffViewer.ViewText(file.Name, LocalizationHelpers.GetSubmoduleText(diffViewer.Module, file.Name, file.TreeGuid)); } } else { diffViewer.ViewPatch(() => { string selectedPatch = diffViewer.GetSelectedPatch(revision, parentRevision, file); return(selectedPatch ?? defaultText); }); } }
public void ItemSelections() { var accessor = _fileStatusList.GetTestAccessor(); var itemNotInList = new GitItemStatus { Name = "not in list" }; var item0 = new GitItemStatus { Name = "z.0" }; var item1 = new GitItemStatus { Name = "x.1" }; var item2 = new GitItemStatus { Name = "y.2" }; var items = new List <GitItemStatus> { item0, item1, item2 }; // alphabetical order var itemAt0 = item1; var itemAt1 = item2; var itemAt2 = item0; _fileStatusList.SetDiffs(items: items); accessor.FileStatusListView.FocusedItem.Index.Should().Be(0); _fileStatusList.SelectedIndex.Should().Be(0); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt0 }); // SelectedIndex _fileStatusList.SelectedIndex = 1; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1 }); _fileStatusList.SelectedIndex = -1; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedIndex = 2; _fileStatusList.SelectedIndex = 42; // clears the selection accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedIndex = 1; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1 }); // SelectedItem _fileStatusList.SelectedItem = itemAt1; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1 }); _fileStatusList.SelectedItem = null; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedItem = itemAt2; _fileStatusList.SelectedItem = itemNotInList; // clears the selection accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedItem = itemAt1; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1 }); // SelectedItems (up to one item) _fileStatusList.SelectedItems = new List <GitItemStatus> { itemAt1 }; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1 }); _fileStatusList.SelectedItems = null; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedItems = new List <GitItemStatus> { }; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedItems = new List <GitItemStatus> { itemAt2 }; _fileStatusList.SelectedItems = new List <GitItemStatus> { itemNotInList }; // clears the selection accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged _fileStatusList.SelectedIndex.Should().Be(-1); _fileStatusList.SelectedItem.Should().BeNull(); _fileStatusList.SelectedItems.Should().BeEmpty(); _fileStatusList.SelectedItems = new List <GitItemStatus> { itemAt1 }; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1 }); // SelectedItems (multiple items) _fileStatusList.SelectedIndex = 2; _fileStatusList.SelectedItems = new List <GitItemStatus> { itemAt2, itemAt0, itemNotInList }; accessor.FileStatusListView.FocusedItem.Index.Should().Be(0); _fileStatusList.SelectedIndex.Should().Be(0); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); // focused item _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt0, itemAt2 }); accessor.FileStatusListView.Items[1].Focused = true; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(0); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt2); // LastSelectedItem _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt0, itemAt2 }); _fileStatusList.SelectedIndex = 2; _fileStatusList.SelectedItems = new List <GitItemStatus> { itemAt2, itemAt1, itemNotInList }; accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); // focused item _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1, itemAt2 }); accessor.FileStatusListView.Items[0].Focused = true; accessor.FileStatusListView.FocusedItem.Index.Should().Be(0); _fileStatusList.SelectedIndex.Should().Be(1); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt2); // LastSelectedItem _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt1, itemAt2 }); // SelectAll _fileStatusList.SelectedIndex = 2; _fileStatusList.SelectAll(); foreach (var item in accessor.FileStatusListView.Items()) { item.Selected.Should().BeTrue(); } accessor.FileStatusListView.FocusedItem.Index.Should().Be(0); _fileStatusList.SelectedIndex.Should().Be(0); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); // focused item _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt0, itemAt1, itemAt2 }); // SelectFirstVisibleItem _fileStatusList.SelectedIndex = 2; _fileStatusList.SelectFirstVisibleItem(); accessor.FileStatusListView.FocusedItem.Index.Should().Be(0); _fileStatusList.SelectedIndex.Should().Be(0); _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); // focused item _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> { itemAt0 }); }
public GitItemStatusWithParent(GitRevision parent, GitItemStatus item) { ParentRevision = parent; Item = item; }
public static string GetSelectedPatch(this FileViewer diffViewer, RevisionGrid grid, GitItemStatus file) { IList <GitRevision> revisions = grid.GetSelectedRevisions(); if (revisions.Count == 0) { return(null); } string firstRevision = revisions[0].Guid; var secondRevision = revisions.Count == 2 ? revisions[1].Guid : null; //to simplify if-ology if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UnstagedGuid) { firstRevision = secondRevision; secondRevision = revisions[0].Guid; } string extraDiffArgs = null; if (firstRevision == GitRevision.UnstagedGuid) //working dir changes { if (secondRevision == null || secondRevision == GitRevision.IndexGuid) { if (file.IsTracked) { return(ProcessDiffText(grid.Module, grid.Module.GetCurrentChanges(file.Name, file.OldName, false, diffViewer.GetExtraDiffArguments(), diffViewer.Encoding), file.IsSubmodule)); } var fullPath = Path.Combine(grid.Module.WorkingDir, file.Name); if (Directory.Exists(fullPath) && GitModule.ValidWorkingDir(fullPath)) { return(GitCommandHelpers.GetSubmoduleText(grid.Module, file.Name.TrimEnd('/'), "")); } return(FileReader.ReadFileContent(fullPath, diffViewer.Encoding)); } else { firstRevision = secondRevision; secondRevision = string.Empty; } } if (firstRevision == GitRevision.IndexGuid) //index { if (secondRevision == null) { return(ProcessDiffText(grid.Module, grid.Module.GetCurrentChanges(file.Name, file.OldName, true, diffViewer.GetExtraDiffArguments(), diffViewer.Encoding), file.IsSubmodule)); } //rev1 vs index firstRevision = secondRevision; secondRevision = string.Empty; extraDiffArgs = string.Join(" ", extraDiffArgs, "--cached"); } Debug.Assert(!GitRevision.IsArtificial(firstRevision), string.Join(" ", firstRevision, secondRevision)); if (secondRevision == null) { secondRevision = firstRevision + "^"; } PatchApply.Patch patch = grid.Module.GetSingleDiff(firstRevision, secondRevision, file.Name, file.OldName, string.Join(" ", diffViewer.GetExtraDiffArguments(), extraDiffArgs), diffViewer.Encoding); if (patch == null) { return(string.Empty); } return(ProcessDiffText(grid.Module, patch.Text, file.IsSubmodule)); }
public void TestUnsetStagedStatus() { var item = new GitItemStatus(); Assert.AreEqual(item.Staged, StagedStatus.Unset); }
public static string GetFullPathFromGitItemStatus(GitModule gitModule, GitItemStatus gitItemStatus) { return(GetFullPathFromFilename(gitModule, gitItemStatus.Name)); }
public void ViewCurrentChanges(GitItemStatus item, bool isStaged) { ViewCurrentChanges(item.Name, item.OldName, isStaged, item.IsSubmodule, item.SubmoduleStatus); }
public static string GetSelectedPatch(this FileViewer diffViewer, RevisionGrid grid, GitItemStatus file) { IList <GitRevision> revisions = grid.GetSelectedRevisions(); return(GetSelectedPatch(diffViewer, revisions, file)); }