public IEnumerable<HunkRangeInfo> GetGitDiffFor(ITextDocument textDocument, ITextSnapshot snapshot) { string fileName = textDocument.FilePath; GitFileStatusTracker tracker = new GitFileStatusTracker(Path.GetDirectoryName(fileName)); if (!tracker.HasGitRepository || tracker.Repository.Resolve(Constants.HEAD) == null) yield break; GitFileStatus status = tracker.GetFileStatus(fileName); if (status == GitFileStatus.New || status == GitFileStatus.Added) yield break; HistogramDiff diff = new HistogramDiff(); diff.SetFallbackAlgorithm(null); string currentText = snapshot.GetText(); byte[] preamble = textDocument.Encoding.GetPreamble(); byte[] content = textDocument.Encoding.GetBytes(currentText); if (preamble.Length > 0) { byte[] completeContent = new byte[preamble.Length + content.Length]; Buffer.BlockCopy(preamble, 0, completeContent, 0, preamble.Length); Buffer.BlockCopy(content, 0, completeContent, preamble.Length, content.Length); content = completeContent; } byte[] previousContent = GetPreviousRevision(tracker, fileName); RawText b = new RawText(content); RawText a = new RawText(previousContent); EditList edits = diff.Diff(RawTextComparator.DEFAULT, a, b); foreach (Edit edit in edits) yield return new HunkRangeInfo(snapshot, edit, a, b); }
private void ShowSelectedFile() { var fileName = GetSelectedFileName(); this.ClearEditor(); if (fileName == null) { diffLines = new string[0]; return; } try { string tmpFileName = ""; var status = tracker.GetFileStatus(fileName); if (status == GitFileStatus.NotControlled || status == GitFileStatus.New) { tmpFileName = Path.Combine(tracker.WorkingDirectory, fileName); } else { var diffAgainstIndex = this.activeListView == this.listStaged; tmpFileName = tracker.DiffFileAdv(fileName, diffAgainstIndex); } if (!string.IsNullOrWhiteSpace(tmpFileName) && File.Exists(tmpFileName)) { if (tracker.IsBinaryFile(tmpFileName)) { this.DiffEditor.Text = $"File \"{fileName}\" is binary that cannot be displayed."; } else if (new FileInfo(tmpFileName).Length > 2 * 1024 * 1024) { this.DiffEditor.Text = "File is too big to display: " + fileName; } else { diffLines = File.ReadAllLines(tmpFileName); this.ShowFile(tmpFileName); } } } catch (Exception ex) { string message = ex.Message; ShowStatusMessage(message); } }
public void FileNameCaseTest() { GitFileStatusTracker.Init(tempFolder); File.WriteAllLines(tempFile, lines); GitFileStatusTracker tracker = new GitFileStatusTracker(tempFolder); tracker.StageFile(tempFile); tracker.Commit("test message"); Assert.IsTrue(tracker.LastCommitMessage.StartsWith("test message")); tempFile = tempFile.Replace("test", "TEST"); File.WriteAllText(tempFile, "changed text"); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Modified, tracker.GetFileStatus(tempFile)); }
private void menuUndo_Click(object sender, RoutedEventArgs e) { GetSelectedFileFullName(fileName => { GitFileStatus status = tracker.GetFileStatus(fileName); if (status == GitFileStatus.Modified || status == GitFileStatus.Staged || status == GitFileStatus.Deleted || status == GitFileStatus.Removed) { if (MessageBox.Show("Are you sure you want to undo changes for " + Path.GetFileName(fileName) + " and restore a version from the last commit? ", "Undo Changes", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { tracker.CheckOutFile(fileName); } } }, false); // file must exists check flag is false }
public IEnumerable <HunkRangeInfo> GetGitDiffFor(ITextDocument textDocument, ITextSnapshot snapshot) { string fileName = textDocument.FilePath; GitFileStatusTracker tracker = new GitFileStatusTracker(Path.GetDirectoryName(fileName)); if (!tracker.IsGit) { yield break; } GitFileStatus status = tracker.GetFileStatus(fileName); if (status == GitFileStatus.New || status == GitFileStatus.Added) { yield break; } HistogramDiff diff = new HistogramDiff(); diff.SetFallbackAlgorithm(null); string currentText = snapshot.GetText(); byte[] preamble = textDocument.Encoding.GetPreamble(); byte[] content = textDocument.Encoding.GetBytes(currentText); if (preamble.Length > 0) { byte[] completeContent = new byte[preamble.Length + content.Length]; Buffer.BlockCopy(preamble, 0, completeContent, 0, preamble.Length); Buffer.BlockCopy(content, 0, completeContent, preamble.Length, content.Length); content = completeContent; } byte[] previousContent = null; //GetPreviousRevision(tracker, fileName); RawText b = new RawText(content); RawText a = new RawText(previousContent ?? new byte[0]); EditList edits = diff.Diff(RawTextComparator.DEFAULT, a, b); foreach (Edit edit in edits) { yield return(new HunkRangeInfo(snapshot, edit, a, b)); } }
public void GetFileStatusTest() { GitFileStatusTracker.Init(tempFolder); GitFileStatusTracker tracker = new GitFileStatusTracker(tempFolder); File.WriteAllLines(tempFile, lines); Assert.AreEqual(GitFileStatus.New, tracker.GetFileStatus(tempFile)); tracker.StageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Added, tracker.GetFileStatus(tempFile)); tracker.UnStageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.New, tracker.GetFileStatus(tempFile)); tracker.StageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Added, tracker.GetFileStatus(tempFile)); tracker.Commit("中文 1čtestč"); Assert.AreEqual(GitFileStatus.Tracked, tracker.GetFileStatus(tempFile)); File.WriteAllText(tempFile, "changed text"); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Modified, tracker.GetFileStatus(tempFile)); tracker.StageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Staged, tracker.GetFileStatus(tempFile)); tracker.UnStageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Modified, tracker.GetFileStatus(tempFile)); File.Delete(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Deleted, tracker.GetFileStatus(tempFile)); tracker.StageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Removed, tracker.GetFileStatus(tempFile)); tracker.UnStageFile(tempFile); tracker.Refresh(); Assert.AreEqual(GitFileStatus.Deleted, tracker.GetFileStatus(tempFile)); }