From 80c2f74093e9dad96ec26cec4ef7869762cbbb36 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 14 Oct 2024 18:09:12 +0200 Subject: pkg/vcs: expose commit patch Add Commit.Patch with patch body. --- pkg/vcs/git.go | 18 ++++++++++++++++-- pkg/vcs/git_test.go | 17 +++++++++++++++++ pkg/vcs/vcs.go | 1 + 3 files changed, 34 insertions(+), 2 deletions(-) (limited to 'pkg') diff --git a/pkg/vcs/git.go b/pkg/vcs/git.go index dd1681157..7425066d2 100644 --- a/pkg/vcs/git.go +++ b/pkg/vcs/git.go @@ -242,11 +242,25 @@ func (git *git) Contains(commit string) (bool, error) { } func (git *git) Commit(com string) (*Commit, error) { - output, err := git.git("log", "--format=%H%n%s%n%ae%n%an%n%ad%n%P%n%cd%n%b", "-n", "1", com) + const patchSeparator = "---===syzkaller-patch-separator===---" + output, err := git.git("log", "--format=%H%n%s%n%ae%n%an%n%ad%n%P%n%cd%n%b"+patchSeparator, + "-n", "1", "-p", "-U0", com) if err != nil { return nil, err } - return gitParseCommit(output, nil, nil, git.ignoreCC) + pos := bytes.Index(output, []byte(patchSeparator)) + if pos == -1 { + return nil, fmt.Errorf("git log output does not contain patch separator") + } + commit, err := gitParseCommit(output[:pos], nil, nil, git.ignoreCC) + if err != nil { + return nil, err + } + commit.Patch = output[pos+len(patchSeparator):] + for len(commit.Patch) != 0 && commit.Patch[0] == '\n' { + commit.Patch = commit.Patch[1:] + } + return commit, nil } func gitParseCommit(output, user, domain []byte, ignoreCC map[string]bool) (*Commit, error) { diff --git a/pkg/vcs/git_test.go b/pkg/vcs/git_test.go index 8ff4dbb6e..a46408417 100644 --- a/pkg/vcs/git_test.go +++ b/pkg/vcs/git_test.go @@ -316,6 +316,23 @@ func TestObject(t *testing.T) { if diff := cmp.Diff(data, secondRev); diff != "" { t.Fatal(diff) } + com, err := repo.repo.Commit(commits[0]) + if err != nil { + t.Fatal(err.Error()) + } + patch := []byte(`diff --git a/object.txt b/object.txt +index 103167d..fbf7a68 100644 +--- a/object.txt ++++ b/object.txt +@@ -1 +1 @@ +-First revision +\ No newline at end of file ++Second revision +\ No newline at end of file +`) + if diff := cmp.Diff(com.Patch, patch); diff != "" { + t.Fatal(diff) + } } func TestMergeBase(t *testing.T) { diff --git a/pkg/vcs/vcs.go b/pkg/vcs/vcs.go index 369765b0e..17f54d653 100644 --- a/pkg/vcs/vcs.go +++ b/pkg/vcs/vcs.go @@ -117,6 +117,7 @@ type Commit struct { Parents []string Date time.Time CommitDate time.Time + Patch []byte } type RecipientType int -- cgit mrf-deployment