aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-10-14 18:09:12 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-10-15 09:08:36 +0000
commit80c2f74093e9dad96ec26cec4ef7869762cbbb36 (patch)
tree7a3141250840ca4e7e22ca7f1023364f0032b21f /pkg
parent42d3a37026616a8cb3a9da11ab8e5565ca6b6074 (diff)
pkg/vcs: expose commit patch
Add Commit.Patch with patch body.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/vcs/git.go18
-rw-r--r--pkg/vcs/git_test.go17
-rw-r--r--pkg/vcs/vcs.go1
3 files changed, 34 insertions, 2 deletions
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