private unsafe int HunkCallback(git_diff_delta *delta, GitDiffHunk hunk, IntPtr payload) { string decodedContent = LaxUtf8Marshaler.FromBuffer(hunk.Header, (int)hunk.HeaderLen); AppendToPatch(decodedContent); return(0); }
private unsafe int LineCallback(git_diff_delta *delta, GitDiffHunk hunk, GitDiffLine line, IntPtr payload) { string decodedContent = LaxUtf8Marshaler.FromNative(line.content, (int)line.contentLen); string prefix; switch (line.lineOrigin) { case GitDiffLineOrigin.GIT_DIFF_LINE_ADDITION: LinesAdded++; prefix = Encoding.ASCII.GetString(new[] { (byte)line.lineOrigin }); break; case GitDiffLineOrigin.GIT_DIFF_LINE_DELETION: LinesDeleted++; prefix = Encoding.ASCII.GetString(new[] { (byte)line.lineOrigin }); break; case GitDiffLineOrigin.GIT_DIFF_LINE_CONTEXT: prefix = Encoding.ASCII.GetString(new[] { (byte)line.lineOrigin }); break; default: prefix = string.Empty; break; } AppendToPatch(prefix); AppendToPatch(decodedContent); return(0); }
private unsafe int FileCallback(git_diff_delta *delta, float progress, IntPtr payload) { IsBinaryComparison = delta->flags.HasFlag(GitDiffFlags.GIT_DIFF_FLAG_BINARY); if (!IsBinaryComparison) { return(0); } AppendToPatch("Binary content differ\n"); return(0); }
internal unsafe TreeEntryChanges(git_diff_delta *delta) { Path = LaxFilePathMarshaler.FromNative(delta->new_file.Path).Native; OldPath = LaxFilePathMarshaler.FromNative(delta->old_file.Path).Native; Mode = (Mode)delta->new_file.Mode; OldMode = (Mode)delta->old_file.Mode; Oid = ObjectId.BuildFromPtr(&delta->new_file.Id); OldOid = ObjectId.BuildFromPtr(&delta->old_file.Id); Exists = (delta->new_file.Flags & GitDiffFlags.GIT_DIFF_FLAG_EXISTS) != 0; OldExists = (delta->old_file.Flags & GitDiffFlags.GIT_DIFF_FLAG_EXISTS) != 0; Status = GetStatusFromChangeKind(delta->status); }
private unsafe void AddStatusEntryForDelta(FileStatus gitStatus, git_diff_delta *deltaHeadToIndex, git_diff_delta *deltaIndexToWorkDir) { RenameDetails headToIndexRenameDetails = null; RenameDetails indexToWorkDirRenameDetails = null; if ((gitStatus & FileStatus.RenamedInIndex) == FileStatus.RenamedInIndex) { headToIndexRenameDetails = new RenameDetails(LaxUtf8Marshaler.FromNative(deltaHeadToIndex->old_file.Path), LaxUtf8Marshaler.FromNative(deltaHeadToIndex->new_file.Path), (int)deltaHeadToIndex->similarity); } if ((gitStatus & FileStatus.RenamedInWorkdir) == FileStatus.RenamedInWorkdir) { indexToWorkDirRenameDetails = new RenameDetails(LaxUtf8Marshaler.FromNative(deltaIndexToWorkDir->old_file.Path), LaxUtf8Marshaler.FromNative(deltaIndexToWorkDir->new_file.Path), (int)deltaIndexToWorkDir->similarity); } var filePath = LaxUtf8Marshaler.FromNative(deltaIndexToWorkDir != null ? deltaIndexToWorkDir->new_file.Path : deltaHeadToIndex->new_file.Path); StatusEntry statusEntry = new StatusEntry(filePath, gitStatus, headToIndexRenameDetails, indexToWorkDirRenameDetails); if (gitStatus == FileStatus.Unaltered) { unaltered.Add(statusEntry); } else { foreach (KeyValuePair <FileStatus, Action <RepositoryStatus, StatusEntry> > kvp in dispatcher) { if (!gitStatus.HasFlag(kvp.Key)) { continue; } kvp.Value(this, statusEntry); } } statusEntries.Add(statusEntry); }
private unsafe int PrintCallBack(git_diff_delta *delta, GitDiffHunk hunk, GitDiffLine line, IntPtr payload) { string patchPart = LaxUtf8Marshaler.FromNative(line.content, (int)line.contentLen); // Deleted files mean no "new file" path var pathPtr = delta->new_file.Path != null ? delta->new_file.Path : delta->old_file.Path; var filePath = LaxFilePathMarshaler.FromNative(pathPtr); PatchEntryChanges currentChange = this[filePath]; string prefix = string.Empty; switch (line.lineOrigin) { case GitDiffLineOrigin.GIT_DIFF_LINE_CONTEXT: prefix = " "; break; case GitDiffLineOrigin.GIT_DIFF_LINE_ADDITION: linesAdded++; currentChange.LinesAdded++; currentChange.AddedLines.Add(new Line(line.NewLineNo, patchPart)); prefix = "+"; break; case GitDiffLineOrigin.GIT_DIFF_LINE_DELETION: linesDeleted++; currentChange.LinesDeleted++; currentChange.DeletedLines.Add(new Line(line.OldLineNo, patchPart)); prefix = "-"; break; } string formattedOutput = string.Concat(prefix, patchPart); fullPatchBuilder.Append(formattedOutput); currentChange.AppendToPatch(formattedOutput); return(0); }
private unsafe void AddFileChange(git_diff_delta *delta) { var treeEntryChanges = new TreeEntryChanges(delta); changes.Add(treeEntryChanges.Path, new PatchEntryChanges(delta->flags.HasFlag(GitDiffFlags.GIT_DIFF_FLAG_BINARY), treeEntryChanges)); }