summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt10
-rw-r--r--tests/attr/ignore.c16
-rw-r--r--tests/buf/percent.c49
-rw-r--r--tests/checkout/head.c128
-rw-r--r--tests/checkout/tree.c2
-rw-r--r--tests/checkout/typechange.c26
-rw-r--r--tests/config/read.c45
-rw-r--r--tests/diff/rename.c268
-rw-r--r--tests/diff/stats.c2
-rw-r--r--tests/fetchhead/nonetwork.c23
-rw-r--r--tests/index/filemodes.c62
-rw-r--r--tests/iterator/iterator_helpers.c3
-rw-r--r--tests/iterator/workdir.c7
-rw-r--r--tests/merge/conflict_data.h20
-rw-r--r--tests/merge/files.c48
-rw-r--r--tests/merge/trees/recursive.c68
-rw-r--r--tests/merge/workdir/recursive.c12
-rw-r--r--tests/message/trailer.c165
-rw-r--r--tests/network/fetchlocal.c8
-rw-r--r--tests/object/tree/write.c12
-rw-r--r--tests/odb/backend/mempack.c60
-rw-r--r--tests/odb/backend/simple.c18
-rw-r--r--tests/odb/largefiles.c77
-rw-r--r--tests/odb/loose.c84
-rw-r--r--tests/online/clone.c102
-rw-r--r--tests/perf/merge.c13
-rw-r--r--tests/refs/dup.c2
-rw-r--r--tests/refs/iterator.c1
-rw-r--r--tests/refs/list.c4
-rw-r--r--tests/repo/open.c2
-rw-r--r--tests/resources/crlf_data/README2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf8
-rw-r--r--tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr4
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom2
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf8
-rw-r--r--tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom8
-rwxr-xr-x[-rw-r--r--]tests/resources/generate_crlf.sh (renamed from tests/generate_crlf.sh)12
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/03/9d0da126f24b819a5a38186249c7f96be3824cbin0 -> 71 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/05/63b7706dcdcf94bc0c02cd96c137940278eca9bin0 -> 151 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/08/f01e1bff7e442d574eb221913515b4bd27ccd6bin0 -> 64 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/0b/beee1982b493330e375a85bbfddaba3d561556bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/0c/e202f64fa8356c1a32835fce4058ca76b0c7edbin0 -> 183 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/0e/c39d71c1b074905350ce20ce3f0629f737a2a9bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/17/946ad3088f931102e5d81f94cf2825fc188953bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/18/2d0d250d1d7adcc60c178be5be98358b3a2fd15
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/1b/c7bcccf4bbdc8bfba2331a37ad5e9cf1dd321cbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/1b/de1883de4977ea3e664b315da951d1f614c3b1bin0 -> 45 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/23/b427bf6278724433e64ef4cf6dc166c4f2e246bin0 -> 67 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/23/cf2687a9327d55abbbd788ff04fa932072aebcbin0 -> 52 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/26/d3c94459b4faa08f009b15867993ca341535922
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/2c/ba583804a4a6fad1baf97c959be447238d1489bin0 -> 23 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/2e/7ae0d42fb7b6126f6a08ac6314ac07833a52f6bin0 -> 61 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/30/39c07db695c8c99d0a7c7e32f0afe40eae0be03
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/35/8efd6f589384fa8baf92234db9c7899a53916ebin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/35/dda4f3f9b3794d92a46d908790e550ed100eaebin0 -> 52 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/36/71e42c8c8302d1a71c0ed7bf2b0a938e9e20f9bin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/39/78944e4cd53edcc10a170ab2ff142f7295b958bin0 -> 185 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/3a/0dc89a8bd20e74fae69d2e038b47360fafb02ebin0 -> 64 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/3a/8c70144d0334721154b1e0529716b368483d6fbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/3e/eff81b57a0ac15a5ab6bb3a8e92511a01a429cbin0 -> 66 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/40/9f5d072decec684331672f2d6c0a9bc3640adbbin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/44/faf5fba1af850dae54f8b2345938d3c7ae479fbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4a/06b258fed8a4d15967ec4253ae7366b70f727dbin0 -> 42 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904bin0 -> 15 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4c/62e9482ed42c1a6d08891906b26126daa4a8f5bin0 -> 182 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/50/4dd93fb5b9c2a28c094c6e84ef0606de1e9b5cbin0 -> 50 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/50/dfa64a56b488fe8082371b182c8a3e3c942332bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/51/135c5884d7dd132fef3b432cca5826bab98f37bin0 -> 154 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/51/60ab78c1973dcd7cdebe2345dc8fcfc755e76dbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/56/fcbad344aafe519bafcc33c87b8e64849d82abbin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5a/47615db824433f816ba62217dda6d46c5a7640bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5c/27b5f7c6f6dd4e5b4d64976741d56c2df8f48abin0 -> 160 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5d/998d5f278aff5693711bc48f6852aac4b603adbin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/61/6d1209afac499b005f68309e1593b44899b054bin0 -> 69 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/71/c50785d8d512293bd3af838b131f3da5829ebcbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/75/afa96db00c26c6ebf3b377615b4e2a20563ee4bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/76/6afbfd7d42f757f1fac9ea550c9fcbc8041b89bin0 -> 180 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7c/61830f8b8632665bb44ae5d219f520f5aa5bb4bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7c/9a30d8dcee320a3b1f9ed10b582479faa9d3a1bin0 -> 152 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7e/2d2bad4fc21f2832ca2afd48b1f95ab37ffb92bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7e/70a7872576bba7e299cde45abb7da1e4d7ba81bin0 -> 61 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7f/9c1d78d760cbfa99273bc1ef642d994c6baa5cbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/81/60cb53660b86c954144b8dbbb0b6e4db4ba6babin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/8f/1b918542a5fe9b3bb7a8770a7525ad5b3b5864bin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/97/5dd228fd1b0cacf2988167088fd1190c9ac0f5bin0 -> 186 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/98/5b725cf91c6861b5e7a419415d03cbcf5f16cabin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/98/cacbdd1fac7bbab54a6c7c97aa2103219e08b8bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/99/754e36599906b81b917447280c4918269e14ffbin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/9a/228c1ee87f286202ec9a25de837a18550013b5bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/9c/dde216049c6a5ccddac0ad81f604419d8990ed2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a0/ce8909834f389b4f8be6a6ec420868422d40a1bin0 -> 154 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a2/817ed0e8ca6fe52bf0a20b2f50eb94b9ea5415bin0 -> 153 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a3/5aa65d86215fce909fc0bcce8949d12becba44bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a3/ca4c462e93fee824c8ad500917ae34b800dea4bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a6/64873b1c0b9a1ed300f8644dde536fdaa3a34fbin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a9/9bf55117ab1958171fccfeb19885f707bd08fdbin0 -> 90 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b0/1de62cf11945685c98ec671edabdff3e90ddc5bin0 -> 185 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b0/4823b75c8220b89c2f8da54709cda262304cd3bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b1/71224a4f604b6091072007765419b14c232c1dbin0 -> 181 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b2/908343e3c16249d0036dd444fc0d4662cd8c0ebin0 -> 154 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b6/bd0f9952f396e757d3f91e08c59a7e91707201bin0 -> 74 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b7/de2b52ba055688061355fad1599a5d214ce8f8bin0 -> 74 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b8/a3b657edcf31e6365a2f1c45d45e6c9ebe8f02bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ba/9dcfe079848e8e5c1b53bc3b6e47ff57f6e481bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/bb/4e0014fb09d24312f0af37c7a45e5488f195104
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/c0/dcb4bfcd86e65a822090aa7a0455413828886bbin0 -> 64 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/c4/44758b02d4af6e3145ac2fc0e3ed02199cf7ecbin0 -> 17 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/c7/f3257db72e885d6612080c003e0f2ef480e0c4bin0 -> 69 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ce/0d744cd2e18eacf883d43471636f231c0995e3bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d0/97bcf99adb1022a6b7d2e94fed2031ebd9d89cbin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d0/c9bd6e2a3e327d81a32de51201d3bd58909f7cbin0 -> 181 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d3/482dbdca5bb83aaf3e3768359855d55aef84d7bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d5/015f9436b2d8c842bf6616e7cf5bc54eb79cedbin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/db/51adf2b699eed93e883d6425f5e6c50165a9c2bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/db/7e2af8ca83b8943adce7ba37d85f8fe7d7d2a9bin0 -> 61 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/de/de92a05a0841faa8e4ad6700285cd208184458bin0 -> 182 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e0/15ebd79a72a88b9291df11771caf56f463e8f9bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e5/20e6aaf8d1e68a433e29d4360c1e74aa4b24d1bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e6/269ce9017816d67c7189a58b6d0d22bf4b8a1abin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e9/30c8c67848df4aa66319c5752fab6b8fdec765bin0 -> 64 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ea/3521485adfa0b0373deaaa06db9218a22edae8bin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f0/856993e005c0d8ed2dc7cdc222cc1d89fb3c77bin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f2/9ccca75754d8476e5dad8cf250e03d43fe9e6cbin0 -> 51 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f3/2c284f537ff1a55d3cbfe9a37d431b6edfadc2bin0 -> 19 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f4/c149e7d0983e90e9ee802ff57ae3c905ba63dabin0 -> 91 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f6/5de1834f57708e76d8dc25502b7f1ecbcce162bin0 -> 156 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f9/c04e4e9d4aaf1e6fe7478a7cc0756554974c2bbin0 -> 45 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchJ-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchJ-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchK-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchK-21
-rw-r--r--tests/resources/renames/.gitted/objects/2c/136d294960f7d939f1ed1903f1ced78b874c87bin0 -> 126 bytes
-rw-r--r--tests/resources/renames/.gitted/objects/84/d8efa38af7ace2b302de0adbda16b1f1cd2e1b1
-rw-r--r--tests/resources/renames/.gitted/objects/89/7dda8ecb7fa2e092bc3f9e2a179d7c1b0364dbbin0 -> 130 bytes
-rw-r--r--tests/resources/renames/.gitted/objects/95/ceb126bf79e76020d8879a8b0d50a73307a97fbin0 -> 1189 bytes
-rw-r--r--tests/resources/renames/.gitted/objects/be/053a189b0bbde545e0a3f59ce00b46ad29ce0dbin0 -> 163 bytes
-rw-r--r--tests/resources/renames/.gitted/refs/heads/delete-and-rename1
-rw-r--r--tests/resources/renames/.gitted/refs/heads/rewrite-and-delete1
-rw-r--r--tests/resources/revwalk.git/HEAD1
-rw-r--r--tests/resources/revwalk.git/config6
-rw-r--r--tests/resources/revwalk.git/description1
-rw-r--r--tests/resources/revwalk.git/objects/info/packs2
-rw-r--r--tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.idxbin0 -> 1520 bytes
-rw-r--r--tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.packbin0 -> 1862 bytes
-rw-r--r--tests/resources/revwalk.git/packed-refs7
-rw-r--r--tests/resources/revwalk.git/refs/.gitkeep0
-rw-r--r--tests/resources/testrepo/.gitted/objects/57/43a3ef145d3638a0fa28233ca92897117ad74fbin0 -> 160 bytes
-rw-r--r--tests/resources/testrepo/.gitted/objects/f9/ed4af42472941da45a3ce44458455ed227a6be2
-rw-r--r--tests/resources/testrepo/.gitted/refs/heads/executable1
-rw-r--r--tests/revwalk/basic.c29
-rw-r--r--tests/status/renames.c8
-rw-r--r--tests/status/worktree.c4
-rw-r--r--tests/submodule/add.c55
-rw-r--r--tests/submodule/lookup.c16
-rw-r--r--tests/transport/register.c2
-rw-r--r--tests/worktree/repository.c1
-rw-r--r--tests/worktree/worktree.c30
218 files changed, 1595 insertions, 244 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 08ecb396b..775f33f2d 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -20,7 +20,7 @@ ENDIF()
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/clar.suite
- COMMAND ${PYTHON_EXECUTABLE} generate.py -o "${CMAKE_CURRENT_BINARY_DIR}" -f -xonline -xstress .
+ COMMAND ${PYTHON_EXECUTABLE} generate.py -o "${CMAKE_CURRENT_BINARY_DIR}" -f -xonline -xstress -xperf .
DEPENDS ${SRC_TEST}
WORKING_DIRECTORY ${CLAR_PATH}
)
@@ -58,8 +58,6 @@ ELSE ()
ADD_TEST(libgit2_clar "${libgit2_BINARY_DIR}/libgit2_clar" -v -xclone::local::git_style_unc_paths -xclone::local::standard_unc_paths_are_written_git_style)
ENDIF ()
-# Add a test target which runs the cred callback tests, to be
-# called after setting the url and user
-ADD_TEST(libgit2_clar-cred_callback "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::clone::cred_callback)
-ADD_TEST(libgit2_clar-proxy_credentials_in_url "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::clone::proxy_credentials_in_url)
-ADD_TEST(libgit2_clar-proxy_credentials_request "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::clone::proxy_credentials_request)
+# Add additional test targets that require special setup
+ADD_TEST(libgit2_clar-proxy_credentials "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::clone::proxy_credentials_in_url -sonline::clone::proxy_credentials_request)
+ADD_TEST(libgit2_clar-ssh "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::push -sonline::clone::ssh_cert -sonline::clone::ssh_with_paths)
diff --git a/tests/attr/ignore.c b/tests/attr/ignore.c
index d241c03b5..165e2ba09 100644
--- a/tests/attr/ignore.c
+++ b/tests/attr/ignore.c
@@ -61,6 +61,22 @@ void test_attr_ignore__ignore_space(void)
assert_is_ignored(true, "NewFolder/NewFolder/File.txt");
}
+void test_attr_ignore__ignore_dir(void)
+{
+ cl_git_rewritefile("attr/.gitignore", "dir/\n");
+
+ assert_is_ignored(true, "dir");
+ assert_is_ignored(true, "dir/file");
+}
+
+void test_attr_ignore__ignore_dir_with_trailing_space(void)
+{
+ cl_git_rewritefile("attr/.gitignore", "dir/ \n");
+
+ assert_is_ignored(true, "dir");
+ assert_is_ignored(true, "dir/file");
+}
+
void test_attr_ignore__ignore_root(void)
{
cl_git_rewritefile("attr/.gitignore", "/\n\n/NewFolder\n/NewFolder/NewFolder");
diff --git a/tests/buf/percent.c b/tests/buf/percent.c
new file mode 100644
index 000000000..60534a053
--- /dev/null
+++ b/tests/buf/percent.c
@@ -0,0 +1,49 @@
+#include "clar_libgit2.h"
+#include "buffer.h"
+
+static void expect_decode_pass(const char *expected, const char *encoded)
+{
+ git_buf in = GIT_BUF_INIT, out = GIT_BUF_INIT;
+
+ /*
+ * ensure that we only read the given length of the input buffer
+ * by putting garbage at the end. this will ensure that we do
+ * not, eg, rely on nul-termination or walk off the end of the buf.
+ */
+ cl_git_pass(git_buf_puts(&in, encoded));
+ cl_git_pass(git_buf_PUTS(&in, "TRAILER"));
+
+ cl_git_pass(git_buf_decode_percent(&out, in.ptr, strlen(encoded)));
+
+ cl_assert_equal_s(expected, git_buf_cstr(&out));
+ cl_assert_equal_i(strlen(expected), git_buf_len(&out));
+
+ git_buf_free(&in);
+ git_buf_free(&out);
+}
+
+void test_buf_percent__decode_succeeds(void)
+{
+ expect_decode_pass("", "");
+ expect_decode_pass(" ", "%20");
+ expect_decode_pass("a", "a");
+ expect_decode_pass(" a", "%20a");
+ expect_decode_pass("a ", "a%20");
+ expect_decode_pass("github.com", "github.com");
+ expect_decode_pass("github.com", "githu%62.com");
+ expect_decode_pass("github.com", "github%2ecom");
+ expect_decode_pass("foo bar baz", "foo%20bar%20baz");
+ expect_decode_pass("foo bar baz", "foo%20bar%20baz");
+ expect_decode_pass("foo bar ", "foo%20bar%20");
+}
+
+void test_buf_percent__ignores_invalid(void)
+{
+ expect_decode_pass("githu%%.com", "githu%%.com");
+ expect_decode_pass("github.co%2", "github.co%2");
+ expect_decode_pass("github%2.com", "github%2.com");
+ expect_decode_pass("githu%2z.com", "githu%2z.com");
+ expect_decode_pass("github.co%9z", "github.co%9z");
+ expect_decode_pass("github.co%2", "github.co%2");
+ expect_decode_pass("github.co%", "github.co%");
+}
diff --git a/tests/checkout/head.c b/tests/checkout/head.c
index ded86df33..99061466f 100644
--- a/tests/checkout/head.c
+++ b/tests/checkout/head.c
@@ -136,3 +136,131 @@ void test_checkout_head__do_remove_tracked_subdir(void)
cl_assert(!git_path_isfile("testrepo/subdir/tracked-file"));
cl_assert(git_path_isfile("testrepo/subdir/untracked-file"));
}
+
+void test_checkout_head__typechange_workdir(void)
+{
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_object *target;
+ struct stat st;
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+ cl_git_pass(git_revparse_single(&target, g_repo, "HEAD"));
+ cl_git_pass(git_reset(g_repo, target, GIT_RESET_HARD, NULL));
+
+ cl_must_pass(p_chmod("testrepo/new.txt", 0755));
+ cl_git_pass(git_checkout_head(g_repo, &opts));
+
+ cl_git_pass(p_stat("testrepo/new.txt", &st));
+ cl_assert(!GIT_PERMS_IS_EXEC(st.st_mode));
+
+ git_object_free(target);
+}
+
+void test_checkout_head__typechange_index_and_workdir(void)
+{
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_object *target;
+ git_index *index;
+ struct stat st;
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+ cl_git_pass(git_revparse_single(&target, g_repo, "HEAD"));
+ cl_git_pass(git_reset(g_repo, target, GIT_RESET_HARD, NULL));
+
+ cl_must_pass(p_chmod("testrepo/new.txt", 0755));
+ cl_git_pass(git_repository_index(&index, g_repo));
+ cl_git_pass(git_index_add_bypath(index, "new.txt"));
+ cl_git_pass(git_index_write(index));
+ cl_git_pass(git_checkout_head(g_repo, &opts));
+
+ cl_git_pass(p_stat("testrepo/new.txt", &st));
+ cl_assert(!GIT_PERMS_IS_EXEC(st.st_mode));
+
+ git_object_free(target);
+ git_index_free(index);
+}
+
+void test_checkout_head__workdir_filemode_is_simplified(void)
+{
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_object *target, *branch;
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+ cl_git_pass(git_revparse_single(&target, g_repo, "a38d028f71eaa590febb7d716b1ca32350cf70da"));
+ cl_git_pass(git_reset(g_repo, target, GIT_RESET_HARD, NULL));
+
+ cl_must_pass(p_chmod("testrepo/branch_file.txt", 0666));
+
+ /*
+ * Checkout should not fail with a conflict; though the file mode
+ * on disk is literally different to the base (0666 vs 0644), Git
+ * ignores the actual mode and simply treats both as non-executable.
+ */
+ cl_git_pass(git_revparse_single(&branch, g_repo, "099fabac3a9ea935598528c27f866e34089c2eff"));
+
+ opts.checkout_strategy &= ~GIT_CHECKOUT_FORCE;
+ opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
+ cl_git_pass(git_checkout_tree(g_repo, branch, NULL));
+
+ git_object_free(branch);
+ git_object_free(target);
+}
+
+void test_checkout_head__obeys_filemode_true(void)
+{
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_object *target, *branch;
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+ /* In this commit, `README` is executable */
+ cl_git_pass(git_revparse_single(&target, g_repo, "f9ed4af42472941da45a3c"));
+ cl_git_pass(git_reset(g_repo, target, GIT_RESET_HARD, NULL));
+
+ cl_repo_set_bool(g_repo, "core.filemode", true);
+ cl_must_pass(p_chmod("testrepo/README", 0644));
+
+ /*
+ * Checkout will fail with a conflict; the file mode is updated in
+ * the checkout target, but the contents have changed in our branch.
+ */
+ cl_git_pass(git_revparse_single(&branch, g_repo, "099fabac3a9ea935598528c27f866e34089c2eff"));
+
+ opts.checkout_strategy &= ~GIT_CHECKOUT_FORCE;
+ opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
+ cl_git_fail_with(GIT_ECONFLICT, git_checkout_tree(g_repo, branch, NULL));
+
+ git_object_free(branch);
+ git_object_free(target);
+}
+
+void test_checkout_head__obeys_filemode_false(void)
+{
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_object *target, *branch;
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+ /* In this commit, `README` is executable */
+ cl_git_pass(git_revparse_single(&target, g_repo, "f9ed4af42472941da45a3c"));
+ cl_git_pass(git_reset(g_repo, target, GIT_RESET_HARD, NULL));
+
+ cl_repo_set_bool(g_repo, "core.filemode", false);
+ cl_must_pass(p_chmod("testrepo/README", 0644));
+
+ /*
+ * Checkout will fail with a conflict; the file contents are updated
+ * in the checkout target, but the filemode has changed in our branch.
+ */
+ cl_git_pass(git_revparse_single(&branch, g_repo, "099fabac3a9ea935598528c27f866e34089c2eff"));
+
+ opts.checkout_strategy &= ~GIT_CHECKOUT_FORCE;
+ opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
+ cl_git_pass(git_checkout_tree(g_repo, branch, NULL));
+
+ git_object_free(branch);
+ git_object_free(target);
+}
diff --git a/tests/checkout/tree.c b/tests/checkout/tree.c
index 56513eab7..a7e29b3db 100644
--- a/tests/checkout/tree.c
+++ b/tests/checkout/tree.c
@@ -1096,6 +1096,8 @@ void test_checkout_tree__filemode_preserved_in_workdir(void)
cl_assert(!GIT_PERMS_IS_EXEC(read_filemode("a/b.txt")));
git_commit_free(commit);
+#else
+ cl_skip();
#endif
}
diff --git a/tests/checkout/typechange.c b/tests/checkout/typechange.c
index 8a5110caa..647b534b1 100644
--- a/tests/checkout/typechange.c
+++ b/tests/checkout/typechange.c
@@ -1,4 +1,5 @@
#include "clar_libgit2.h"
+#include "diff_generate.h"
#include "git2/checkout.h"
#include "path.h"
#include "posix.h"
@@ -307,3 +308,28 @@ void test_checkout_typechange__checkout_with_conflicts(void)
git_object_free(obj);
}
}
+
+void test_checkout_typechange__status_char(void)
+{
+ size_t i;
+ git_oid oid;
+ git_commit *commit;
+ git_diff *diff;
+ const git_diff_delta *delta;
+ git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
+ char expected[8] = {'M', 'M', 'R', 'T', 'D', 'R', 'A', 'R'};
+
+ git_oid_fromstr(&oid, "9b19edf33a03a0c59cdfc113bfa5c06179bf9b1a");
+ cl_git_pass(git_commit_lookup(&commit, g_repo, &oid));
+ diffopts.flags |= GIT_DIFF_INCLUDE_TYPECHANGE;
+ cl_git_pass(git_diff__commit(&diff, g_repo, commit, &diffopts));
+ cl_git_pass(git_diff_find_similar(diff, NULL));
+
+ for (i = 0; i < git_diff_num_deltas(diff); i++) {
+ delta = git_diff_get_delta(diff, i);
+ cl_assert_equal_i(expected[i], git_diff_status_char(delta->status));
+ }
+
+ git_diff_free(diff);
+ git_commit_free(commit);
+}
diff --git a/tests/config/read.c b/tests/config/read.c
index 25a4fcaf4..a34455a0c 100644
--- a/tests/config/read.c
+++ b/tests/config/read.c
@@ -703,3 +703,48 @@ void test_config_read__path(void)
git_buf_free(&expected_path);
git_config_free(cfg);
}
+
+void test_config_read__crlf_style_line_endings(void)
+{
+ git_buf buf = GIT_BUF_INIT;
+ git_config *cfg;
+
+ cl_set_cleanup(&clean_test_config, NULL);
+ cl_git_mkfile("./testconfig", "[some]\r\n var = value\r\n");
+ cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
+ cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.var"));
+ cl_assert_equal_s(buf.ptr, "value");
+
+ git_config_free(cfg);
+ git_buf_free(&buf);
+}
+
+void test_config_read__trailing_crlf(void)
+{
+ git_buf buf = GIT_BUF_INIT;
+ git_config *cfg;
+
+ cl_set_cleanup(&clean_test_config, NULL);
+ cl_git_mkfile("./testconfig", "[some]\r\n var = value\r\n\r\n");
+ cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
+ cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.var"));
+ cl_assert_equal_s(buf.ptr, "value");
+
+ git_config_free(cfg);
+ git_buf_free(&buf);
+}
+
+void test_config_read__bom(void)
+{
+ git_buf buf = GIT_BUF_INIT;
+ git_config *cfg;
+
+ cl_set_cleanup(&clean_test_config, NULL);
+ cl_git_mkfile("./testconfig", "\xEF\xBB\xBF[some]\n var = value\n");
+ cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
+ cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.var"));
+ cl_assert_equal_s(buf.ptr, "value");
+
+ git_config_free(cfg);
+ git_buf_free(&buf);
+}
diff --git a/tests/diff/rename.c b/tests/diff/rename.c
index c1cd25239..ddc1d5d78 100644
--- a/tests/diff/rename.c
+++ b/tests/diff/rename.c
@@ -16,6 +16,13 @@ void test_diff_rename__cleanup(void)
cl_git_sandbox_cleanup();
}
+#define INITIAL_COMMIT "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2"
+#define COPY_RENAME_COMMIT "2bc7f351d20b53f1c72c16c4b036e491c478c49a"
+#define REWRITE_COPY_COMMIT "1c068dee5790ef1580cfc4cd670915b48d790084"
+#define RENAME_MODIFICATION_COMMIT "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13"
+#define REWRITE_DELETE_COMMIT "84d8efa38af7ace2b302de0adbda16b1f1cd2e1b"
+#define DELETE_RENAME_COMMIT "be053a189b0bbde545e0a3f59ce00b46ad29ce0d"
+
/*
* Renames repo has:
*
@@ -36,12 +43,22 @@ void test_diff_rename__cleanup(void)
* ikeepsix.txt -> ikeepsix.txt (reorder sections in file)
* sixserving.txt -> sixserving.txt (whitespace change - not just indent)
* sevencities.txt -> songof7cities.txt (rename, small text changes)
+ * commit 84d8efa38af7ace2b302de0adbda16b1f1cd2e1b
+ * songof7cities.txt -> songof7citie.txt (major rewrite, <20% match)
+ * ikeepsix.txt -> (deleted)
+ * untimely.txt (no change)
+ * sixserving.txt (no change)
+ * commit be053a189b0bbde545e0a3f59ce00b46ad29ce0d
+ * ikeepsix.txt -> (deleted)
+ * songof7cities.txt -> ikeepsix.txt (rename, 100% match)
+ * untimely.txt (no change)
+ * sixserving.txt (no change)
*/
void test_diff_rename__match_oid(void)
{
- const char *old_sha = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2";
- const char *new_sha = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
+ const char *old_sha = INITIAL_COMMIT;
+ const char *new_sha = COPY_RENAME_COMMIT;
git_tree *old_tree, *new_tree;
git_diff *diff;
git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
@@ -139,8 +156,8 @@ void test_diff_rename__match_oid(void)
void test_diff_rename__checks_options_version(void)
{
- const char *old_sha = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2";
- const char *new_sha = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
+ const char *old_sha = INITIAL_COMMIT;
+ const char *new_sha = COPY_RENAME_COMMIT;
git_tree *old_tree, *new_tree;
git_diff *diff;
git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
@@ -171,9 +188,9 @@ void test_diff_rename__checks_options_version(void)
void test_diff_rename__not_exact_match(void)
{
- const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
- const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084";
- const char *sha2 = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13";
+ const char *sha0 = COPY_RENAME_COMMIT;
+ const char *sha1 = REWRITE_COPY_COMMIT;
+ const char *sha2 = RENAME_MODIFICATION_COMMIT;
git_tree *old_tree, *new_tree;
git_diff *diff;
git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
@@ -433,7 +450,7 @@ void test_diff_rename__test_small_files(void)
void test_diff_rename__working_directory_changes(void)
{
- const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
+ const char *sha0 = COPY_RENAME_COMMIT;
const char *blobsha = "66311f5cfbe7836c27510a3ba2f43e282e2c8bba";
git_oid id;
git_tree *tree;
@@ -592,8 +609,8 @@ void test_diff_rename__working_directory_changes(void)
void test_diff_rename__patch(void)
{
- const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
- const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084";
+ const char *sha0 = COPY_RENAME_COMMIT;
+ const char *sha1 = REWRITE_COPY_COMMIT;
git_tree *old_tree, *new_tree;
git_diff *diff;
git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
@@ -1425,9 +1442,9 @@ void test_diff_rename__can_delete_unmodified_deltas(void)
void test_diff_rename__matches_config_behavior(void)
{
- const char *sha0 = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2";
- const char *sha1 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
- const char *sha2 = "1c068dee5790ef1580cfc4cd670915b48d790084";
+ const char *sha0 = INITIAL_COMMIT;
+ const char *sha1 = COPY_RENAME_COMMIT;
+ const char *sha2 = REWRITE_COPY_COMMIT;
git_tree *tree0, *tree1, *tree2;
git_config *cfg;
@@ -1508,8 +1525,8 @@ void test_diff_rename__matches_config_behavior(void)
void test_diff_rename__can_override_thresholds_when_obeying_config(void)
{
- const char *sha1 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
- const char *sha2 = "1c068dee5790ef1580cfc4cd670915b48d790084";
+ const char *sha1 = COPY_RENAME_COMMIT;
+ const char *sha2 = REWRITE_COPY_COMMIT;
git_tree *tree1, *tree2;
git_config *cfg;
@@ -1563,8 +1580,8 @@ void test_diff_rename__can_override_thresholds_when_obeying_config(void)
void test_diff_rename__by_config_doesnt_mess_with_whitespace_settings(void)
{
- const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084";
- const char *sha2 = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13";
+ const char *sha1 = REWRITE_COPY_COMMIT;
+ const char *sha2 = RENAME_MODIFICATION_COMMIT;
git_tree *tree1, *tree2;
git_config *cfg;
@@ -1710,8 +1727,8 @@ void test_diff_rename__blank_files_not_renamed_when_not_ignoring_whitespace(void
*/
void test_diff_rename__identical(void)
{
- const char *old_sha = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2";
- const char *new_sha = "2bc7f351d20b53f1c72c16c4b036e491c478c49a";
+ const char *old_sha = INITIAL_COMMIT;
+ const char *new_sha = COPY_RENAME_COMMIT;
git_tree *old_tree, *new_tree;
git_diff *diff;
git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
@@ -1748,3 +1765,216 @@ void test_diff_rename__identical(void)
git_tree_free(new_tree);
}
+void test_diff_rename__rewrite_and_delete(void)
+{
+ const char *old_sha = RENAME_MODIFICATION_COMMIT;
+ const char *new_sha = REWRITE_DELETE_COMMIT;
+ git_tree *old_tree, *new_tree;
+ git_diff *diff;
+ git_diff_find_options find_opts = GIT_DIFF_FIND_OPTIONS_INIT;
+ git_buf diff_buf = GIT_BUF_INIT;
+ const char *expected =
+ "diff --git a/ikeepsix.txt b/ikeepsix.txt\n"
+ "deleted file mode 100644\n"
+ "index eaf4a3e..0000000\n"
+ "--- a/ikeepsix.txt\n"
+ "+++ /dev/null\n"
+ "@@ -1,27 +0,0 @@\n"
+ "-I Keep Six Honest Serving-Men\n"
+ "-=============================\n"
+ "-\n"
+ "-She sends'em abroad on her own affairs,\n"
+ "- From the second she opens her eyes—\n"
+ "-One million Hows, two million Wheres,\n"
+ "-And seven million Whys!\n"
+ "-\n"
+ "-I let them rest from nine till five,\n"
+ "- For I am busy then,\n"
+ "-As well as breakfast, lunch, and tea,\n"
+ "- For they are hungry men.\n"
+ "-But different folk have different views;\n"
+ "-I know a person small—\n"
+ "-She keeps ten million serving-men,\n"
+ "-Who get no rest at all!\n"
+ "-\n"
+ "- -- Rudyard Kipling\n"
+ "-\n"
+ "-I KEEP six honest serving-men\n"
+ "- (They taught me all I knew);\n"
+ "-Their names are What and Why and When\n"
+ "- And How and Where and Who.\n"
+ "-I send them over land and sea,\n"
+ "- I send them east and west;\n"
+ "-But after they have worked for me,\n"
+ "- I give them all a rest.\n"
+ "diff --git a/songof7cities.txt b/songof7cities.txt\n"
+ "index 4210ffd..95ceb12 100644\n"
+ "--- a/songof7cities.txt\n"
+ "+++ b/songof7cities.txt\n"
+ "@@ -1,45 +1,45 @@\n"
+ "-The Song of Seven Cities\n"
+ "+THE SONG OF SEVEN CITIES\n"
+ " ------------------------\n"
+ " \n"
+ "-I WAS Lord of Cities very sumptuously builded.\n"
+ "-Seven roaring Cities paid me tribute from afar.\n"
+ "-Ivory their outposts were--the guardrooms of them gilded,\n"
+ "-And garrisoned with Amazons invincible in war.\n"
+ "-\n"
+ "-All the world went softly when it walked before my Cities--\n"
+ "-Neither King nor Army vexed my peoples at their toil,\n"
+ "-Never horse nor chariot irked or overbore my Cities,\n"
+ "-Never Mob nor Ruler questioned whence they drew their spoil.\n"
+ "-\n"
+ "-Banded, mailed and arrogant from sunrise unto sunset;\n"
+ "-Singing while they sacked it, they possessed the land at large.\n"
+ "-Yet when men would rob them, they resisted, they made onset\n"
+ "-And pierced the smoke of battle with a thousand-sabred charge.\n"
+ "-\n"
+ "-So they warred and trafficked only yesterday, my Cities.\n"
+ "-To-day there is no mark or mound of where my Cities stood.\n"
+ "-For the River rose at midnight and it washed away my Cities.\n"
+ "-They are evened with Atlantis and the towns before the Flood.\n"
+ "-\n"
+ "-Rain on rain-gorged channels raised the water-levels round them,\n"
+ "-Freshet backed on freshet swelled and swept their world from sight,\n"
+ "-Till the emboldened floods linked arms and, flashing forward, drowned them--\n"
+ "-Drowned my Seven Cities and their peoples in one night!\n"
+ "-\n"
+ "-Low among the alders lie their derelict foundations,\n"
+ "-The beams wherein they trusted and the plinths whereon they built--\n"
+ "-My rulers and their treasure and their unborn populations,\n"
+ "-Dead, destroyed, aborted, and defiled with mud and silt!\n"
+ "-\n"
+ "-The Daughters of the Palace whom they cherished in my Cities,\n"
+ "-My silver-tongued Princesses, and the promise of their May--\n"
+ "-Their bridegrooms of the June-tide--all have perished in my Cities,\n"
+ "-With the harsh envenomed virgins that can neither love nor play.\n"
+ "-\n"
+ "-I was Lord of Cities--I will build anew my Cities,\n"
+ "-Seven, set on rocks, above the wrath of any flood.\n"
+ "-Nor will I rest from search till I have filled anew my Cities\n"
+ "-With peoples undefeated of the dark, enduring blood.\n"
+ "+I WAS LORD OF CITIES VERY SUMPTUOUSLY BUILDED.\n"
+ "+SEVEN ROARING CITIES PAID ME TRIBUTE FROM AFAR.\n"
+ "+IVORY THEIR OUTPOSTS WERE--THE GUARDROOMS OF THEM GILDED,\n"
+ "+AND GARRISONED WITH AMAZONS INVINCIBLE IN WAR.\n"
+ "+\n"
+ "+ALL THE WORLD WENT SOFTLY WHEN IT WALKED BEFORE MY CITIES--\n"
+ "+NEITHER KING NOR ARMY VEXED MY PEOPLES AT THEIR TOIL,\n"
+ "+NEVER HORSE NOR CHARIOT IRKED OR OVERBORE MY CITIES,\n"
+ "+NEVER MOB NOR RULER QUESTIONED WHENCE THEY DREW THEIR SPOIL.\n"
+ "+\n"
+ "+BANDED, MAILED AND ARROGANT FROM SUNRISE UNTO SUNSET;\n"
+ "+SINGING WHILE THEY SACKED IT, THEY POSSESSED THE LAND AT LARGE.\n"
+ "+YET WHEN MEN WOULD ROB THEM, THEY RESISTED, THEY MADE ONSET\n"
+ "+AND PIERCED THE SMOKE OF BATTLE WITH A THOUSAND-SABRED CHARGE.\n"
+ "+\n"
+ "+SO THEY WARRED AND TRAFFICKED ONLY YESTERDAY, MY CITIES.\n"
+ "+TO-DAY THERE IS NO MARK OR MOUND OF WHERE MY CITIES STOOD.\n"
+ "+FOR THE RIVER ROSE AT MIDNIGHT AND IT WASHED AWAY MY CITIES.\n"
+ "+THEY ARE EVENED WITH ATLANTIS AND THE TOWNS BEFORE THE FLOOD.\n"
+ "+\n"
+ "+RAIN ON RAIN-GORGED CHANNELS RAISED THE WATER-LEVELS ROUND THEM,\n"
+ "+FRESHET BACKED ON FRESHET SWELLED AND SWEPT THEIR WORLD FROM SIGHT,\n"
+ "+TILL THE EMBOLDENED FLOODS LINKED ARMS AND, FLASHING FORWARD, DROWNED THEM--\n"
+ "+DROWNED MY SEVEN CITIES AND THEIR PEOPLES IN ONE NIGHT!\n"
+ "+\n"
+ "+LOW AMONG THE ALDERS LIE THEIR DERELICT FOUNDATIONS,\n"
+ "+THE BEAMS WHEREIN THEY TRUSTED AND THE PLINTHS WHEREON THEY BUILT--\n"
+ "+MY RULERS AND THEIR TREASURE AND THEIR UNBORN POPULATIONS,\n"
+ "+DEAD, DESTROYED, ABORTED, AND DEFILED WITH MUD AND SILT!\n"
+ "+\n"
+ "+THE DAUGHTERS OF THE PALACE WHOM THEY CHERISHED IN MY CITIES,\n"
+ "+MY SILVER-TONGUED PRINCESSES, AND THE PROMISE OF THEIR MAY--\n"
+ "+THEIR BRIDEGROOMS OF THE JUNE-TIDE--ALL HAVE PERISHED IN MY CITIES,\n"
+ "+WITH THE HARSH ENVENOMED VIRGINS THAT CAN NEITHER LOVE NOR PLAY.\n"
+ "+\n"
+ "+I WAS LORD OF CITIES--I WILL BUILD ANEW MY CITIES,\n"
+ "+SEVEN, SET ON ROCKS, ABOVE THE WRATH OF ANY FLOOD.\n"
+ "+NOR WILL I REST FROM SEARCH TILL I HAVE FILLED ANEW MY CITIES\n"
+ "+WITH PEOPLES UNDEFEATED OF THE DARK, ENDURING BLOOD.\n"
+ " \n"
+ " To the sound of trumpets shall their seed restore my Cities\n"
+ " Wealthy and well-weaponed, that once more may I behold\n";
+
+ old_tree = resolve_commit_oid_to_tree(g_repo, old_sha);
+ new_tree = resolve_commit_oid_to_tree(g_repo, new_sha);
+
+ find_opts.flags = GIT_DIFF_FIND_RENAMES_FROM_REWRITES;
+
+ cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, old_tree, new_tree, NULL));
+ cl_git_pass(git_diff_find_similar(diff, &find_opts));
+
+ cl_git_pass(git_diff_to_buf(&diff_buf, diff, GIT_DIFF_FORMAT_PATCH));
+
+ cl_assert_equal_s(expected, diff_buf.ptr);
+
+ git_buf_free(&diff_buf);
+ git_diff_free(diff);
+ git_tree_free(old_tree);
+ git_tree_free(new_tree);
+}
+
+void test_diff_rename__delete_and_rename(void)
+{
+ const char *old_sha = RENAME_MODIFICATION_COMMIT;
+ const char *new_sha = DELETE_RENAME_COMMIT;
+ git_tree *old_tree, *new_tree;
+ git_diff *diff;
+ git_diff_find_options find_opts = GIT_DIFF_FIND_OPTIONS_INIT;
+ git_buf diff_buf = GIT_BUF_INIT;
+ const char *expected =
+ "diff --git a/sixserving.txt b/sixserving.txt\n"
+ "deleted file mode 100644\n"
+ "index f90d4fc..0000000\n"
+ "--- a/sixserving.txt\n"
+ "+++ /dev/null\n"
+ "@@ -1,25 +0,0 @@\n"
+ "-I KEEP six honest serving-men\n"
+ "- (They taught me all I knew);\n"
+ "-Their names are What and Why and When\n"
+ "- And How and Where and Who.\n"
+ "-I send them over land and sea,\n"
+ "- I send them east and west;\n"
+ "-But after they have worked for me,\n"
+ "- I give them all a rest.\n"
+ "-\n"
+ "-I let them rest from nine till five,\n"
+ "- For I am busy then,\n"
+ "-As well as breakfast, lunch, and tea,\n"
+ "- For they are hungry men.\n"
+ "-But different folk have different views;\n"
+ "-I know a person small—\n"
+ "-She keeps ten million serving-men,\n"
+ "-Who get no rest at all!\n"
+ "-\n"
+ "-She sends'em abroad on her own affairs,\n"
+ "- From the second she opens her eyes—\n"
+ "-One million Hows, two million Wheres,\n"
+ "-And seven million Whys!\n"
+ "-\n"
+ "- -- Rudyard Kipling\n"
+ "-\n"
+ "diff --git a/songof7cities.txt b/sixserving.txt\n"
+ "similarity index 100%\n"
+ "rename from songof7cities.txt\n"
+ "rename to sixserving.txt\n";
+
+ old_tree = resolve_commit_oid_to_tree(g_repo, old_sha);
+ new_tree = resolve_commit_oid_to_tree(g_repo, new_sha);
+
+ find_opts.flags = GIT_DIFF_FIND_RENAMES_FROM_REWRITES;
+
+ cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, old_tree, new_tree, NULL));
+ cl_git_pass(git_diff_find_similar(diff, &find_opts));
+
+ cl_git_pass(git_diff_to_buf(&diff_buf, diff, GIT_DIFF_FORMAT_PATCH));
+
+ cl_assert_equal_s(expected, diff_buf.ptr);
+
+ git_buf_free(&diff_buf);
+ git_diff_free(diff);
+ git_tree_free(old_tree);
+ git_tree_free(new_tree);
+}
diff --git a/tests/diff/stats.c b/tests/diff/stats.c
index 3171a4486..347d0d757 100644
--- a/tests/diff/stats.c
+++ b/tests/diff/stats.c
@@ -254,7 +254,7 @@ void test_diff_stats__rename_nochanges_no_find(void)
git_buf_free(&buf);
}
-void test_diff_stats__rename_and_modifiy_no_find(void)
+void test_diff_stats__rename_and_modify_no_find(void)
{
git_buf buf = GIT_BUF_INIT;
const char *stat =
diff --git a/tests/fetchhead/nonetwork.c b/tests/fetchhead/nonetwork.c
index 4dabb577e..a6394600a 100644
--- a/tests/fetchhead/nonetwork.c
+++ b/tests/fetchhead/nonetwork.c
@@ -343,6 +343,29 @@ void test_fetchhead_nonetwork__unborn_with_upstream(void)
cl_fixture_cleanup("./repowithunborn");
}
+void test_fetchhead_nonetwork__fetch_into_repo_with_symrefs(void)
+{
+ git_repository *repo;
+ git_remote *remote;
+ git_reference *symref;
+
+ repo = cl_git_sandbox_init("empty_standard_repo");
+
+ /*
+ * Testing for a specific constellation where the repository has at
+ * least one symbolic reference in its refdb.
+ */
+ cl_git_pass(git_reference_symbolic_create(&symref, repo, "refs/heads/symref", "refs/heads/master", 0, NULL));
+
+ cl_git_pass(git_remote_set_url(repo, "origin", cl_fixture("testrepo.git")));
+ cl_git_pass(git_remote_lookup(&remote, repo, "origin"));
+ cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL));
+
+ git_remote_free(remote);
+ git_reference_free(symref);
+ cl_git_sandbox_cleanup();
+}
+
void test_fetchhead_nonetwork__quote_in_branch_name(void)
{
cl_set_cleanup(&cleanup_repository, "./test1");
diff --git a/tests/index/filemodes.c b/tests/index/filemodes.c
index 2efad5b33..2693b1312 100644
--- a/tests/index/filemodes.c
+++ b/tests/index/filemodes.c
@@ -256,3 +256,65 @@ void test_index_filemodes__invalid(void)
git_index_free(index);
}
+
+void test_index_filemodes__frombuffer_requires_files(void)
+{
+ git_index *index;
+ git_index_entry new_entry;
+ const git_index_entry *ret_entry;
+ const char *content = "hey there\n";
+
+ memset(&new_entry, 0, sizeof(new_entry));
+ cl_git_pass(git_repository_index(&index, g_repo));
+
+ /* regular blob */
+ new_entry.path = "dummy-file.txt";
+ new_entry.mode = GIT_FILEMODE_BLOB;
+
+ cl_git_pass(git_index_add_frombuffer(index,
+ &new_entry, content, strlen(content)));
+
+ cl_assert((ret_entry = git_index_get_bypath(index, "dummy-file.txt", 0)));
+ cl_assert_equal_s("dummy-file.txt", ret_entry->path);
+ cl_assert_equal_i(GIT_FILEMODE_BLOB, ret_entry->mode);
+
+ /* executable blob */
+ new_entry.path = "dummy-file.txt";
+ new_entry.mode = GIT_FILEMODE_BLOB_EXECUTABLE;
+
+ cl_git_pass(git_index_add_frombuffer(index,
+ &new_entry, content, strlen(content)));
+
+ cl_assert((ret_entry = git_index_get_bypath(index, "dummy-file.txt", 0)));
+ cl_assert_equal_s("dummy-file.txt", ret_entry->path);
+ cl_assert_equal_i(GIT_FILEMODE_BLOB_EXECUTABLE, ret_entry->mode);
+
+ /* links are also acceptable */
+ new_entry.path = "dummy-link.txt";
+ new_entry.mode = GIT_FILEMODE_LINK;
+
+ cl_git_pass(git_index_add_frombuffer(index,
+ &new_entry, content, strlen(content)));
+
+ cl_assert((ret_entry = git_index_get_bypath(index, "dummy-link.txt", 0)));
+ cl_assert_equal_s("dummy-link.txt", ret_entry->path);
+ cl_assert_equal_i(GIT_FILEMODE_LINK, ret_entry->mode);
+
+ /* trees are rejected */
+ new_entry.path = "invalid_mode.txt";
+ new_entry.mode = GIT_FILEMODE_TREE;
+
+ cl_git_fail(git_index_add_frombuffer(index,
+ &new_entry, content, strlen(content)));
+ cl_assert_equal_p(NULL, git_index_get_bypath(index, "invalid_mode.txt", 0));
+
+ /* submodules are rejected */
+ new_entry.path = "invalid_mode.txt";
+ new_entry.mode = GIT_FILEMODE_COMMIT;
+
+ cl_git_fail(git_index_add_frombuffer(index,
+ &new_entry, content, strlen(content)));
+ cl_assert_equal_p(NULL, git_index_get_bypath(index, "invalid_mode.txt", 0));
+
+ git_index_free(index);
+}
diff --git a/tests/iterator/iterator_helpers.c b/tests/iterator/iterator_helpers.c
index ae48fcd46..68d574126 100644
--- a/tests/iterator/iterator_helpers.c
+++ b/tests/iterator/iterator_helpers.c
@@ -51,8 +51,7 @@ void expect_iterator_items(
cl_assert(entry->mode != GIT_FILEMODE_TREE);
}
- if (++count >= expected_flat)
- break;
+ cl_assert(++count <= expected_flat);
}
assert_at_end(i, v);
diff --git a/tests/iterator/workdir.c b/tests/iterator/workdir.c
index f33fd98f1..81016752c 100644
--- a/tests/iterator/workdir.c
+++ b/tests/iterator/workdir.c
@@ -610,6 +610,7 @@ void test_iterator_workdir__filesystem2(void)
static const char *expect_base[] = {
"heads/br2",
"heads/dir",
+ "heads/executable",
"heads/ident",
"heads/long-file-name",
"heads/master",
@@ -630,7 +631,7 @@ void test_iterator_workdir__filesystem2(void)
cl_git_pass(git_iterator_for_filesystem(
&i, "testrepo/.git/refs", NULL));
- expect_iterator_items(i, 15, expect_base, 15, expect_base);
+ expect_iterator_items(i, 16, expect_base, 16, expect_base);
git_iterator_free(i);
}
@@ -662,7 +663,7 @@ void test_iterator_workdir__filesystem_gunk(void)
/* should only have 13 items, since we're not asking for trees to be
* returned. the goal of this test is simply to not crash.
*/
- expect_iterator_items(i, 13, NULL, 13, NULL);
+ expect_iterator_items(i, 15, NULL, 15, NULL);
git_iterator_free(i);
git_buf_free(&parent);
}
@@ -741,6 +742,8 @@ void test_iterator_workdir__skips_fifos_and_special_files(void)
cl_assert_equal_i(GIT_ITEROVER, git_iterator_advance(&e, i));
git_iterator_free(i);
+#else
+ cl_skip();
#endif
}
diff --git a/tests/merge/conflict_data.h b/tests/merge/conflict_data.h
index e6394a9e8..27f19c1b0 100644
--- a/tests/merge/conflict_data.h
+++ b/tests/merge/conflict_data.h
@@ -70,22 +70,22 @@
"This is a mighty fine recipe!\n" \
">>>>>>> branchF-2\n"
-#define CONFLICTING_RECURSIVE_H1_TO_H2_WITH_DIFF3 \
+#define CONFLICTING_RECURSIVE_H2_TO_H1_WITH_DIFF3 \
"VEAL SOUP.\n" \
"\n" \
"<<<<<<< HEAD\n" \
- "put into a pot three quarts of water, three onions cut small, one\n" \
- "||||||| merged common ancestors\n" \
- "<<<<<<< Temporary merge branch 1\n" \
- "Put into a pot three quarts of water, THREE ONIONS CUT SMALL, one\n" \
+ "Put Into A Pot Three Quarts of Water, Three Onions Cut Small, One\n" \
"||||||| merged common ancestors\n" \
- "Put into a pot three quarts of water, three onions cut small, one\n" \
- "=======\n" \
+ "<<<<<<<<< Temporary merge branch 1\n" \
"PUT INTO A POT three quarts of water, three onions cut small, one\n" \
- ">>>>>>> Temporary merge branch 2\n" \
+ "||||||||| merged common ancestors\n" \
+ "Put into a pot three quarts of water, three onions cut small, one\n" \
+ "=========\n" \
+ "Put into a pot three quarts of water, THREE ONIONS CUT SMALL, one\n" \
+ ">>>>>>>>> Temporary merge branch 2\n" \
"=======\n" \
- "Put Into A Pot Three Quarts of Water, Three Onions Cut Small, One\n" \
- ">>>>>>> branchH-2\n" \
+ "put into a pot three quarts of water, three onions cut small, one\n" \
+ ">>>>>>> branchH-1\n" \
"spoonful of black pepper pounded, and two of salt, with two or three\n" \
"slices of lean ham; let it boil steadily two hours; skim it\n" \
"occasionally, then put into it a shin of veal, let it boil two hours\n" \
diff --git a/tests/merge/files.c b/tests/merge/files.c
index daa73fada..6f5a1fd9c 100644
--- a/tests/merge/files.c
+++ b/tests/merge/files.c
@@ -377,3 +377,51 @@ void test_merge_files__handles_binaries_when_favored(void)
git_merge_file_result_free(&result);
}
+
+void test_merge_files__crlf_conflict_markers_for_crlf_files(void)
+{
+ git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT,
+ ours = GIT_MERGE_FILE_INPUT_INIT,
+ theirs = GIT_MERGE_FILE_INPUT_INIT;
+ git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT;
+ git_merge_file_result result = {0};
+
+ const char *expected =
+ "<<<<<<< file.txt\r\nThis file\r\ndoes, too.\r\n"
+ "=======\r\nAnd so does\r\nthis one.\r\n>>>>>>> file.txt\r\n";
+ size_t expected_len = strlen(expected);
+
+ const char *expected_diff3 =
+ "<<<<<<< file.txt\r\nThis file\r\ndoes, too.\r\n"
+ "||||||| file.txt\r\nThis file has\r\nCRLF line endings.\r\n"
+ "=======\r\nAnd so does\r\nthis one.\r\n>>>>>>> file.txt\r\n";
+ size_t expected_diff3_len = strlen(expected_diff3);
+
+ ancestor.ptr = "This file has\r\nCRLF line endings.\r\n";
+ ancestor.size = 35;
+ ancestor.path = "file.txt";
+ ancestor.mode = 0100644;
+
+ ours.ptr = "This file\r\ndoes, too.\r\n";
+ ours.size = 23;
+ ours.path = "file.txt";
+ ours.mode = 0100644;
+
+ theirs.ptr = "And so does\r\nthis one.\r\n";
+ theirs.size = 24;
+ theirs.path = "file.txt";
+ theirs.mode = 0100644;
+
+ cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts));
+ cl_assert_equal_i(0, result.automergeable);
+ cl_assert_equal_i(expected_len, result.len);
+ cl_assert(memcmp(expected, result.ptr, expected_len) == 0);
+ git_merge_file_result_free(&result);
+
+ opts.flags |= GIT_MERGE_FILE_STYLE_DIFF3;
+ cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts));
+ cl_assert_equal_i(0, result.automergeable);
+ cl_assert_equal_i(expected_diff3_len, result.len);
+ cl_assert(memcmp(expected_diff3, result.ptr, expected_len) == 0);
+ git_merge_file_result_free(&result);
+}
diff --git a/tests/merge/trees/recursive.c b/tests/merge/trees/recursive.c
index c5b129bf8..71f5af150 100644
--- a/tests/merge/trees/recursive.c
+++ b/tests/merge/trees/recursive.c
@@ -312,7 +312,7 @@ void test_merge_trees_recursive__conflicting_merge_base(void)
{ 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
{ 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
{ 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
- { 0100644, "3a66812fed1e03ea4a6a7ee28d8a57aec1ca6537", 1, "veal.txt" },
+ { 0100644, "cfc01b0976122eae42a82064440bbf534eddd7a0", 1, "veal.txt" },
{ 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 2, "veal.txt" },
{ 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 3, "veal.txt" },
};
@@ -339,14 +339,14 @@ void test_merge_trees_recursive__conflicting_merge_base_with_diff3(void)
{ 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
{ 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
{ 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
- { 0100644, "cd17a91513f3aee9e44114d1ede67932dd41d2fc", 1, "veal.txt" },
- { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 2, "veal.txt" },
- { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 3, "veal.txt" },
+ { 0100644, "0b01d2f70a1c6b9ab60c382f3f9cdc8173da6736", 1, "veal.txt" },
+ { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 2, "veal.txt" },
+ { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 3, "veal.txt" },
};
opts.file_flags |= GIT_MERGE_FILE_STYLE_DIFF3;
- cl_git_pass(merge_commits_from_branches(&index, repo, "branchH-1", "branchH-2", &opts));
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchH-2", "branchH-1", &opts));
cl_assert(merge_test_index(index, merge_index_entries, 8));
@@ -392,19 +392,67 @@ void test_merge_trees_recursive__recursionlimit(void)
{ 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
{ 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
{ 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
- { 0100644, "ce7e553c6feb6e5f3bd67e3c3be04182fe3094b4", 1, "gravy.txt" },
- { 0100644, "d8dd349b78f19a4ebe3357bacb8138f00bf5ed41", 2, "gravy.txt" },
- { 0100644, "e50fbbd701458757bdfe9815f58ed717c588d1b5", 3, "gravy.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
{ 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
- { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
+ { 0100644, "53217e8ac3f52bccf7603b8fff0ed0f4817f9bb7", 1, "veal.txt" },
+ { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 2, "veal.txt" },
+ { 0100644, "68a2e1ee61a23a4728fe6b35580fbbbf729df370", 3, "veal.txt" },
};
opts.recursion_limit = 1;
- cl_git_pass(merge_commits_from_branches(&index, repo, "branchE-1", "branchE-2", &opts));
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchC-1", "branchC-2", &opts));
cl_assert(merge_test_index(index, merge_index_entries, 8));
git_index_free(index);
}
+/* There are multiple levels of criss-cross merges. This ensures
+ * that the virtual merge base parents are compared in the same
+ * order as git. If the base parents are created in the order as
+ * git does, then the file `targetfile.txt` is automerged. If not,
+ * `targetfile.txt` will be in conflict due to the virtual merge
+ * base.
+ */
+void test_merge_trees_recursive__merge_base_for_virtual_commit(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "1bde1883de4977ea3e664b315da951d1f614c3b1", 0, "targetfile.txt" },
+ { 0100644, "b7de2b52ba055688061355fad1599a5d214ce8f8", 1, "version.txt" },
+ { 0100644, "358efd6f589384fa8baf92234db9c7899a53916e", 2, "version.txt" },
+ { 0100644, "a664873b1c0b9a1ed300f8644dde536fdaa3a34f", 3, "version.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchJ-1", "branchJ-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 4));
+
+ git_index_free(index);
+}
+
+/* This test is the same as above, but the graph is constructed such
+ * that the 1st-recursion merge bases of the two heads are
+ * in a different order.
+ */
+void test_merge_trees_recursive__merge_base_for_virtual_commit_2(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "4a06b258fed8a4d15967ec4253ae7366b70f727d", 0, "targetfile.txt" },
+ { 0100644, "b6bd0f9952f396e757d3f91e08c59a7e91707201", 1, "version.txt" },
+ { 0100644, "f0856993e005c0d8ed2dc7cdc222cc1d89fb3c77", 2, "version.txt" },
+ { 0100644, "2cba583804a4a6fad1baf97c959be447238d1489", 3, "version.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchK-1", "branchK-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 4));
+
+ git_index_free(index);
+}
diff --git a/tests/merge/workdir/recursive.c b/tests/merge/workdir/recursive.c
index 795126255..d47a0c50b 100644
--- a/tests/merge/workdir/recursive.c
+++ b/tests/merge/workdir/recursive.c
@@ -44,7 +44,7 @@ void test_merge_workdir_recursive__writes_conflict_with_virtual_base(void)
cl_git_pass(git_futils_readbuffer(&conflicting_buf, "merge-recursive/veal.txt"));
cl_assert_equal_s(CONFLICTING_RECURSIVE_F1_TO_F2, conflicting_buf.ptr);
-
+
git_index_free(index);
git_buf_free(&conflicting_buf);
}
@@ -62,22 +62,22 @@ void test_merge_workdir_recursive__conflicting_merge_base_with_diff3(void)
{ 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
{ 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
{ 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
- { 0100644, "cd17a91513f3aee9e44114d1ede67932dd41d2fc", 1, "veal.txt" },
- { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 2, "veal.txt" },
- { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 3, "veal.txt" },
+ { 0100644, "0b01d2f70a1c6b9ab60c382f3f9cdc8173da6736", 1, "veal.txt" },
+ { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 2, "veal.txt" },
+ { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 3, "veal.txt" },
};
opts.file_flags |= GIT_MERGE_FILE_STYLE_DIFF3;
checkout_opts.checkout_strategy |= GIT_CHECKOUT_CONFLICT_STYLE_DIFF3;
- cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR "branchH-1", GIT_REFS_HEADS_DIR "branchH-2", &opts, &checkout_opts));
+ cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR "branchH-2", GIT_REFS_HEADS_DIR "branchH-1", &opts, &checkout_opts));
cl_git_pass(git_repository_index(&index, repo));
cl_assert(merge_test_index(index, merge_index_entries, 8));
cl_git_pass(git_futils_readbuffer(&conflicting_buf, "merge-recursive/veal.txt"));
- cl_assert_equal_s(CONFLICTING_RECURSIVE_H1_TO_H2_WITH_DIFF3, conflicting_buf.ptr);
+ cl_assert_equal_s(CONFLICTING_RECURSIVE_H2_TO_H1_WITH_DIFF3, conflicting_buf.ptr);
git_index_free(index);
git_buf_free(&conflicting_buf);
diff --git a/tests/message/trailer.c b/tests/message/trailer.c
new file mode 100644
index 000000000..9cc83de72
--- /dev/null
+++ b/tests/message/trailer.c
@@ -0,0 +1,165 @@
+#include "clar_libgit2.h"
+#include "message.h"
+
+static void assert_trailers(const char *message, git_message_trailer *trailers)
+{
+ git_message_trailer_array arr;
+ size_t i;
+
+ int rc = git_message_trailers(&arr, message);
+
+ cl_assert_equal_i(0, rc);
+
+ for(i=0; i<arr.count; i++) {
+ cl_assert_equal_s(arr.trailers[i].key, trailers[i].key);
+ cl_assert_equal_s(arr.trailers[i].value, trailers[i].value);
+ }
+
+ cl_assert_equal_i(0, rc);
+
+ git_message_trailer_array_free(&arr);
+}
+
+void test_message_trailer__simple(void)
+{
+ git_message_trailer trailers[] = {
+ {"Signed-off-by", "foo@bar.com"},
+ {"Signed-off-by", "someone@else.com"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Signed-off-by: foo@bar.com\n"
+ "Signed-off-by: someone@else.com\n"
+ , trailers);
+}
+
+void test_message_trailer__no_whitespace(void)
+{
+ git_message_trailer trailers[] = {
+ {"Key", "value"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Key:value\n"
+ , trailers);
+}
+
+void test_message_trailer__extra_whitespace(void)
+{
+ git_message_trailer trailers[] = {
+ {"Key", "value"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Key : value\n"
+ , trailers);
+}
+
+void test_message_trailer__no_newline(void)
+{
+ git_message_trailer trailers[] = {
+ {"Key", "value"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Key: value"
+ , trailers);
+}
+
+void test_message_trailer__not_last_paragraph(void)
+{
+ git_message_trailer trailers[] = {
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Key: value\n"
+ "\n"
+ "More stuff\n"
+ , trailers);
+}
+
+void test_message_trailer__conflicts(void)
+{
+ git_message_trailer trailers[] = {
+ {"Key", "value"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Key: value\n"
+ "\n"
+ "Conflicts:\n"
+ "\tfoo.c\n"
+ , trailers);
+}
+
+void test_message_trailer__patch(void)
+{
+ git_message_trailer trailers[] = {
+ {"Key", "value"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Key: value\n"
+ "\n"
+ "---\n"
+ "More: stuff\n"
+ , trailers);
+}
+
+void test_message_trailer__continuation(void)
+{
+ git_message_trailer trailers[] = {
+ {"A", "b\n c"},
+ {"D", "e\n f: g h"},
+ {"I", "j"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "A: b\n"
+ " c\n"
+ "D: e\n"
+ " f: g h\n"
+ "I: j\n"
+ , trailers);
+}
+
+void test_message_trailer__invalid(void)
+{
+ git_message_trailer trailers[] = {
+ {"Signed-off-by", "some@one.com"},
+ {"Another", "trailer"},
+ {NULL, NULL},
+ };
+
+ assert_trailers(
+ "Message\n"
+ "\n"
+ "Signed-off-by: some@one.com\n"
+ "Not a trailer\n"
+ "Another: trailer\n"
+ , trailers);
+}
diff --git a/tests/network/fetchlocal.c b/tests/network/fetchlocal.c
index 17c8f26e3..91e2a0595 100644
--- a/tests/network/fetchlocal.c
+++ b/tests/network/fetchlocal.c
@@ -314,12 +314,6 @@ void test_network_fetchlocal__prune_tag(void)
git_repository_free(repo);
}
-static void cleanup_sandbox(void *unused)
-{
- GIT_UNUSED(unused);
- cl_git_sandbox_cleanup();
-}
-
void test_network_fetchlocal__partial(void)
{
git_repository *repo = cl_git_sandbox_init("partial-testrepo");
@@ -332,7 +326,6 @@ void test_network_fetchlocal__partial(void)
options.callbacks.transfer_progress = transfer_cb;
options.callbacks.payload = &callcount;
- cl_set_cleanup(&cleanup_sandbox, NULL);
cl_git_pass(git_reference_list(&refnames, repo));
cl_assert_equal_i(1, (int)refnames.count);
@@ -420,7 +413,6 @@ void test_network_fetchlocal__multi_remotes(void)
git_strarray refnames = {0};
git_fetch_options options = GIT_FETCH_OPTIONS_INIT;
- cl_set_cleanup(&cleanup_sandbox, NULL);
options.callbacks.transfer_progress = transfer_cb;
cl_git_pass(git_remote_set_url(repo, "test", cl_git_fixture_url("testrepo.git")));
cl_git_pass(git_remote_lookup(&test, repo, "test"));
diff --git a/tests/object/tree/write.c b/tests/object/tree/write.c
index a9decf9c1..a1ee03d6d 100644
--- a/tests/object/tree/write.c
+++ b/tests/object/tree/write.c
@@ -495,6 +495,7 @@ static void test_inserting_submodule(void)
git_treebuilder *bld;
git_oid sm_id;
+ cl_git_pass(git_oid_fromstr(&sm_id, "da39a3ee5e6b4b0d3255bfef95601890afd80709"));
cl_git_pass(git_treebuilder_new(&bld, g_repo, NULL));
cl_git_pass(git_treebuilder_insert(NULL, bld, "sm", &sm_id, GIT_FILEMODE_COMMIT));
git_treebuilder_free(bld);
@@ -512,3 +513,14 @@ void test_object_tree_write__object_validity(void)
test_inserting_submodule();
}
+void test_object_tree_write__invalid_null_oid(void)
+{
+ git_treebuilder *bld;
+ git_oid null_oid = {{0}};
+
+ cl_git_pass(git_treebuilder_new(&bld, g_repo, NULL));
+ cl_git_fail(git_treebuilder_insert(NULL, bld, "null_oid_file", &null_oid, GIT_FILEMODE_BLOB));
+ cl_assert(giterr_last() && strstr(giterr_last()->message, "null OID") != NULL);
+
+ git_treebuilder_free(bld);
+}
diff --git a/tests/odb/backend/mempack.c b/tests/odb/backend/mempack.c
new file mode 100644
index 000000000..624f0e604
--- /dev/null
+++ b/tests/odb/backend/mempack.c
@@ -0,0 +1,60 @@
+#include "clar_libgit2.h"
+#include "repository.h"
+#include "backend_helpers.h"
+#include "git2/sys/mempack.h"
+
+static git_odb *_odb;
+static git_oid _oid;
+static git_odb_object *_obj;
+static git_repository *_repo;
+
+void test_odb_backend_mempack__initialize(void)
+{
+ git_odb_backend *backend;
+
+ cl_git_pass(git_mempack_new(&backend));
+ cl_git_pass(git_odb_new(&_odb));
+ cl_git_pass(git_odb_add_backend(_odb, backend, 10));
+ cl_git_pass(git_repository_wrap_odb(&_repo, _odb));
+}
+
+void test_odb_backend_mempack__cleanup(void)
+{
+ git_odb_object_free(_obj);
+ git_odb_free(_odb);
+ git_repository_free(_repo);
+}
+
+void test_odb_backend_mempack__write_succeeds(void)
+{
+ const char *data = "data";
+ cl_git_pass(git_odb_write(&_oid, _odb, data, strlen(data) + 1, GIT_OBJ_BLOB));
+ cl_git_pass(git_odb_read(&_obj, _odb, &_oid));
+}
+
+void test_odb_backend_mempack__read_of_missing_object_fails(void)
+{
+ cl_git_pass(git_oid_fromstr(&_oid, "f6ea0495187600e7b2288c8ac19c5886383a4633"));
+ cl_git_fail_with(GIT_ENOTFOUND, git_odb_read(&_obj, _odb, &_oid));
+}
+
+void test_odb_backend_mempack__exists_of_missing_object_fails(void)
+{
+ cl_git_pass(git_oid_fromstr(&_oid, "f6ea0495187600e7b2288c8ac19c5886383a4633"));
+ cl_assert(git_odb_exists(_odb, &_oid) == 0);
+}
+
+void test_odb_backend_mempack__exists_with_existing_objects_succeeds(void)
+{
+ const char *data = "data";
+ cl_git_pass(git_odb_write(&_oid, _odb, data, strlen(data) + 1, GIT_OBJ_BLOB));
+ cl_assert(git_odb_exists(_odb, &_oid) == 1);
+}
+
+void test_odb_backend_mempack__blob_create_frombuffer_succeeds(void)
+{
+ const char *data = "data";
+
+ cl_git_pass(git_blob_create_frombuffer(&_oid, _repo, data, strlen(data) + 1));
+ cl_assert(git_odb_exists(_odb, &_oid) == 1);
+}
diff --git a/tests/odb/backend/simple.c b/tests/odb/backend/simple.c
index c0fcd403b..f4d29cc76 100644
--- a/tests/odb/backend/simple.c
+++ b/tests/odb/backend/simple.c
@@ -230,3 +230,21 @@ void test_odb_backend_simple__exists_with_highly_ambiguous_prefix(void)
cl_git_pass(git_odb_exists_prefix(&found, _odb, &_oid, 40));
cl_assert(git_oid_equal(&found, &_oid));
}
+
+void test_odb_backend_simple__null_oid_is_ignored(void)
+{
+ const fake_object objs[] = {
+ { "0000000000000000000000000000000000000000", "null oid content" },
+ { NULL, NULL }
+ };
+ git_oid null_oid = {{0}};
+ git_odb_object *obj;
+
+ setup_backend(objs);
+
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 0));
+ cl_assert(!git_odb_exists(_odb, &null_oid));
+
+ cl_git_fail_with(GIT_ENOTFOUND, git_odb_read(&obj, _odb, &null_oid));
+ cl_assert(giterr_last() && strstr(giterr_last()->message, "null OID"));
+}
diff --git a/tests/odb/largefiles.c b/tests/odb/largefiles.c
index 22f136df5..a5b982e14 100644
--- a/tests/odb/largefiles.c
+++ b/tests/odb/largefiles.c
@@ -1,5 +1,9 @@
#include "clar_libgit2.h"
#include "git2/odb_backend.h"
+#include "hash.h"
+#include "odb.h"
+
+#define LARGEFILE_SIZE 5368709122
static git_repository *repo;
static git_odb *odb;
@@ -25,7 +29,7 @@ static void writefile(git_oid *oid)
for (i = 0; i < 3041; i++)
cl_git_pass(git_buf_puts(&buf, "Hello, world.\n"));
- cl_git_pass(git_odb_open_wstream(&stream, odb, 5368709122, GIT_OBJ_BLOB));
+ cl_git_pass(git_odb_open_wstream(&stream, odb, LARGEFILE_SIZE, GIT_OBJ_BLOB));
for (i = 0; i < 126103; i++)
cl_git_pass(git_odb_stream_write(stream, buf.ptr, buf.size));
@@ -63,6 +67,10 @@ void test_odb_largefiles__streamwrite(void)
{
git_oid expected, oid;
+#ifndef GIT_ARCH_64
+ cl_skip();
+#endif
+
if (!cl_is_env_set("GITTEST_INVASIVE_FS_SIZE") ||
!cl_is_env_set("GITTEST_SLOW"))
cl_skip();
@@ -73,6 +81,52 @@ void test_odb_largefiles__streamwrite(void)
cl_assert_equal_oid(&expected, &oid);
}
+void test_odb_largefiles__streamread(void)
+{
+ git_oid oid, read_oid;
+ git_odb_stream *stream;
+ char buf[10240];
+ char hdr[64];
+ size_t len, hdr_len, total = 0;
+ git_hash_ctx hash;
+ git_otype type;
+ int ret;
+
+#ifndef GIT_ARCH_64
+ cl_skip();
+#endif
+
+ if (!cl_is_env_set("GITTEST_INVASIVE_FS_SIZE") ||
+ !cl_is_env_set("GITTEST_SLOW"))
+ cl_skip();
+
+ writefile(&oid);
+
+ cl_git_pass(git_odb_open_rstream(&stream, &len, &type, odb, &oid));
+
+ cl_assert_equal_sz(LARGEFILE_SIZE, len);
+ cl_assert_equal_i(GIT_OBJ_BLOB, type);
+
+ cl_git_pass(git_hash_ctx_init(&hash));
+ cl_git_pass(git_odb__format_object_header(&hdr_len, hdr, sizeof(hdr), len, type));
+
+ cl_git_pass(git_hash_update(&hash, hdr, hdr_len));
+
+ while ((ret = git_odb_stream_read(stream, buf, 10240)) > 0) {
+ cl_git_pass(git_hash_update(&hash, buf, ret));
+ total += ret;
+ }
+
+ cl_assert_equal_sz(LARGEFILE_SIZE, total);
+
+ git_hash_final(&read_oid, &hash);
+
+ cl_assert_equal_oid(&oid, &read_oid);
+
+ git_hash_ctx_cleanup(&hash);
+ git_odb_stream_free(stream);
+}
+
void test_odb_largefiles__read_into_memory(void)
{
git_oid oid;
@@ -112,3 +166,24 @@ void test_odb_largefiles__read_into_memory_rejected_on_32bit(void)
git_odb_object_free(obj);
}
+
+void test_odb_largefiles__read_header(void)
+{
+ git_oid oid;
+ size_t len;
+ git_otype type;
+
+#ifndef GIT_ARCH_64
+ cl_skip();
+#endif
+
+ if (!cl_is_env_set("GITTEST_INVASIVE_FS_SIZE") ||
+ !cl_is_env_set("GITTEST_SLOW"))
+ cl_skip();
+
+ writefile(&oid);
+ cl_git_pass(git_odb_read_header(&len, &type, odb, &oid));
+
+ cl_assert_equal_sz(LARGEFILE_SIZE, len);
+ cl_assert_equal_i(GIT_OBJ_BLOB, type);
+}
diff --git a/tests/odb/loose.c b/tests/odb/loose.c
index 2e24d6723..83d080729 100644
--- a/tests/odb/loose.c
+++ b/tests/odb/loose.c
@@ -55,6 +55,63 @@ static void test_read_object(object_data *data)
git_odb_free(odb);
}
+static void test_read_header(object_data *data)
+{
+ git_oid id;
+ git_odb *odb;
+ size_t len;
+ git_otype type;
+
+ write_object_files(data);
+
+ cl_git_pass(git_odb_open(&odb, "test-objects"));
+ cl_git_pass(git_oid_fromstr(&id, data->id));
+ cl_git_pass(git_odb_read_header(&len, &type, odb, &id));
+
+ cl_assert_equal_sz(data->dlen, len);
+ cl_assert_equal_i(git_object_string2type(data->type), type);
+
+ git_odb_free(odb);
+}
+
+static void test_readstream_object(object_data *data, size_t blocksize)
+{
+ git_oid id;
+ git_odb *odb;
+ git_odb_stream *stream;
+ git_rawobj tmp;
+ char buf[2048], *ptr = buf;
+ size_t remain;
+ int ret;
+
+ write_object_files(data);
+
+ cl_git_pass(git_odb_open(&odb, "test-objects"));
+ cl_git_pass(git_oid_fromstr(&id, data->id));
+ cl_git_pass(git_odb_open_rstream(&stream, &tmp.len, &tmp.type, odb, &id));
+
+ remain = tmp.len;
+
+ while (remain) {
+ cl_assert((ret = git_odb_stream_read(stream, ptr, blocksize)) >= 0);
+ if (ret == 0)
+ break;
+
+ cl_assert(remain >= (size_t)ret);
+ remain -= ret;
+ ptr += ret;
+ }
+
+ cl_assert(remain == 0);
+
+ tmp.data = buf;
+
+ cmp_objects(&tmp, data);
+
+ git_odb_stream_free(stream);
+ git_odb_free(odb);
+}
+
void test_odb_loose__initialize(void)
{
p_fsync__cnt = 0;
@@ -103,6 +160,33 @@ void test_odb_loose__simple_reads(void)
test_read_object(&some);
}
+void test_odb_loose__streaming_reads(void)
+{
+ size_t blocksizes[] = { 1, 2, 4, 16, 99, 1024, 123456789 };
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(blocksizes); i++) {
+ test_readstream_object(&commit, blocksizes[i]);
+ test_readstream_object(&tree, blocksizes[i]);
+ test_readstream_object(&tag, blocksizes[i]);
+ test_readstream_object(&zero, blocksizes[i]);
+ test_readstream_object(&one, blocksizes[i]);
+ test_readstream_object(&two, blocksizes[i]);
+ test_readstream_object(&some, blocksizes[i]);
+ }
+}
+
+void test_odb_loose__read_header(void)
+{
+ test_read_header(&commit);
+ test_read_header(&tree);
+ test_read_header(&tag);
+ test_read_header(&zero);
+ test_read_header(&one);
+ test_read_header(&two);
+ test_read_header(&some);
+}
+
void test_write_object_permission(
mode_t dir_mode, mode_t file_mode,
mode_t expected_dir_mode, mode_t expected_file_mode)
diff --git a/tests/online/clone.c b/tests/online/clone.c
index 5eda73f87..43106145c 100644
--- a/tests/online/clone.c
+++ b/tests/online/clone.c
@@ -28,6 +28,9 @@ static char *_remote_proxy_url = NULL;
static char *_remote_proxy_user = NULL;
static char *_remote_proxy_pass = NULL;
+static int _orig_proxies_need_reset = 0;
+static char *_orig_http_proxy = NULL;
+static char *_orig_https_proxy = NULL;
void test_online_clone__initialize(void)
{
@@ -52,6 +55,8 @@ void test_online_clone__initialize(void)
_remote_proxy_url = cl_getenv("GITTEST_REMOTE_PROXY_URL");
_remote_proxy_user = cl_getenv("GITTEST_REMOTE_PROXY_USER");
_remote_proxy_pass = cl_getenv("GITTEST_REMOTE_PROXY_PASS");
+
+ _orig_proxies_need_reset = 0;
}
void test_online_clone__cleanup(void)
@@ -72,6 +77,14 @@ void test_online_clone__cleanup(void)
git__free(_remote_proxy_url);
git__free(_remote_proxy_user);
git__free(_remote_proxy_pass);
+
+ if (_orig_proxies_need_reset) {
+ cl_setenv("HTTP_PROXY", _orig_http_proxy);
+ cl_setenv("HTTPS_PROXY", _orig_https_proxy);
+
+ git__free(_orig_http_proxy);
+ git__free(_orig_https_proxy);
+ }
}
void test_online_clone__network_full(void)
@@ -263,8 +276,8 @@ static int cred_failure_cb(
void test_online_clone__cred_callback_failure_return_code_is_tunnelled(void)
{
- if (!_remote_url || !_remote_user)
- clar__skip();
+ _remote_url = git__strdup("https://github.com/libgit2/non-existent");
+ _remote_user = git__strdup("libgit2test");
g_options.fetch_opts.callbacks.credentials = cred_failure_cb;
@@ -293,8 +306,8 @@ void test_online_clone__cred_callback_called_again_on_auth_failure(void)
{
size_t counter = 0;
- if (!_remote_url || !_remote_user)
- clar__skip();
+ _remote_url = git__strdup("https://github.com/libgit2/non-existent");
+ _remote_user = git__strdup("libgit2test");
g_options.fetch_opts.callbacks.credentials = cred_count_calls_cb;
g_options.fetch_opts.callbacks.payload = &counter;
@@ -348,7 +361,7 @@ void test_online_clone__credentials(void)
void test_online_clone__bitbucket_style(void)
{
git_cred_userpass_payload user_pass = {
- "libgit2", "libgit2"
+ "libgit3", "libgit3"
};
g_options.fetch_opts.callbacks.credentials = git_cred_userpass;
@@ -357,15 +370,45 @@ void test_online_clone__bitbucket_style(void)
cl_git_pass(git_clone(&g_repo, BB_REPO_URL, "./foo", &g_options));
git_repository_free(g_repo); g_repo = NULL;
cl_fixture_cleanup("./foo");
+}
+
+void test_online_clone__bitbucket_uses_creds_in_url(void)
+{
+ git_cred_userpass_payload user_pass = {
+ "libgit2", "wrong"
+ };
+
+ g_options.fetch_opts.callbacks.credentials = git_cred_userpass;
+ g_options.fetch_opts.callbacks.payload = &user_pass;
- /* User and pass from URL */
- user_pass.password = "wrong";
+ /*
+ * Correct user and pass are in the URL; the (incorrect) creds in
+ * the `git_cred_userpass_payload` should be ignored.
+ */
cl_git_pass(git_clone(&g_repo, BB_REPO_URL_WITH_PASS, "./foo", &g_options));
git_repository_free(g_repo); g_repo = NULL;
cl_fixture_cleanup("./foo");
+}
+
+void test_online_clone__bitbucket_falls_back_to_specified_creds(void)
+{
+ git_cred_userpass_payload user_pass = {
+ "libgit2", "libgit2"
+ };
+
+ g_options.fetch_opts.callbacks.credentials = git_cred_userpass;
+ g_options.fetch_opts.callbacks.payload = &user_pass;
- /* Wrong password in URL, fall back to user_pass */
- user_pass.password = "libgit2";
+ /*
+ * TODO: as of March 2018, bitbucket sporadically fails with
+ * 403s instead of replying with a 401 - but only sometimes.
+ */
+ cl_skip();
+
+ /*
+ * Incorrect user and pass are in the URL; the (correct) creds in
+ * the `git_cred_userpass_payload` should be used as a fallback.
+ */
cl_git_pass(git_clone(&g_repo, BB_REPO_URL_WITH_WRONG_PASS, "./foo", &g_options));
git_repository_free(g_repo); g_repo = NULL;
cl_fixture_cleanup("./foo");
@@ -677,25 +720,60 @@ static int proxy_creds(git_cred **out, const char *url, const char *username, un
void test_online_clone__proxy_credentials_request(void)
{
+ git_buf url = GIT_BUF_INIT;
+
if (!_remote_proxy_url || !_remote_proxy_user || !_remote_proxy_pass)
cl_skip();
+ cl_git_pass(git_buf_printf(&url, "http://%s/", _remote_proxy_url));
+
g_options.fetch_opts.proxy_opts.type = GIT_PROXY_SPECIFIED;
- g_options.fetch_opts.proxy_opts.url = _remote_proxy_url;
+ g_options.fetch_opts.proxy_opts.url = url.ptr;
g_options.fetch_opts.proxy_opts.credentials = proxy_creds;
called_proxy_creds = 0;
cl_git_pass(git_clone(&g_repo, "http://github.com/libgit2/TestGitRepository", "./foo", &g_options));
cl_assert(called_proxy_creds);
+
+ git_buf_free(&url);
}
void test_online_clone__proxy_credentials_in_url(void)
{
- if (!_remote_proxy_url)
+ git_buf url = GIT_BUF_INIT;
+
+ if (!_remote_proxy_url || !_remote_proxy_user || !_remote_proxy_pass)
cl_skip();
+ cl_git_pass(git_buf_printf(&url, "http://%s:%s@%s/", _remote_proxy_user, _remote_proxy_pass, _remote_proxy_url));
+
g_options.fetch_opts.proxy_opts.type = GIT_PROXY_SPECIFIED;
- g_options.fetch_opts.proxy_opts.url = _remote_proxy_url;
+ g_options.fetch_opts.proxy_opts.url = url.ptr;
called_proxy_creds = 0;
cl_git_pass(git_clone(&g_repo, "http://github.com/libgit2/TestGitRepository", "./foo", &g_options));
cl_assert(called_proxy_creds == 0);
+
+ git_buf_free(&url);
+}
+
+void test_online_clone__proxy_credentials_in_environment(void)
+{
+ git_buf url = GIT_BUF_INIT;
+
+ if (!_remote_proxy_url || !_remote_proxy_user || !_remote_proxy_pass)
+ cl_skip();
+
+ _orig_http_proxy = cl_getenv("HTTP_PROXY");
+ _orig_https_proxy = cl_getenv("HTTPS_PROXY");
+ _orig_proxies_need_reset = 1;
+
+ g_options.fetch_opts.proxy_opts.type = GIT_PROXY_AUTO;
+
+ cl_git_pass(git_buf_printf(&url, "http://%s:%s@%s/", _remote_proxy_user, _remote_proxy_pass, _remote_proxy_url));
+
+ cl_setenv("HTTP_PROXY", url.ptr);
+ cl_setenv("HTTPS_PROXY", url.ptr);
+
+ cl_git_pass(git_clone(&g_repo, "http://github.com/libgit2/TestGitRepository", "./foo", &g_options));
+
+ git_buf_free(&url);
}
diff --git a/tests/perf/merge.c b/tests/perf/merge.c
index b2ef082eb..721902d63 100644
--- a/tests/perf/merge.c
+++ b/tests/perf/merge.c
@@ -25,20 +25,7 @@
#define ID_BRANCH_A "d853fb9f24e0fe63b3dce9fbc04fd9cfe17a030b"
#define ID_BRANCH_B "1ce9ea3ba9b4fa666602d52a5281d41a482cc58b"
-
-void test_perf_merge__initialize(void)
-{
-}
-
-void test_perf_merge__cleanup(void)
-{
-}
-
void test_perf_merge__m1(void)
{
-#if 1
- cl_skip();
-#else
perf__do_merge(SRC_REPO, "m1", ID_BRANCH_A, ID_BRANCH_B);
-#endif
}
diff --git a/tests/refs/dup.c b/tests/refs/dup.c
index 0fc635a7a..8a89cd95c 100644
--- a/tests/refs/dup.c
+++ b/tests/refs/dup.c
@@ -21,6 +21,7 @@ void test_refs_dup__direct(void)
cl_git_pass(git_reference_dup(&b, a));
cl_assert(git_reference_cmp(a, b) == 0);
+ cl_assert(git_reference_owner(b) == g_repo);
git_reference_free(b);
git_reference_free(a);
@@ -34,6 +35,7 @@ void test_refs_dup__symbolic(void)
cl_git_pass(git_reference_dup(&b, a));
cl_assert(git_reference_cmp(a, b) == 0);
+ cl_assert(git_reference_owner(b) == g_repo);
git_reference_free(b);
git_reference_free(a);
diff --git a/tests/refs/iterator.c b/tests/refs/iterator.c
index 56f6ce505..18e9d1d5b 100644
--- a/tests/refs/iterator.c
+++ b/tests/refs/iterator.c
@@ -213,6 +213,7 @@ void test_refs_iterator__foreach_name(void)
git_vector_foreach(&output, i, name) {
cl_assert(refnames[i] != NULL);
cl_assert_equal_s(refnames[i], name);
+ git__free(name);
}
git_vector_free(&output);
diff --git a/tests/refs/list.c b/tests/refs/list.c
index f7ca3f707..97461fd69 100644
--- a/tests/refs/list.c
+++ b/tests/refs/list.c
@@ -36,7 +36,7 @@ void test_refs_list__all(void)
/* We have exactly 12 refs in total if we include the packed ones:
* there is a reference that exists both in the packfile and as
* loose, but we only list it once */
- cl_assert_equal_i((int)ref_list.count, 17);
+ cl_assert_equal_i((int)ref_list.count, 18);
git_strarray_free(&ref_list);
}
@@ -51,7 +51,7 @@ void test_refs_list__do_not_retrieve_references_which_name_end_with_a_lock_exten
"144344043ba4d4a405da03de3844aa829ae8be0e\n");
cl_git_pass(git_reference_list(&ref_list, g_repo));
- cl_assert_equal_i((int)ref_list.count, 17);
+ cl_assert_equal_i((int)ref_list.count, 18);
git_strarray_free(&ref_list);
}
diff --git a/tests/repo/open.c b/tests/repo/open.c
index 3239b6fec..ab36dd587 100644
--- a/tests/repo/open.c
+++ b/tests/repo/open.c
@@ -180,6 +180,8 @@ void test_repo_open__from_git_new_workdir(void)
cl_assert_(git__suffixcmp(git_repository_workdir(repo2), "alternate/") == 0, git_repository_workdir(repo2));
git_repository_free(repo2);
+#else
+ cl_skip();
#endif
}
diff --git a/tests/resources/crlf_data/README b/tests/resources/crlf_data/README
new file mode 100644
index 000000000..2347e126f
--- /dev/null
+++ b/tests/resources/crlf_data/README
@@ -0,0 +1,2 @@
+This test data was generated using the `tests/resources/generate_crlf.sh`
+script. Please see that script for usage information.
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf
index 85340755c..af6fcf6da 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf
@@ -1,4 +1,4 @@
-one
-two
-three
-four
+one
+two
+three
+four
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr
index fd2abfa9d..203555c56 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
index fd2abfa9d..aaf083a9c 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr
index df8c0f680..d11e7ef63 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf
index df8c0f680..417786fc3 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf
index 85340755c..af6fcf6da 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf
@@ -1,4 +1,4 @@
-one
-two
-three
-four
+one
+two
+three
+four
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr
index fd2abfa9d..203555c56 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
index fd2abfa9d..aaf083a9c 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr
index df8c0f680..d11e7ef63 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf
index df8c0f680..417786fc3 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf
index 85340755c..af6fcf6da 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf
@@ -1,4 +1,4 @@
-one
-two
-three
-four
+one
+two
+three
+four
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr
index fd2abfa9d..203555c56 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
index fd2abfa9d..aaf083a9c 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr
index df8c0f680..d11e7ef63 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf
index df8c0f680..417786fc3 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom
+++ b/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf
index 85340755c..af6fcf6da 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf
@@ -1,4 +1,4 @@
-one
-two
-three
-four
+one
+two
+three
+four
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr
index fd2abfa9d..203555c56 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
index fd2abfa9d..aaf083a9c 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr
index df8c0f680..d11e7ef63 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf
index df8c0f680..417786fc3 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf
index 85340755c..af6fcf6da 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf
@@ -1,4 +1,4 @@
-one
-two
-three
-four
+one
+two
+three
+four
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr
index fd2abfa9d..203555c56 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
index fd2abfa9d..aaf083a9c 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr
index df8c0f680..d11e7ef63 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf
index df8c0f680..417786fc3 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf
index 85340755c..af6fcf6da 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf
@@ -1,4 +1,4 @@
-one
-two
-three
-four
+one
+two
+three
+four
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr
index fd2abfa9d..203555c56 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
index fd2abfa9d..aaf083a9c 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr
index df8c0f680..d11e7ef63 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr
@@ -1,3 +1,3 @@
-one
-two three
+one
+two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf
index df8c0f680..417786fc3 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf
@@ -1,3 +1,3 @@
-one
+one
two three
four \ No newline at end of file
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf
index e682c3077..0ff5a53f1 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom
index 2e1220cbb..ea030d3c6 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom
@@ -1,5 +1,5 @@
crlf
crlf
-lf
+lf
crlf
crlf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf
index 6da5b0c7e..04de00b35 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom
index 3fa59c809..dc88e3b91 100644
--- a/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom
+++ b/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom
@@ -1,5 +1,5 @@
-lf
-lf
+lf
+lf
crlf
-lf
-lf
+lf
+lf
diff --git a/tests/generate_crlf.sh b/tests/resources/generate_crlf.sh
index d3fd1bb9a..70534543f 100644..100755
--- a/tests/generate_crlf.sh
+++ b/tests/resources/generate_crlf.sh
@@ -1,4 +1,16 @@
#!/usr/bin/env bash
+#
+# This script will generate the test corpus for CR/LF data using git;
+# we create files with all possible line ending varieties (all LF, all
+# CRLF, mixed, etc) on all the possible line ending configurations
+# (`core.autocrlf=true`, `text=auto` in gitattributes, etc). This
+# allows us to validate that our configuration will match byte-for-byte
+# the configuration that git produces.
+#
+# To update the test resource data, from the test resource directory:
+# git rm -r ./crlf_data
+# sh ./generate_crlf.sh ./crlf ./crlf_data /tmp/crlf_gitdirs
+# git add ./crlf_data
set -e
diff --git a/tests/resources/merge-recursive/.gitted/objects/03/9d0da126f24b819a5a38186249c7f96be3824c b/tests/resources/merge-recursive/.gitted/objects/03/9d0da126f24b819a5a38186249c7f96be3824c
new file mode 100644
index 000000000..79ad635ff
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/03/9d0da126f24b819a5a38186249c7f96be3824c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/05/63b7706dcdcf94bc0c02cd96c137940278eca9 b/tests/resources/merge-recursive/.gitted/objects/05/63b7706dcdcf94bc0c02cd96c137940278eca9
new file mode 100644
index 000000000..c6d38a7d3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/05/63b7706dcdcf94bc0c02cd96c137940278eca9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/08/f01e1bff7e442d574eb221913515b4bd27ccd6 b/tests/resources/merge-recursive/.gitted/objects/08/f01e1bff7e442d574eb221913515b4bd27ccd6
new file mode 100644
index 000000000..c2fbf5ba7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/08/f01e1bff7e442d574eb221913515b4bd27ccd6
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/0b/beee1982b493330e375a85bbfddaba3d561556 b/tests/resources/merge-recursive/.gitted/objects/0b/beee1982b493330e375a85bbfddaba3d561556
new file mode 100644
index 000000000..66b927246
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/0b/beee1982b493330e375a85bbfddaba3d561556
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/0c/e202f64fa8356c1a32835fce4058ca76b0c7ed b/tests/resources/merge-recursive/.gitted/objects/0c/e202f64fa8356c1a32835fce4058ca76b0c7ed
new file mode 100644
index 000000000..9a84b7149
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/0c/e202f64fa8356c1a32835fce4058ca76b0c7ed
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/0e/c39d71c1b074905350ce20ce3f0629f737a2a9 b/tests/resources/merge-recursive/.gitted/objects/0e/c39d71c1b074905350ce20ce3f0629f737a2a9
new file mode 100644
index 000000000..68808d2f3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/0e/c39d71c1b074905350ce20ce3f0629f737a2a9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/17/946ad3088f931102e5d81f94cf2825fc188953 b/tests/resources/merge-recursive/.gitted/objects/17/946ad3088f931102e5d81f94cf2825fc188953
new file mode 100644
index 000000000..9cc133e94
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/17/946ad3088f931102e5d81f94cf2825fc188953
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/18/2d0d250d1d7adcc60c178be5be98358b3a2fd1 b/tests/resources/merge-recursive/.gitted/objects/18/2d0d250d1d7adcc60c178be5be98358b3a2fd1
new file mode 100644
index 000000000..96674c89b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/18/2d0d250d1d7adcc60c178be5be98358b3a2fd1
@@ -0,0 +1,5 @@
+xK
+1]_>@H
+^<j2i4Fg9ʼn
++ 3L6{vX
+`F:?CtM`y"*iT)R3M!{3+ךqϷ%@m9I {ܫvpx/E \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/1b/c7bcccf4bbdc8bfba2331a37ad5e9cf1dd321c b/tests/resources/merge-recursive/.gitted/objects/1b/c7bcccf4bbdc8bfba2331a37ad5e9cf1dd321c
new file mode 100644
index 000000000..811716700
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/1b/c7bcccf4bbdc8bfba2331a37ad5e9cf1dd321c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/1b/de1883de4977ea3e664b315da951d1f614c3b1 b/tests/resources/merge-recursive/.gitted/objects/1b/de1883de4977ea3e664b315da951d1f614c3b1
new file mode 100644
index 000000000..67daf36ae
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/1b/de1883de4977ea3e664b315da951d1f614c3b1
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/23/b427bf6278724433e64ef4cf6dc166c4f2e246 b/tests/resources/merge-recursive/.gitted/objects/23/b427bf6278724433e64ef4cf6dc166c4f2e246
new file mode 100644
index 000000000..03be909e4
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/23/b427bf6278724433e64ef4cf6dc166c4f2e246
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/23/cf2687a9327d55abbbd788ff04fa932072aebc b/tests/resources/merge-recursive/.gitted/objects/23/cf2687a9327d55abbbd788ff04fa932072aebc
new file mode 100644
index 000000000..5cc665a0c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/23/cf2687a9327d55abbbd788ff04fa932072aebc
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/26/d3c94459b4faa08f009b15867993ca34153592 b/tests/resources/merge-recursive/.gitted/objects/26/d3c94459b4faa08f009b15867993ca34153592
new file mode 100644
index 000000000..dd7b1a245
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/26/d3c94459b4faa08f009b15867993ca34153592
@@ -0,0 +1,2 @@
+xA
+1 E]vڂ+O 3mF*x{\yZ܀7BH5Ț:sYB9D3Ohk1T-ؑpt>N"1[!#v_+\>uVo,ӭȼZ@2l1 N{`?Ts6_?B* \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/2c/ba583804a4a6fad1baf97c959be447238d1489 b/tests/resources/merge-recursive/.gitted/objects/2c/ba583804a4a6fad1baf97c959be447238d1489
new file mode 100644
index 000000000..c0a60a172
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/2c/ba583804a4a6fad1baf97c959be447238d1489
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/2e/7ae0d42fb7b6126f6a08ac6314ac07833a52f6 b/tests/resources/merge-recursive/.gitted/objects/2e/7ae0d42fb7b6126f6a08ac6314ac07833a52f6
new file mode 100644
index 000000000..6a9651c76
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/2e/7ae0d42fb7b6126f6a08ac6314ac07833a52f6
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/30/39c07db695c8c99d0a7c7e32f0afe40eae0be0 b/tests/resources/merge-recursive/.gitted/objects/30/39c07db695c8c99d0a7c7e32f0afe40eae0be0
new file mode 100644
index 000000000..cc21b5c31
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/30/39c07db695c8c99d0a7c7e32f0afe40eae0be0
@@ -0,0 +1,3 @@
+xQ
+!@sB"茵mݾ
+}^^Z"(J8iŌI]98Xd)QNX"[2^t|,pZ }5./[V]B \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/35/8efd6f589384fa8baf92234db9c7899a53916e b/tests/resources/merge-recursive/.gitted/objects/35/8efd6f589384fa8baf92234db9c7899a53916e
new file mode 100644
index 000000000..aefc81ad5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/35/8efd6f589384fa8baf92234db9c7899a53916e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/35/dda4f3f9b3794d92a46d908790e550ed100eae b/tests/resources/merge-recursive/.gitted/objects/35/dda4f3f9b3794d92a46d908790e550ed100eae
new file mode 100644
index 000000000..d6cabb419
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/35/dda4f3f9b3794d92a46d908790e550ed100eae
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/36/71e42c8c8302d1a71c0ed7bf2b0a938e9e20f9 b/tests/resources/merge-recursive/.gitted/objects/36/71e42c8c8302d1a71c0ed7bf2b0a938e9e20f9
new file mode 100644
index 000000000..4f70ad6d4
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/36/71e42c8c8302d1a71c0ed7bf2b0a938e9e20f9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/39/78944e4cd53edcc10a170ab2ff142f7295b958 b/tests/resources/merge-recursive/.gitted/objects/39/78944e4cd53edcc10a170ab2ff142f7295b958
new file mode 100644
index 000000000..b18fd4836
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/39/78944e4cd53edcc10a170ab2ff142f7295b958
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/3a/0dc89a8bd20e74fae69d2e038b47360fafb02e b/tests/resources/merge-recursive/.gitted/objects/3a/0dc89a8bd20e74fae69d2e038b47360fafb02e
new file mode 100644
index 000000000..fdff502d1
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/3a/0dc89a8bd20e74fae69d2e038b47360fafb02e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/3a/8c70144d0334721154b1e0529716b368483d6f b/tests/resources/merge-recursive/.gitted/objects/3a/8c70144d0334721154b1e0529716b368483d6f
new file mode 100644
index 000000000..958d17d35
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/3a/8c70144d0334721154b1e0529716b368483d6f
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/3e/eff81b57a0ac15a5ab6bb3a8e92511a01a429c b/tests/resources/merge-recursive/.gitted/objects/3e/eff81b57a0ac15a5ab6bb3a8e92511a01a429c
new file mode 100644
index 000000000..6a6c65460
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/3e/eff81b57a0ac15a5ab6bb3a8e92511a01a429c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/40/9f5d072decec684331672f2d6c0a9bc3640adb b/tests/resources/merge-recursive/.gitted/objects/40/9f5d072decec684331672f2d6c0a9bc3640adb
new file mode 100644
index 000000000..b4c9005e1
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/40/9f5d072decec684331672f2d6c0a9bc3640adb
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/44/faf5fba1af850dae54f8b2345938d3c7ae479f b/tests/resources/merge-recursive/.gitted/objects/44/faf5fba1af850dae54f8b2345938d3c7ae479f
new file mode 100644
index 000000000..d0bc09902
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/44/faf5fba1af850dae54f8b2345938d3c7ae479f
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4a/06b258fed8a4d15967ec4253ae7366b70f727d b/tests/resources/merge-recursive/.gitted/objects/4a/06b258fed8a4d15967ec4253ae7366b70f727d
new file mode 100644
index 000000000..d3e181501
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4a/06b258fed8a4d15967ec4253ae7366b70f727d
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/tests/resources/merge-recursive/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
new file mode 100644
index 000000000..adf64119a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4c/62e9482ed42c1a6d08891906b26126daa4a8f5 b/tests/resources/merge-recursive/.gitted/objects/4c/62e9482ed42c1a6d08891906b26126daa4a8f5
new file mode 100644
index 000000000..f3cee9a2d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4c/62e9482ed42c1a6d08891906b26126daa4a8f5
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/50/4dd93fb5b9c2a28c094c6e84ef0606de1e9b5c b/tests/resources/merge-recursive/.gitted/objects/50/4dd93fb5b9c2a28c094c6e84ef0606de1e9b5c
new file mode 100644
index 000000000..214d3076d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/50/4dd93fb5b9c2a28c094c6e84ef0606de1e9b5c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/50/dfa64a56b488fe8082371b182c8a3e3c942332 b/tests/resources/merge-recursive/.gitted/objects/50/dfa64a56b488fe8082371b182c8a3e3c942332
new file mode 100644
index 000000000..7c90c99af
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/50/dfa64a56b488fe8082371b182c8a3e3c942332
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/51/135c5884d7dd132fef3b432cca5826bab98f37 b/tests/resources/merge-recursive/.gitted/objects/51/135c5884d7dd132fef3b432cca5826bab98f37
new file mode 100644
index 000000000..95818f144
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/51/135c5884d7dd132fef3b432cca5826bab98f37
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/51/60ab78c1973dcd7cdebe2345dc8fcfc755e76d b/tests/resources/merge-recursive/.gitted/objects/51/60ab78c1973dcd7cdebe2345dc8fcfc755e76d
new file mode 100644
index 000000000..f3f99d7fe
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/51/60ab78c1973dcd7cdebe2345dc8fcfc755e76d
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/56/fcbad344aafe519bafcc33c87b8e64849d82ab b/tests/resources/merge-recursive/.gitted/objects/56/fcbad344aafe519bafcc33c87b8e64849d82ab
new file mode 100644
index 000000000..06bea32e6
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/56/fcbad344aafe519bafcc33c87b8e64849d82ab
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/5a/47615db824433f816ba62217dda6d46c5a7640 b/tests/resources/merge-recursive/.gitted/objects/5a/47615db824433f816ba62217dda6d46c5a7640
new file mode 100644
index 000000000..c1e30ce54
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5a/47615db824433f816ba62217dda6d46c5a7640
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/5c/27b5f7c6f6dd4e5b4d64976741d56c2df8f48a b/tests/resources/merge-recursive/.gitted/objects/5c/27b5f7c6f6dd4e5b4d64976741d56c2df8f48a
new file mode 100644
index 000000000..783d085a7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5c/27b5f7c6f6dd4e5b4d64976741d56c2df8f48a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/5d/998d5f278aff5693711bc48f6852aac4b603ad b/tests/resources/merge-recursive/.gitted/objects/5d/998d5f278aff5693711bc48f6852aac4b603ad
new file mode 100644
index 000000000..a7795f59b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5d/998d5f278aff5693711bc48f6852aac4b603ad
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/61/6d1209afac499b005f68309e1593b44899b054 b/tests/resources/merge-recursive/.gitted/objects/61/6d1209afac499b005f68309e1593b44899b054
new file mode 100644
index 000000000..6a06214d7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/61/6d1209afac499b005f68309e1593b44899b054
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/71/c50785d8d512293bd3af838b131f3da5829ebc b/tests/resources/merge-recursive/.gitted/objects/71/c50785d8d512293bd3af838b131f3da5829ebc
new file mode 100644
index 000000000..23c40332e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/71/c50785d8d512293bd3af838b131f3da5829ebc
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/75/afa96db00c26c6ebf3b377615b4e2a20563ee4 b/tests/resources/merge-recursive/.gitted/objects/75/afa96db00c26c6ebf3b377615b4e2a20563ee4
new file mode 100644
index 000000000..11d7f94a9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/75/afa96db00c26c6ebf3b377615b4e2a20563ee4
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/76/6afbfd7d42f757f1fac9ea550c9fcbc8041b89 b/tests/resources/merge-recursive/.gitted/objects/76/6afbfd7d42f757f1fac9ea550c9fcbc8041b89
new file mode 100644
index 000000000..a5af38357
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/76/6afbfd7d42f757f1fac9ea550c9fcbc8041b89
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/7c/61830f8b8632665bb44ae5d219f520f5aa5bb4 b/tests/resources/merge-recursive/.gitted/objects/7c/61830f8b8632665bb44ae5d219f520f5aa5bb4
new file mode 100644
index 000000000..04b10f7ee
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7c/61830f8b8632665bb44ae5d219f520f5aa5bb4
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/7c/9a30d8dcee320a3b1f9ed10b582479faa9d3a1 b/tests/resources/merge-recursive/.gitted/objects/7c/9a30d8dcee320a3b1f9ed10b582479faa9d3a1
new file mode 100644
index 000000000..7500a241e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7c/9a30d8dcee320a3b1f9ed10b582479faa9d3a1
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/7e/2d2bad4fc21f2832ca2afd48b1f95ab37ffb92 b/tests/resources/merge-recursive/.gitted/objects/7e/2d2bad4fc21f2832ca2afd48b1f95ab37ffb92
new file mode 100644
index 000000000..11f96c9c8
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7e/2d2bad4fc21f2832ca2afd48b1f95ab37ffb92
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/7e/70a7872576bba7e299cde45abb7da1e4d7ba81 b/tests/resources/merge-recursive/.gitted/objects/7e/70a7872576bba7e299cde45abb7da1e4d7ba81
new file mode 100644
index 000000000..cab463975
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7e/70a7872576bba7e299cde45abb7da1e4d7ba81
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/7f/9c1d78d760cbfa99273bc1ef642d994c6baa5c b/tests/resources/merge-recursive/.gitted/objects/7f/9c1d78d760cbfa99273bc1ef642d994c6baa5c
new file mode 100644
index 000000000..46c8e8523
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7f/9c1d78d760cbfa99273bc1ef642d994c6baa5c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/81/60cb53660b86c954144b8dbbb0b6e4db4ba6ba b/tests/resources/merge-recursive/.gitted/objects/81/60cb53660b86c954144b8dbbb0b6e4db4ba6ba
new file mode 100644
index 000000000..19d32c770
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/81/60cb53660b86c954144b8dbbb0b6e4db4ba6ba
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/8f/1b918542a5fe9b3bb7a8770a7525ad5b3b5864 b/tests/resources/merge-recursive/.gitted/objects/8f/1b918542a5fe9b3bb7a8770a7525ad5b3b5864
new file mode 100644
index 000000000..5ecb3e57b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/8f/1b918542a5fe9b3bb7a8770a7525ad5b3b5864
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/97/5dd228fd1b0cacf2988167088fd1190c9ac0f5 b/tests/resources/merge-recursive/.gitted/objects/97/5dd228fd1b0cacf2988167088fd1190c9ac0f5
new file mode 100644
index 000000000..96658c4fb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/97/5dd228fd1b0cacf2988167088fd1190c9ac0f5
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/98/5b725cf91c6861b5e7a419415d03cbcf5f16ca b/tests/resources/merge-recursive/.gitted/objects/98/5b725cf91c6861b5e7a419415d03cbcf5f16ca
new file mode 100644
index 000000000..bc95c6fc5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/98/5b725cf91c6861b5e7a419415d03cbcf5f16ca
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/98/cacbdd1fac7bbab54a6c7c97aa2103219e08b8 b/tests/resources/merge-recursive/.gitted/objects/98/cacbdd1fac7bbab54a6c7c97aa2103219e08b8
new file mode 100644
index 000000000..13344d86c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/98/cacbdd1fac7bbab54a6c7c97aa2103219e08b8
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/99/754e36599906b81b917447280c4918269e14ff b/tests/resources/merge-recursive/.gitted/objects/99/754e36599906b81b917447280c4918269e14ff
new file mode 100644
index 000000000..40455efab
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/99/754e36599906b81b917447280c4918269e14ff
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/9a/228c1ee87f286202ec9a25de837a18550013b5 b/tests/resources/merge-recursive/.gitted/objects/9a/228c1ee87f286202ec9a25de837a18550013b5
new file mode 100644
index 000000000..d6bcd5262
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/9a/228c1ee87f286202ec9a25de837a18550013b5
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/9c/dde216049c6a5ccddac0ad81f604419d8990ed b/tests/resources/merge-recursive/.gitted/objects/9c/dde216049c6a5ccddac0ad81f604419d8990ed
new file mode 100644
index 000000000..9f2c92851
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/9c/dde216049c6a5ccddac0ad81f604419d8990ed
@@ -0,0 +1,2 @@
+xQ
+B!EvnPDbA϶繜 Z箝Mo"7)Hvdq0!S,T( J𬞩ɣ8q`8>*}mi,K҇}4/;ZQѻzk1j#Wuv CN \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/a0/ce8909834f389b4f8be6a6ec420868422d40a1 b/tests/resources/merge-recursive/.gitted/objects/a0/ce8909834f389b4f8be6a6ec420868422d40a1
new file mode 100644
index 000000000..5f6643c59
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a0/ce8909834f389b4f8be6a6ec420868422d40a1
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a2/817ed0e8ca6fe52bf0a20b2f50eb94b9ea5415 b/tests/resources/merge-recursive/.gitted/objects/a2/817ed0e8ca6fe52bf0a20b2f50eb94b9ea5415
new file mode 100644
index 000000000..a043a8e03
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a2/817ed0e8ca6fe52bf0a20b2f50eb94b9ea5415
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a3/5aa65d86215fce909fc0bcce8949d12becba44 b/tests/resources/merge-recursive/.gitted/objects/a3/5aa65d86215fce909fc0bcce8949d12becba44
new file mode 100644
index 000000000..e71e9ec44
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a3/5aa65d86215fce909fc0bcce8949d12becba44
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a3/ca4c462e93fee824c8ad500917ae34b800dea4 b/tests/resources/merge-recursive/.gitted/objects/a3/ca4c462e93fee824c8ad500917ae34b800dea4
new file mode 100644
index 000000000..dff9e9750
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a3/ca4c462e93fee824c8ad500917ae34b800dea4
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a6/64873b1c0b9a1ed300f8644dde536fdaa3a34f b/tests/resources/merge-recursive/.gitted/objects/a6/64873b1c0b9a1ed300f8644dde536fdaa3a34f
new file mode 100644
index 000000000..f6b66dada
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a6/64873b1c0b9a1ed300f8644dde536fdaa3a34f
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a9/9bf55117ab1958171fccfeb19885f707bd08fd b/tests/resources/merge-recursive/.gitted/objects/a9/9bf55117ab1958171fccfeb19885f707bd08fd
new file mode 100644
index 000000000..9c3a3ec28
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a9/9bf55117ab1958171fccfeb19885f707bd08fd
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b0/1de62cf11945685c98ec671edabdff3e90ddc5 b/tests/resources/merge-recursive/.gitted/objects/b0/1de62cf11945685c98ec671edabdff3e90ddc5
new file mode 100644
index 000000000..786c9a510
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b0/1de62cf11945685c98ec671edabdff3e90ddc5
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b0/4823b75c8220b89c2f8da54709cda262304cd3 b/tests/resources/merge-recursive/.gitted/objects/b0/4823b75c8220b89c2f8da54709cda262304cd3
new file mode 100644
index 000000000..81714b06d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b0/4823b75c8220b89c2f8da54709cda262304cd3
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b1/71224a4f604b6091072007765419b14c232c1d b/tests/resources/merge-recursive/.gitted/objects/b1/71224a4f604b6091072007765419b14c232c1d
new file mode 100644
index 000000000..987d5fec1
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b1/71224a4f604b6091072007765419b14c232c1d
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b2/908343e3c16249d0036dd444fc0d4662cd8c0e b/tests/resources/merge-recursive/.gitted/objects/b2/908343e3c16249d0036dd444fc0d4662cd8c0e
new file mode 100644
index 000000000..7f0e0aba6
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b2/908343e3c16249d0036dd444fc0d4662cd8c0e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b6/bd0f9952f396e757d3f91e08c59a7e91707201 b/tests/resources/merge-recursive/.gitted/objects/b6/bd0f9952f396e757d3f91e08c59a7e91707201
new file mode 100644
index 000000000..87cb8fa04
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b6/bd0f9952f396e757d3f91e08c59a7e91707201
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b7/de2b52ba055688061355fad1599a5d214ce8f8 b/tests/resources/merge-recursive/.gitted/objects/b7/de2b52ba055688061355fad1599a5d214ce8f8
new file mode 100644
index 000000000..6fbf58187
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b7/de2b52ba055688061355fad1599a5d214ce8f8
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b8/a3b657edcf31e6365a2f1c45d45e6c9ebe8f02 b/tests/resources/merge-recursive/.gitted/objects/b8/a3b657edcf31e6365a2f1c45d45e6c9ebe8f02
new file mode 100644
index 000000000..0b8404bf3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b8/a3b657edcf31e6365a2f1c45d45e6c9ebe8f02
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ba/9dcfe079848e8e5c1b53bc3b6e47ff57f6e481 b/tests/resources/merge-recursive/.gitted/objects/ba/9dcfe079848e8e5c1b53bc3b6e47ff57f6e481
new file mode 100644
index 000000000..c43b79da3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ba/9dcfe079848e8e5c1b53bc3b6e47ff57f6e481
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/bb/4e0014fb09d24312f0af37c7a45e5488f19510 b/tests/resources/merge-recursive/.gitted/objects/bb/4e0014fb09d24312f0af37c7a45e5488f19510
new file mode 100644
index 000000000..ca45760cd
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/bb/4e0014fb09d24312f0af37c7a45e5488f19510
@@ -0,0 +1,4 @@
+xKj1)tVs}ղf2f' _WT-2 cSK v&8)`#
+*ssMI (J%5BUx
+!R JbI ࢏nMju~1 OQd]t 1 
+~h2OP# \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/c0/dcb4bfcd86e65a822090aa7a0455413828886b b/tests/resources/merge-recursive/.gitted/objects/c0/dcb4bfcd86e65a822090aa7a0455413828886b
new file mode 100644
index 000000000..f8fe20180
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/c0/dcb4bfcd86e65a822090aa7a0455413828886b
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/c4/44758b02d4af6e3145ac2fc0e3ed02199cf7ec b/tests/resources/merge-recursive/.gitted/objects/c4/44758b02d4af6e3145ac2fc0e3ed02199cf7ec
new file mode 100644
index 000000000..b2f6662a0
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/c4/44758b02d4af6e3145ac2fc0e3ed02199cf7ec
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/c7/f3257db72e885d6612080c003e0f2ef480e0c4 b/tests/resources/merge-recursive/.gitted/objects/c7/f3257db72e885d6612080c003e0f2ef480e0c4
new file mode 100644
index 000000000..255624e93
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/c7/f3257db72e885d6612080c003e0f2ef480e0c4
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ce/0d744cd2e18eacf883d43471636f231c0995e3 b/tests/resources/merge-recursive/.gitted/objects/ce/0d744cd2e18eacf883d43471636f231c0995e3
new file mode 100644
index 000000000..63c457a2c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ce/0d744cd2e18eacf883d43471636f231c0995e3
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d0/97bcf99adb1022a6b7d2e94fed2031ebd9d89c b/tests/resources/merge-recursive/.gitted/objects/d0/97bcf99adb1022a6b7d2e94fed2031ebd9d89c
new file mode 100644
index 000000000..51ffec090
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d0/97bcf99adb1022a6b7d2e94fed2031ebd9d89c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d0/c9bd6e2a3e327d81a32de51201d3bd58909f7c b/tests/resources/merge-recursive/.gitted/objects/d0/c9bd6e2a3e327d81a32de51201d3bd58909f7c
new file mode 100644
index 000000000..5a0508c5d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d0/c9bd6e2a3e327d81a32de51201d3bd58909f7c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d3/482dbdca5bb83aaf3e3768359855d55aef84d7 b/tests/resources/merge-recursive/.gitted/objects/d3/482dbdca5bb83aaf3e3768359855d55aef84d7
new file mode 100644
index 000000000..8442948fa
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d3/482dbdca5bb83aaf3e3768359855d55aef84d7
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d5/015f9436b2d8c842bf6616e7cf5bc54eb79ced b/tests/resources/merge-recursive/.gitted/objects/d5/015f9436b2d8c842bf6616e7cf5bc54eb79ced
new file mode 100644
index 000000000..6d4446ec4
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d5/015f9436b2d8c842bf6616e7cf5bc54eb79ced
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/db/51adf2b699eed93e883d6425f5e6c50165a9c2 b/tests/resources/merge-recursive/.gitted/objects/db/51adf2b699eed93e883d6425f5e6c50165a9c2
new file mode 100644
index 000000000..41b481efb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/db/51adf2b699eed93e883d6425f5e6c50165a9c2
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/db/7e2af8ca83b8943adce7ba37d85f8fe7d7d2a9 b/tests/resources/merge-recursive/.gitted/objects/db/7e2af8ca83b8943adce7ba37d85f8fe7d7d2a9
new file mode 100644
index 000000000..0a0ad6527
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/db/7e2af8ca83b8943adce7ba37d85f8fe7d7d2a9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/de/de92a05a0841faa8e4ad6700285cd208184458 b/tests/resources/merge-recursive/.gitted/objects/de/de92a05a0841faa8e4ad6700285cd208184458
new file mode 100644
index 000000000..c275071e2
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/de/de92a05a0841faa8e4ad6700285cd208184458
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e0/15ebd79a72a88b9291df11771caf56f463e8f9 b/tests/resources/merge-recursive/.gitted/objects/e0/15ebd79a72a88b9291df11771caf56f463e8f9
new file mode 100644
index 000000000..a75a6b60e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e0/15ebd79a72a88b9291df11771caf56f463e8f9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e5/20e6aaf8d1e68a433e29d4360c1e74aa4b24d1 b/tests/resources/merge-recursive/.gitted/objects/e5/20e6aaf8d1e68a433e29d4360c1e74aa4b24d1
new file mode 100644
index 000000000..bcf2dcfc5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e5/20e6aaf8d1e68a433e29d4360c1e74aa4b24d1
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e6/269ce9017816d67c7189a58b6d0d22bf4b8a1a b/tests/resources/merge-recursive/.gitted/objects/e6/269ce9017816d67c7189a58b6d0d22bf4b8a1a
new file mode 100644
index 000000000..f9a0a27cc
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e6/269ce9017816d67c7189a58b6d0d22bf4b8a1a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e9/30c8c67848df4aa66319c5752fab6b8fdec765 b/tests/resources/merge-recursive/.gitted/objects/e9/30c8c67848df4aa66319c5752fab6b8fdec765
new file mode 100644
index 000000000..c0ba76deb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e9/30c8c67848df4aa66319c5752fab6b8fdec765
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ea/3521485adfa0b0373deaaa06db9218a22edae8 b/tests/resources/merge-recursive/.gitted/objects/ea/3521485adfa0b0373deaaa06db9218a22edae8
new file mode 100644
index 000000000..40d89843c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ea/3521485adfa0b0373deaaa06db9218a22edae8
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f0/856993e005c0d8ed2dc7cdc222cc1d89fb3c77 b/tests/resources/merge-recursive/.gitted/objects/f0/856993e005c0d8ed2dc7cdc222cc1d89fb3c77
new file mode 100644
index 000000000..22b1ad94c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f0/856993e005c0d8ed2dc7cdc222cc1d89fb3c77
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f2/9ccca75754d8476e5dad8cf250e03d43fe9e6c b/tests/resources/merge-recursive/.gitted/objects/f2/9ccca75754d8476e5dad8cf250e03d43fe9e6c
new file mode 100644
index 000000000..b91872905
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f2/9ccca75754d8476e5dad8cf250e03d43fe9e6c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f3/2c284f537ff1a55d3cbfe9a37d431b6edfadc2 b/tests/resources/merge-recursive/.gitted/objects/f3/2c284f537ff1a55d3cbfe9a37d431b6edfadc2
new file mode 100644
index 000000000..be3ceccdc
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f3/2c284f537ff1a55d3cbfe9a37d431b6edfadc2
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f4/c149e7d0983e90e9ee802ff57ae3c905ba63da b/tests/resources/merge-recursive/.gitted/objects/f4/c149e7d0983e90e9ee802ff57ae3c905ba63da
new file mode 100644
index 000000000..e9c675b6d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f4/c149e7d0983e90e9ee802ff57ae3c905ba63da
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f6/5de1834f57708e76d8dc25502b7f1ecbcce162 b/tests/resources/merge-recursive/.gitted/objects/f6/5de1834f57708e76d8dc25502b7f1ecbcce162
new file mode 100644
index 000000000..3d238fd8c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f6/5de1834f57708e76d8dc25502b7f1ecbcce162
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f9/c04e4e9d4aaf1e6fe7478a7cc0756554974c2b b/tests/resources/merge-recursive/.gitted/objects/f9/c04e4e9d4aaf1e6fe7478a7cc0756554974c2b
new file mode 100644
index 000000000..bc44fa73a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f9/c04e4e9d4aaf1e6fe7478a7cc0756554974c2b
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchJ-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchJ-1
new file mode 100644
index 000000000..64612d486
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchJ-1
@@ -0,0 +1 @@
+f65de1834f57708e76d8dc25502b7f1ecbcce162
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchJ-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchJ-2
new file mode 100644
index 000000000..bea674803
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchJ-2
@@ -0,0 +1 @@
+b01de62cf11945685c98ec671edabdff3e90ddc5
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchK-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchK-1
new file mode 100644
index 000000000..309b38880
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchK-1
@@ -0,0 +1 @@
+182d0d250d1d7adcc60c178be5be98358b3a2fd1
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchK-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchK-2
new file mode 100644
index 000000000..f958f131c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchK-2
@@ -0,0 +1 @@
+0ce202f64fa8356c1a32835fce4058ca76b0c7ed
diff --git a/tests/resources/renames/.gitted/objects/2c/136d294960f7d939f1ed1903f1ced78b874c87 b/tests/resources/renames/.gitted/objects/2c/136d294960f7d939f1ed1903f1ced78b874c87
new file mode 100644
index 000000000..51b7cea41
--- /dev/null
+++ b/tests/resources/renames/.gitted/objects/2c/136d294960f7d939f1ed1903f1ced78b874c87
Binary files differ
diff --git a/tests/resources/renames/.gitted/objects/84/d8efa38af7ace2b302de0adbda16b1f1cd2e1b b/tests/resources/renames/.gitted/objects/84/d8efa38af7ace2b302de0adbda16b1f1cd2e1b
new file mode 100644
index 000000000..56f98fe3b
--- /dev/null
+++ b/tests/resources/renames/.gitted/objects/84/d8efa38af7ace2b302de0adbda16b1f1cd2e1b
@@ -0,0 +1 @@
+xQj0SX+۲ !4'XiHeCߐtgr_fZRT%*!q.&40.Of? )g,Z0>8y$[жt5:l'<B WH6% uJI \ No newline at end of file
diff --git a/tests/resources/renames/.gitted/objects/89/7dda8ecb7fa2e092bc3f9e2a179d7c1b0364db b/tests/resources/renames/.gitted/objects/89/7dda8ecb7fa2e092bc3f9e2a179d7c1b0364db
new file mode 100644
index 000000000..d104e66de
--- /dev/null
+++ b/tests/resources/renames/.gitted/objects/89/7dda8ecb7fa2e092bc3f9e2a179d7c1b0364db
Binary files differ
diff --git a/tests/resources/renames/.gitted/objects/95/ceb126bf79e76020d8879a8b0d50a73307a97f b/tests/resources/renames/.gitted/objects/95/ceb126bf79e76020d8879a8b0d50a73307a97f
new file mode 100644
index 000000000..0486ba5b0
--- /dev/null
+++ b/tests/resources/renames/.gitted/objects/95/ceb126bf79e76020d8879a8b0d50a73307a97f
Binary files differ
diff --git a/tests/resources/renames/.gitted/objects/be/053a189b0bbde545e0a3f59ce00b46ad29ce0d b/tests/resources/renames/.gitted/objects/be/053a189b0bbde545e0a3f59ce00b46ad29ce0d
new file mode 100644
index 000000000..de7aceb62
--- /dev/null
+++ b/tests/resources/renames/.gitted/objects/be/053a189b0bbde545e0a3f59ce00b46ad29ce0d
Binary files differ
diff --git a/tests/resources/renames/.gitted/refs/heads/delete-and-rename b/tests/resources/renames/.gitted/refs/heads/delete-and-rename
new file mode 100644
index 000000000..f27fc2184
--- /dev/null
+++ b/tests/resources/renames/.gitted/refs/heads/delete-and-rename
@@ -0,0 +1 @@
+be053a189b0bbde545e0a3f59ce00b46ad29ce0d
diff --git a/tests/resources/renames/.gitted/refs/heads/rewrite-and-delete b/tests/resources/renames/.gitted/refs/heads/rewrite-and-delete
new file mode 100644
index 000000000..0c0ecad78
--- /dev/null
+++ b/tests/resources/renames/.gitted/refs/heads/rewrite-and-delete
@@ -0,0 +1 @@
+84d8efa38af7ace2b302de0adbda16b1f1cd2e1b
diff --git a/tests/resources/revwalk.git/HEAD b/tests/resources/revwalk.git/HEAD
new file mode 100644
index 000000000..cb089cd89
--- /dev/null
+++ b/tests/resources/revwalk.git/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/tests/resources/revwalk.git/config b/tests/resources/revwalk.git/config
new file mode 100644
index 000000000..7c968c3b5
--- /dev/null
+++ b/tests/resources/revwalk.git/config
@@ -0,0 +1,6 @@
+[core]
+ bare = true
+ repositoryformatversion = 0
+ filemode = false
+ symlinks = false
+ ignorecase = true
diff --git a/tests/resources/revwalk.git/description b/tests/resources/revwalk.git/description
new file mode 100644
index 000000000..498b267a8
--- /dev/null
+++ b/tests/resources/revwalk.git/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/tests/resources/revwalk.git/objects/info/packs b/tests/resources/revwalk.git/objects/info/packs
new file mode 100644
index 000000000..d8d85b895
--- /dev/null
+++ b/tests/resources/revwalk.git/objects/info/packs
@@ -0,0 +1,2 @@
+P pack-9adacb9971981a1a3264fd473da5b800f2715959.pack
+
diff --git a/tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.idx b/tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.idx
new file mode 100644
index 000000000..e157b386e
--- /dev/null
+++ b/tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.idx
Binary files differ
diff --git a/tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.pack b/tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.pack
new file mode 100644
index 000000000..2a61f9403
--- /dev/null
+++ b/tests/resources/revwalk.git/objects/pack/pack-9adacb9971981a1a3264fd473da5b800f2715959.pack
Binary files differ
diff --git a/tests/resources/revwalk.git/packed-refs b/tests/resources/revwalk.git/packed-refs
new file mode 100644
index 000000000..905a3db51
--- /dev/null
+++ b/tests/resources/revwalk.git/packed-refs
@@ -0,0 +1,7 @@
+# pack-refs with: peeled fully-peeled sorted
+3ae0f53011bdb7e68f99bde4943449f36c1c318a refs/heads/A
+061978578d7c9ff2ba92dd36d31fd8d809871030 refs/heads/B
+743398b425d6c216d6cfaae3786b5bc436393ae5 refs/heads/C
+790ba0facf6fd103699a5c40cd19dad277ff49cd refs/heads/D
+d3d783066cf7d95def6844b9c5118c1e7bcce7df refs/heads/E
+d3d783066cf7d95def6844b9c5118c1e7bcce7df refs/heads/master
diff --git a/tests/resources/revwalk.git/refs/.gitkeep b/tests/resources/revwalk.git/refs/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/resources/revwalk.git/refs/.gitkeep
diff --git a/tests/resources/testrepo/.gitted/objects/57/43a3ef145d3638a0fa28233ca92897117ad74f b/tests/resources/testrepo/.gitted/objects/57/43a3ef145d3638a0fa28233ca92897117ad74f
new file mode 100644
index 000000000..85abb27cc
--- /dev/null
+++ b/tests/resources/testrepo/.gitted/objects/57/43a3ef145d3638a0fa28233ca92897117ad74f
Binary files differ
diff --git a/tests/resources/testrepo/.gitted/objects/f9/ed4af42472941da45a3ce44458455ed227a6be b/tests/resources/testrepo/.gitted/objects/f9/ed4af42472941da45a3ce44458455ed227a6be
new file mode 100644
index 000000000..69c52fc9f
--- /dev/null
+++ b/tests/resources/testrepo/.gitted/objects/f9/ed4af42472941da45a3ce44458455ed227a6be
@@ -0,0 +1,2 @@
+xN[
+B!Uzꁈ~A8W 3K-?v|f&R.]61K-p% d&S6;5u3 9 ΄h|`Uh8gAk_jyQor#ZR;*1*j@ wgǵ|eO \ No newline at end of file
diff --git a/tests/resources/testrepo/.gitted/refs/heads/executable b/tests/resources/testrepo/.gitted/refs/heads/executable
new file mode 100644
index 000000000..2bdccea29
--- /dev/null
+++ b/tests/resources/testrepo/.gitted/refs/heads/executable
@@ -0,0 +1 @@
+f9ed4af42472941da45a3ce44458455ed227a6be
diff --git a/tests/revwalk/basic.c b/tests/revwalk/basic.c
index 547050c68..1106bf4ce 100644
--- a/tests/revwalk/basic.c
+++ b/tests/revwalk/basic.c
@@ -177,7 +177,7 @@ void test_revwalk_basic__glob_heads_with_invalid(void)
/* walking */;
/* git log --branches --oneline | wc -l => 16 */
- cl_assert_equal_i(19, i);
+ cl_assert_equal_i(20, i);
}
void test_revwalk_basic__push_head(void)
@@ -555,3 +555,30 @@ void test_revwalk_basic__old_hidden_commit_two(void)
cl_git_fail_with(GIT_ITEROVER, git_revwalk_next(&oid, _walk));
}
+
+/*
+ * Ensure that we correctly hide all parent commits of a newer
+ * commit when first hiding older commits.
+ *
+ * % git rev-list D ^B ^A ^E
+ * 790ba0facf6fd103699a5c40cd19dad277ff49cd
+ * b82cee5004151ae0c4f82b69fb71b87477664b6f
+ */
+void test_revwalk_basic__newer_hidden_commit_hides_old_commits(void)
+{
+ git_oid oid;
+
+ revwalk_basic_setup_walk("revwalk.git");
+
+ cl_git_pass(git_revwalk_push_ref(_walk, "refs/heads/D"));
+ cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/B"));
+ cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/A"));
+ cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/E"));
+
+ cl_git_pass(git_revwalk_next(&oid, _walk));
+ cl_assert(git_oid_streq(&oid, "b82cee5004151ae0c4f82b69fb71b87477664b6f"));
+ cl_git_pass(git_revwalk_next(&oid, _walk));
+ cl_assert(git_oid_streq(&oid, "790ba0facf6fd103699a5c40cd19dad277ff49cd"));
+
+ cl_git_fail_with(GIT_ITEROVER, git_revwalk_next(&oid, _walk));
+}
diff --git a/tests/status/renames.c b/tests/status/renames.c
index f482d693a..ae32d2ee0 100644
--- a/tests/status/renames.c
+++ b/tests/status/renames.c
@@ -590,6 +590,12 @@ static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D";
static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D";
#endif
+/*
+ * Create a file in NFD (canonically decomposed) format. Ensure
+ * that when core.precomposeunicode is false that we return paths
+ * in NFD, but when core.precomposeunicode is true, then we
+ * return paths precomposed (in NFC).
+ */
void test_status_renames__precomposed_unicode_rename(void)
{
#ifdef GIT_USE_ICONV
@@ -610,7 +616,7 @@ void test_status_renames__precomposed_unicode_rename(void)
{ GIT_STATUS_WT_RENAMED, "sixserving.txt", nfc },
};
- rename_file(g_repo, "sixserving.txt", nfc);
+ rename_file(g_repo, "sixserving.txt", nfd);
opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
diff --git a/tests/status/worktree.c b/tests/status/worktree.c
index 44ed324f1..c6b18c166 100644
--- a/tests/status/worktree.c
+++ b/tests/status/worktree.c
@@ -1072,6 +1072,8 @@ void test_status_worktree__unreadable(void)
cl_assert_equal_i(counts.expected_entry_count, counts.entry_count);
cl_assert_equal_i(0, counts.wrong_status_flags_count);
cl_assert_equal_i(0, counts.wrong_sorted_path);
+#else
+ cl_skip();
#endif
}
@@ -1106,6 +1108,8 @@ void test_status_worktree__unreadable_not_included(void)
cl_assert_equal_i(counts.expected_entry_count, counts.entry_count);
cl_assert_equal_i(0, counts.wrong_status_flags_count);
cl_assert_equal_i(0, counts.wrong_sorted_path);
+#else
+ cl_skip();
#endif
}
diff --git a/tests/submodule/add.c b/tests/submodule/add.c
index c3b3e6364..ebb9d6292 100644
--- a/tests/submodule/add.c
+++ b/tests/submodule/add.c
@@ -7,6 +7,7 @@
#include "repository.h"
static git_repository *g_repo = NULL;
+static const char *valid_blob_id = "fa49b077972391ad58037050f2a75f74e3671e92";
void test_submodule_add__cleanup(void)
{
@@ -128,3 +129,57 @@ void test_submodule_add__url_relative_to_workdir(void)
assert_submodule_url("TestGitRepository", git_repository_workdir(g_repo));
}
+
+static void test_add_entry(
+ git_index *index,
+ const char *idstr,
+ const char *path,
+ git_filemode_t mode)
+{
+ git_index_entry entry = {{0}};
+
+ cl_git_pass(git_oid_fromstr(&entry.id, idstr));
+
+ entry.path = path;
+ entry.mode = mode;
+
+ cl_git_pass(git_index_add(index, &entry));
+}
+
+void test_submodule_add__path_exists_in_index(void)
+{
+ git_index *index;
+ git_submodule *sm;
+ git_buf filename = GIT_BUF_INIT;
+
+ g_repo = cl_git_sandbox_init("testrepo");
+
+ cl_git_pass(git_buf_joinpath(&filename, "subdirectory", "test.txt"));
+
+ cl_git_pass(git_repository_index__weakptr(&index, g_repo));
+
+ test_add_entry(index, valid_blob_id, filename.ptr, GIT_FILEMODE_BLOB);
+
+ cl_git_fail_with(git_submodule_add_setup(&sm, g_repo, "./", "subdirectory", 1), GIT_EEXISTS);
+
+ git_submodule_free(sm);
+ git_buf_free(&filename);
+}
+
+void test_submodule_add__file_exists_in_index(void)
+{
+ git_index *index;
+ git_submodule *sm;
+ git_buf name = GIT_BUF_INIT;
+
+ g_repo = cl_git_sandbox_init("testrepo");
+
+ cl_git_pass(git_repository_index__weakptr(&index, g_repo));
+
+ test_add_entry(index, valid_blob_id, "subdirectory", GIT_FILEMODE_BLOB);
+
+ cl_git_fail_with(git_submodule_add_setup(&sm, g_repo, "./", "subdirectory", 1), GIT_EEXISTS);
+
+ git_submodule_free(sm);
+ git_buf_free(&name);
+}
diff --git a/tests/submodule/lookup.c b/tests/submodule/lookup.c
index f84f07c60..170be5a44 100644
--- a/tests/submodule/lookup.c
+++ b/tests/submodule/lookup.c
@@ -445,3 +445,19 @@ void test_submodule_lookup__foreach_in_bare_repository_fails(void)
cl_git_fail(git_submodule_foreach(g_repo, foreach_cb, NULL));
}
+
+void test_submodule_lookup__fail_invalid_gitmodules(void)
+{
+ git_submodule *sm;
+ sm_lookup_data data;
+ memset(&data, 0, sizeof(data));
+
+ cl_git_rewritefile("submod2/.gitmodules",
+ "[submodule \"Test_App\"\n"
+ " path = Test_App\n"
+ " url = ../Test_App\n");
+
+ cl_git_fail(git_submodule_lookup(&sm, g_repo, "Test_App"));
+
+ cl_git_fail(git_submodule_foreach(g_repo, sm_lookup_cb, &data));
+}
diff --git a/tests/transport/register.c b/tests/transport/register.c
index 97aae6b20..88ba247de 100644
--- a/tests/transport/register.c
+++ b/tests/transport/register.c
@@ -45,6 +45,8 @@ void test_transport_register__custom_transport_ssh(void)
"ssh+git://somehost:somepath",
"git+ssh://somehost:somepath",
"git@somehost:somepath",
+ "ssh://somehost:somepath%20with%20%spaces",
+ "ssh://somehost:somepath with spaces"
};
git_transport *transport;
unsigned i;
diff --git a/tests/worktree/repository.c b/tests/worktree/repository.c
index 5c7595c64..ca56413b7 100644
--- a/tests/worktree/repository.c
+++ b/tests/worktree/repository.c
@@ -27,6 +27,7 @@ void test_worktree_repository__head(void)
cl_git_pass(git_reference_lookup(&ref, fixture.repo, "refs/heads/testrepo-worktree"));
cl_git_pass(git_repository_head_for_worktree(&head, fixture.repo, "testrepo-worktree"));
cl_assert(git_reference_cmp(ref, head) == 0);
+ cl_assert(git_reference_owner(ref) == fixture.repo);
git_reference_free(ref);
git_reference_free(head);
diff --git a/tests/worktree/worktree.c b/tests/worktree/worktree.c
index 4ac3b8bba..9b932d8ae 100644
--- a/tests/worktree/worktree.c
+++ b/tests/worktree/worktree.c
@@ -273,6 +273,36 @@ void test_worktree_worktree__init_existing_branch(void)
git_reference_free(branch);
}
+void test_worktree_worktree__add_with_explicit_branch(void)
+{
+ git_reference *head, *branch, *wthead;
+ git_commit *commit;
+ git_worktree *wt;
+ git_repository *wtrepo;
+ git_buf path = GIT_BUF_INIT;
+ git_worktree_add_options opts = GIT_WORKTREE_ADD_OPTIONS_INIT;
+
+ cl_git_pass(git_repository_head(&head, fixture.repo));
+ cl_git_pass(git_commit_lookup(&commit, fixture.repo, &head->target.oid));
+ cl_git_pass(git_branch_create(&branch, fixture.repo, "worktree-with-ref", commit, false));
+
+ opts.ref = branch;
+
+ cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-with-different-name"));
+ cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-with-different-name", path.ptr, &opts));
+ cl_git_pass(git_repository_open_from_worktree(&wtrepo, wt));
+ cl_git_pass(git_repository_head(&wthead, wtrepo));
+ cl_assert_equal_s(git_reference_name(wthead), "refs/heads/worktree-with-ref");
+
+ git_buf_free(&path);
+ git_commit_free(commit);
+ git_reference_free(head);
+ git_reference_free(branch);
+ git_reference_free(wthead);
+ git_repository_free(wtrepo);
+}
+
+
void test_worktree_worktree__init_existing_worktree(void)
{
git_worktree *wt;