示例#1
0
        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);
        }
示例#2
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);
        }
示例#3
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);
        }
示例#5
0
        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);
        }
示例#6
0
文件: Patch.cs 项目: Xornent/simula
        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);
        }
示例#7
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));
        }