Пример #1
0
        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));
        }
Пример #2
0
        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);
        }
Пример #3
0
 public GitItemStatusWithParent(GitItemStatus anItem, string aParentGuid)
 {
     Item       = anItem;
     ParentGuid = aParentGuid;
 }
Пример #4
0
        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);
            }
        }
Пример #6
0
        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);
        }
Пример #7
0
        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));
        }
Пример #8
0
 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));
 }
Пример #9
0
 private static string?GetPrimarySortingPath(GitItemStatus itemStatus)
 {
     return(!string.IsNullOrEmpty(itemStatus.Name)
         ? itemStatus.Name
         : itemStatus.OldName);
 }
Пример #10
0
 public void ViewCurrentChanges(GitItemStatus item)
 {
     ViewCurrentChanges(item.Name, item.OldName, item.IsStaged, item.IsSubmodule);
 }
Пример #11
0
        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 */));
        }
Пример #12
0
        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("", ""));
                }
            }
        }
Пример #13
0
 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);
     });
 }
Пример #14
0
 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);
         });
     }
 }
Пример #15
0
        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;
            }
        }
Пример #16
0
        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();
                }
            }
        }
Пример #17
0
        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;
                }));
            }
        }
Пример #18
0
        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);
        }
Пример #19
0
        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));
        }
Пример #20
0
 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;
 }
Пример #21
0
        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);
        }
Пример #22
0
        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("");
            }
        }
Пример #23
0
 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
            });
        }
Пример #25
0
 public GitItemStatusWithParent(GitRevision parent, GitItemStatus item)
 {
     ParentRevision = parent;
     Item           = item;
 }
Пример #26
0
        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);
        }
Пример #28
0
 public static string GetFullPathFromGitItemStatus(GitModule gitModule, GitItemStatus gitItemStatus)
 {
     return(GetFullPathFromFilename(gitModule, gitItemStatus.Name));
 }
Пример #29
0
 public void ViewCurrentChanges(GitItemStatus item, bool isStaged)
 {
     ViewCurrentChanges(item.Name, item.OldName, isStaged, item.IsSubmodule, item.SubmoduleStatus);
 }
Пример #30
0
        public static string GetSelectedPatch(this FileViewer diffViewer, RevisionGrid grid, GitItemStatus file)
        {
            IList <GitRevision> revisions = grid.GetSelectedRevisions();

            return(GetSelectedPatch(diffViewer, revisions, file));
        }