summaryrefslogtreecommitdiff
path: root/pkg/gitdiff/testdata
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gitdiff/testdata')
-rw-r--r--pkg/gitdiff/testdata/apply/bin.go124
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_error.srcbin0 -> 130 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_error_dst_size.patch5
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_add.patch5
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_copy.patch5
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_error_src_size.patch5
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.outbin0 -> 1084 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.patch13
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.srcbin0 -> 1024 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.outbin0 -> 131072 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.patch166
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.srcbin0 -> 131072 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_literal_create.outbin0 -> 32 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_literal_create.patch8
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_literal_create.src0
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.outbin0 -> 32 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.patch8
-rw-r--r--pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.srcbin0 -> 32 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/file_bin_modify.outbin0 -> 1084 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/file_bin_modify.patch13
-rw-r--r--pkg/gitdiff/testdata/apply/file_bin_modify.srcbin0 -> 1024 bytes
-rw-r--r--pkg/gitdiff/testdata/apply/file_mode_change.out2
-rw-r--r--pkg/gitdiff/testdata/apply/file_mode_change.patch3
-rw-r--r--pkg/gitdiff/testdata/apply/file_mode_change.src2
-rw-r--r--pkg/gitdiff/testdata/apply/file_text.src200
-rw-r--r--pkg/gitdiff/testdata/apply/file_text_delete.out0
-rw-r--r--pkg/gitdiff/testdata/apply/file_text_delete.patch206
-rw-r--r--pkg/gitdiff/testdata/apply/file_text_error_partial_delete.patch106
-rw-r--r--pkg/gitdiff/testdata/apply/file_text_modify.out195
-rw-r--r--pkg/gitdiff/testdata/apply/file_text_modify.patch62
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_end.out5
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_end.patch9
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_end.src3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.out5
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.patch11
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.src3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_middle.out5
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_middle.patch9
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_middle.src3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_start.out4
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_start.patch8
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_add_start.src3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_end.out10
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_end.patch9
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_end.src10
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.out3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.patch10
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.src3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_exact.out19
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_exact.patch12
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_exact.src30
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_middle.out9
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_middle.patch12
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_middle.src10
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.out1
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.patch8
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.src1
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_start.out4
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_start.patch9
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_change_start.src10
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_delete_all.out0
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_delete_all.patch8
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_delete_all.src4
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_error.src13
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_error_context_conflict.patch12
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_error_delete_conflict.patch12
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_error_new_file.patch7
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_error_short_src.patch12
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_error_short_src_before.patch12
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_new.out3
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_new.patch7
-rw-r--r--pkg/gitdiff/testdata/apply/text_fragment_new.src0
-rw-r--r--pkg/gitdiff/testdata/new_binary_file.patch16
-rw-r--r--pkg/gitdiff/testdata/no_files.patch8
-rw-r--r--pkg/gitdiff/testdata/one_file.patch28
-rw-r--r--pkg/gitdiff/testdata/string/binary_modify.patch9
-rw-r--r--pkg/gitdiff/testdata/string/binary_modify_nodata.patch3
-rw-r--r--pkg/gitdiff/testdata/string/binary_new.patch11
-rw-r--r--pkg/gitdiff/testdata/string/copy.patch4
-rw-r--r--pkg/gitdiff/testdata/string/copy_modify.patch21
-rw-r--r--pkg/gitdiff/testdata/string/delete.patch16
-rw-r--r--pkg/gitdiff/testdata/string/mode.patch3
-rw-r--r--pkg/gitdiff/testdata/string/mode_modify.patch10
-rw-r--r--pkg/gitdiff/testdata/string/modify.patch16
-rw-r--r--pkg/gitdiff/testdata/string/new.patch16
-rw-r--r--pkg/gitdiff/testdata/string/new_empty.patch3
-rw-r--r--pkg/gitdiff/testdata/string/new_mode.patch16
-rw-r--r--pkg/gitdiff/testdata/string/rename.patch4
-rw-r--r--pkg/gitdiff/testdata/string/rename_modify.patch18
-rw-r--r--pkg/gitdiff/testdata/two_files.patch48
90 files changed, 1706 insertions, 0 deletions
diff --git a/pkg/gitdiff/testdata/apply/bin.go b/pkg/gitdiff/testdata/apply/bin.go
new file mode 100644
index 0000000..e34f06b
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin.go
@@ -0,0 +1,124 @@
+//go:build ignore
+
+// bin.go is a helper CLI to manipulate binary diff data for testing purposes.
+// It can decode patches generated by git using the standard parsing functions
+// or it can encode binary data back into the format expected by Git. It
+// operates on stdin writes results (possibly binary) to stdout.
+
+package main
+
+import (
+ "bytes"
+ "compress/zlib"
+ "encoding/binary"
+ "flag"
+ "io/ioutil"
+ "log"
+ "os"
+ "strings"
+
+ "github.com/bluekeyes/go-gitdiff/gitdiff"
+)
+
+var (
+ b85Powers = []uint32{52200625, 614125, 7225, 85, 1}
+ b85Alpha = []byte(
+ "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "!#$%&()*+-;<=>?@^_`{|}~",
+ )
+)
+
+var mode string
+
+func base85Encode(data []byte) []byte {
+ chunks, remaining := len(data)/4, len(data)%4
+ if remaining > 0 {
+ data = append(data, make([]byte, 4-remaining)...)
+ chunks++
+ }
+
+ var n int
+ out := make([]byte, 5*chunks)
+
+ for i := 0; i < len(data); i += 4 {
+ v := binary.BigEndian.Uint32(data[i : i+4])
+ for j := 0; j < 5; j++ {
+ p := v / b85Powers[j]
+ out[n+j] = b85Alpha[p]
+ v -= b85Powers[j] * p
+ }
+ n += 5
+ }
+
+ return out
+}
+
+func compress(data []byte) ([]byte, error) {
+ var b bytes.Buffer
+ w := zlib.NewWriter(&b)
+
+ if _, err := w.Write(data); err != nil {
+ return nil, err
+ }
+ if err := w.Close(); err != nil {
+ return nil, err
+ }
+
+ return b.Bytes(), nil
+}
+
+func wrap(data []byte) string {
+ var s strings.Builder
+ for i := 0; i < len(data); i += 52 {
+ c := 52
+ if c > len(data)-i {
+ c = len(data) - i
+ }
+ b := (c / 5) * 4
+
+ if b <= 26 {
+ s.WriteByte(byte('A' + b - 1))
+ } else {
+ s.WriteByte(byte('a' + b - 27))
+ }
+ s.Write(data[i : i+c])
+ s.WriteByte('\n')
+ }
+ return s.String()
+}
+
+func init() {
+ flag.StringVar(&mode, "mode", "parse", "operation mode, one of 'parse' or 'encode'")
+}
+
+func main() {
+ flag.Parse()
+
+ switch mode {
+ case "parse":
+ files, _, err := gitdiff.Parse(os.Stdin)
+ if err != nil {
+ log.Fatalf("failed to parse file: %v", err)
+ }
+ if len(files) != 1 {
+ log.Fatalf("patch contains more than one file: %d", len(files))
+ }
+ if files[0].BinaryFragment == nil {
+ log.Fatalf("patch file does not contain a binary fragment")
+ }
+ os.Stdout.Write(files[0].BinaryFragment.Data)
+
+ case "encode":
+ data, err := ioutil.ReadAll(os.Stdin)
+ if err != nil {
+ log.Fatalf("failed to read input: %v", err)
+ }
+ data, err = compress(data)
+ if err != nil {
+ log.Fatalf("failed to compress data: %v", err)
+ }
+ os.Stdout.WriteString(wrap(base85Encode(data)))
+
+ default:
+ log.Fatalf("unknown mode: %s", mode)
+ }
+}
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_error.src b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error.src
new file mode 100644
index 0000000..d4edf89
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error.src
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_dst_size.patch b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_dst_size.patch
new file mode 100644
index 0000000..6d5bb42
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_dst_size.patch
@@ -0,0 +1,5 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_delta_error.src b/gitdiff/testdata/apply/bin_fragment_delta_error.src
+GIT binary patch
+delta 18
+fc${itY+{<=z`_4AtEhVK$zKyatN;N30RR6$D+j^=
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_add.patch b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_add.patch
new file mode 100644
index 0000000..b8c1835
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_add.patch
@@ -0,0 +1,5 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_delta_error.src b/gitdiff/testdata/apply/bin_fragment_delta_error.src
+GIT binary patch
+delta 11
+Xc${itY+{_?z`_4As|XMP0RR6K8UwQc
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_copy.patch b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_copy.patch
new file mode 100644
index 0000000..8db8f84
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_incomplete_copy.patch
@@ -0,0 +1,5 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_delta_error.src b/gitdiff/testdata/apply/bin_fragment_delta_error.src
+GIT binary patch
+delta 17
+fc${itY+{_?z`_4AtEhVK$zKya00961|Nl5!2ZsOv
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_src_size.patch b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_src_size.patch
new file mode 100644
index 0000000..29cb26b
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_error_src_size.patch
@@ -0,0 +1,5 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_delta_error.src b/gitdiff/testdata/apply/bin_fragment_delta_error.src
+GIT binary patch
+delta 18
+fc${itYGRz=z`_4AtEhVK$zKyatN;N30RR6$EeFB?
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.out b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.out
new file mode 100644
index 0000000..f3386d1
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.out
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.patch b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.patch
new file mode 100644
index 0000000..1801ef2
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.patch
@@ -0,0 +1,13 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_delta_modify.src b/gitdiff/testdata/apply/bin_fragment_delta_modify.src
+GIT binary patch
+delta 172
+zcmV;d08{^f2)qc8AP{I3VQ>J`s>wb0HU+h#6w8q?tUO~cHmDjZi2<8yZ9XmKhhMdo
+zWu(4bg|8QwzZ|1e*rL4P#)`Fen<n~ik=E?$qG6?hzJ6$u{l5W#?uwHb0q6w)00000
+zlLZ3%0RfW%1N%UMJ{~Z~0@X${&1Kk#98tb3==a{J7A;`O`v&<T@514_mvMTz72b#n
+atf$#NLoPbNe?RPFJVt1aCFGoQbiKD!OHgJ2
+
+delta 112
+zcmV-$0FVE?2!IHXAP~DY<7&llQfwqYA%tL<sR@xVtUMD;+4ZG>XTQ5=J2y;^BfB}4
+zWkisH791|vOVl5e-@^VLX0s~Ky_UyN!3;CgPr>Edj0j+0gOSwSsFsr$0q6zUJph<q
+SlLZ3%0XmZb1N#I__7UCuR5Dxu
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.src b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.src
new file mode 100644
index 0000000..fb85478
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify.src
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.out b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.out
new file mode 100644
index 0000000..f0f7f14
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.out
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.patch b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.patch
new file mode 100644
index 0000000..093936b
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.patch
@@ -0,0 +1,166 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_delta_modify_large.src b/gitdiff/testdata/apply/bin_fragment_delta_modify_large.src
+GIT binary patch
+delta 4145
+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
+
+delta 4145
+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
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.src b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.src
new file mode 100644
index 0000000..90a9f6d
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_delta_modify_large.src
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.out b/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.out
new file mode 100644
index 0000000..c62cba2
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.out
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.patch b/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.patch
new file mode 100644
index 0000000..b3b846a
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.patch
@@ -0,0 +1,8 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_literal_create.src b/gitdiff/testdata/apply/bin_fragment_literal_create.src
+GIT binary patch
+literal 32
+ocmZQzU`lR_IpTEv<rOIzfy0`|3>L*`JUiBtu5<US@-j_*0M$he#sB~S
+
+literal 0
+HcmV?d00001
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.src b/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.src
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_literal_create.src
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.out b/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.out
new file mode 100644
index 0000000..0bf736e
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.out
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.patch b/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.patch
new file mode 100644
index 0000000..c3da024
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.patch
@@ -0,0 +1,8 @@
+diff --git a/gitdiff/testdata/apply/bin_fragment_literal_modify.src b/gitdiff/testdata/apply/bin_fragment_literal_modify.src
+GIT binary patch
+literal 32
+ocmZQzU`lR_IpTEv<rOIzfy0_p?@r&O@$6Vny3XCR%F8tM0pJ`CjQ{`u
+
+literal 32
+ocmZQzU`lR_IpTEv<rOIzfy0`|3>L*`JUiBtu5<US@-j_*0M$he#sB~S
+
diff --git a/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.src b/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.src
new file mode 100644
index 0000000..c62cba2
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/bin_fragment_literal_modify.src
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/file_bin_modify.out b/pkg/gitdiff/testdata/apply/file_bin_modify.out
new file mode 100644
index 0000000..f3386d1
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_bin_modify.out
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/file_bin_modify.patch b/pkg/gitdiff/testdata/apply/file_bin_modify.patch
new file mode 100644
index 0000000..af38f36
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_bin_modify.patch
@@ -0,0 +1,13 @@
+diff --git a/gitdiff/testdata/apply/file_bin_modify.src b/gitdiff/testdata/apply/file_bin_modify.src
+GIT binary patch
+delta 172
+zcmV;d08{^f2)qc8AP{I3VQ>J`s>wb0HU+h#6w8q?tUO~cHmDjZi2<8yZ9XmKhhMdo
+zWu(4bg|8QwzZ|1e*rL4P#)`Fen<n~ik=E?$qG6?hzJ6$u{l5W#?uwHb0q6w)00000
+zlLZ3%0RfW%1N%UMJ{~Z~0@X${&1Kk#98tb3==a{J7A;`O`v&<T@514_mvMTz72b#n
+atf$#NLoPbNe?RPFJVt1aCFGoQbiKD!OHgJ2
+
+delta 112
+zcmV-$0FVE?2!IHXAP~DY<7&llQfwqYA%tL<sR@xVtUMD;+4ZG>XTQ5=J2y;^BfB}4
+zWkisH791|vOVl5e-@^VLX0s~Ky_UyN!3;CgPr>Edj0j+0gOSwSsFsr$0q6zUJph<q
+SlLZ3%0XmZb1N#I__7UCuR5Dxu
+
diff --git a/pkg/gitdiff/testdata/apply/file_bin_modify.src b/pkg/gitdiff/testdata/apply/file_bin_modify.src
new file mode 100644
index 0000000..fb85478
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_bin_modify.src
Binary files differ
diff --git a/pkg/gitdiff/testdata/apply/file_mode_change.out b/pkg/gitdiff/testdata/apply/file_mode_change.out
new file mode 100644
index 0000000..ec3b7fd
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_mode_change.out
@@ -0,0 +1,2 @@
+#!/bin/bash
+echo "this file is executable"
diff --git a/pkg/gitdiff/testdata/apply/file_mode_change.patch b/pkg/gitdiff/testdata/apply/file_mode_change.patch
new file mode 100644
index 0000000..b1f6859
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_mode_change.patch
@@ -0,0 +1,3 @@
+diff --git a/gitdiff/testdata/apply/file_mode_change.src b/gitdiff/testdata/apply/file_mode_change.src
+old mode 100644
+new mode 100755
diff --git a/pkg/gitdiff/testdata/apply/file_mode_change.src b/pkg/gitdiff/testdata/apply/file_mode_change.src
new file mode 100644
index 0000000..ec3b7fd
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_mode_change.src
@@ -0,0 +1,2 @@
+#!/bin/bash
+echo "this file is executable"
diff --git a/pkg/gitdiff/testdata/apply/file_text.src b/pkg/gitdiff/testdata/apply/file_text.src
new file mode 100644
index 0000000..3805ad4
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_text.src
@@ -0,0 +1,200 @@
+this is line 1
+this is line 2
+this is line 3
+this is line 4
+this is line 5
+this is line 6
+this is line 7
+this is line 8
+this is line 9
+this is line 10
+this is line 11
+this is line 12
+this is line 13
+this is line 14
+this is line 15
+this is line 16
+this is line 17
+this is line 18
+this is line 19
+this is line 20
+this is line 21
+this is line 22
+this is line 23
+this is line 24
+this is line 25
+this is line 26
+this is line 27
+this is line 28
+this is line 29
+this is line 30
+this is line 31
+this is line 32
+this is line 33
+this is line 34
+this is line 35
+this is line 36
+this is line 37
+this is line 38
+this is line 39
+this is line 40
+this is line 41
+this is line 42
+this is line 43
+this is line 44
+this is line 45
+this is line 46
+this is line 47
+this is line 48
+this is line 49
+this is line 50
+this is line 51
+this is line 52
+this is line 53
+this is line 54
+this is line 55
+this is line 56
+this is line 57
+this is line 58
+this is line 59
+this is line 60
+this is line 61
+this is line 62
+this is line 63
+this is line 64
+this is line 65
+this is line 66
+this is line 67
+this is line 68
+this is line 69
+this is line 70
+this is line 71
+this is line 72
+this is line 73
+this is line 74
+this is line 75
+this is line 76
+this is line 77
+this is line 78
+this is line 79
+this is line 80
+this is line 81
+this is line 82
+this is line 83
+this is line 84
+this is line 85
+this is line 86
+this is line 87
+this is line 88
+this is line 89
+this is line 90
+this is line 91
+this is line 92
+this is line 93
+this is line 94
+this is line 95
+this is line 96
+this is line 97
+this is line 98
+this is line 99
+this is line 100
+this is line 101
+this is line 102
+this is line 103
+this is line 104
+this is line 105
+this is line 106
+this is line 107
+this is line 108
+this is line 109
+this is line 110
+this is line 111
+this is line 112
+this is line 113
+this is line 114
+this is line 115
+this is line 116
+this is line 117
+this is line 118
+this is line 119
+this is line 120
+this is line 121
+this is line 122
+this is line 123
+this is line 124
+this is line 125
+this is line 126
+this is line 127
+this is line 128
+this is line 129
+this is line 130
+this is line 131
+this is line 132
+this is line 133
+this is line 134
+this is line 135
+this is line 136
+this is line 137
+this is line 138
+this is line 139
+this is line 140
+this is line 141
+this is line 142
+this is line 143
+this is line 144
+this is line 145
+this is line 146
+this is line 147
+this is line 148
+this is line 149
+this is line 150
+this is line 151
+this is line 152
+this is line 153
+this is line 154
+this is line 155
+this is line 156
+this is line 157
+this is line 158
+this is line 159
+this is line 160
+this is line 161
+this is line 162
+this is line 163
+this is line 164
+this is line 165
+this is line 166
+this is line 167
+this is line 168
+this is line 169
+this is line 170
+this is line 171
+this is line 172
+this is line 173
+this is line 174
+this is line 175
+this is line 176
+this is line 177
+this is line 178
+this is line 179
+this is line 180
+this is line 181
+this is line 182
+this is line 183
+this is line 184
+this is line 185
+this is line 186
+this is line 187
+this is line 188
+this is line 189
+this is line 190
+this is line 191
+this is line 192
+this is line 193
+this is line 194
+this is line 195
+this is line 196
+this is line 197
+this is line 198
+this is line 199
+this is line 200
diff --git a/pkg/gitdiff/testdata/apply/file_text_delete.out b/pkg/gitdiff/testdata/apply/file_text_delete.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_text_delete.out
diff --git a/pkg/gitdiff/testdata/apply/file_text_delete.patch b/pkg/gitdiff/testdata/apply/file_text_delete.patch
new file mode 100644
index 0000000..9ac710b
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_text_delete.patch
@@ -0,0 +1,206 @@
+diff --git a/gitdiff/testdata/apply/file_text.src.src b/gitdiff/testdata/apply/file_text.src
+deleted file mode 100644
+index 3805ad4..0000000
+--- a/gitdiff/testdata/apply/file_text.src.src
++++ /dev/null
+@@ -1,200 +0,0 @@
+-this is line 1
+-this is line 2
+-this is line 3
+-this is line 4
+-this is line 5
+-this is line 6
+-this is line 7
+-this is line 8
+-this is line 9
+-this is line 10
+-this is line 11
+-this is line 12
+-this is line 13
+-this is line 14
+-this is line 15
+-this is line 16
+-this is line 17
+-this is line 18
+-this is line 19
+-this is line 20
+-this is line 21
+-this is line 22
+-this is line 23
+-this is line 24
+-this is line 25
+-this is line 26
+-this is line 27
+-this is line 28
+-this is line 29
+-this is line 30
+-this is line 31
+-this is line 32
+-this is line 33
+-this is line 34
+-this is line 35
+-this is line 36
+-this is line 37
+-this is line 38
+-this is line 39
+-this is line 40
+-this is line 41
+-this is line 42
+-this is line 43
+-this is line 44
+-this is line 45
+-this is line 46
+-this is line 47
+-this is line 48
+-this is line 49
+-this is line 50
+-this is line 51
+-this is line 52
+-this is line 53
+-this is line 54
+-this is line 55
+-this is line 56
+-this is line 57
+-this is line 58
+-this is line 59
+-this is line 60
+-this is line 61
+-this is line 62
+-this is line 63
+-this is line 64
+-this is line 65
+-this is line 66
+-this is line 67
+-this is line 68
+-this is line 69
+-this is line 70
+-this is line 71
+-this is line 72
+-this is line 73
+-this is line 74
+-this is line 75
+-this is line 76
+-this is line 77
+-this is line 78
+-this is line 79
+-this is line 80
+-this is line 81
+-this is line 82
+-this is line 83
+-this is line 84
+-this is line 85
+-this is line 86
+-this is line 87
+-this is line 88
+-this is line 89
+-this is line 90
+-this is line 91
+-this is line 92
+-this is line 93
+-this is line 94
+-this is line 95
+-this is line 96
+-this is line 97
+-this is line 98
+-this is line 99
+-this is line 100
+-this is line 101
+-this is line 102
+-this is line 103
+-this is line 104
+-this is line 105
+-this is line 106
+-this is line 107
+-this is line 108
+-this is line 109
+-this is line 110
+-this is line 111
+-this is line 112
+-this is line 113
+-this is line 114
+-this is line 115
+-this is line 116
+-this is line 117
+-this is line 118
+-this is line 119
+-this is line 120
+-this is line 121
+-this is line 122
+-this is line 123
+-this is line 124
+-this is line 125
+-this is line 126
+-this is line 127
+-this is line 128
+-this is line 129
+-this is line 130
+-this is line 131
+-this is line 132
+-this is line 133
+-this is line 134
+-this is line 135
+-this is line 136
+-this is line 137
+-this is line 138
+-this is line 139
+-this is line 140
+-this is line 141
+-this is line 142
+-this is line 143
+-this is line 144
+-this is line 145
+-this is line 146
+-this is line 147
+-this is line 148
+-this is line 149
+-this is line 150
+-this is line 151
+-this is line 152
+-this is line 153
+-this is line 154
+-this is line 155
+-this is line 156
+-this is line 157
+-this is line 158
+-this is line 159
+-this is line 160
+-this is line 161
+-this is line 162
+-this is line 163
+-this is line 164
+-this is line 165
+-this is line 166
+-this is line 167
+-this is line 168
+-this is line 169
+-this is line 170
+-this is line 171
+-this is line 172
+-this is line 173
+-this is line 174
+-this is line 175
+-this is line 176
+-this is line 177
+-this is line 178
+-this is line 179
+-this is line 180
+-this is line 181
+-this is line 182
+-this is line 183
+-this is line 184
+-this is line 185
+-this is line 186
+-this is line 187
+-this is line 188
+-this is line 189
+-this is line 190
+-this is line 191
+-this is line 192
+-this is line 193
+-this is line 194
+-this is line 195
+-this is line 196
+-this is line 197
+-this is line 198
+-this is line 199
+-this is line 200
diff --git a/pkg/gitdiff/testdata/apply/file_text_error_partial_delete.patch b/pkg/gitdiff/testdata/apply/file_text_error_partial_delete.patch
new file mode 100644
index 0000000..01d2a6f
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_text_error_partial_delete.patch
@@ -0,0 +1,106 @@
+diff --git a/gitdiff/testdata/apply/file_text.src.src b/gitdiff/testdata/apply/file_text.src
+deleted file mode 100644
+index 3805ad4..0000000
+--- a/gitdiff/testdata/apply/file_text.src.src
++++ /dev/null
+@@ -1,100 +0,0 @@
+-this is line 1
+-this is line 2
+-this is line 3
+-this is line 4
+-this is line 5
+-this is line 6
+-this is line 7
+-this is line 8
+-this is line 9
+-this is line 10
+-this is line 11
+-this is line 12
+-this is line 13
+-this is line 14
+-this is line 15
+-this is line 16
+-this is line 17
+-this is line 18
+-this is line 19
+-this is line 20
+-this is line 21
+-this is line 22
+-this is line 23
+-this is line 24
+-this is line 25
+-this is line 26
+-this is line 27
+-this is line 28
+-this is line 29
+-this is line 30
+-this is line 31
+-this is line 32
+-this is line 33
+-this is line 34
+-this is line 35
+-this is line 36
+-this is line 37
+-this is line 38
+-this is line 39
+-this is line 40
+-this is line 41
+-this is line 42
+-this is line 43
+-this is line 44
+-this is line 45
+-this is line 46
+-this is line 47
+-this is line 48
+-this is line 49
+-this is line 50
+-this is line 51
+-this is line 52
+-this is line 53
+-this is line 54
+-this is line 55
+-this is line 56
+-this is line 57
+-this is line 58
+-this is line 59
+-this is line 60
+-this is line 61
+-this is line 62
+-this is line 63
+-this is line 64
+-this is line 65
+-this is line 66
+-this is line 67
+-this is line 68
+-this is line 69
+-this is line 70
+-this is line 71
+-this is line 72
+-this is line 73
+-this is line 74
+-this is line 75
+-this is line 76
+-this is line 77
+-this is line 78
+-this is line 79
+-this is line 80
+-this is line 81
+-this is line 82
+-this is line 83
+-this is line 84
+-this is line 85
+-this is line 86
+-this is line 87
+-this is line 88
+-this is line 89
+-this is line 90
+-this is line 91
+-this is line 92
+-this is line 93
+-this is line 94
+-this is line 95
+-this is line 96
+-this is line 97
+-this is line 98
+-this is line 99
+-this is line 100
diff --git a/pkg/gitdiff/testdata/apply/file_text_modify.out b/pkg/gitdiff/testdata/apply/file_text_modify.out
new file mode 100644
index 0000000..dc20c07
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_text_modify.out
@@ -0,0 +1,195 @@
+the first line is different
+this is line 2
+this is line 3
+this is line 4
+this is line 5
+this is line 6
+this is line 7
+this is line 8
+this is line 9
+this is line 10
+this is line 11
+this is line 12
+this is line 13
+this is line 14
+this is line 15
+this is line 16
+this is line 17
+this is line 18
+this is line 19
+this line offsets all the line numbers!
+this is line 20
+this is line 21
+until here, now we're back on track!
+this is line 24
+this is line 25
+this is line 26
+this is line 27
+this is line 28
+this is line 29
+this is line 30
+this is line 31
+this is line 32
+this is line 33
+this is line 34
+this is line 35
+this is line 36
+this is line 37
+this is line 38
+this is line 39
+this is line 40
+this is line 41
+this is line 42
+this is line 43
+this is line 44
+this is line 45
+this is line 46
+this is line 47
+this is line 48
+this is line 49
+this is line 50
+this is line 51
+this is line 52
+this is line 53
+this is line 54
+this is line 55
+once upon a time, a line
+ in a text
+ file
+ changed
+this is line 60
+this is line 61
+this is line 62
+this is line 63
+this is line 64
+this is line 65
+this is line 66
+this is line 67
+this is line 68
+this is line 69
+this is line 70
+this is line 71
+this is line 72
+this is line 73
+this is line 74
+this is line 75
+this is line 76
+this is line 77
+this is line 78
+this is line 79
+this is line 80
+this is line 81
+this is line 82
+this is line 83
+this is line 84
+this is line 85
+this is line 86
+this is line 87
+this is line 88
+this is line 89
+this is line 90
+this is line 91
+this is line 92
+this is line 93
+this is line 94
+this is line 95
+this is line 96
+this is line 97
+this is line 98
+this is line 99
+this is line 100
+this is line 101
+this is line 102
+this is line 103
+this is line 104
+this is line 105
+this is line 106
+this is line 107
+this is line 108
+this is line 109
+this is line 110
+this is line 111
+this is line 112
+this is line 113
+this is line 114
+this is line 115
+this is line 116
+this is line 117
+this is line 118
+this is line 119
+this is line 120
+this is line 121
+this is line 122
+this is line 123
+this is line 124
+this is line 125
+this is line 126
+this is line 127
+this is line 128
+this is line 129
+this is line 130
+this is line 131
+this is line 132
+this line was bad and has been removed
+this line was REDACTED and has been REDACTED
+this is line 135
+this is line 136
+this is line 137
+this is line 138
+this is line 139
+this is line 140
+this is line 141
+this is line 142
+this is line 143
+this is line 144
+this is line 145
+this is line 146
+this is line 147
+this is line 148
+this is line 149
+this is line 150
+this is line 151
+this is line 152
+this is line 153
+this is line 154
+this is line 155
+this is line 156
+this is line 157
+this is line 158
+this is line 159
+this is line 160
+this is line 161
+this is line 162
+this is line 163
+the number on the remaining lines is 5 ahead of their actual position in the file
+this is line 170
+this is line 171
+this is line 172
+this is line 173
+this is line 174
+this is line 175
+this is line 176
+this is line 177
+this is line 178
+this is line 179
+this is line 180
+this is line 181
+this is line 182
+this is line 183
+this is line 184
+this is line 185
+this is line 186
+this is line 187
+this is line 188
+this is line 189
+this is line 190
+this is line 191
+this is line 192
+this is line 193
+this is line 194
+this is line 195
+this is line 196
+this is line 197
+this is line 198
+this is line 199
+this is line 200
diff --git a/pkg/gitdiff/testdata/apply/file_text_modify.patch b/pkg/gitdiff/testdata/apply/file_text_modify.patch
new file mode 100644
index 0000000..362d9a9
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/file_text_modify.patch
@@ -0,0 +1,62 @@
+diff --git a/gitdiff/testdata/apply/file_text.src b/gitdiff/testdata/apply/file_text.src
+--- a/gitdiff/testdata/apply/file_text.src
++++ b/gitdiff/testdata/apply/file_text.src
+@@ -1,4 +1,4 @@
+-this is line 1
++the first line is different
+ this is line 2
+ this is line 3
+ this is line 4
+@@ -17,10 +17,10 @@ this is line 16
+ this is line 17
+ this is line 18
+ this is line 19
++this line offsets all the line numbers!
+ this is line 20
+ this is line 21
+-this is line 22
+-this is line 23
++until here, now we're back on track!
+ this is line 24
+ this is line 25
+ this is line 26
+@@ -53,10 +53,10 @@ this is line 52
+ this is line 53
+ this is line 54
+ this is line 55
+-this is line 56
+-this is line 57
+-this is line 58
+-this is line 59
++once upon a time, a line
++ in a text
++ file
++ changed
+ this is line 60
+ this is line 61
+ this is line 62
+@@ -130,8 +130,8 @@ this is line 129
+ this is line 130
+ this is line 131
+ this is line 132
+-this is line 133
+-this is line 134
++this line was bad and has been removed
++this line was REDACTED and has been REDACTED
+ this is line 135
+ this is line 136
+ this is line 137
+@@ -161,12 +161,7 @@ this is line 160
+ this is line 161
+ this is line 162
+ this is line 163
+-this is line 164
+-this is line 165
+-this is line 166
+-this is line 167
+-this is line 168
+-this is line 169
++the number on the remaining lines is 5 ahead of their actual position in the file
+ this is line 170
+ this is line 171
+ this is line 172
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_end.out b/pkg/gitdiff/testdata/apply/text_fragment_add_end.out
new file mode 100644
index 0000000..648fd44
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_end.out
@@ -0,0 +1,5 @@
+line 1
+line 2
+line 3
+new line a
+new line b
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_end.patch b/pkg/gitdiff/testdata/apply/text_fragment_add_end.patch
new file mode 100644
index 0000000..de708be
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_end.patch
@@ -0,0 +1,9 @@
+diff --git a/gitdiff/testdata/apply/fragment_add_end.src b/gitdiff/testdata/apply/fragment_add_end.src
+--- a/gitdiff/testdata/apply/fragment_add_end.src
++++ b/gitdiff/testdata/apply/fragment_add_end.src
+@@ -1,3 +1,5 @@
+ line 1
+ line 2
+ line 3
++new line a
++new line b
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_end.src b/pkg/gitdiff/testdata/apply/text_fragment_add_end.src
new file mode 100644
index 0000000..a92d664
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_end.src
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.out b/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.out
new file mode 100644
index 0000000..94c99a3
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.out
@@ -0,0 +1,5 @@
+line 1
+line 2
+line 3
+line 4
+line 5
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.patch b/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.patch
new file mode 100644
index 0000000..ec3cea4
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.patch
@@ -0,0 +1,11 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_add_end_noeol.src b/gitdiff/testdata/apply/text_fragment_add_end_noeol.src
+--- a/gitdiff/testdata/apply/text_fragment_add_end_noeol.src
++++ b/gitdiff/testdata/apply/text_fragment_add_end_noeol.src
+@@ -1,3 +1,5 @@
+ line 1
+ line 2
+-line 3
+\ No newline at end of file
++line 3
++line 4
++line 5
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.src b/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.src
new file mode 100644
index 0000000..8cf2f17
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_end_noeol.src
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3 \ No newline at end of file
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_middle.out b/pkg/gitdiff/testdata/apply/text_fragment_add_middle.out
new file mode 100644
index 0000000..ded20d8
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_middle.out
@@ -0,0 +1,5 @@
+line 1
+line 2
+new line a
+new line b
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_middle.patch b/pkg/gitdiff/testdata/apply/text_fragment_add_middle.patch
new file mode 100644
index 0000000..43aee3b
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_middle.patch
@@ -0,0 +1,9 @@
+diff --git a/gitdiff/testdata/apply/fragment_add_middle.src b/gitdiff/testdata/apply/fragment_add_middle.src
+--- a/gitdiff/testdata/apply/fragment_add_middle.src
++++ b/gitdiff/testdata/apply/fragment_add_middle.src
+@@ -1,3 +1,5 @@
+ line 1
+ line 2
++new line a
++new line b
+ line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_middle.src b/pkg/gitdiff/testdata/apply/text_fragment_add_middle.src
new file mode 100644
index 0000000..a92d664
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_middle.src
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_start.out b/pkg/gitdiff/testdata/apply/text_fragment_add_start.out
new file mode 100644
index 0000000..b153f60
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_start.out
@@ -0,0 +1,4 @@
+new line a
+line 1
+line 2
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_start.patch b/pkg/gitdiff/testdata/apply/text_fragment_add_start.patch
new file mode 100644
index 0000000..5218764
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_start.patch
@@ -0,0 +1,8 @@
+diff --git a/gitdiff/testdata/apply/fragment_add_start.src b/gitdiff/testdata/apply/fragment_add_start.src
+--- a/gitdiff/testdata/apply/fragment_add_start.src
++++ b/gitdiff/testdata/apply/fragment_add_start.src
+@@ -1,3 +1,4 @@
++new line a
+ line 1
+ line 2
+ line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_add_start.src b/pkg/gitdiff/testdata/apply/text_fragment_add_start.src
new file mode 100644
index 0000000..a92d664
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_add_start.src
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_end.out b/pkg/gitdiff/testdata/apply/text_fragment_change_end.out
new file mode 100644
index 0000000..e3cbece
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_end.out
@@ -0,0 +1,10 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+line 6
+line 7
+line 8
+line 9
+new line a
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_end.patch b/pkg/gitdiff/testdata/apply/text_fragment_change_end.patch
new file mode 100644
index 0000000..5655880
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_end.patch
@@ -0,0 +1,9 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_change_end.src b/gitdiff/testdata/apply/text_fragment_change_end.src
+--- a/gitdiff/testdata/apply/text_fragment_change_end.src
++++ b/gitdiff/testdata/apply/text_fragment_change_end.src
+@@ -7,4 +7,4 @@ line 6
+ line 7
+ line 8
+ line 9
+-line 10
++new line a
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_end.src b/pkg/gitdiff/testdata/apply/text_fragment_change_end.src
new file mode 100644
index 0000000..fa2da6e
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_end.src
@@ -0,0 +1,10 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+line 6
+line 7
+line 8
+line 9
+line 10
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.out b/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.out
new file mode 100644
index 0000000..8cf2f17
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.out
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3 \ No newline at end of file
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.patch b/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.patch
new file mode 100644
index 0000000..f1c9477
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.patch
@@ -0,0 +1,10 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_remove_last_eol.src b/gitdiff/testdata/apply/text_fragment_remove_last_eol.src
+index a92d664..8cf2f17 100644
+--- a/gitdiff/testdata/apply/text_fragment_remove_last_eol.src
++++ b/gitdiff/testdata/apply/text_fragment_remove_last_eol.src
+@@ -1,3 +1,3 @@
+ line 1
+ line 2
+-line 3
++line 3
+\ No newline at end of file
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.src b/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.src
new file mode 100644
index 0000000..a92d664
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_end_eol.src
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_exact.out b/pkg/gitdiff/testdata/apply/text_fragment_change_exact.out
new file mode 100644
index 0000000..4655a0a
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_exact.out
@@ -0,0 +1,19 @@
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+new line a
+line
+line
+line
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_exact.patch b/pkg/gitdiff/testdata/apply/text_fragment_change_exact.patch
new file mode 100644
index 0000000..395de4d
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_exact.patch
@@ -0,0 +1,12 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_change_exact.src b/gitdiff/testdata/apply/text_fragment_change_exact.src
+--- a/gitdiff/testdata/apply/text_fragment_change_exact.src
++++ b/gitdiff/testdata/apply/text_fragment_change_exact.src
+@@ -13,7 +13,7 @@ line
+ line
+ line
+ line
+-line
++new line a
+ line
+ line
+ line
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_exact.src b/pkg/gitdiff/testdata/apply/text_fragment_change_exact.src
new file mode 100644
index 0000000..316a8f0
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_exact.src
@@ -0,0 +1,30 @@
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
+line
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_middle.out b/pkg/gitdiff/testdata/apply/text_fragment_change_middle.out
new file mode 100644
index 0000000..fd0a9ad
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_middle.out
@@ -0,0 +1,9 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+new line a
+line 7
+line 8
+line 9
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_middle.patch b/pkg/gitdiff/testdata/apply/text_fragment_change_middle.patch
new file mode 100644
index 0000000..139a0fe
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_middle.patch
@@ -0,0 +1,12 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_change_middle.src b/gitdiff/testdata/apply/text_fragment_change_middle.src
+--- a/gitdiff/testdata/apply/text_fragment_change_middle.src
++++ b/gitdiff/testdata/apply/text_fragment_change_middle.src
+@@ -3,7 +3,7 @@ line 2
+ line 3
+ line 4
+ line 5
+-line 6
++new line a
+ line 7
+ line 8
+ line 9
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_middle.src b/pkg/gitdiff/testdata/apply/text_fragment_change_middle.src
new file mode 100644
index 0000000..fa2da6e
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_middle.src
@@ -0,0 +1,10 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+line 6
+line 7
+line 8
+line 9
+line 10
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.out b/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.out
new file mode 100644
index 0000000..ed59e08
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.out
@@ -0,0 +1 @@
+new line a \ No newline at end of file
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.patch b/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.patch
new file mode 100644
index 0000000..f945234
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.patch
@@ -0,0 +1,8 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_change_single_noeol.src b/gitdiff/testdata/apply/text_fragment_change_single_noeol.src
+--- a/gitdiff/testdata/apply/text_fragment_change_single_noeol.src
++++ b/gitdiff/testdata/apply/text_fragment_change_single_noeol.src
+@@ -1 +1 @@
+-line 1
+\ No newline at end of file
++new line a
+\ No newline at end of file
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.src b/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.src
new file mode 100644
index 0000000..dcf168c
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_single_noeol.src
@@ -0,0 +1 @@
+line 1 \ No newline at end of file
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_start.out b/pkg/gitdiff/testdata/apply/text_fragment_change_start.out
new file mode 100644
index 0000000..5156941
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_start.out
@@ -0,0 +1,4 @@
+new line a
+line 2
+line 3
+line 4
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_start.patch b/pkg/gitdiff/testdata/apply/text_fragment_change_start.patch
new file mode 100644
index 0000000..d0a6653
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_start.patch
@@ -0,0 +1,9 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_change_start.src b/gitdiff/testdata/apply/text_fragment_change_start.src
+--- a/gitdiff/testdata/apply/text_fragment_change_start.src
++++ b/gitdiff/testdata/apply/text_fragment_change_start.src
+@@ -1,4 +1,4 @@
+-line 1
++new line a
+ line 2
+ line 3
+ line 4
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_change_start.src b/pkg/gitdiff/testdata/apply/text_fragment_change_start.src
new file mode 100644
index 0000000..fa2da6e
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_change_start.src
@@ -0,0 +1,10 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+line 6
+line 7
+line 8
+line 9
+line 10
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_delete_all.out b/pkg/gitdiff/testdata/apply/text_fragment_delete_all.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_delete_all.out
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_delete_all.patch b/pkg/gitdiff/testdata/apply/text_fragment_delete_all.patch
new file mode 100644
index 0000000..8a2fb9c
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_delete_all.patch
@@ -0,0 +1,8 @@
+diff --git a/gitdiff/testdata/apply/fragment_delete_all.src b/gitdiff/testdata/apply/fragment_delete_all.src
+--- a/gitdiff/testdata/apply/fragment_delete_all.src
++++ b/gitdiff/testdata/apply/fragment_delete_all.src
+@@ -1,4 +0,0 @@
+-line a
+-line b
+-line c
+-line d
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_delete_all.src b/pkg/gitdiff/testdata/apply/text_fragment_delete_all.src
new file mode 100644
index 0000000..47d03ac
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_delete_all.src
@@ -0,0 +1,4 @@
+line a
+line b
+line c
+line d
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_error.src b/pkg/gitdiff/testdata/apply/text_fragment_error.src
new file mode 100644
index 0000000..f8b6f0a
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_error.src
@@ -0,0 +1,13 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+line 6
+line 7
+line 8
+line 9
+line 10
+line 11
+line 12
+line 13
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_error_context_conflict.patch b/pkg/gitdiff/testdata/apply/text_fragment_error_context_conflict.patch
new file mode 100644
index 0000000..a262796
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_error_context_conflict.patch
@@ -0,0 +1,12 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_error.src b/gitdiff/testdata/apply/text_fragment_error.src
+--- a/gitdiff/testdata/apply/text_fragment_error.src
++++ b/gitdiff/testdata/apply/text_fragment_error.src
+@@ -4,7 +4,7 @@ line 3
+ line 4
+ line 5
+ line conflict
+-line 7
++new line a
+ line 8
+ line 9
+ line 10
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_error_delete_conflict.patch b/pkg/gitdiff/testdata/apply/text_fragment_error_delete_conflict.patch
new file mode 100644
index 0000000..17ea166
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_error_delete_conflict.patch
@@ -0,0 +1,12 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_error.src b/gitdiff/testdata/apply/text_fragment_error.src
+--- a/gitdiff/testdata/apply/text_fragment_error.src
++++ b/gitdiff/testdata/apply/text_fragment_error.src
+@@ -4,7 +4,7 @@ line 3
+ line 4
+ line 5
+ line 6
+-line conflict
++new line a
+ line 8
+ line 9
+ line 10
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_error_new_file.patch b/pkg/gitdiff/testdata/apply/text_fragment_error_new_file.patch
new file mode 100644
index 0000000..f4fbee6
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_error_new_file.patch
@@ -0,0 +1,7 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_error.src b/gitdiff/testdata/apply/text_fragment_error.src
+--- a/gitdiff/testdata/apply/text_fragment_error.src
++++ b/gitdiff/testdata/apply/text_fragment_error.src
+@@ -0,0 +1,3 @@
++line 1
++line 2
++line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_error_short_src.patch b/pkg/gitdiff/testdata/apply/text_fragment_error_short_src.patch
new file mode 100644
index 0000000..bfe7b96
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_error_short_src.patch
@@ -0,0 +1,12 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_error.src b/gitdiff/testdata/apply/text_fragment_error.src
+--- a/gitdiff/testdata/apply/text_fragment_error.src
++++ b/gitdiff/testdata/apply/text_fragment_error.src
+@@ -9,7 +9,7 @@ line 8
+ line 9
+ line 10
+ line 11
+-line 12
++new line a
+ line 13
+ line 14
+ line 15
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_error_short_src_before.patch b/pkg/gitdiff/testdata/apply/text_fragment_error_short_src_before.patch
new file mode 100644
index 0000000..0a96018
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_error_short_src_before.patch
@@ -0,0 +1,12 @@
+diff --git a/gitdiff/testdata/apply/text_fragment_error.src b/gitdiff/testdata/apply/text_fragment_error.src
+--- a/gitdiff/testdata/apply/text_fragment_error.src
++++ b/gitdiff/testdata/apply/text_fragment_error.src
+@@ -15,7 +15,7 @@ line 14
+ line 15
+ line 16
+ line 17
+-line 18
++new line a
+ line 19
+ line 20
+ line 21
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_new.out b/pkg/gitdiff/testdata/apply/text_fragment_new.out
new file mode 100644
index 0000000..a92d664
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_new.out
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_new.patch b/pkg/gitdiff/testdata/apply/text_fragment_new.patch
new file mode 100644
index 0000000..c87487b
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_new.patch
@@ -0,0 +1,7 @@
+diff --git a/gitdiff/testdata/apply/fragment_new.src b/gitdiff/testdata/apply/fragment_new.src
+--- a/gitdiff/testdata/apply/fragment_new.src
++++ b/gitdiff/testdata/apply/fragment_new.src
+@@ -0,0 +1,3 @@
++line 1
++line 2
++line 3
diff --git a/pkg/gitdiff/testdata/apply/text_fragment_new.src b/pkg/gitdiff/testdata/apply/text_fragment_new.src
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pkg/gitdiff/testdata/apply/text_fragment_new.src
diff --git a/pkg/gitdiff/testdata/new_binary_file.patch b/pkg/gitdiff/testdata/new_binary_file.patch
new file mode 100644
index 0000000..e9ad45d
--- /dev/null
+++ b/pkg/gitdiff/testdata/new_binary_file.patch
@@ -0,0 +1,16 @@
+commit 5d9790fec7d95aa223f3d20936340bf55ff3dcbe
+Author: Morton Haypenny <mhaypenny@example.com>
+Date: Tue Apr 2 22:55:40 2019 -0700
+
+ A binary file with the first 10 fibonacci numbers.
+
+diff --git a/dir/ten.bin b/dir/ten.bin
+new file mode 100644
+index 0000000000000000000000000000000000000000..77b068ba48c356156944ea714740d0d5ca07bfec
+GIT binary patch
+literal 40
+gcmZQzU|?i`U?w2V48*KJ%mKu_Kr9NxN<eH500b)lkN^Mx
+
+literal 0
+HcmV?d00001
+
diff --git a/pkg/gitdiff/testdata/no_files.patch b/pkg/gitdiff/testdata/no_files.patch
new file mode 100644
index 0000000..9eea12d
--- /dev/null
+++ b/pkg/gitdiff/testdata/no_files.patch
@@ -0,0 +1,8 @@
+commit 5d9790fec7d95aa223f3d20936340bf55ff3dcbe
+Author: Morton Haypenny <mhaypenny@example.com>
+Date: Tue Apr 2 22:55:40 2019 -0700
+
+ A file with multiple fragments.
+
+ The content is arbitrary.
+
diff --git a/pkg/gitdiff/testdata/one_file.patch b/pkg/gitdiff/testdata/one_file.patch
new file mode 100644
index 0000000..1aefec3
--- /dev/null
+++ b/pkg/gitdiff/testdata/one_file.patch
@@ -0,0 +1,28 @@
+commit 5d9790fec7d95aa223f3d20936340bf55ff3dcbe
+Author: Morton Haypenny <mhaypenny@example.com>
+Date: Tue Apr 2 22:55:40 2019 -0700
+
+ A file with multiple fragments.
+
+ The content is arbitrary.
+
+diff --git a/dir/file1.txt b/dir/file1.txt
+index ebe9fa54..fe103e1d 100644
+--- a/dir/file1.txt
++++ b/dir/file1.txt
+@@ -3,6 +3,8 @@ fragment 1
+ context line
+-old line 1
+-old line 2
+ context line
++new line 1
++new line 2
++new line 3
+ context line
+-old line 3
++new line 4
++new line 5
+@@ -31,2 +33,2 @@ fragment 2
+ context line
+-old line 4
++new line 6
diff --git a/pkg/gitdiff/testdata/string/binary_modify.patch b/pkg/gitdiff/testdata/string/binary_modify.patch
new file mode 100644
index 0000000..12ddad5
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/binary_modify.patch
@@ -0,0 +1,9 @@
+diff --git a/file.bin b/file.bin
+index a7f4d5d6975ec021016c02b6d58345ebf434f38c..bdc9a70f055892146612dcdb413f0e339faaa0df 100644
+GIT binary patch
+delta 66
+QcmeZhVVvM$!$1K50C&Ox;s5{u
+
+delta 5
+McmZo+^qAlQ00i9urT_o{
+
diff --git a/pkg/gitdiff/testdata/string/binary_modify_nodata.patch b/pkg/gitdiff/testdata/string/binary_modify_nodata.patch
new file mode 100644
index 0000000..833a534
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/binary_modify_nodata.patch
@@ -0,0 +1,3 @@
+diff --git a/file.bin b/file.bin
+index a7f4d5d..bdc9a70 100644
+Binary files a/file.bin and b/file.bin differ
diff --git a/pkg/gitdiff/testdata/string/binary_new.patch b/pkg/gitdiff/testdata/string/binary_new.patch
new file mode 100644
index 0000000..c56f35e
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/binary_new.patch
@@ -0,0 +1,11 @@
+diff --git a/file.bin b/file.bin
+new file mode 100644
+index 0000000000000000000000000000000000000000..a7f4d5d6975ec021016c02b6d58345ebf434f38c
+GIT binary patch
+literal 72
+zcmV-O0Jr~td-`u6JcK&{KDK=<a#;v1^LR5&K)zQ0=Goz82(?nJ6_nD`f#8O9p}}{P
+eiXim+rDI+BDadMQmMsO5Sw@;DbrCA+PamP;Ng_@F
+
+literal 0
+HcmV?d00001
+
diff --git a/pkg/gitdiff/testdata/string/copy.patch b/pkg/gitdiff/testdata/string/copy.patch
new file mode 100644
index 0000000..f002f07
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/copy.patch
@@ -0,0 +1,4 @@
+diff --git a/file.txt b/numbers.txt
+similarity index 100%
+copy from file.txt
+copy to numbers.txt
diff --git a/pkg/gitdiff/testdata/string/copy_modify.patch b/pkg/gitdiff/testdata/string/copy_modify.patch
new file mode 100644
index 0000000..558a511
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/copy_modify.patch
@@ -0,0 +1,21 @@
+diff --git a/file.txt b/numbers.txt
+similarity index 57%
+copy from file.txt
+copy to numbers.txt
+index c9e9e05..6c4a3e0 100644
+--- a/file.txt
++++ b/numbers.txt
+@@ -1,6 +1,6 @@
+ one
+ two
+-three
++three three three
+ four
+ five
+ six
+@@ -8,3 +8,5 @@ seven
+ eight
+ nine
+ ten
++eleven
++twelve
diff --git a/pkg/gitdiff/testdata/string/delete.patch b/pkg/gitdiff/testdata/string/delete.patch
new file mode 100644
index 0000000..f32dc25
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/delete.patch
@@ -0,0 +1,16 @@
+diff --git a/file.txt b/file.txt
+deleted file mode 100644
+index c9e9e05..0000000
+--- a/file.txt
++++ /dev/null
+@@ -1,10 +0,0 @@
+-one
+-two
+-three
+-four
+-five
+-six
+-seven
+-eight
+-nine
+-ten
diff --git a/pkg/gitdiff/testdata/string/mode.patch b/pkg/gitdiff/testdata/string/mode.patch
new file mode 100644
index 0000000..953ab25
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/mode.patch
@@ -0,0 +1,3 @@
+diff --git a/file.txt b/file.txt
+old mode 100644
+new mode 100755
diff --git a/pkg/gitdiff/testdata/string/mode_modify.patch b/pkg/gitdiff/testdata/string/mode_modify.patch
new file mode 100644
index 0000000..f1554a7
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/mode_modify.patch
@@ -0,0 +1,10 @@
+diff --git a/script.sh b/script.sh
+old mode 100644
+new mode 100755
+index 7a870bd..68d501e
+--- a/script.sh
++++ b/script.sh
+@@ -1,2 +1,2 @@
+ #!/bin/bash
+-echo "Hello World"
++echo "Hello, World!"
diff --git a/pkg/gitdiff/testdata/string/modify.patch b/pkg/gitdiff/testdata/string/modify.patch
new file mode 100644
index 0000000..9d89753
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/modify.patch
@@ -0,0 +1,16 @@
+diff --git a/file.txt b/file.txt
+index c9e9e05..7d5fdc6 100644
+--- a/file.txt
++++ b/file.txt
+@@ -3,8 +3,10 @@ two
+ three
+ four
+ five
+-six
++six six six six six six
+ seven
+ eight
+ nine
+ ten
++eleven
++twelve
diff --git a/pkg/gitdiff/testdata/string/new.patch b/pkg/gitdiff/testdata/string/new.patch
new file mode 100644
index 0000000..941fe25
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/new.patch
@@ -0,0 +1,16 @@
+diff --git a/file.txt b/file.txt
+new file mode 100644
+index 0000000..c9e9e05
+--- /dev/null
++++ b/file.txt
+@@ -0,0 +1,10 @@
++one
++two
++three
++four
++five
++six
++seven
++eight
++nine
++ten
diff --git a/pkg/gitdiff/testdata/string/new_empty.patch b/pkg/gitdiff/testdata/string/new_empty.patch
new file mode 100644
index 0000000..5cc7cf7
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/new_empty.patch
@@ -0,0 +1,3 @@
+diff --git a/file.txt b/file.txt
+new file mode 100644
+index 0000000..e69de29
diff --git a/pkg/gitdiff/testdata/string/new_mode.patch b/pkg/gitdiff/testdata/string/new_mode.patch
new file mode 100644
index 0000000..f9d7f1f
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/new_mode.patch
@@ -0,0 +1,16 @@
+diff --git a/file.sh b/file.sh
+new file mode 100755
+index 0000000..c9e9e05
+--- /dev/null
++++ b/file.sh
+@@ -0,0 +1,10 @@
++one
++two
++three
++four
++five
++six
++seven
++eight
++nine
++ten
diff --git a/pkg/gitdiff/testdata/string/rename.patch b/pkg/gitdiff/testdata/string/rename.patch
new file mode 100644
index 0000000..3c0ca6f
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/rename.patch
@@ -0,0 +1,4 @@
+diff --git a/file.txt b/numbers.txt
+similarity index 100%
+rename from file.txt
+rename to numbers.txt
diff --git a/pkg/gitdiff/testdata/string/rename_modify.patch b/pkg/gitdiff/testdata/string/rename_modify.patch
new file mode 100644
index 0000000..52a32af
--- /dev/null
+++ b/pkg/gitdiff/testdata/string/rename_modify.patch
@@ -0,0 +1,18 @@
+diff --git a/file.txt b/numbers.txt
+similarity index 77%
+rename from file.txt
+rename to numbers.txt
+index c9e9e05..a6b31d6 100644
+--- a/file.txt
++++ b/numbers.txt
+@@ -3,8 +3,9 @@ two
+ three
+ four
+ five
+-six
++ six
+ seven
+ eight
+ nine
+ ten
++eleven
diff --git a/pkg/gitdiff/testdata/two_files.patch b/pkg/gitdiff/testdata/two_files.patch
new file mode 100644
index 0000000..dd14421
--- /dev/null
+++ b/pkg/gitdiff/testdata/two_files.patch
@@ -0,0 +1,48 @@
+commit 5d9790fec7d95aa223f3d20936340bf55ff3dcbe
+Author: Morton Haypenny <mhaypenny@example.com>
+Date: Tue Apr 2 22:55:40 2019 -0700
+
+ A file with multiple fragments.
+
+ The content is arbitrary.
+
+diff --git a/dir/file1.txt b/dir/file1.txt
+index ebe9fa54..fe103e1d 100644
+--- a/dir/file1.txt
++++ b/dir/file1.txt
+@@ -3,6 +3,8 @@ fragment 1
+ context line
+-old line 1
+-old line 2
+ context line
++new line 1
++new line 2
++new line 3
+ context line
+-old line 3
++new line 4
++new line 5
+@@ -31,2 +33,2 @@ fragment 2
+ context line
+-old line 4
++new line 6
+diff --git a/dir/file2.txt b/dir/file2.txt
+index 417ebc70..67514b7f 100644
+--- a/dir/file2.txt
++++ b/dir/file2.txt
+@@ -3,6 +3,8 @@ fragment 1
+ context line
+-old line 1
+-old line 2
+ context line
++new line 1
++new line 2
++new line 3
+ context line
+-old line 3
++new line 4
++new line 5
+@@ -31,2 +33,2 @@ fragment 2
+ context line
+-old line 4
++new line 6