summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2015-11-30 04:49:31 +0100
committerCarlos Martín Nieto <cmn@dwim.me>2015-11-30 04:49:31 +0100
commita27f31d8f54635e349d5c64df4394a3f51752a5a (patch)
treeff1380602c2fadbe1eb07fb84e5f9675f269f243
parente0ab1ca0288db57fabbd63dfb6a0cd27f3acf8b2 (diff)
parent5b9c63c3f673cbc209e53627be2a0e87c17ccb3c (diff)
downloadlibgit2-a27f31d8f54635e349d5c64df4394a3f51752a5a.tar.gz
Merge pull request #3513 from ethomson/merge_recursive
Recursive Merge
-rw-r--r--CHANGELOG.md8
-rw-r--r--include/git2/merge.h44
-rw-r--r--src/annotated_commit.c89
-rw-r--r--src/annotated_commit.h27
-rw-r--r--src/merge.c407
-rw-r--r--src/merge.h4
-rw-r--r--tests/cherrypick/workdir.c4
-rw-r--r--tests/merge/conflict_data.h103
-rw-r--r--tests/merge/files.c1
-rw-r--r--tests/merge/merge_helpers.c3
-rw-r--r--tests/merge/merge_helpers.h43
-rw-r--r--tests/merge/trees/automerge.c3
-rw-r--r--tests/merge/trees/commits.c3
-rw-r--r--tests/merge/trees/recursive.c410
-rw-r--r--tests/merge/trees/treediff.c2
-rw-r--r--tests/merge/workdir/recursive.c84
-rw-r--r--tests/merge/workdir/renames.c6
-rw-r--r--tests/merge/workdir/simple.c1
-rw-r--r--tests/resources/merge-recursive/.gitted/HEAD1
-rw-r--r--tests/resources/merge-recursive/.gitted/config7
-rw-r--r--tests/resources/merge-recursive/.gitted/indexbin0 -> 619 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/info/refs1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/00/6b298c5702b04c00370d0414959765b82fd722bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/00/7f1ee2af8e5d99906867c4237510e1790a89b83
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/01/6eef4a6fefd36bdcaa93ad773449ddc5c73cbbbin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/05/c6a04ac101ab1a9836a95d5ec8d16b6f6304fdbin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/06/db153c36829fc656e05cdf5a3bf7183f3c10aa2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/07/10c3c796e0704361472ecb904413fca0107a25bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/07/2d89dcf3a7671ac34a8e875bb72fb39bcf14d7bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/0b/b7ed583d7e9ad507e8b902594f5c9126ea456bbin0 -> 161 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/0e/8126647ec607f0a14122cec4b15315d790c8ffbin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/0f/a6ead2731b9d138afe38c336c9727ea05027a71
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/12/4d4fe29d3433fdaa2f0f455d226f2c79d89cf3bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/15/311229e70fa62653f73dde1d4deef1a8e47a11bin0 -> 710 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/15/faa0c9991f2d65686e844651faa2ff9827887bbin0 -> 665 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/16/895aa5e13f8907d4adab81285557d938fad342bin0 -> 634 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/1c/1bdb80c04233d1a9b9755913ee233987be6175bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/1e/8dff96faaaa24f84943d2d9601dde61cb0398abin0 -> 268 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/21/950d5e4e4d1a871b4dfcf72ecb6b9c162c434ebin0 -> 670 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/34/8f16ffaeb73f319a75cec5b16a0a47d2d5e27cbin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/37/185b25a204309bf74817da1a607518f13ca3edbin0 -> 715 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/37/a5054a9f9b4628e3924c5cb8f2147c6e2a3efcbin0 -> 630 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/38/55170cef875708da06ab9ad7fc6a73b531cda1bin0 -> 664 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/3a/3f5a6ec1c968d1d2d5d20dee0d161a4351f2791
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/3b/919b6e8a575b4779c8243ebea3e3beb436e88fbin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/3f/d41804a7906db846af5e868444782e546af46abin0 -> 206 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/41/71bb8d40e9fc830d79b757dc06ec6c14548b78bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/42/1b392106e079df6d412babd5636697938269ec2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/42/44d13e2bbc38510320443bbb003f3967d12436bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/43/2faca0c62dc556ad71a22f23e541a46a8b0f6f2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/43/5424798e5e1b21dd4588d1c291ba4eb179a838bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/43/6ea75c99f527e4b42fddb46abedf7726eb719d2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/48/3065df53c0f4a02cdc6b2910b05d388fc17ffbbin0 -> 165 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850abin0 -> 615 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4c/49317a0912ca559d2048bc329994eb7d10474fbin0 -> 183 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4d/fc1be85a9d6c9898152444d32b238b4aecf8ccbin0 -> 168 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4e/21d2d63357bde5027d1625f5ec6b430cdeb143bin0 -> 662 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4e/70a6b06fc62481f80fbb74327849e7170eebffbin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/4f/4e85a0ab8515e34302721fbcec06fa9d9c1a9abin0 -> 631 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/50/e4facaafb746cfed89287206274193c14172882
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/53/9bd011c4822c560c1d17cab095006b7a10f707bin0 -> 163 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/56/07a8c4601a737daadd1f470bde3142aff570261
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5a/ba269b3be41fc8db38068d3948c8af543fe609bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5b/8e1e56cb99e8b99ac22eec8aebf6422ecd08c0bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5e/8747f5200fac0f945a07daf6163ca9cb1a8da9bin0 -> 672 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/5f/18576d464946eb2338daeb8b4030019961f505bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/63/e8773becdea9c3699c95a5740be5baa8be8d69bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/65/bea8448ca5b3104628ffbca553c54bde54b0fc3
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/66/6ffdfcf1eaa5641fa31064bf2607327e843c09bin0 -> 664 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/68/a2e1ee61a23a4728fe6b35580fbbbf729df370bin0 -> 665 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/68/af1fc7407fd9addf1701a87eb1c95c7494c598bin0 -> 443 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/68/f6182f4c85d39e1309d97c7e456156dc9c0096bin0 -> 755 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/6c/778edd0e4cf394f5a3df8b96db516024cc1bb8bin0 -> 636 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/6e/f31d35a3f5abc1e24f4f9afa5cb2016f03fa2d1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/71/3e438567b28543235faf265c4c5b02b437c7fdbin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/72/3181f1bfd30e47a6d1d36a4d874e31e7a0a1a42
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/73/b20c8e09fa2726d69ff66969186014165da3c3bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/74/4df1bdf0f7bca20deb23e5a5eb8255fc237901bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/75/c653822173a8e5795153ec3773dfe44bb9bb631
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/78/3d6539dde96b8873c5b5da3e79cc14cd64830b4
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7a/9277e0c5ec75339f011c176d0c20e513c4de1c1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7c/7e08f9559d9e1551b91e1cf68f1d0066109addbin0 -> 443 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/7e/3056f6765b3044ab09701077dbe1eb5b0e9ad0bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/81/5b5a1c80ca749d705c7aa0cb294a00cbedd3405
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/88/8588a782ad433fbf0cc526e07cfe6f4a6b60b3bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/88/eb3f98849f4b8d0555395f514800900a01dc8fbin0 -> 209 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/89/8d12687fb35be271c27c795a6b32c8b51da79ebin0 -> 663 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/8a/bda8de114a93f2d3c5a975ee2960f31e24be582
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/8f/35f30bfe09513f96cf8aa4df0834ae34e93bae1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/94/d2c01087f48213bd157222d54edfefd77c9bbabin0 -> 621 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/95/78b04e2087976e382622322ba476aa40398dc7bin0 -> 620 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/96/23368f0fc562d6d840372ae17dc4cc32d51a802
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/97/3b70322e758da87e1ce21d2195d86c5e4e96471
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/98/1c79eb38518d3821e73bb159dc413bb42d6614bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/9a/e63b4a8ce0f181b2d1d098971733a103226917bin0 -> 240 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/9b/258ad4c39f40c24f66bf1faf48eb6202d59c85bin0 -> 240 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/9c/3f1c70db28c00ce74b22ba3edafe16d9cf03d4bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/9e/12bce04446d097ae1782967a5888c2e2a0d35bbin0 -> 268 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a0/2d4fd126e0cc8fb46ee48cf38bad36d44f2dbcbin0 -> 649 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a0/65d3022e99a1943177c10a53cce38bc2127042bin0 -> 162 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a2/8c21c90aa36580641b345011869d1a899a67832
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a2/fa36ffc4a565a223e225d15b18774f87d0c4f03
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a3/4e5a16feabbd0335a633aadb8217c9f3dba58dbin0 -> 164 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20bin0 -> 621 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/a8/2a121ea36b115548d6dad2cd86ec27f06f7b30bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/aa/9e263294fd2f6f6fd9ceab23ca8ce3ea2ce707bin0 -> 175 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ad/1ea02c2cc4f55c1dff87b80a086206a73885eb2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ad/2ace9e15f66b3d1138922e6ffdc3ea3f967fa6bin0 -> 170 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ad/98bfa4679fb00b89207a0a11b8bbf91a3e4de9bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b2/a81ead9e722af0099fccfb478cea88eea749a2bin0 -> 664 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b4/cefb3c75770e57bb8bb44e4a50d9578009e847bin0 -> 639 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/b9/1ef5ffa8612616c8e76051901caafd723f0e2cbin0 -> 712 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/bd/97980c22d122509cdd915fd9788d56c8d3ae20bin0 -> 163 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/c0/bd078a61d2cc22c52ca5ce04abdcdc5cc1829ebin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/c4/83ca4bb087174af5cb51d7caa9c09fe4a28ccb1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f1
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ca/224bba0a8a24f1768804fe5f565b1014af7ef2bin0 -> 170 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ca/49d1a8b6116ffeba22667bba265fa5261df7ab2
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ca/7d316d6d9af99d2481e980d68b77e572d80fe7bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ca/fa936d25f0b397432a27201f6b3284c47df8bebin0 -> 712 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/cb/49ad76147f5f9439cbd6133708b76142660660bin0 -> 641 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d0/dd5d9083bda65ec99aa8b9b64a5a278771b70abin0 -> 620 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d2/682aaf9594080ce877b5eeee110850fd6e34801
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d6/04c75019c282144bdbbf3fd3462ba74b240efcbin0 -> 620 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d7/1c24b3b113fd1d1909998c5bfe33b86a65ee03bin0 -> 240 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d8/dd349b78f19a4ebe3357bacb8138f00bf5ed41bin0 -> 277 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/d8/e05a90b3c2240d71a20c2502c937d9b7d227772
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/da/b7b53383a1fec46632e60a1d847ce4f9ae14f2bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/db/203155a789fb749aa3c14e93eea2c744a9c6c71
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/de/a7215f259b2cced87d1bda6c72f8b4ce37a2ffbin0 -> 357 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e1/512550f09d980214e46e6d3f5a2b20c3d75755bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e1/dcfc3038be54195a59817c89782b261e46cb051
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e2/93bfdddb81a853bbb16b8b58e68626f30841a4bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e2/c84bb33992a455b1a7a5019f0e38d883d3f475bin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e2/d185fa827d58134cea20b9e1df893833c6560ebin0 -> 208 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/e5/0fbbd701458757bdfe9815f58ed717c588d1b53
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ef/1783444b61a8671beea4ce1f4d0202677dfbfb3
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f1/3e1bc6ba935fce2efffa5be4c4832404034ef1bin0 -> 206 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f1/72517a8cf39e009ffff541ee52429b89e418f3bin0 -> 268 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f1/b44c04989a3a1c14b036cfadfa328d53a7bc5ebin0 -> 672 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f3/5f159ff5d44dfd9f52d63dd5b659f0521ff569bin0 -> 669 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f5/1658077d85f2264fa179b4d0848268cb3475c32
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/f7/929c5a67a4bdc98247fb4b5098675723932a64bin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/fa/567f568ed72157c0c617438d077695b99d9aacbin0 -> 662 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/fd/8b5fe88cda995e70a22ed98701e65b843e05ecbin0 -> 165 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/fe/f01f3104c8047d05e8572e521c454f8fd4b8dbbin0 -> 207 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807dbin0 -> 355 bytes
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchA-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchA-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchB-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchB-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchC-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchC-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchD-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchD-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchE-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchE-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchE-31
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchF-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchF-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchG-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchG-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchH-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchH-21
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchI-11
-rw-r--r--tests/resources/merge-recursive/.gitted/refs/heads/branchI-21
-rw-r--r--tests/resources/merge-recursive/asparagus.txt10
-rw-r--r--tests/resources/merge-recursive/beef.txt22
-rw-r--r--tests/resources/merge-recursive/bouilli.txt18
-rw-r--r--tests/resources/merge-recursive/gravy.txt8
-rw-r--r--tests/resources/merge-recursive/oyster.txt13
-rw-r--r--tests/resources/merge-recursive/veal.txt20
-rw-r--r--tests/revert/workdir.c4
175 files changed, 1237 insertions, 192 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7d5a4166a..196ad705a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -34,6 +34,14 @@ v0.23 + 1
### Breaking API changes
+* The `git_merge_tree_flag_t` is now `git_merge_flag_t`. Subsequently,
+ its members are no longer prefixed with `GIT_MERGE_TREE_FLAG` but are
+ now prefixed with `GIT_MERGE_FLAG`, and the `tree_flags` field of the
+ `git_merge_options` structure is now named `flags`.
+
+* The `git_merge_file_flags_t` enum is now `git_merge_file_flag_t` for
+ consistency with other enum type names.
+
* `git_cert` descendent types now have a proper `parent` member
* It is the responsibility of the refdb backend to decide what to do
diff --git a/include/git2/merge.h b/include/git2/merge.h
index b7da63e0e..af53ead22 100644
--- a/include/git2/merge.h
+++ b/include/git2/merge.h
@@ -62,8 +62,8 @@ GIT_EXTERN(int) git_merge_file_init_input(
unsigned int version);
/**
- * Flags for `git_merge_tree` options. A combination of these flags can be
- * passed in via the `tree_flags` value in the `git_merge_options`.
+ * Flags for `git_merge` options. A combination of these flags can be
+ * passed in via the `flags` value in the `git_merge_options`.
*/
typedef enum {
/**
@@ -71,20 +71,28 @@ typedef enum {
* side or the common ancestor and the "theirs" side. This will enable
* the ability to merge between a modified and renamed file.
*/
- GIT_MERGE_TREE_FIND_RENAMES = (1 << 0),
+ GIT_MERGE_FIND_RENAMES = (1 << 0),
/**
* If a conflict occurs, exit immediately instead of attempting to
* continue resolving conflicts. The merge operation will fail with
* GIT_EMERGECONFLICT and no index will be returned.
*/
- GIT_MERGE_TREE_FAIL_ON_CONFLICT = (1 << 1),
+ GIT_MERGE_FAIL_ON_CONFLICT = (1 << 1),
/**
* Do not write the REUC extension on the generated index
*/
- GIT_MERGE_TREE_SKIP_REUC = (1 << 2),
-} git_merge_tree_flag_t;
+ GIT_MERGE_SKIP_REUC = (1 << 2),
+
+ /**
+ * If the commits being merged have multiple merge bases, do not build
+ * a recursive merge base (by merging the multiple merge bases),
+ * instead simply use the first base. This flag provides a similar
+ * merge base to `git-merge-resolve`.
+ */
+ GIT_MERGE_NO_RECURSIVE = (1 << 3),
+} git_merge_flag_t;
/**
* Merge file favor options for `git_merge_options` instruct the file-level
@@ -152,7 +160,7 @@ typedef enum {
/** Take extra time to find minimal diff */
GIT_MERGE_FILE_DIFF_MINIMAL = (1 << 7),
-} git_merge_file_flags_t;
+} git_merge_file_flag_t;
/**
* Options for merging a file
@@ -181,8 +189,8 @@ typedef struct {
/** The file to favor in region conflicts. */
git_merge_file_favor_t favor;
- /** see `git_merge_file_flags_t` above */
- unsigned int flags;
+ /** see `git_merge_file_flag_t` above */
+ git_merge_file_flag_t flags;
} git_merge_file_options;
#define GIT_MERGE_FILE_OPTIONS_VERSION 1
@@ -232,11 +240,13 @@ typedef struct {
*/
typedef struct {
unsigned int version;
- git_merge_tree_flag_t tree_flags;
+
+ /** See `git_merge_flag_t` above */
+ git_merge_flag_t flags;
/**
* Similarity to consider a file renamed (default 50). If
- * `GIT_MERGE_TREE_FIND_RENAMES` is enabled, added files will be compared
+ * `GIT_MERGE_FIND_RENAMES` is enabled, added files will be compared
* with deleted files to determine their similarity. Files that are
* more similar than the rename threshold (percentage-wise) will be
* treated as a rename.
@@ -255,11 +265,19 @@ typedef struct {
/** Pluggable similarity metric; pass NULL to use internal metric */
git_diff_similarity_metric *metric;
+ /**
+ * Maximum number of times to merge common ancestors to build a
+ * virtual merge base when faced with criss-cross merges. When this
+ * limit is reached, the next ancestor will simply be used instead of
+ * attempting to merge it. The default is unlimited.
+ */
+ unsigned int recursion_limit;
+
/** Flags for handling conflicting content. */
git_merge_file_favor_t file_favor;
- /** see `git_merge_file_flags_t` above */
- unsigned int file_flags;
+ /** see `git_merge_file_flag_t` above */
+ git_merge_file_flag_t file_flags;
} git_merge_options;
#define GIT_MERGE_OPTIONS_VERSION 1
diff --git a/src/annotated_commit.c b/src/annotated_commit.c
index 3f2d2ed17..e53b95dee 100644
--- a/src/annotated_commit.c
+++ b/src/annotated_commit.c
@@ -7,12 +7,16 @@
#include "common.h"
#include "annotated_commit.h"
+#include "refs.h"
+#include "cache.h"
#include "git2/commit.h"
#include "git2/refs.h"
#include "git2/repository.h"
#include "git2/annotated_commit.h"
#include "git2/revparse.h"
+#include "git2/tree.h"
+#include "git2/index.h"
static int annotated_commit_init(
git_annotated_commit **out,
@@ -22,14 +26,17 @@ static int annotated_commit_init(
const char *remote_url)
{
git_annotated_commit *annotated_commit;
+ git_commit *commit = NULL;
int error = 0;
assert(out && id);
*out = NULL;
- annotated_commit = git__calloc(1, sizeof(git_annotated_commit));
- GITERR_CHECK_ALLOC(annotated_commit);
+ if ((error = git_commit_lookup(&commit, repo, id)) < 0 ||
+ (error = git_annotated_commit_from_commit(&annotated_commit,
+ commit)) < 0)
+ goto done;
if (ref_name) {
annotated_commit->ref_name = git__strdup(ref_name);
@@ -41,15 +48,10 @@ static int annotated_commit_init(
GITERR_CHECK_ALLOC(annotated_commit->remote_url);
}
- git_oid_fmt(annotated_commit->id_str, id);
- annotated_commit->id_str[GIT_OID_HEXSZ] = '\0';
-
- if ((error = git_commit_lookup(&annotated_commit->commit, repo, id)) < 0) {
- git_annotated_commit_free(annotated_commit);
- return error;
- }
-
*out = annotated_commit;
+
+done:
+ git_commit_free(commit);
return error;
}
@@ -75,6 +77,51 @@ int git_annotated_commit_from_ref(
return error;
}
+int git_annotated_commit_from_head(
+ git_annotated_commit **out,
+ git_repository *repo)
+{
+ git_reference *head;
+ int error;
+
+ assert(out && repo);
+
+ *out = NULL;
+
+ if ((error = git_reference_lookup(&head, repo, GIT_HEAD_FILE)) < 0)
+ return -1;
+
+ error = git_annotated_commit_from_ref(out, repo, head);
+
+ git_reference_free(head);
+ return error;
+}
+
+int git_annotated_commit_from_commit(
+ git_annotated_commit **out,
+ git_commit *commit)
+{
+ git_annotated_commit *annotated_commit;
+
+ assert(out && commit);
+
+ *out = NULL;
+
+ annotated_commit = git__calloc(1, sizeof(git_annotated_commit));
+ GITERR_CHECK_ALLOC(annotated_commit);
+
+ annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL;
+
+ git_cached_obj_incref(commit);
+ annotated_commit->commit = commit;
+
+ git_oid_fmt(annotated_commit->id_str, git_commit_id(commit));
+ annotated_commit->id_str[GIT_OID_HEXSZ] = '\0';
+
+ *out = annotated_commit;
+ return 0;
+}
+
int git_annotated_commit_lookup(
git_annotated_commit **out,
git_repository *repo,
@@ -136,14 +183,20 @@ void git_annotated_commit_free(git_annotated_commit *annotated_commit)
if (annotated_commit == NULL)
return;
- if (annotated_commit->commit != NULL)
- git_commit_free(annotated_commit->commit);
-
- if (annotated_commit->ref_name != NULL)
- git__free(annotated_commit->ref_name);
-
- if (annotated_commit->remote_url != NULL)
- git__free(annotated_commit->remote_url);
+ switch (annotated_commit->type) {
+ case GIT_ANNOTATED_COMMIT_REAL:
+ git_commit_free(annotated_commit->commit);
+ git_tree_free(annotated_commit->tree);
+ git__free(annotated_commit->ref_name);
+ git__free(annotated_commit->remote_url);
+ break;
+ case GIT_ANNOTATED_COMMIT_VIRTUAL:
+ git_index_free(annotated_commit->index);
+ git_array_clear(annotated_commit->parents);
+ break;
+ default:
+ abort();
+ }
git__free(annotated_commit);
}
diff --git a/src/annotated_commit.h b/src/annotated_commit.h
index e873184ae..cbb88fd22 100644
--- a/src/annotated_commit.h
+++ b/src/annotated_commit.h
@@ -7,11 +7,31 @@
#ifndef INCLUDE_annotated_commit_h__
#define INCLUDE_annotated_commit_h__
+#include "oidarray.h"
+
#include "git2/oid.h"
-/** Internal structure for merge inputs */
+typedef enum {
+ GIT_ANNOTATED_COMMIT_REAL = 1,
+ GIT_ANNOTATED_COMMIT_VIRTUAL = 2,
+} git_annotated_commit_t;
+
+/**
+ * Internal structure for merge inputs. An annotated commit is generally
+ * "real" and backed by an actual commit in the repository, but merge will
+ * internally create "virtual" commits that are in-memory intermediate
+ * commits backed by an index.
+ */
struct git_annotated_commit {
+ git_annotated_commit_t type;
+
+ /* real commit */
git_commit *commit;
+ git_tree *tree;
+
+ /* virtual commit structure */
+ git_index *index;
+ git_array_oid_t parents;
char *ref_name;
char *remote_url;
@@ -19,4 +39,9 @@ struct git_annotated_commit {
char id_str[GIT_OID_HEXSZ+1];
};
+extern int git_annotated_commit_from_head(git_annotated_commit **out,
+ git_repository *repo);
+extern int git_annotated_commit_from_commit(git_annotated_commit **out,
+ git_commit *commit);
+
#endif
diff --git a/src/merge.c b/src/merge.c
index bad5f9552..9eb3b0904 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -27,6 +27,8 @@
#include "config.h"
#include "oidarray.h"
#include "annotated_commit.h"
+#include "commit.h"
+#include "oidarray.h"
#include "git2/types.h"
#include "git2/repository.h"
@@ -47,6 +49,19 @@
#define GIT_MERGE_INDEX_ENTRY_EXISTS(X) ((X).mode != 0)
#define GIT_MERGE_INDEX_ENTRY_ISFILE(X) S_ISREG((X).mode)
+
+/** Internal merge flags. */
+enum {
+ /** The merge is for a virtual base in a recursive merge. */
+ GIT_MERGE__VIRTUAL_BASE = (1 << 31),
+};
+
+enum {
+ /** Accept the conflict file, staging it as the merge result. */
+ GIT_MERGE_FILE_FAVOR__CONFLICTED = 4,
+};
+
+
typedef enum {
TREE_IDX_ANCESTOR = 0,
TREE_IDX_OURS = 1,
@@ -799,11 +814,9 @@ static int merge_conflict_resolve_automerge(
int *resolved,
git_merge_diff_list *diff_list,
const git_merge_diff *conflict,
- unsigned int merge_file_favor,
- unsigned int file_flags)
+ const git_merge_file_options *file_opts)
{
const git_index_entry *ancestor = NULL, *ours = NULL, *theirs = NULL;
- git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT;
git_merge_file_result result = {0};
git_index_entry *index_entry;
git_odb *odb = NULL;
@@ -850,12 +863,9 @@ static int merge_conflict_resolve_automerge(
theirs = GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ?
&conflict->their_entry : NULL;
- opts.favor = merge_file_favor;
- opts.flags = file_flags;
-
if ((error = git_repository_odb(&odb, diff_list->repo)) < 0 ||
- (error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, &opts)) < 0 ||
- !result.automergeable ||
+ (error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, file_opts)) < 0 ||
+ (!result.automergeable && !(file_opts->flags & GIT_MERGE_FILE_FAVOR__CONFLICTED)) ||
(error = git_odb_write(&automerge_oid, odb, result.ptr, result.len, GIT_OBJ_BLOB)) < 0)
goto done;
@@ -885,8 +895,7 @@ static int merge_conflict_resolve(
int *out,
git_merge_diff_list *diff_list,
const git_merge_diff *conflict,
- unsigned int merge_file_favor,
- unsigned int file_flags)
+ const git_merge_file_options *file_opts)
{
int resolved = 0;
int error = 0;
@@ -902,8 +911,7 @@ static int merge_conflict_resolve(
if (!resolved && (error = merge_conflict_resolve_one_renamed(&resolved, diff_list, conflict)) < 0)
goto done;
- if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict,
- merge_file_favor, file_flags)) < 0)
+ if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, file_opts)) < 0)
goto done;
*out = resolved;
@@ -1296,7 +1304,7 @@ int git_merge_diff_list__find_renames(
assert(diff_list && opts);
- if ((opts->tree_flags & GIT_MERGE_TREE_FIND_RENAMES) == 0)
+ if ((opts->flags & GIT_MERGE_FIND_RENAMES) == 0)
return 0;
similarity_ours = git__calloc(diff_list->conflicts.length,
@@ -1632,8 +1640,8 @@ static int merge_normalize_opts(
git_merge_options init = GIT_MERGE_OPTIONS_INIT;
memcpy(opts, &init, sizeof(init));
- opts->tree_flags = GIT_MERGE_TREE_FIND_RENAMES;
- opts->rename_threshold = GIT_MERGE_TREE_RENAME_THRESHOLD;
+ opts->flags = GIT_MERGE_FIND_RENAMES;
+ opts->rename_threshold = GIT_MERGE_DEFAULT_RENAME_THRESHOLD;
}
if (!opts->target_limit) {
@@ -1643,7 +1651,7 @@ static int merge_normalize_opts(
limit = git_config__get_int_force(cfg, "diff.renamelimit", 0);
opts->target_limit = (limit <= 0) ?
- GIT_MERGE_TREE_TARGET_LIMIT : (unsigned int)limit;
+ GIT_MERGE_DEFAULT_TARGET_LIMIT : (unsigned int)limit;
}
/* assign the internal metric with whitespace flag as payload */
@@ -1827,6 +1835,7 @@ int git_merge__iterators(
*empty_theirs = NULL;
git_merge_diff_list *diff_list;
git_merge_options opts;
+ git_merge_file_options file_opts = GIT_MERGE_FILE_OPTIONS_INIT;
git_merge_diff *conflict;
git_vector changes;
size_t i;
@@ -1842,6 +1851,17 @@ int git_merge__iterators(
if ((error = merge_normalize_opts(repo, &opts, given_opts)) < 0)
return error;
+ file_opts.favor = opts.file_favor;
+ file_opts.flags = opts.file_flags;
+
+ /* use the git-inspired labels when virtual base building */
+ if (opts.flags & GIT_MERGE__VIRTUAL_BASE) {
+ file_opts.ancestor_label = "merged common ancestors";
+ file_opts.our_label = "Temporary merge branch 1";
+ file_opts.their_label = "Temporary merge branch 2";
+ file_opts.flags |= GIT_MERGE_FILE_FAVOR__CONFLICTED;
+ }
+
diff_list = git_merge_diff_list__alloc(repo);
GITERR_CHECK_ALLOC(diff_list);
@@ -1860,11 +1880,12 @@ int git_merge__iterators(
git_vector_foreach(&changes, i, conflict) {
int resolved = 0;
- if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.file_flags)) < 0)
+ if ((error = merge_conflict_resolve(
+ &resolved, diff_list, conflict, &file_opts)) < 0)
goto done;
if (!resolved) {
- if ((opts.tree_flags & GIT_MERGE_TREE_FAIL_ON_CONFLICT)) {
+ if ((opts.flags & GIT_MERGE_FAIL_ON_CONFLICT)) {
giterr_set(GITERR_MERGE, "merge conflicts exist");
error = GIT_EMERGECONFLICT;
goto done;
@@ -1875,7 +1896,7 @@ int git_merge__iterators(
}
error = index_from_diff_list(out, diff_list,
- (opts.tree_flags & GIT_MERGE_TREE_SKIP_REUC));
+ (opts.flags & GIT_MERGE_SKIP_REUC));
done:
if (!given_opts || !given_opts->metric)
@@ -1922,6 +1943,207 @@ done:
return error;
}
+static int merge_annotated_commits(
+ git_index **index_out,
+ git_annotated_commit **base_out,
+ git_repository *repo,
+ git_annotated_commit *our_commit,
+ git_annotated_commit *their_commit,
+ size_t recursion_level,
+ const git_merge_options *opts);
+
+GIT_INLINE(int) insert_head_ids(
+ git_array_oid_t *ids,
+ const git_annotated_commit *annotated_commit)
+{
+ git_oid *id;
+ size_t i;
+
+ if (annotated_commit->type == GIT_ANNOTATED_COMMIT_REAL) {
+ id = git_array_alloc(*ids);
+ GITERR_CHECK_ALLOC(id);
+
+ git_oid_cpy(id, git_commit_id(annotated_commit->commit));
+ } else {
+ for (i = 0; i < annotated_commit->parents.size; i++) {
+ id = git_array_alloc(*ids);
+ GITERR_CHECK_ALLOC(id);
+
+ git_oid_cpy(id, &annotated_commit->parents.ptr[i]);
+ }
+ }
+
+ return 0;
+}
+
+static int create_virtual_base(
+ git_annotated_commit **out,
+ git_repository *repo,
+ git_annotated_commit *one,
+ git_annotated_commit *two,
+ const git_merge_options *opts,
+ size_t recursion_level)
+{
+ git_annotated_commit *result = NULL;
+ git_index *index = NULL;
+ git_merge_options virtual_opts = GIT_MERGE_OPTIONS_INIT;
+
+ result = git__calloc(1, sizeof(git_annotated_commit));
+ GITERR_CHECK_ALLOC(result);
+
+ /* Conflicts in the merge base creation do not propagate to conflicts
+ * in the result; the conflicted base will act as the common ancestor.
+ */
+ if (opts)
+ memcpy(&virtual_opts, opts, sizeof(git_merge_options));
+
+ virtual_opts.flags &= ~GIT_MERGE_FAIL_ON_CONFLICT;
+ virtual_opts.flags |= GIT_MERGE__VIRTUAL_BASE;
+
+ if ((merge_annotated_commits(&index, NULL, repo, one, two,
+ recursion_level + 1, &virtual_opts)) < 0)
+ return -1;
+
+ result->type = GIT_ANNOTATED_COMMIT_VIRTUAL;
+ result->index = index;
+
+ insert_head_ids(&result->parents, one);
+ insert_head_ids(&result->parents, two);
+
+ *out = result;
+ return 0;
+}
+
+static int compute_base(
+ git_annotated_commit **out,
+ git_repository *repo,
+ const git_annotated_commit *one,
+ const git_annotated_commit *two,
+ const git_merge_options *given_opts,
+ size_t recursion_level)
+{
+ git_array_oid_t head_ids = GIT_ARRAY_INIT;
+ git_oidarray bases = {0};
+ git_annotated_commit *base = NULL, *other = NULL, *new_base = NULL;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+ size_t i;
+ int error;
+
+ *out = NULL;
+
+ if (given_opts)
+ memcpy(&opts, given_opts, sizeof(git_merge_options));
+
+ if ((error = insert_head_ids(&head_ids, one)) < 0 ||
+ (error = insert_head_ids(&head_ids, two)) < 0)
+ goto done;
+
+ if ((error = git_merge_bases_many(&bases, repo,
+ head_ids.size, head_ids.ptr)) < 0 ||
+ (error = git_annotated_commit_lookup(&base, repo, &bases.ids[0])) < 0 ||
+ (opts.flags & GIT_MERGE_NO_RECURSIVE))
+ goto done;
+
+ for (i = 1; i < bases.count; i++) {
+ recursion_level++;
+
+ if (opts.recursion_limit && recursion_level > opts.recursion_limit)
+ break;
+
+ if ((error = git_annotated_commit_lookup(&other, repo,
+ &bases.ids[i])) < 0 ||
+ (error = create_virtual_base(&new_base, repo, base, other, &opts,
+ recursion_level)) < 0)
+ goto done;
+
+ git_annotated_commit_free(base);
+ git_annotated_commit_free(other);
+
+ base = new_base;
+ new_base = NULL;
+ other = NULL;
+ }
+
+done:
+ if (error == 0)
+ *out = base;
+ else
+ git_annotated_commit_free(base);
+
+ git_annotated_commit_free(other);
+ git_annotated_commit_free(new_base);
+ git_oidarray_free(&bases);
+ git_array_clear(head_ids);
+ return error;
+}
+
+static int iterator_for_annotated_commit(
+ git_iterator **out,
+ git_annotated_commit *commit)
+{
+ git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT;
+ int error;
+
+ opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
+
+ if (commit == NULL) {
+ error = git_iterator_for_nothing(out, &opts);
+ } else if (commit->type == GIT_ANNOTATED_COMMIT_VIRTUAL) {
+ error = git_iterator_for_index(out, commit->index, &opts);
+ } else {
+ if (!commit->tree &&
+ (error = git_commit_tree(&commit->tree, commit->commit)) < 0)
+ goto done;
+
+ error = git_iterator_for_tree(out, commit->tree, &opts);
+ }
+
+done:
+ return error;
+}
+
+static int merge_annotated_commits(
+ git_index **index_out,
+ git_annotated_commit **base_out,
+ git_repository *repo,
+ git_annotated_commit *ours,
+ git_annotated_commit *theirs,
+ size_t recursion_level,
+ const git_merge_options *opts)
+{
+ git_annotated_commit *base = NULL;
+ git_iterator *base_iter = NULL, *our_iter = NULL, *their_iter = NULL;
+ int error;
+
+ if ((error = compute_base(&base, repo, ours, theirs, opts,
+ recursion_level)) < 0) {
+
+ if (error != GIT_ENOTFOUND)
+ goto done;
+
+ giterr_clear();
+ }
+
+ if ((error = iterator_for_annotated_commit(&base_iter, base)) < 0 ||
+ (error = iterator_for_annotated_commit(&our_iter, ours)) < 0 ||
+ (error = iterator_for_annotated_commit(&their_iter, theirs)) < 0 ||
+ (error = git_merge__iterators(index_out, repo, base_iter, our_iter,
+ their_iter, opts)) < 0)
+ goto done;
+
+ if (base_out) {
+ *base_out = base;
+ base = NULL;
+ }
+
+done:
+ git_annotated_commit_free(base);
+ git_iterator_free(base_iter);
+ git_iterator_free(our_iter);
+ git_iterator_free(their_iter);
+ return error;
+}
+
int git_merge_commits(
git_index **out,
@@ -1930,30 +2152,19 @@ int git_merge_commits(
const git_commit *their_commit,
const git_merge_options *opts)
{
- git_oid ancestor_oid;
- git_commit *ancestor_commit = NULL;
- git_tree *our_tree = NULL, *their_tree = NULL, *ancestor_tree = NULL;
+ git_annotated_commit *ours = NULL, *theirs = NULL, *base = NULL;
int error = 0;
- if ((error = git_merge_base(&ancestor_oid, repo, git_commit_id(our_commit), git_commit_id(their_commit))) < 0 &&
- error == GIT_ENOTFOUND)
- giterr_clear();
- else if (error < 0 ||
- (error = git_commit_lookup(&ancestor_commit, repo, &ancestor_oid)) < 0 ||
- (error = git_commit_tree(&ancestor_tree, ancestor_commit)) < 0)
+ if ((error = git_annotated_commit_from_commit(&ours, (git_commit *)our_commit)) < 0 ||
+ (error = git_annotated_commit_from_commit(&theirs, (git_commit *)their_commit)) < 0)
goto done;
- if ((error = git_commit_tree(&our_tree, our_commit)) < 0 ||
- (error = git_commit_tree(&their_tree, their_commit)) < 0 ||
- (error = git_merge_trees(out, repo, ancestor_tree, our_tree, their_tree, opts)) < 0)
- goto done;
+ error = merge_annotated_commits(out, &base, repo, ours, theirs, 0, opts);
done:
- git_commit_free(ancestor_commit);
- git_tree_free(our_tree);
- git_tree_free(their_tree);
- git_tree_free(ancestor_tree);
-
+ git_annotated_commit_free(ours);
+ git_annotated_commit_free(theirs);
+ git_annotated_commit_free(base);
return error;
}
@@ -2387,49 +2598,50 @@ const char *merge_their_label(const char *branchname)
}
static int merge_normalize_checkout_opts(
+ git_checkout_options *out,
git_repository *repo,
- git_checkout_options *checkout_opts,
const git_checkout_options *given_checkout_opts,
- const git_annotated_commit *ancestor_head,
+ unsigned int checkout_strategy,
+ git_annotated_commit *ancestor,
const git_annotated_commit *our_head,
- size_t their_heads_len,
- const git_annotated_commit **their_heads)
+ const git_annotated_commit **their_heads,
+ size_t their_heads_len)
{
+ git_checkout_options default_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
int error = 0;
GIT_UNUSED(repo);
if (given_checkout_opts != NULL)
- memcpy(checkout_opts, given_checkout_opts, sizeof(git_checkout_options));
- else {
- git_checkout_options default_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
- default_checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE;
+ memcpy(out, given_checkout_opts, sizeof(git_checkout_options));
+ else
+ memcpy(out, &default_checkout_opts, sizeof(git_checkout_options));
- memcpy(checkout_opts, &default_checkout_opts, sizeof(git_checkout_options));
- }
+ out->checkout_strategy = checkout_strategy;
- /* TODO: for multiple ancestors in merge-recursive, this is "merged common ancestors" */
- if (!checkout_opts->ancestor_label) {
- if (ancestor_head && ancestor_head->commit)
- checkout_opts->ancestor_label = git_commit_summary(ancestor_head->commit);
+ if (!out->ancestor_label) {
+ if (ancestor && ancestor->type == GIT_ANNOTATED_COMMIT_REAL)
+ out->ancestor_label = git_commit_summary(ancestor->commit);
+ else if (ancestor)
+ out->ancestor_label = "merged common ancestors";
else
- checkout_opts->ancestor_label = "ancestor";
+ out->ancestor_label = "empty base";
}
- if (!checkout_opts->our_label) {
+ if (!out->our_label) {
if (our_head && our_head->ref_name)
- checkout_opts->our_label = our_head->ref_name;
+ out->our_label = our_head->ref_name;
else
- checkout_opts->our_label = "ours";
+ out->our_label = "ours";
}
- if (!checkout_opts->their_label) {
+ if (!out->their_label) {
if (their_heads_len == 1 && their_heads[0]->ref_name)
- checkout_opts->their_label = merge_their_label(their_heads[0]->ref_name);
+ out->their_label = merge_their_label(their_heads[0]->ref_name);
else if (their_heads_len == 1)
- checkout_opts->their_label = their_heads[0]->id_str;
+ out->their_label = their_heads[0]->id_str;
else
- checkout_opts->their_label = "theirs";
+ out->their_label = "theirs";
}
return error;
@@ -2782,11 +2994,10 @@ int git_merge(
{
git_reference *our_ref = NULL;
git_checkout_options checkout_opts;
- git_annotated_commit *ancestor_head = NULL, *our_head = NULL;
- git_tree *ancestor_tree = NULL, *our_tree = NULL, **their_trees = NULL;
+ git_annotated_commit *our_head = NULL, *base = NULL;
git_index *index = NULL;
git_indexwriter indexwriter = GIT_INDEXWRITER_INIT;
- size_t i;
+ unsigned int checkout_strategy;
int error = 0;
assert(repo && their_heads);
@@ -2796,61 +3007,49 @@ int git_merge(
return -1;
}
- their_trees = git__calloc(their_heads_len, sizeof(git_tree *));
- GITERR_CHECK_ALLOC(their_trees);
-
- if ((error = merge_heads(&ancestor_head, &our_head, repo, their_heads, their_heads_len)) < 0 ||
- (error = merge_normalize_checkout_opts(repo, &checkout_opts, given_checkout_opts,
- ancestor_head, our_head, their_heads_len, their_heads)) < 0 ||
- (error = git_indexwriter_init_for_operation(&indexwriter, repo, &checkout_opts.checkout_strategy)) < 0)
- goto on_error;
-
- /* Write the merge files to the repository. */
- if ((error = git_merge__setup(repo, our_head, their_heads, their_heads_len)) < 0)
- goto on_error;
+ if ((error = git_repository__ensure_not_bare(repo, "merge")) < 0)
+ goto done;
- if (ancestor_head != NULL &&
- (error = git_commit_tree(&ancestor_tree, ancestor_head->commit)) < 0)
- goto on_error;
+ checkout_strategy = given_checkout_opts ?
+ given_checkout_opts->checkout_strategy :
+ GIT_CHECKOUT_SAFE;
- if ((error = git_commit_tree(&our_tree, our_head->commit)) < 0)
- goto on_error;
+ if ((error = git_indexwriter_init_for_operation(&indexwriter, repo,
+ &checkout_strategy)) < 0)
+ goto done;
- for (i = 0; i < their_heads_len; i++) {
- if ((error = git_commit_tree(&their_trees[i], their_heads[i]->commit)) < 0)
- goto on_error;
- }
+ /* Write the merge setup files to the repository. */
+ if ((error = git_annotated_commit_from_head(&our_head, repo)) < 0 ||
+ (error = git_merge__setup(repo, our_head, their_heads,
+ their_heads_len)) < 0)
+ goto done;
- /* TODO: recursive, octopus, etc... */
+ /* TODO: octopus */
- if ((error = git_merge_trees(&index, repo, ancestor_tree, our_tree, their_trees[0], merge_opts)) < 0 ||
+ if ((error = merge_annotated_commits(&index, &base, repo, our_head,
+ (git_annotated_commit *)their_heads[0], 0, merge_opts)) < 0 ||
(error = git_merge__check_result(repo, index)) < 0 ||
- (error = git_merge__append_conflicts_to_merge_msg(repo, index)) < 0 ||
- (error = git_checkout_index(repo, index, &checkout_opts)) < 0 ||
- (error = git_indexwriter_commit(&indexwriter)) < 0)
- goto on_error;
+ (error = git_merge__append_conflicts_to_merge_msg(repo, index)) < 0)
+ goto done;
- goto done;
+ /* check out the merge results */
-on_error:
- merge_state_cleanup(repo);
+ if ((error = merge_normalize_checkout_opts(&checkout_opts, repo,
+ given_checkout_opts, checkout_strategy,
+ base, our_head, their_heads, their_heads_len)) < 0 ||
+ (error = git_checkout_index(repo, index, &checkout_opts)) < 0)
+ goto done;
+
+ error = git_indexwriter_commit(&indexwriter);
done:
- git_indexwriter_cleanup(&indexwriter);
+ if (error < 0)
+ merge_state_cleanup(repo);
+ git_indexwriter_cleanup(&indexwriter);
git_index_free(index);
-
- git_tree_free(ancestor_tree);
- git_tree_free(our_tree);
-
- for (i = 0; i < their_heads_len; i++)
- git_tree_free(their_trees[i]);
-
- git__free(their_trees);
-
git_annotated_commit_free(our_head);
- git_annotated_commit_free(ancestor_head);
-
+ git_annotated_commit_free(base);
git_reference_free(our_ref);
return error;
diff --git a/src/merge.h b/src/merge.h
index 3caf617c6..bd839be49 100644
--- a/src/merge.h
+++ b/src/merge.h
@@ -19,8 +19,8 @@
#define GIT_MERGE_MODE_FILE "MERGE_MODE"
#define GIT_MERGE_FILE_MODE 0666
-#define GIT_MERGE_TREE_RENAME_THRESHOLD 50
-#define GIT_MERGE_TREE_TARGET_LIMIT 1000
+#define GIT_MERGE_DEFAULT_RENAME_THRESHOLD 50
+#define GIT_MERGE_DEFAULT_TARGET_LIMIT 1000
/** Types of changes when files are merged from branch to branch. */
typedef enum {
diff --git a/tests/cherrypick/workdir.c b/tests/cherrypick/workdir.c
index 787f1f4d4..2b45f5a33 100644
--- a/tests/cherrypick/workdir.c
+++ b/tests/cherrypick/workdir.c
@@ -300,7 +300,7 @@ void test_cherrypick_workdir__rename(void)
{ 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 0, "file3.txt.renamed" },
};
- opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ opts.merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
opts.merge_opts.rename_threshold = 50;
git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15");
@@ -335,7 +335,7 @@ void test_cherrypick_workdir__both_renamed(void)
{ 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 2, "file3.txt.renamed_on_branch" },
};
- opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ opts.merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
opts.merge_opts.rename_threshold = 50;
git_oid_fromstr(&head_oid, "44cd2ed2052c9c68f9a439d208e9614dc2a55c70");
diff --git a/tests/merge/conflict_data.h b/tests/merge/conflict_data.h
new file mode 100644
index 000000000..e6394a9e8
--- /dev/null
+++ b/tests/merge/conflict_data.h
@@ -0,0 +1,103 @@
+#define AUTOMERGEABLE_MERGED_FILE \
+ "this file is changed in master\n" \
+ "this file is automergeable\n" \
+ "this file is automergeable\n" \
+ "this file is automergeable\n" \
+ "this file is automergeable\n" \
+ "this file is automergeable\n" \
+ "this file is automergeable\n" \
+ "this file is automergeable\n" \
+ "this file is changed in branch\n"
+
+#define AUTOMERGEABLE_MERGED_FILE_CRLF \
+ "this file is changed in master\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is automergeable\r\n" \
+ "this file is changed in branch\r\n"
+
+#define CONFLICTING_MERGE_FILE \
+ "<<<<<<< HEAD\n" \
+ "this file is changed in master and branch\n" \
+ "=======\n" \
+ "this file is changed in branch and master\n" \
+ ">>>>>>> 7cb63eed597130ba4abb87b3e544b85021905520\n"
+
+#define CONFLICTING_DIFF3_FILE \
+ "<<<<<<< HEAD\n" \
+ "this file is changed in master and branch\n" \
+ "||||||| initial\n" \
+ "this file is a conflict\n" \
+ "=======\n" \
+ "this file is changed in branch and master\n" \
+ ">>>>>>> 7cb63eed597130ba4abb87b3e544b85021905520\n"
+
+#define CONFLICTING_UNION_FILE \
+ "this file is changed in master and branch\n" \
+ "this file is changed in branch and master\n"
+
+#define CONFLICTING_RECURSIVE_F1_TO_F2 \
+ "VEAL SOUP.\n" \
+ "\n" \
+ "<<<<<<< HEAD\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 not too small, one\n" \
+ ">>>>>>> branchF-2\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" \
+ "longer; take out the slices of ham, and skim off the grease if any\n" \
+ "should rise, take a gill of good cream, mix with it two table-spoonsful\n" \
+ "of flour very nicely, and the yelks of two eggs beaten well, strain this\n" \
+ "mixture, and add some chopped parsley; pour some soup on by degrees,\n" \
+ "stir it well, and pour it into the pot, continuing to stir until it has\n" \
+ "boiled two or three minutes to take off the raw taste of the eggs. If\n" \
+ "the cream be not perfectly sweet, and the eggs quite new, the thickening\n" \
+ "will curdle in the soup. For a change you may put a dozen ripe tomatos\n" \
+ "in, first taking off their skins, by letting them stand a few minutes in\n" \
+ "hot water, when they may be easily peeled. When made in this way you\n" \
+ "must thicken it with the flour only. Any part of the veal may be used,\n" \
+ "but the shin or knuckle is the nicest.\n" \
+ "\n" \
+ "<<<<<<< HEAD\n" \
+ "This certainly is a mighty fine recipe.\n" \
+ "=======\n" \
+ "This is a mighty fine recipe!\n" \
+ ">>>>>>> branchF-2\n"
+
+#define CONFLICTING_RECURSIVE_H1_TO_H2_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" \
+ "||||||| 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" \
+ "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" \
+ "longer; take out the slices of ham, and skim off the grease if any\n" \
+ "should rise, take a gill of good cream, mix with it two table-spoonsful\n" \
+ "of flour very nicely, and the yelks of two eggs beaten well, strain this\n" \
+ "mixture, and add some chopped parsley; pour some soup on by degrees,\n" \
+ "stir it well, and pour it into the pot, continuing to stir until it has\n" \
+ "boiled two or three minutes to take off the raw taste of the eggs. If\n" \
+ "the cream be not perfectly sweet, and the eggs quite new, the thickening\n" \
+ "will curdle in the soup. For a change you may put a dozen ripe tomatos\n" \
+ "in, first taking off their skins, by letting them stand a few minutes in\n" \
+ "hot water, when they may be easily peeled. When made in this way you\n" \
+ "must thicken it with the flour only. Any part of the veal may be used,\n" \
+ "but the shin or knuckle is the nicest.\n"
diff --git a/tests/merge/files.c b/tests/merge/files.c
index 2d55df2b2..daa73fada 100644
--- a/tests/merge/files.c
+++ b/tests/merge/files.c
@@ -4,6 +4,7 @@
#include "buffer.h"
#include "merge.h"
#include "merge_helpers.h"
+#include "conflict_data.h"
#include "refs.h"
#include "fileops.h"
#include "diff_xdiff.h"
diff --git a/tests/merge/merge_helpers.c b/tests/merge/merge_helpers.c
index 986a365db..4b1b7d262 100644
--- a/tests/merge/merge_helpers.c
+++ b/tests/merge/merge_helpers.c
@@ -4,6 +4,7 @@
#include "tree.h"
#include "merge_helpers.h"
#include "merge.h"
+#include "index.h"
#include "git2/merge.h"
#include "git2/sys/index.h"
#include "git2/annotated_commit.h"
@@ -239,7 +240,7 @@ int merge_test_index(git_index *index, const struct merge_index_entry expected[]
const git_index_entry *index_entry;
/*
- dump_index_entries(&index->entries);
+ merge__dump_index_entries(&index->entries);
*/
if (git_index_entrycount(index) != expected_len)
diff --git a/tests/merge/merge_helpers.h b/tests/merge/merge_helpers.h
index 554c24b7c..e407c7d13 100644
--- a/tests/merge/merge_helpers.h
+++ b/tests/merge/merge_helpers.h
@@ -4,49 +4,6 @@
#include "merge.h"
#include "git2/merge.h"
-#define AUTOMERGEABLE_MERGED_FILE \
- "this file is changed in master\n" \
- "this file is automergeable\n" \
- "this file is automergeable\n" \
- "this file is automergeable\n" \
- "this file is automergeable\n" \
- "this file is automergeable\n" \
- "this file is automergeable\n" \
- "this file is automergeable\n" \
- "this file is changed in branch\n"
-
-#define AUTOMERGEABLE_MERGED_FILE_CRLF \
- "this file is changed in master\r\n" \
- "this file is automergeable\r\n" \
- "this file is automergeable\r\n" \
- "this file is automergeable\r\n" \
- "this file is automergeable\r\n" \
- "this file is automergeable\r\n" \
- "this file is automergeable\r\n" \
- "this file is automergeable\r\n" \
- "this file is changed in branch\r\n"
-
-#define CONFLICTING_MERGE_FILE \
- "<<<<<<< HEAD\n" \
- "this file is changed in master and branch\n" \
- "=======\n" \
- "this file is changed in branch and master\n" \
- ">>>>>>> 7cb63eed597130ba4abb87b3e544b85021905520\n"
-
-#define CONFLICTING_DIFF3_FILE \
- "<<<<<<< HEAD\n" \
- "this file is changed in master and branch\n" \
- "||||||| initial\n" \
- "this file is a conflict\n" \
- "=======\n" \
- "this file is changed in branch and master\n" \
- ">>>>>>> 7cb63eed597130ba4abb87b3e544b85021905520\n"
-
-#define CONFLICTING_UNION_FILE \
- "this file is changed in master and branch\n" \
- "this file is changed in branch and master\n"
-
-
struct merge_index_entry {
uint16_t mode;
char oid_str[GIT_OID_HEXSZ+1];
diff --git a/tests/merge/trees/automerge.c b/tests/merge/trees/automerge.c
index c18881d7c..67f2cf786 100644
--- a/tests/merge/trees/automerge.c
+++ b/tests/merge/trees/automerge.c
@@ -3,8 +3,9 @@
#include "git2/merge.h"
#include "buffer.h"
#include "merge.h"
-#include "../merge_helpers.h"
#include "fileops.h"
+#include "../merge_helpers.h"
+#include "../conflict_data.h"
static git_repository *repo;
diff --git a/tests/merge/trees/commits.c b/tests/merge/trees/commits.c
index 2e3c4578b..786a77a8b 100644
--- a/tests/merge/trees/commits.c
+++ b/tests/merge/trees/commits.c
@@ -3,6 +3,7 @@
#include "git2/merge.h"
#include "merge.h"
#include "../merge_helpers.h"
+#include "../conflict_data.h"
static git_repository *repo;
@@ -134,7 +135,7 @@ void test_merge_trees_commits__fail_on_conflict(void)
git_index *index;
git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
- opts.tree_flags |= GIT_MERGE_TREE_FAIL_ON_CONFLICT;
+ opts.flags |= GIT_MERGE_FAIL_ON_CONFLICT;
cl_git_fail_with(GIT_EMERGECONFLICT,
merge_trees_from_branches(&index, repo, "df_side1", "df_side2", &opts));
diff --git a/tests/merge/trees/recursive.c b/tests/merge/trees/recursive.c
new file mode 100644
index 000000000..c5b129bf8
--- /dev/null
+++ b/tests/merge/trees/recursive.c
@@ -0,0 +1,410 @@
+#include "clar_libgit2.h"
+#include "git2/repository.h"
+#include "git2/merge.h"
+#include "merge.h"
+#include "../merge_helpers.h"
+
+static git_repository *repo;
+
+#define TEST_REPO_PATH "merge-recursive"
+
+void test_merge_trees_recursive__initialize(void)
+{
+ repo = cl_git_sandbox_init(TEST_REPO_PATH);
+}
+
+void test_merge_trees_recursive__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+void test_merge_trees_recursive__one_base_commit(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "dea7215f259b2cced87d1bda6c72f8b4ce37a2ff", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "94d2c01087f48213bd157222d54edfefd77c9bba", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchA-1", "branchA-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__one_base_commit_norecursive(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "dea7215f259b2cced87d1bda6c72f8b4ce37a2ff", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "94d2c01087f48213bd157222d54edfefd77c9bba", 0, "veal.txt" },
+ };
+
+ opts.flags |= GIT_MERGE_NO_RECURSIVE;
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchA-1", "branchA-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__two_base_commits(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "666ffdfcf1eaa5641fa31064bf2607327e843c09", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchB-1", "branchB-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__two_base_commits_norecursive(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "cb49ad76147f5f9439cbd6133708b76142660660", 1, "veal.txt" },
+ { 0100644, "b2a81ead9e722af0099fccfb478cea88eea749a2", 2, "veal.txt" },
+ { 0100644, "4e21d2d63357bde5027d1625f5ec6b430cdeb143", 3, "veal.txt" },
+ };
+
+ opts.flags |= GIT_MERGE_NO_RECURSIVE;
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchB-1", "branchB-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__two_levels_of_multiple_bases(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "15faa0c9991f2d65686e844651faa2ff9827887b", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchC-1", "branchC-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__two_levels_of_multiple_bases_norecursive(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "b2a81ead9e722af0099fccfb478cea88eea749a2", 1, "veal.txt" },
+ { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 2, "veal.txt" },
+ { 0100644, "68a2e1ee61a23a4728fe6b35580fbbbf729df370", 3, "veal.txt" },
+ };
+
+ opts.flags |= GIT_MERGE_NO_RECURSIVE;
+
+ 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);
+}
+
+void test_merge_trees_recursive__three_levels_of_multiple_bases(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "d55e5dc038c52f1a36548625bcb666cbc06db9e6", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchD-2", "branchD-1", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__three_levels_of_multiple_bases_norecursive(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 1, "veal.txt" },
+ { 0100644, "f1b44c04989a3a1c14b036cfadfa328d53a7bc5e", 2, "veal.txt" },
+ { 0100644, "5e8747f5200fac0f945a07daf6163ca9cb1a8da9", 3, "veal.txt" },
+ };
+
+ opts.flags |= GIT_MERGE_NO_RECURSIVE;
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchD-2", "branchD-1", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__three_base_commits(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4f7269b07c76d02755d75ccaf05c0b4c36cdc6c", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchE-1", "branchE-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__three_base_commits_norecursive(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "9e12bce04446d097ae1782967a5888c2e2a0d35b", 1, "gravy.txt" },
+ { 0100644, "d8dd349b78f19a4ebe3357bacb8138f00bf5ed41", 2, "gravy.txt" },
+ { 0100644, "e50fbbd701458757bdfe9815f58ed717c588d1b5", 3, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
+ };
+
+ opts.flags |= GIT_MERGE_NO_RECURSIVE;
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchE-1", "branchE-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
+void test_merge_trees_recursive__conflict(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "fa567f568ed72157c0c617438d077695b99d9aac", 1, "veal.txt" },
+ { 0100644, "21950d5e4e4d1a871b4dfcf72ecb6b9c162c434e", 2, "veal.txt" },
+ { 0100644, "3855170cef875708da06ab9ad7fc6a73b531cda1", 3, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchF-1", "branchF-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
+/*
+ * Branch G-1 and G-2 have three common ancestors (815b5a1, ad2ace9, 483065d).
+ * The merge-base of the first two has two common ancestors (723181f, a34e5a1)
+ * which themselves have two common ancestors (8f35f30, 3a3f5a6), which
+ * finally has a common ancestor of 7c7bf85. This virtual merge base will
+ * be computed and merged with 483065d which also has a common ancestor of
+ * 7c7bf85.
+ */
+void test_merge_trees_recursive__oh_so_many_levels_of_recursion(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "7c7e08f9559d9e1551b91e1cf68f1d0066109add", 0, "oyster.txt" },
+ { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchG-1", "branchG-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+/* Branch H-1 and H-2 have two common ancestors (aa9e263, 6ef31d3). The two
+ * ancestors themselves conflict.
+ */
+void test_merge_trees_recursive__conflicting_merge_base(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "3a66812fed1e03ea4a6a7ee28d8a57aec1ca6537", 1, "veal.txt" },
+ { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 2, "veal.txt" },
+ { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 3, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchH-1", "branchH-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
+/* Branch H-1 and H-2 have two common ancestors (aa9e263, 6ef31d3). The two
+ * ancestors themselves conflict. The generated common ancestor file will
+ * have diff3 style conflicts inside it.
+ */
+void test_merge_trees_recursive__conflicting_merge_base_with_diff3(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 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" },
+ };
+
+ opts.file_flags |= GIT_MERGE_FILE_STYLE_DIFF3;
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchH-1", "branchH-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
+/* Branch I-1 and I-2 have two common ancestors (aa9e263, 6ef31d3). The two
+ * ancestors themselves conflict, but when each was merged, the conflicts were
+ * resolved identically, thus merging I-1 into I-2 does not conflict.
+ */
+void test_merge_trees_recursive__conflicting_merge_base_since_resolved(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "a02d4fd126e0cc8fb46ee48cf38bad36d44f2dbc", 0, "veal.txt" },
+ };
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchI-1", "branchI-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 6));
+
+ git_index_free(index);
+}
+
+/* There are multiple levels of criss-cross merges, and multiple recursive
+ * merges would create a common ancestor that allows the merge to complete
+ * successfully. Test that we can build a single virtual base, then stop,
+ * which will produce a conflicting merge.
+ */
+void test_merge_trees_recursive__recursionlimit(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 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, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
+ };
+
+ opts.recursion_limit = 1;
+
+ cl_git_pass(merge_commits_from_branches(&index, repo, "branchE-1", "branchE-2", &opts));
+
+ cl_assert(merge_test_index(index, merge_index_entries, 8));
+
+ git_index_free(index);
+}
+
diff --git a/tests/merge/trees/treediff.c b/tests/merge/trees/treediff.c
index f21d99b6d..3634568de 100644
--- a/tests/merge/trees/treediff.c
+++ b/tests/merge/trees/treediff.c
@@ -47,7 +47,7 @@ static void test_find_differences(
git_iterator_options iter_opts = GIT_ITERATOR_OPTIONS_INIT;
git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
- opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ opts.flags |= GIT_MERGE_FIND_RENAMES;
opts.target_limit = 1000;
opts.rename_threshold = 50;
diff --git a/tests/merge/workdir/recursive.c b/tests/merge/workdir/recursive.c
new file mode 100644
index 000000000..795126255
--- /dev/null
+++ b/tests/merge/workdir/recursive.c
@@ -0,0 +1,84 @@
+#include "clar_libgit2.h"
+#include "git2/repository.h"
+#include "git2/merge.h"
+#include "merge.h"
+#include "../merge_helpers.h"
+#include "../conflict_data.h"
+
+static git_repository *repo;
+
+#define TEST_REPO_PATH "merge-recursive"
+
+void test_merge_workdir_recursive__initialize(void)
+{
+ repo = cl_git_sandbox_init(TEST_REPO_PATH);
+}
+
+void test_merge_workdir_recursive__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+void test_merge_workdir_recursive__writes_conflict_with_virtual_base(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+ git_buf conflicting_buf = GIT_BUF_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "fa567f568ed72157c0c617438d077695b99d9aac", 1, "veal.txt" },
+ { 0100644, "21950d5e4e4d1a871b4dfcf72ecb6b9c162c434e", 2, "veal.txt" },
+ { 0100644, "3855170cef875708da06ab9ad7fc6a73b531cda1", 3, "veal.txt" },
+ };
+
+ cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR "branchF-1", GIT_REFS_HEADS_DIR "branchF-2", &opts, NULL));
+
+ 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_F1_TO_F2, conflicting_buf.ptr);
+
+ git_index_free(index);
+ git_buf_free(&conflicting_buf);
+}
+
+void test_merge_workdir_recursive__conflicting_merge_base_with_diff3(void)
+{
+ git_index *index;
+ git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
+ git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_buf conflicting_buf = GIT_BUF_INIT;
+
+ struct merge_index_entry merge_index_entries[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 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" },
+ };
+
+ 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(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);
+
+ git_index_free(index);
+ git_buf_free(&conflicting_buf);
+}
diff --git a/tests/merge/workdir/renames.c b/tests/merge/workdir/renames.c
index 83006a703..fabcda2a8 100644
--- a/tests/merge/workdir/renames.c
+++ b/tests/merge/workdir/renames.c
@@ -63,7 +63,7 @@ void test_merge_workdir_renames__renames(void)
{ 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed.txt~rename_conflict_theirs" },
};
- merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
merge_opts.rename_threshold = 50;
cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, NULL));
@@ -99,7 +99,7 @@ void test_merge_workdir_renames__ours(void)
{ 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "7-both-renamed.txt" },
};
- merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
merge_opts.rename_threshold = 50;
checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS;
@@ -147,7 +147,7 @@ void test_merge_workdir_renames__similar(void)
{ 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed.txt~rename_conflict_theirs" },
};
- merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
merge_opts.rename_threshold = 50;
cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, NULL));
diff --git a/tests/merge/workdir/simple.c b/tests/merge/workdir/simple.c
index abc0777f7..3cdd15b5a 100644
--- a/tests/merge/workdir/simple.c
+++ b/tests/merge/workdir/simple.c
@@ -4,6 +4,7 @@
#include "buffer.h"
#include "merge.h"
#include "../merge_helpers.h"
+#include "../conflict_data.h"
#include "refs.h"
#include "fileops.h"
diff --git a/tests/resources/merge-recursive/.gitted/HEAD b/tests/resources/merge-recursive/.gitted/HEAD
new file mode 100644
index 000000000..d7cef11aa
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/branchG-2
diff --git a/tests/resources/merge-recursive/.gitted/config b/tests/resources/merge-recursive/.gitted/config
new file mode 100644
index 000000000..6c9406b7d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/config
@@ -0,0 +1,7 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ ignorecase = true
+ precomposeunicode = true
diff --git a/tests/resources/merge-recursive/.gitted/index b/tests/resources/merge-recursive/.gitted/index
new file mode 100644
index 000000000..571cfd02f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/index
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/info/refs b/tests/resources/merge-recursive/.gitted/info/refs
new file mode 100644
index 000000000..96482e6cb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/info/refs
@@ -0,0 +1 @@
+7c7bf85e978f1d18c0566f702d2cb7766b9c8d4f refs/heads/master
diff --git a/tests/resources/merge-recursive/.gitted/objects/00/6b298c5702b04c00370d0414959765b82fd722 b/tests/resources/merge-recursive/.gitted/objects/00/6b298c5702b04c00370d0414959765b82fd722
new file mode 100644
index 000000000..d3fb85fca
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/00/6b298c5702b04c00370d0414959765b82fd722
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/00/7f1ee2af8e5d99906867c4237510e1790a89b8 b/tests/resources/merge-recursive/.gitted/objects/00/7f1ee2af8e5d99906867c4237510e1790a89b8
new file mode 100644
index 000000000..d9399d71c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/00/7f1ee2af8e5d99906867c4237510e1790a89b8
@@ -0,0 +1,3 @@
+xNI
+1<FtgA<zY:LFBjj-I]߈fah
+R)<+΅sZd8Fkg$RQqe!&Zg R g_.nK N ~j[=2ց28;vsfTrqa< `bQ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/01/6eef4a6fefd36bdcaa93ad773449ddc5c73cbb b/tests/resources/merge-recursive/.gitted/objects/01/6eef4a6fefd36bdcaa93ad773449ddc5c73cbb
new file mode 100644
index 000000000..90085847c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/01/6eef4a6fefd36bdcaa93ad773449ddc5c73cbb
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/05/c6a04ac101ab1a9836a95d5ec8d16b6f6304fd b/tests/resources/merge-recursive/.gitted/objects/05/c6a04ac101ab1a9836a95d5ec8d16b6f6304fd
new file mode 100644
index 000000000..c6a3a3b8d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/05/c6a04ac101ab1a9836a95d5ec8d16b6f6304fd
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/06/db153c36829fc656e05cdf5a3bf7183f3c10aa b/tests/resources/merge-recursive/.gitted/objects/06/db153c36829fc656e05cdf5a3bf7183f3c10aa
new file mode 100644
index 000000000..85887e0f5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/06/db153c36829fc656e05cdf5a3bf7183f3c10aa
@@ -0,0 +1,2 @@
+x%Pn@ |_HN.}%)Qe819@R$&I!w6pF,Kң*HL s߯#0+300/`#Cib']l
+RRqo,k>\vXɸPzIIM6iY],WzpBzPdF4V .xV!y~9ր0uhoU`$,_R:-a2%Sw^cJ>fFOv;+ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/07/10c3c796e0704361472ecb904413fca0107a25 b/tests/resources/merge-recursive/.gitted/objects/07/10c3c796e0704361472ecb904413fca0107a25
new file mode 100644
index 000000000..9f48594b5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/07/10c3c796e0704361472ecb904413fca0107a25
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/07/2d89dcf3a7671ac34a8e875bb72fb39bcf14d7 b/tests/resources/merge-recursive/.gitted/objects/07/2d89dcf3a7671ac34a8e875bb72fb39bcf14d7
new file mode 100644
index 000000000..69104c948
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/07/2d89dcf3a7671ac34a8e875bb72fb39bcf14d7
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/0b/b7ed583d7e9ad507e8b902594f5c9126ea456b b/tests/resources/merge-recursive/.gitted/objects/0b/b7ed583d7e9ad507e8b902594f5c9126ea456b
new file mode 100644
index 000000000..e7b4ba10f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/0b/b7ed583d7e9ad507e8b902594f5c9126ea456b
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/0e/8126647ec607f0a14122cec4b15315d790c8ff b/tests/resources/merge-recursive/.gitted/objects/0e/8126647ec607f0a14122cec4b15315d790c8ff
new file mode 100644
index 000000000..c99a6865c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/0e/8126647ec607f0a14122cec4b15315d790c8ff
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/0f/a6ead2731b9d138afe38c336c9727ea05027a7 b/tests/resources/merge-recursive/.gitted/objects/0f/a6ead2731b9d138afe38c336c9727ea05027a7
new file mode 100644
index 000000000..b06362dd8
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/0f/a6ead2731b9d138afe38c336c9727ea05027a7
@@ -0,0 +1 @@
+xJAE+*hk"bhTw8̴-\0/2<݌nKI\9D`5Tdϩ4Jm I)ꈼ"-鄱晴O'„3YG JAXSd#(NPxzmpg{q>e9ѱsӞ3=Y1pFe2oz \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/12/4d4fe29d3433fdaa2f0f455d226f2c79d89cf3 b/tests/resources/merge-recursive/.gitted/objects/12/4d4fe29d3433fdaa2f0f455d226f2c79d89cf3
new file mode 100644
index 000000000..f0ea020fb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/12/4d4fe29d3433fdaa2f0f455d226f2c79d89cf3
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/15/311229e70fa62653f73dde1d4deef1a8e47a11 b/tests/resources/merge-recursive/.gitted/objects/15/311229e70fa62653f73dde1d4deef1a8e47a11
new file mode 100644
index 000000000..8c21bb357
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/15/311229e70fa62653f73dde1d4deef1a8e47a11
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/15/faa0c9991f2d65686e844651faa2ff9827887b b/tests/resources/merge-recursive/.gitted/objects/15/faa0c9991f2d65686e844651faa2ff9827887b
new file mode 100644
index 000000000..54cd6f26e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/15/faa0c9991f2d65686e844651faa2ff9827887b
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/16/895aa5e13f8907d4adab81285557d938fad342 b/tests/resources/merge-recursive/.gitted/objects/16/895aa5e13f8907d4adab81285557d938fad342
new file mode 100644
index 000000000..4d3319bc7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/16/895aa5e13f8907d4adab81285557d938fad342
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/1c/1bdb80c04233d1a9b9755913ee233987be6175 b/tests/resources/merge-recursive/.gitted/objects/1c/1bdb80c04233d1a9b9755913ee233987be6175
new file mode 100644
index 000000000..a2146496d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/1c/1bdb80c04233d1a9b9755913ee233987be6175
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/1e/8dff96faaaa24f84943d2d9601dde61cb0398a b/tests/resources/merge-recursive/.gitted/objects/1e/8dff96faaaa24f84943d2d9601dde61cb0398a
new file mode 100644
index 000000000..b6185f294
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/1e/8dff96faaaa24f84943d2d9601dde61cb0398a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/21/950d5e4e4d1a871b4dfcf72ecb6b9c162c434e b/tests/resources/merge-recursive/.gitted/objects/21/950d5e4e4d1a871b4dfcf72ecb6b9c162c434e
new file mode 100644
index 000000000..a87732611
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/21/950d5e4e4d1a871b4dfcf72ecb6b9c162c434e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/34/8f16ffaeb73f319a75cec5b16a0a47d2d5e27c b/tests/resources/merge-recursive/.gitted/objects/34/8f16ffaeb73f319a75cec5b16a0a47d2d5e27c
new file mode 100644
index 000000000..bd1b1f69a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/34/8f16ffaeb73f319a75cec5b16a0a47d2d5e27c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/37/185b25a204309bf74817da1a607518f13ca3ed b/tests/resources/merge-recursive/.gitted/objects/37/185b25a204309bf74817da1a607518f13ca3ed
new file mode 100644
index 000000000..a8cf005bc
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/37/185b25a204309bf74817da1a607518f13ca3ed
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/37/a5054a9f9b4628e3924c5cb8f2147c6e2a3efc b/tests/resources/merge-recursive/.gitted/objects/37/a5054a9f9b4628e3924c5cb8f2147c6e2a3efc
new file mode 100644
index 000000000..4591f0e04
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/37/a5054a9f9b4628e3924c5cb8f2147c6e2a3efc
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/38/55170cef875708da06ab9ad7fc6a73b531cda1 b/tests/resources/merge-recursive/.gitted/objects/38/55170cef875708da06ab9ad7fc6a73b531cda1
new file mode 100644
index 000000000..7da945e6f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/38/55170cef875708da06ab9ad7fc6a73b531cda1
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/3a/3f5a6ec1c968d1d2d5d20dee0d161a4351f279 b/tests/resources/merge-recursive/.gitted/objects/3a/3f5a6ec1c968d1d2d5d20dee0d161a4351f279
new file mode 100644
index 000000000..f39a1271f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/3a/3f5a6ec1c968d1d2d5d20dee0d161a4351f279
@@ -0,0 +1 @@
+xO !*h@Bb?ׁ Xr&a}؁LfR]KqQ{ `Ozɚtɤk(gؓ+*+X[F8>EGkS~y˽CۥB4ƀNnPֈ)OWN: \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/3b/919b6e8a575b4779c8243ebea3e3beb436e88f b/tests/resources/merge-recursive/.gitted/objects/3b/919b6e8a575b4779c8243ebea3e3beb436e88f
new file mode 100644
index 000000000..c85731d6b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/3b/919b6e8a575b4779c8243ebea3e3beb436e88f
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/3f/d41804a7906db846af5e868444782e546af46a b/tests/resources/merge-recursive/.gitted/objects/3f/d41804a7906db846af5e868444782e546af46a
new file mode 100644
index 000000000..4915b864f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/3f/d41804a7906db846af5e868444782e546af46a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/41/71bb8d40e9fc830d79b757dc06ec6c14548b78 b/tests/resources/merge-recursive/.gitted/objects/41/71bb8d40e9fc830d79b757dc06ec6c14548b78
new file mode 100644
index 000000000..5dc102d35
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/41/71bb8d40e9fc830d79b757dc06ec6c14548b78
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/42/1b392106e079df6d412babd5636697938269ec b/tests/resources/merge-recursive/.gitted/objects/42/1b392106e079df6d412babd5636697938269ec
new file mode 100644
index 000000000..3a8324c1b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/42/1b392106e079df6d412babd5636697938269ec
@@ -0,0 +1,2 @@
+xQ
+0D)re7D @ݥmFU3o`)u.zM[Dӽ,PH^w*)c&6,27JJADQ&KN)bT3<XkX؞:lҏ:7]:v `Vmgyj=O \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/42/44d13e2bbc38510320443bbb003f3967d12436 b/tests/resources/merge-recursive/.gitted/objects/42/44d13e2bbc38510320443bbb003f3967d12436
new file mode 100644
index 000000000..a19b19120
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/42/44d13e2bbc38510320443bbb003f3967d12436
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911 b/tests/resources/merge-recursive/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911
new file mode 100644
index 000000000..99b5e6d2c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/43/2faca0c62dc556ad71a22f23e541a46a8b0f6f b/tests/resources/merge-recursive/.gitted/objects/43/2faca0c62dc556ad71a22f23e541a46a8b0f6f
new file mode 100644
index 000000000..ff18f0e35
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/43/2faca0c62dc556ad71a22f23e541a46a8b0f6f
@@ -0,0 +1,2 @@
+x+)JMU022g040031QH,.H,JL/-+(a9/>~WENYZGj
+RSj2I^'y51i0599`e5a z%潎U^XV Vtٙo]2Y~P1($bz7g\QdLɔ3Rsj/]3VLlg{W[ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/43/5424798e5e1b21dd4588d1c291ba4eb179a838 b/tests/resources/merge-recursive/.gitted/objects/43/5424798e5e1b21dd4588d1c291ba4eb179a838
new file mode 100644
index 000000000..58ab23917
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/43/5424798e5e1b21dd4588d1c291ba4eb179a838
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/43/6ea75c99f527e4b42fddb46abedf7726eb719d b/tests/resources/merge-recursive/.gitted/objects/43/6ea75c99f527e4b42fddb46abedf7726eb719d
new file mode 100644
index 000000000..e8825d867
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/43/6ea75c99f527e4b42fddb46abedf7726eb719d
@@ -0,0 +1,2 @@
+xKj1D)tncev@bFf,G U(i۶v}CՂft1RRf`$tNTcy6>t]Rǐ!=@̱T\
+ǔW_aGm϶۳WOi"Q%  :v}s|Ϋp_Dž7QA \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/48/3065df53c0f4a02cdc6b2910b05d388fc17ffb b/tests/resources/merge-recursive/.gitted/objects/48/3065df53c0f4a02cdc6b2910b05d388fc17ffb
new file mode 100644
index 000000000..298251b3c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/48/3065df53c0f4a02cdc6b2910b05d388fc17ffb
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850a b/tests/resources/merge-recursive/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850a
new file mode 100644
index 000000000..016398531
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4c/49317a0912ca559d2048bc329994eb7d10474f b/tests/resources/merge-recursive/.gitted/objects/4c/49317a0912ca559d2048bc329994eb7d10474f
new file mode 100644
index 000000000..d7bb4d37c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4c/49317a0912ca559d2048bc329994eb7d10474f
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4d/fc1be85a9d6c9898152444d32b238b4aecf8cc b/tests/resources/merge-recursive/.gitted/objects/4d/fc1be85a9d6c9898152444d32b238b4aecf8cc
new file mode 100644
index 000000000..9db684d40
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4d/fc1be85a9d6c9898152444d32b238b4aecf8cc
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4e/21d2d63357bde5027d1625f5ec6b430cdeb143 b/tests/resources/merge-recursive/.gitted/objects/4e/21d2d63357bde5027d1625f5ec6b430cdeb143
new file mode 100644
index 000000000..34f183dd1
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4e/21d2d63357bde5027d1625f5ec6b430cdeb143
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4e/70a6b06fc62481f80fbb74327849e7170eebff b/tests/resources/merge-recursive/.gitted/objects/4e/70a6b06fc62481f80fbb74327849e7170eebff
new file mode 100644
index 000000000..1dfcec50b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4e/70a6b06fc62481f80fbb74327849e7170eebff
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/4f/4e85a0ab8515e34302721fbcec06fa9d9c1a9a b/tests/resources/merge-recursive/.gitted/objects/4f/4e85a0ab8515e34302721fbcec06fa9d9c1a9a
new file mode 100644
index 000000000..4752ea07a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/4f/4e85a0ab8515e34302721fbcec06fa9d9c1a9a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/50/e4facaafb746cfed89287206274193c1417288 b/tests/resources/merge-recursive/.gitted/objects/50/e4facaafb746cfed89287206274193c1417288
new file mode 100644
index 000000000..b1eaee557
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/50/e4facaafb746cfed89287206274193c1417288
@@ -0,0 +1,2 @@
+x+)JMU022g040031QH,.H,JL/-+(a9/>~WENYZGj
+RSj2I^'y51i0599`e5a z%潎U^XV Vtٙo]2Y~P1($bz7g\QdLɔ3RsjD-89S^75#-ע3;\ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/53/9bd011c4822c560c1d17cab095006b7a10f707 b/tests/resources/merge-recursive/.gitted/objects/53/9bd011c4822c560c1d17cab095006b7a10f707
new file mode 100644
index 000000000..3fa1e1f94
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/53/9bd011c4822c560c1d17cab095006b7a10f707
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/56/07a8c4601a737daadd1f470bde3142aff57026 b/tests/resources/merge-recursive/.gitted/objects/56/07a8c4601a737daadd1f470bde3142aff57026
new file mode 100644
index 000000000..bf3639d05
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/56/07a8c4601a737daadd1f470bde3142aff57026
@@ -0,0 +1 @@
+xMJ1])#?<čp:3w=Ԧ((~`MxCrBYMSP-}tjzL`JRvR jBV8Ze&6zsTr͵̍2.9>~I~Gs1G!j1IcS1xW(܎u#rbV \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/5a/ba269b3be41fc8db38068d3948c8af543fe609 b/tests/resources/merge-recursive/.gitted/objects/5a/ba269b3be41fc8db38068d3948c8af543fe609
new file mode 100644
index 000000000..85bc8f569
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5a/ba269b3be41fc8db38068d3948c8af543fe609
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/5b/8e1e56cb99e8b99ac22eec8aebf6422ecd08c0 b/tests/resources/merge-recursive/.gitted/objects/5b/8e1e56cb99e8b99ac22eec8aebf6422ecd08c0
new file mode 100644
index 000000000..c3e6d31ca
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5b/8e1e56cb99e8b99ac22eec8aebf6422ecd08c0
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/5e/8747f5200fac0f945a07daf6163ca9cb1a8da9 b/tests/resources/merge-recursive/.gitted/objects/5e/8747f5200fac0f945a07daf6163ca9cb1a8da9
new file mode 100644
index 000000000..fa1c9e5dc
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5e/8747f5200fac0f945a07daf6163ca9cb1a8da9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/5f/18576d464946eb2338daeb8b4030019961f505 b/tests/resources/merge-recursive/.gitted/objects/5f/18576d464946eb2338daeb8b4030019961f505
new file mode 100644
index 000000000..d03742b92
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/5f/18576d464946eb2338daeb8b4030019961f505
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/63/e8773becdea9c3699c95a5740be5baa8be8d69 b/tests/resources/merge-recursive/.gitted/objects/63/e8773becdea9c3699c95a5740be5baa8be8d69
new file mode 100644
index 000000000..6d5c320fe
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/63/e8773becdea9c3699c95a5740be5baa8be8d69
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/65/bea8448ca5b3104628ffbca553c54bde54b0fc b/tests/resources/merge-recursive/.gitted/objects/65/bea8448ca5b3104628ffbca553c54bde54b0fc
new file mode 100644
index 000000000..031c91359
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/65/bea8448ca5b3104628ffbca553c54bde54b0fc
@@ -0,0 +1,3 @@
+x !D
+а,3 jyL^\6h9qDLɒ~
+ F'Qk$< !!2eְazlH}MEy^~Qïr- n`[Q+]eyBWyM \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/66/6ffdfcf1eaa5641fa31064bf2607327e843c09 b/tests/resources/merge-recursive/.gitted/objects/66/6ffdfcf1eaa5641fa31064bf2607327e843c09
new file mode 100644
index 000000000..8d6be4216
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/66/6ffdfcf1eaa5641fa31064bf2607327e843c09
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/68/a2e1ee61a23a4728fe6b35580fbbbf729df370 b/tests/resources/merge-recursive/.gitted/objects/68/a2e1ee61a23a4728fe6b35580fbbbf729df370
new file mode 100644
index 000000000..6d7c948c9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/68/a2e1ee61a23a4728fe6b35580fbbbf729df370
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/68/af1fc7407fd9addf1701a87eb1c95c7494c598 b/tests/resources/merge-recursive/.gitted/objects/68/af1fc7407fd9addf1701a87eb1c95c7494c598
new file mode 100644
index 000000000..6aaf79fcb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/68/af1fc7407fd9addf1701a87eb1c95c7494c598
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/68/f6182f4c85d39e1309d97c7e456156dc9c0096 b/tests/resources/merge-recursive/.gitted/objects/68/f6182f4c85d39e1309d97c7e456156dc9c0096
new file mode 100644
index 000000000..ed1de3ada
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/68/f6182f4c85d39e1309d97c7e456156dc9c0096
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/6c/778edd0e4cf394f5a3df8b96db516024cc1bb8 b/tests/resources/merge-recursive/.gitted/objects/6c/778edd0e4cf394f5a3df8b96db516024cc1bb8
new file mode 100644
index 000000000..ec1db19e6
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/6c/778edd0e4cf394f5a3df8b96db516024cc1bb8
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/6e/f31d35a3f5abc1e24f4f9afa5cb2016f03fa2d b/tests/resources/merge-recursive/.gitted/objects/6e/f31d35a3f5abc1e24f4f9afa5cb2016f03fa2d
new file mode 100644
index 000000000..e95a5e2db
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/6e/f31d35a3f5abc1e24f4f9afa5cb2016f03fa2d
@@ -0,0 +1 @@
+xAN!]sahcx$2gpWE:z8‡5UA-YG zAl+&LLd>cW.-&͊)BI5o&p<gq/`n,<"!^C#anr]]Bɧ_*PV \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/71/3e438567b28543235faf265c4c5b02b437c7fd b/tests/resources/merge-recursive/.gitted/objects/71/3e438567b28543235faf265c4c5b02b437c7fd
new file mode 100644
index 000000000..8b1f688ca
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/71/3e438567b28543235faf265c4c5b02b437c7fd
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/72/3181f1bfd30e47a6d1d36a4d874e31e7a0a1a4 b/tests/resources/merge-recursive/.gitted/objects/72/3181f1bfd30e47a6d1d36a4d874e31e7a0a1a4
new file mode 100644
index 000000000..01d113eec
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/72/3181f1bfd30e47a6d1d36a4d874e31e7a0a1a4
@@ -0,0 +1,2 @@
+x[
+1 E*Ağفȴ)#8SUowDž.˥E 8Bt6'<`bvh=I_ԍD)Bq}D )z6Z\{]B?Չ_Ku9Atl5jQcOznO6 \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/73/b20c8e09fa2726d69ff66969186014165da3c3 b/tests/resources/merge-recursive/.gitted/objects/73/b20c8e09fa2726d69ff66969186014165da3c3
new file mode 100644
index 000000000..6559958c5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/73/b20c8e09fa2726d69ff66969186014165da3c3
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/74/4df1bdf0f7bca20deb23e5a5eb8255fc237901 b/tests/resources/merge-recursive/.gitted/objects/74/4df1bdf0f7bca20deb23e5a5eb8255fc237901
new file mode 100644
index 000000000..c05cdad8f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/74/4df1bdf0f7bca20deb23e5a5eb8255fc237901
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/75/c653822173a8e5795153ec3773dfe44bb9bb63 b/tests/resources/merge-recursive/.gitted/objects/75/c653822173a8e5795153ec3773dfe44bb9bb63
new file mode 100644
index 000000000..1495f70f4
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/75/c653822173a8e5795153ec3773dfe44bb9bb63
@@ -0,0 +1 @@
+xJ1);ՑLfrYdfSFbwヿm @WcRyh5V<H}@,3NFhI^-ŤuDA"1y!-N6Aߥ+<m{m;ؑ~;*~um- sȳwٱsӑ3=Z6NpGeOp< \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/78/3d6539dde96b8873c5b5da3e79cc14cd64830b b/tests/resources/merge-recursive/.gitted/objects/78/3d6539dde96b8873c5b5da3e79cc14cd64830b
new file mode 100644
index 000000000..e2f34d6bb
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/78/3d6539dde96b8873c5b5da3e79cc14cd64830b
@@ -0,0 +1,4 @@
+xk
+0S*y4/DO6ٍ-Fj[ofrvrf(G"IAq \H޳,٢r1%Xt R
+Z6g'zBp3xuos\=18#tJ)Vmg8ֹ
+L8wZU \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/7a/9277e0c5ec75339f011c176d0c20e513c4de1c b/tests/resources/merge-recursive/.gitted/objects/7a/9277e0c5ec75339f011c176d0c20e513c4de1c
new file mode 100644
index 000000000..9fb34f7ee
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7a/9277e0c5ec75339f011c176d0c20e513c4de1c
@@ -0,0 +1 @@
+xOANE!sN>1nLܸ0ނc nڦiSӠwsP!gwaZB,CiB@HT ԰P(g@(*h7+,N*ĕd.5P6{|(mOaOo{8"Pbrױ^uɃO_.`s?o0Xa \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f b/tests/resources/merge-recursive/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f
new file mode 100644
index 000000000..fe8b15777
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f
@@ -0,0 +1 @@
+xN0Dd' \V\~/1rw5m|0 tntƺ%kcnu a:K,^W55<i:q^33qe\ ӝ KR &ڡȶJ,Nי#|VhNwDžԙԺ {Y}RYa) \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/7c/7e08f9559d9e1551b91e1cf68f1d0066109add b/tests/resources/merge-recursive/.gitted/objects/7c/7e08f9559d9e1551b91e1cf68f1d0066109add
new file mode 100644
index 000000000..48d22f6a9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7c/7e08f9559d9e1551b91e1cf68f1d0066109add
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/7e/3056f6765b3044ab09701077dbe1eb5b0e9ad0 b/tests/resources/merge-recursive/.gitted/objects/7e/3056f6765b3044ab09701077dbe1eb5b0e9ad0
new file mode 100644
index 000000000..c4b835518
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/7e/3056f6765b3044ab09701077dbe1eb5b0e9ad0
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/81/5b5a1c80ca749d705c7aa0cb294a00cbedd340 b/tests/resources/merge-recursive/.gitted/objects/81/5b5a1c80ca749d705c7aa0cb294a00cbedd340
new file mode 100644
index 000000000..12eb0662a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/81/5b5a1c80ca749d705c7aa0cb294a00cbedd340
@@ -0,0 +1,5 @@
+xK
+1D]}|:  @`Hx}G^AR w32t99^e/sFǙId9{ 5^kE&x4[e 'Cd̈11:#sZ
+}G[_ۧVUD)F7ވږK
+l
+e6Rb \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/88/8588a782ad433fbf0cc526e07cfe6f4a6b60b3 b/tests/resources/merge-recursive/.gitted/objects/88/8588a782ad433fbf0cc526e07cfe6f4a6b60b3
new file mode 100644
index 000000000..44efd3315
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/88/8588a782ad433fbf0cc526e07cfe6f4a6b60b3
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/88/eb3f98849f4b8d0555395f514800900a01dc8f b/tests/resources/merge-recursive/.gitted/objects/88/eb3f98849f4b8d0555395f514800900a01dc8f
new file mode 100644
index 000000000..41c812f10
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/88/eb3f98849f4b8d0555395f514800900a01dc8f
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/89/8d12687fb35be271c27c795a6b32c8b51da79e b/tests/resources/merge-recursive/.gitted/objects/89/8d12687fb35be271c27c795a6b32c8b51da79e
new file mode 100644
index 000000000..2ce4f7f0a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/89/8d12687fb35be271c27c795a6b32c8b51da79e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/8a/bda8de114a93f2d3c5a975ee2960f31e24be58 b/tests/resources/merge-recursive/.gitted/objects/8a/bda8de114a93f2d3c5a975ee2960f31e24be58
new file mode 100644
index 000000000..a03624d81
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/8a/bda8de114a93f2d3c5a975ee2960f31e24be58
@@ -0,0 +1,2 @@
+xN;
+1)r"6[y "Y#^(@b>0j-+k}'⤒#(,HmK 2 ZNǝ=%!QEa^p޹% $Y||N'~[[}hvoSGl̥1I!pNΰkK%  \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/8f/35f30bfe09513f96cf8aa4df0834ae34e93bae b/tests/resources/merge-recursive/.gitted/objects/8f/35f30bfe09513f96cf8aa4df0834ae34e93bae
new file mode 100644
index 000000000..1011a885d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/8f/35f30bfe09513f96cf8aa4df0834ae34e93bae
@@ -0,0 +1 @@
+xO 1*ҀfAv`̄\#1jFo뺞4mzcl&toQ *p:9qK])BѤ!+Bʐc8e WDz69+5z{k. sgV9Pƈ'xxO \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/94/d2c01087f48213bd157222d54edfefd77c9bba b/tests/resources/merge-recursive/.gitted/objects/94/d2c01087f48213bd157222d54edfefd77c9bba
new file mode 100644
index 000000000..76ffe4ea7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/94/d2c01087f48213bd157222d54edfefd77c9bba
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/95/78b04e2087976e382622322ba476aa40398dc7 b/tests/resources/merge-recursive/.gitted/objects/95/78b04e2087976e382622322ba476aa40398dc7
new file mode 100644
index 000000000..e3d15aac3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/95/78b04e2087976e382622322ba476aa40398dc7
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/96/23368f0fc562d6d840372ae17dc4cc32d51a80 b/tests/resources/merge-recursive/.gitted/objects/96/23368f0fc562d6d840372ae17dc4cc32d51a80
new file mode 100644
index 000000000..70bf8fbb0
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/96/23368f0fc562d6d840372ae17dc4cc32d51a80
@@ -0,0 +1,2 @@
+xK
+1D]H>πYId1oo ԢuJ7"BthuՊ2ypH@bhܡ2IXPIat8OYx6Whֺ=O4][vH| t Tr˸0L#S; \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/97/3b70322e758da87e1ce21d2195d86c5e4e9647 b/tests/resources/merge-recursive/.gitted/objects/97/3b70322e758da87e1ce21d2195d86c5e4e9647
new file mode 100644
index 000000000..a90a61cd7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/97/3b70322e758da87e1ce21d2195d86c5e4e9647
@@ -0,0 +1 @@
+xN1 )]u^!NDI 8^[z$&u7{7fBD{Rr(䓯2jmL9AHI .TT s T Y6۾]{祭׶Ɇns[(pD8 w5ӓ68u. up`p3 \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/98/1c79eb38518d3821e73bb159dc413bb42d6614 b/tests/resources/merge-recursive/.gitted/objects/98/1c79eb38518d3821e73bb159dc413bb42d6614
new file mode 100644
index 000000000..d5787b44d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/98/1c79eb38518d3821e73bb159dc413bb42d6614
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/9a/e63b4a8ce0f181b2d1d098971733a103226917 b/tests/resources/merge-recursive/.gitted/objects/9a/e63b4a8ce0f181b2d1d098971733a103226917
new file mode 100644
index 000000000..0cbd00d53
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/9a/e63b4a8ce0f181b2d1d098971733a103226917
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/9b/258ad4c39f40c24f66bf1faf48eb6202d59c85 b/tests/resources/merge-recursive/.gitted/objects/9b/258ad4c39f40c24f66bf1faf48eb6202d59c85
new file mode 100644
index 000000000..305e1f3e9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/9b/258ad4c39f40c24f66bf1faf48eb6202d59c85
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/9c/3f1c70db28c00ce74b22ba3edafe16d9cf03d4 b/tests/resources/merge-recursive/.gitted/objects/9c/3f1c70db28c00ce74b22ba3edafe16d9cf03d4
new file mode 100644
index 000000000..b0ef1af86
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/9c/3f1c70db28c00ce74b22ba3edafe16d9cf03d4
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/9e/12bce04446d097ae1782967a5888c2e2a0d35b b/tests/resources/merge-recursive/.gitted/objects/9e/12bce04446d097ae1782967a5888c2e2a0d35b
new file mode 100644
index 000000000..0940d09c2
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/9e/12bce04446d097ae1782967a5888c2e2a0d35b
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a0/2d4fd126e0cc8fb46ee48cf38bad36d44f2dbc b/tests/resources/merge-recursive/.gitted/objects/a0/2d4fd126e0cc8fb46ee48cf38bad36d44f2dbc
new file mode 100644
index 000000000..566976715
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a0/2d4fd126e0cc8fb46ee48cf38bad36d44f2dbc
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a0/65d3022e99a1943177c10a53cce38bc2127042 b/tests/resources/merge-recursive/.gitted/objects/a0/65d3022e99a1943177c10a53cce38bc2127042
new file mode 100644
index 000000000..d14b7394c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a0/65d3022e99a1943177c10a53cce38bc2127042
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a2/8c21c90aa36580641b345011869d1a899a6783 b/tests/resources/merge-recursive/.gitted/objects/a2/8c21c90aa36580641b345011869d1a899a6783
new file mode 100644
index 000000000..91ffb4b88
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a2/8c21c90aa36580641b345011869d1a899a6783
@@ -0,0 +1,2 @@
+xN@ ۥ:\I x^dQ WDg3i\<7le*MbB0 Ji%XTUV[6CԠՔQR0ZjB/TD OmDr% bxR>
+jra,hWwY=wo;[nk1'D1Ó/~xmrrmѝROa \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/a2/fa36ffc4a565a223e225d15b18774f87d0c4f0 b/tests/resources/merge-recursive/.gitted/objects/a2/fa36ffc4a565a223e225d15b18774f87d0c4f0
new file mode 100644
index 000000000..347139464
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a2/fa36ffc4a565a223e225d15b18774f87d0c4f0
@@ -0,0 +1,3 @@
+xA D]s
+.Cb c]LfRG¡P9Ѣ%@ k0L bӡ/W^ĄT倾 yIY
+*u"Dd("m+Yަ:ougG] ~|@)>5brx7Q \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/a3/4e5a16feabbd0335a633aadb8217c9f3dba58d b/tests/resources/merge-recursive/.gitted/objects/a3/4e5a16feabbd0335a633aadb8217c9f3dba58d
new file mode 100644
index 000000000..00f9c2ddd
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a3/4e5a16feabbd0335a633aadb8217c9f3dba58d
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20 b/tests/resources/merge-recursive/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20
new file mode 100644
index 000000000..54f9b6617
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/a8/2a121ea36b115548d6dad2cd86ec27f06f7b30 b/tests/resources/merge-recursive/.gitted/objects/a8/2a121ea36b115548d6dad2cd86ec27f06f7b30
new file mode 100644
index 000000000..e740872fa
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/a8/2a121ea36b115548d6dad2cd86ec27f06f7b30
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/aa/9e263294fd2f6f6fd9ceab23ca8ce3ea2ce707 b/tests/resources/merge-recursive/.gitted/objects/aa/9e263294fd2f6f6fd9ceab23ca8ce3ea2ce707
new file mode 100644
index 000000000..0ec6cd891
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/aa/9e263294fd2f6f6fd9ceab23ca8ce3ea2ce707
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ad/1ea02c2cc4f55c1dff87b80a086206a73885eb b/tests/resources/merge-recursive/.gitted/objects/ad/1ea02c2cc4f55c1dff87b80a086206a73885eb
new file mode 100644
index 000000000..99207a9dd
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ad/1ea02c2cc4f55c1dff87b80a086206a73885eb
@@ -0,0 +1,2 @@
+x+)JMU022g040031QH,.H,JL/-+(a9/>~WENYZGj
+RSj2I^'y51i0599`e5a z%潎U^XV Vtٙo]2Y~P1($bz7g\QdLɔ3Rsjݿ*~뛘R+<[{ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/ad/2ace9e15f66b3d1138922e6ffdc3ea3f967fa6 b/tests/resources/merge-recursive/.gitted/objects/ad/2ace9e15f66b3d1138922e6ffdc3ea3f967fa6
new file mode 100644
index 000000000..8ae3ba5a7
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ad/2ace9e15f66b3d1138922e6ffdc3ea3f967fa6
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ad/98bfa4679fb00b89207a0a11b8bbf91a3e4de9 b/tests/resources/merge-recursive/.gitted/objects/ad/98bfa4679fb00b89207a0a11b8bbf91a3e4de9
new file mode 100644
index 000000000..457f9da1f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ad/98bfa4679fb00b89207a0a11b8bbf91a3e4de9
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b2/a81ead9e722af0099fccfb478cea88eea749a2 b/tests/resources/merge-recursive/.gitted/objects/b2/a81ead9e722af0099fccfb478cea88eea749a2
new file mode 100644
index 000000000..7a8ffe58a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b2/a81ead9e722af0099fccfb478cea88eea749a2
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b4/cefb3c75770e57bb8bb44e4a50d9578009e847 b/tests/resources/merge-recursive/.gitted/objects/b4/cefb3c75770e57bb8bb44e4a50d9578009e847
new file mode 100644
index 000000000..836bb4edc
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b4/cefb3c75770e57bb8bb44e4a50d9578009e847
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/b9/1ef5ffa8612616c8e76051901caafd723f0e2c b/tests/resources/merge-recursive/.gitted/objects/b9/1ef5ffa8612616c8e76051901caafd723f0e2c
new file mode 100644
index 000000000..e19652394
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/b9/1ef5ffa8612616c8e76051901caafd723f0e2c
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/bd/97980c22d122509cdd915fd9788d56c8d3ae20 b/tests/resources/merge-recursive/.gitted/objects/bd/97980c22d122509cdd915fd9788d56c8d3ae20
new file mode 100644
index 000000000..71295e071
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/bd/97980c22d122509cdd915fd9788d56c8d3ae20
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/c0/bd078a61d2cc22c52ca5ce04abdcdc5cc1829e b/tests/resources/merge-recursive/.gitted/objects/c0/bd078a61d2cc22c52ca5ce04abdcdc5cc1829e
new file mode 100644
index 000000000..3dde6c243
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/c0/bd078a61d2cc22c52ca5ce04abdcdc5cc1829e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/c4/83ca4bb087174af5cb51d7caa9c09fe4a28ccb b/tests/resources/merge-recursive/.gitted/objects/c4/83ca4bb087174af5cb51d7caa9c09fe4a28ccb
new file mode 100644
index 000000000..643a98280
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/c4/83ca4bb087174af5cb51d7caa9c09fe4a28ccb
@@ -0,0 +1 @@
+xPKN@ cS̮d#!+v\ d[E}E\`۱lɼ-0.cW5熱5Қ\sX(V#$V;g1H y±ڂP!HmzXb-X \^)\+15WP!g`JHw~Uy㘷<'b^m9oӮ~y\-o˽AdC2}C3g3 GCq;zl<{ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f b/tests/resources/merge-recursive/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f
new file mode 100644
index 000000000..2bbf28f57
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f
@@ -0,0 +1 @@
+x%P1n0 WCNEN7:*pԒ/WmI$=^^._?~|C6yTȄA(#1e鴓.(Hto@̸K-as1r6)&)8ŷTa<0ׇJ٢[K5IJcq͓쌫r_ۇ"u^@7~X)2 G,fR`B43vQH֩uab SwcJq)fƔOv; \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/ca/224bba0a8a24f1768804fe5f565b1014af7ef2 b/tests/resources/merge-recursive/.gitted/objects/ca/224bba0a8a24f1768804fe5f565b1014af7ef2
new file mode 100644
index 000000000..0dd861f2c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ca/224bba0a8a24f1768804fe5f565b1014af7ef2
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ca/49d1a8b6116ffeba22667bba265fa5261df7ab b/tests/resources/merge-recursive/.gitted/objects/ca/49d1a8b6116ffeba22667bba265fa5261df7ab
new file mode 100644
index 000000000..1ea596763
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ca/49d1a8b6116ffeba22667bba265fa5261df7ab
@@ -0,0 +1,2 @@
+xN1 D+8q^BH:{ݠ^=gFھ_8FWo* s]#ZR)Zl$N0ڔz bY4+
+VCE9>_=$#)hDf#fN-őYmlCy^ikk;F'Twel[@"2Yp6d2,71ˣg48 .hv>d?;No \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/ca/7d316d6d9af99d2481e980d68b77e572d80fe7 b/tests/resources/merge-recursive/.gitted/objects/ca/7d316d6d9af99d2481e980d68b77e572d80fe7
new file mode 100644
index 000000000..0733fa232
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ca/7d316d6d9af99d2481e980d68b77e572d80fe7
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ca/fa936d25f0b397432a27201f6b3284c47df8be b/tests/resources/merge-recursive/.gitted/objects/ca/fa936d25f0b397432a27201f6b3284c47df8be
new file mode 100644
index 000000000..fb012eea3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ca/fa936d25f0b397432a27201f6b3284c47df8be
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/cb/49ad76147f5f9439cbd6133708b76142660660 b/tests/resources/merge-recursive/.gitted/objects/cb/49ad76147f5f9439cbd6133708b76142660660
new file mode 100644
index 000000000..849668c8b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/cb/49ad76147f5f9439cbd6133708b76142660660
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d0/dd5d9083bda65ec99aa8b9b64a5a278771b70a b/tests/resources/merge-recursive/.gitted/objects/d0/dd5d9083bda65ec99aa8b9b64a5a278771b70a
new file mode 100644
index 000000000..b0d951c9e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d0/dd5d9083bda65ec99aa8b9b64a5a278771b70a
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d2/682aaf9594080ce877b5eeee110850fd6e3480 b/tests/resources/merge-recursive/.gitted/objects/d2/682aaf9594080ce877b5eeee110850fd6e3480
new file mode 100644
index 000000000..c79a3bb0f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d2/682aaf9594080ce877b5eeee110850fd6e3480
@@ -0,0 +1 @@
+x%Pn@ |_IPS)SХ$2ʶp>'9F:gH$it]p:?p``dΝBzBE)aۅt@4+FC{b]& yl`(p9[*mx`?t2.Ԩ^ReMEZVE ƕd;z@>+r^[<aż~9ր0uhE`$$S:a2%Sw^bJ>fFOvۅЋ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/d6/04c75019c282144bdbbf3fd3462ba74b240efc b/tests/resources/merge-recursive/.gitted/objects/d6/04c75019c282144bdbbf3fd3462ba74b240efc
new file mode 100644
index 000000000..059fcfe72
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d6/04c75019c282144bdbbf3fd3462ba74b240efc
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d7/1c24b3b113fd1d1909998c5bfe33b86a65ee03 b/tests/resources/merge-recursive/.gitted/objects/d7/1c24b3b113fd1d1909998c5bfe33b86a65ee03
new file mode 100644
index 000000000..66720086c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d7/1c24b3b113fd1d1909998c5bfe33b86a65ee03
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d8/dd349b78f19a4ebe3357bacb8138f00bf5ed41 b/tests/resources/merge-recursive/.gitted/objects/d8/dd349b78f19a4ebe3357bacb8138f00bf5ed41
new file mode 100644
index 000000000..ade33f7f5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d8/dd349b78f19a4ebe3357bacb8138f00bf5ed41
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/d8/e05a90b3c2240d71a20c2502c937d9b7d22777 b/tests/resources/merge-recursive/.gitted/objects/d8/e05a90b3c2240d71a20c2502c937d9b7d22777
new file mode 100644
index 000000000..b157ba17c
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/d8/e05a90b3c2240d71a20c2502c937d9b7d22777
@@ -0,0 +1,2 @@
+x%Pn@ |_IQS)SХ$2ʶp>'9F:gH$it]p:oB8u0L2N!=ZĔ0B: !ѽ1.s Ӽ60FvZMA^
+Vn-yb6<0ׇq -jT/)ɲʦ"-[UOgz@>+r^[<aż~9ր0uhE`$$S:a2%Sw^bJ>fFOvۄ𶋅 \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/da/b7b53383a1fec46632e60a1d847ce4f9ae14f2 b/tests/resources/merge-recursive/.gitted/objects/da/b7b53383a1fec46632e60a1d847ce4f9ae14f2
new file mode 100644
index 000000000..cc4f24369
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/da/b7b53383a1fec46632e60a1d847ce4f9ae14f2
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/db/203155a789fb749aa3c14e93eea2c744a9c6c7 b/tests/resources/merge-recursive/.gitted/objects/db/203155a789fb749aa3c14e93eea2c744a9c6c7
new file mode 100644
index 000000000..e9f7fd8fd
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/db/203155a789fb749aa3c14e93eea2c744a9c6c7
@@ -0,0 +1 @@
+xMJ1]$_q;/t;D Ԧ((K k2S A,J*b[,'KG dyRP0PuF1 o$jL 81}l}6'q/}9nC#$mQ'=-DŽzN<h{XkE\cZ \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/de/a7215f259b2cced87d1bda6c72f8b4ce37a2ff b/tests/resources/merge-recursive/.gitted/objects/de/a7215f259b2cced87d1bda6c72f8b4ce37a2ff
new file mode 100644
index 000000000..55c1983a8
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/de/a7215f259b2cced87d1bda6c72f8b4ce37a2ff
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e1/512550f09d980214e46e6d3f5a2b20c3d75755 b/tests/resources/merge-recursive/.gitted/objects/e1/512550f09d980214e46e6d3f5a2b20c3d75755
new file mode 100644
index 000000000..a5f506fb3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e1/512550f09d980214e46e6d3f5a2b20c3d75755
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e1/dcfc3038be54195a59817c89782b261e46cb05 b/tests/resources/merge-recursive/.gitted/objects/e1/dcfc3038be54195a59817c89782b261e46cb05
new file mode 100644
index 000000000..3668b546a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e1/dcfc3038be54195a59817c89782b261e46cb05
@@ -0,0 +1 @@
+xN1 :O:%/uݠ\OGTG5ܶ2yw7x-X1pM`#ؠ6%F]œᤙ"HyI)8Կy*X_CX\1VB9JAX[Aڶk$Rg>ܶ{nD2ZQk5Yn0hn,UV8e N;G>>MpM \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/e2/93bfdddb81a853bbb16b8b58e68626f30841a4 b/tests/resources/merge-recursive/.gitted/objects/e2/93bfdddb81a853bbb16b8b58e68626f30841a4
new file mode 100644
index 000000000..fab55fea6
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e2/93bfdddb81a853bbb16b8b58e68626f30841a4
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e2/c84bb33992a455b1a7a5019f0e38d883d3f475 b/tests/resources/merge-recursive/.gitted/objects/e2/c84bb33992a455b1a7a5019f0e38d883d3f475
new file mode 100644
index 000000000..8c6686706
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e2/c84bb33992a455b1a7a5019f0e38d883d3f475
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e2/d185fa827d58134cea20b9e1df893833c6560e b/tests/resources/merge-recursive/.gitted/objects/e2/d185fa827d58134cea20b9e1df893833c6560e
new file mode 100644
index 000000000..fc80c0851
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e2/d185fa827d58134cea20b9e1df893833c6560e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/e5/0fbbd701458757bdfe9815f58ed717c588d1b5 b/tests/resources/merge-recursive/.gitted/objects/e5/0fbbd701458757bdfe9815f58ed717c588d1b5
new file mode 100644
index 000000000..96467c106
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/e5/0fbbd701458757bdfe9815f58ed717c588d1b5
@@ -0,0 +1,3 @@
+x%P1n0 Wݡ@SKCCG%QXr}&IKi*ݡRKl8͆Uj2*HLx>3?03RKXNXPZɩ9[-=\߷_밓q9El-ҳ*X7n\$
+C: hVe^[<ᨐżԄE
+7LH[@Wvfw.0u:Ժ.U=Ld{L 4 0m$ox \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/ef/1783444b61a8671beea4ce1f4d0202677dfbfb b/tests/resources/merge-recursive/.gitted/objects/ef/1783444b61a8671beea4ce1f4d0202677dfbfb
new file mode 100644
index 000000000..67e6e8a5e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ef/1783444b61a8671beea4ce1f4d0202677dfbfb
@@ -0,0 +1,3 @@
+xO[
+0; TI " l-Fj3Pr+(+7ue~0bxL4A;TpJDŽcZqd#FmD kdGg
+5e*Qqs?৶=1Vmc+Y#eI9yv5 70U \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/f1/3e1bc6ba935fce2efffa5be4c4832404034ef1 b/tests/resources/merge-recursive/.gitted/objects/f1/3e1bc6ba935fce2efffa5be4c4832404034ef1
new file mode 100644
index 000000000..e115747a2
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f1/3e1bc6ba935fce2efffa5be4c4832404034ef1
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f1/72517a8cf39e009ffff541ee52429b89e418f3 b/tests/resources/merge-recursive/.gitted/objects/f1/72517a8cf39e009ffff541ee52429b89e418f3
new file mode 100644
index 000000000..3d29a0fe8
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f1/72517a8cf39e009ffff541ee52429b89e418f3
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f1/b44c04989a3a1c14b036cfadfa328d53a7bc5e b/tests/resources/merge-recursive/.gitted/objects/f1/b44c04989a3a1c14b036cfadfa328d53a7bc5e
new file mode 100644
index 000000000..7cbaaeecf
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f1/b44c04989a3a1c14b036cfadfa328d53a7bc5e
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f3/5f159ff5d44dfd9f52d63dd5b659f0521ff569 b/tests/resources/merge-recursive/.gitted/objects/f3/5f159ff5d44dfd9f52d63dd5b659f0521ff569
new file mode 100644
index 000000000..5179f2ccf
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f3/5f159ff5d44dfd9f52d63dd5b659f0521ff569
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/f5/1658077d85f2264fa179b4d0848268cb3475c3 b/tests/resources/merge-recursive/.gitted/objects/f5/1658077d85f2264fa179b4d0848268cb3475c3
new file mode 100644
index 000000000..3b4eb97e9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f5/1658077d85f2264fa179b4d0848268cb3475c3
@@ -0,0 +1,2 @@
+xERN1W,}D@Jsl^'3Ǯz}{@٘o^X3y';K8ęOlI)g7d3Q FABFtc9*~)@a1L. ݜĔXiV1a2tP*$%ɝ׭q$ET<< UP;uKu*T⤛
+&U-q̱*nѥ fgg:ע4!AASmĹiQށm E 43FgFғaD5 Y)G8@*g1NN;_ jw3*Fzv~y|s \ No newline at end of file
diff --git a/tests/resources/merge-recursive/.gitted/objects/f7/929c5a67a4bdc98247fb4b5098675723932a64 b/tests/resources/merge-recursive/.gitted/objects/f7/929c5a67a4bdc98247fb4b5098675723932a64
new file mode 100644
index 000000000..2861579e8
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/f7/929c5a67a4bdc98247fb4b5098675723932a64
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/fa/567f568ed72157c0c617438d077695b99d9aac b/tests/resources/merge-recursive/.gitted/objects/fa/567f568ed72157c0c617438d077695b99d9aac
new file mode 100644
index 000000000..ad5a3cf4f
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/fa/567f568ed72157c0c617438d077695b99d9aac
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/fd/8b5fe88cda995e70a22ed98701e65b843e05ec b/tests/resources/merge-recursive/.gitted/objects/fd/8b5fe88cda995e70a22ed98701e65b843e05ec
new file mode 100644
index 000000000..b6f14634e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/fd/8b5fe88cda995e70a22ed98701e65b843e05ec
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/fe/f01f3104c8047d05e8572e521c454f8fd4b8db b/tests/resources/merge-recursive/.gitted/objects/fe/f01f3104c8047d05e8572e521c454f8fd4b8db
new file mode 100644
index 000000000..715b6a865
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/fe/f01f3104c8047d05e8572e521c454f8fd4b8db
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807d b/tests/resources/merge-recursive/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807d
new file mode 100644
index 000000000..f655d12ea
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807d
Binary files differ
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchA-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchA-1
new file mode 100644
index 000000000..b55325c3e
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchA-1
@@ -0,0 +1 @@
+539bd011c4822c560c1d17cab095006b7a10f707
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchA-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchA-2
new file mode 100644
index 000000000..d35574340
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchA-2
@@ -0,0 +1 @@
+0bb7ed583d7e9ad507e8b902594f5c9126ea456b
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchB-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchB-1
new file mode 100644
index 000000000..d2eecb741
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchB-1
@@ -0,0 +1 @@
+a34e5a16feabbd0335a633aadb8217c9f3dba58d
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchB-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchB-2
new file mode 100644
index 000000000..d5cfb2762
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchB-2
@@ -0,0 +1 @@
+723181f1bfd30e47a6d1d36a4d874e31e7a0a1a4
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchC-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchC-1
new file mode 100644
index 000000000..346b039b4
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchC-1
@@ -0,0 +1 @@
+ad2ace9e15f66b3d1138922e6ffdc3ea3f967fa6
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchC-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchC-2
new file mode 100644
index 000000000..67f3153f5
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchC-2
@@ -0,0 +1 @@
+815b5a1c80ca749d705c7aa0cb294a00cbedd340
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchD-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchD-1
new file mode 100644
index 000000000..fa96ccb28
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchD-1
@@ -0,0 +1 @@
+4dfc1be85a9d6c9898152444d32b238b4aecf8cc
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchD-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchD-2
new file mode 100644
index 000000000..8a87f9868
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchD-2
@@ -0,0 +1 @@
+007f1ee2af8e5d99906867c4237510e1790a89b8
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchE-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchE-1
new file mode 100644
index 000000000..b8d011e2d
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchE-1
@@ -0,0 +1 @@
+ca224bba0a8a24f1768804fe5f565b1014af7ef2
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchE-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchE-2
new file mode 100644
index 000000000..5e1e1acd9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchE-2
@@ -0,0 +1 @@
+436ea75c99f527e4b42fddb46abedf7726eb719d
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchE-3 b/tests/resources/merge-recursive/.gitted/refs/heads/branchE-3
new file mode 100644
index 000000000..eaec8d81a
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchE-3
@@ -0,0 +1 @@
+9b258ad4c39f40c24f66bf1faf48eb6202d59c85
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchF-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchF-1
new file mode 100644
index 000000000..5f2ca915b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchF-1
@@ -0,0 +1 @@
+783d6539dde96b8873c5b5da3e79cc14cd64830b
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchF-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchF-2
new file mode 100644
index 000000000..abe2ea947
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchF-2
@@ -0,0 +1 @@
+ef1783444b61a8671beea4ce1f4d0202677dfbfb
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchG-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchG-1
new file mode 100644
index 000000000..af511439b
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchG-1
@@ -0,0 +1 @@
+c483ca4bb087174af5cb51d7caa9c09fe4a28ccb
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchG-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchG-2
new file mode 100644
index 000000000..24177a247
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchG-2
@@ -0,0 +1 @@
+d71c24b3b113fd1d1909998c5bfe33b86a65ee03
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchH-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchH-1
new file mode 100644
index 000000000..ffe9f8cf3
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchH-1
@@ -0,0 +1 @@
+7a9277e0c5ec75339f011c176d0c20e513c4de1c
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchH-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchH-2
new file mode 100644
index 000000000..84ed1a2a9
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchH-2
@@ -0,0 +1 @@
+db203155a789fb749aa3c14e93eea2c744a9c6c7
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchI-1 b/tests/resources/merge-recursive/.gitted/refs/heads/branchI-1
new file mode 100644
index 000000000..2d1ecd026
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchI-1
@@ -0,0 +1 @@
+5607a8c4601a737daadd1f470bde3142aff57026
diff --git a/tests/resources/merge-recursive/.gitted/refs/heads/branchI-2 b/tests/resources/merge-recursive/.gitted/refs/heads/branchI-2
new file mode 100644
index 000000000..fc360bae2
--- /dev/null
+++ b/tests/resources/merge-recursive/.gitted/refs/heads/branchI-2
@@ -0,0 +1 @@
+f7929c5a67a4bdc98247fb4b5098675723932a64
diff --git a/tests/resources/merge-recursive/asparagus.txt b/tests/resources/merge-recursive/asparagus.txt
new file mode 100644
index 000000000..ffb36e513
--- /dev/null
+++ b/tests/resources/merge-recursive/asparagus.txt
@@ -0,0 +1,10 @@
+ASPARAGUS SOUP.
+
+Take four large bunches of asparagus, scrape it nicely, cut off one inch
+of the tops, and lay them in water, chop the stalks and put them on the
+fire with a piece of bacon, a large onion cut up, and pepper and salt;
+add two quarts of water, boil them till the stalks are quite soft, then
+pulp them through a sieve, and strain the water to it, which must be put
+back in the pot; put into it a chicken cut up, with the tops of
+asparagus which had been laid by, boil it until these last articles are
+sufficiently done, thicken with flour, butter and milk, and serve it up.
diff --git a/tests/resources/merge-recursive/beef.txt b/tests/resources/merge-recursive/beef.txt
new file mode 100644
index 000000000..68f6182f4
--- /dev/null
+++ b/tests/resources/merge-recursive/beef.txt
@@ -0,0 +1,22 @@
+BEEF SOUP.
+
+Take the hind shin of beef, cut off all the flesh off the leg-bone,
+which must be taken away entirely, or the soup will be greasy. Wash the
+meat clean and lay it in a pot, sprinkle over it one small
+table-spoonful of pounded black pepper, and two of salt; three onions
+the size of a hen's egg, cut small, six small carrots scraped and cut
+up, two small turnips pared and cut into dice; pour on three quarts of
+water, cover the pot close, and keep it gently and steadily boiling five
+hours, which will leave about three pints of clear soup; do not let the
+pot boil over, but take off the scum carefully, as it rises. When it has
+boiled four hours, put in a small bundle of thyme and parsley, and a
+pint of celery cut small, or a tea-spoonful of celery seed pounded.
+These latter ingredients would lose their delicate flavour if boiled too
+much. Just before you take it up, brown it in the following manner: put
+a small table-spoonful of nice brown sugar into an iron skillet, set it
+on the fire and stir it till it melts and looks very dark, pour into it
+a ladle full of the soup, a little at a time; stirring it all the while.
+Strain this browning and mix it well with the soup; take out the bundle
+of thyme and parsley, put the nicest pieces of meat in your tureen, and
+pour on the soup and vegetables; put in some toasted bread cut in dice,
+and serve it up.
diff --git a/tests/resources/merge-recursive/bouilli.txt b/tests/resources/merge-recursive/bouilli.txt
new file mode 100644
index 000000000..4b7c56500
--- /dev/null
+++ b/tests/resources/merge-recursive/bouilli.txt
@@ -0,0 +1,18 @@
+SOUP WITH BOUILLI.
+
+Take the nicest part of the thick brisket of beef, about eight pounds,
+put it into a pot with every thing directed for the other soup; make it
+exactly in the same way, only put it on an hour sooner, that you may
+have time to prepare the bouilli; after it has boiled five hours, take
+out the beef, cover up the soup and set it near the fire that it may
+keep hot. Take the skin off the beef, have the yelk of an egg well
+beaten, dip a feather in it and wash the top of your beef, sprinkle over
+it the crumb of stale bread finely grated, put it in a Dutch oven
+previously heated, put the top on with coals enough to brown, but not
+burn the beef; let it stand nearly an hour, and prepare your gravy
+thus:--Take a sufficient quantity of soup and the vegetables boiled in
+it; add to it a table-spoonful of red wine, and two of mushroom catsup,
+thicken with a little bit of butter and a little brown flour; make it
+very hot, pour it in your dish, and put the beef on it. Garnish it with
+green pickle, cut in thin slices, serve up the soup in a tureen with
+bits of toasted bread.
diff --git a/tests/resources/merge-recursive/gravy.txt b/tests/resources/merge-recursive/gravy.txt
new file mode 100644
index 000000000..c4e6cca3e
--- /dev/null
+++ b/tests/resources/merge-recursive/gravy.txt
@@ -0,0 +1,8 @@
+GRAVY SOUP.
+
+Get eight pounds of coarse lean beef--wash it clean and lay it in your
+pot, put in the same ingredients as for the shin soup, with the same
+quantity of water, and follow the process directed for that. Strain the
+soup through a sieve, and serve it up clear, with nothing more than
+toasted bread in it; two table-spoonsful of mushroom catsup will add a
+fine flavour to the soup.
diff --git a/tests/resources/merge-recursive/oyster.txt b/tests/resources/merge-recursive/oyster.txt
new file mode 100644
index 000000000..7c7e08f95
--- /dev/null
+++ b/tests/resources/merge-recursive/oyster.txt
@@ -0,0 +1,13 @@
+OYSTER SOUP!
+
+Wash and drain two quarts of oysters, put them on with three quarts of
+water, three onions chopped up, two or three slices of lean ham, pepper
+and salt; boil it till reduced one-half, strain it through a sieve,
+return the liquid into the pot, put in one quart of fresh oysters, boil
+it till they are sufficiently done, and thicken the soup with four
+spoonsful of flour, two gills of rich cream, and the yelks of six new
+laid eggs beaten well; boil it a few minutes after the thickening is put
+in. Take care that it does not curdle, and that the flour is not in
+lumps; serve it up with the last oysters that were put in. If the
+flavour of thyme be agreeable, you may put in a little, but take care
+that it does not boil in it long enough to discolour the soup.
diff --git a/tests/resources/merge-recursive/veal.txt b/tests/resources/merge-recursive/veal.txt
new file mode 100644
index 000000000..898d12687
--- /dev/null
+++ b/tests/resources/merge-recursive/veal.txt
@@ -0,0 +1,20 @@
+VEAL SOUP.
+
+PUT INTO A POT THREE QUARTS OF WATER, 3 onions cut small, ONE
+spoonful of black pepper pounded, and two of salt, with two or three
+slices of lean ham; let it boil steadily two hours; skim it
+occasionally, then put into it a shin of veal, let it boil two hours
+longer; take out the slices of ham, and skim off the grease if any
+should rise, take a gill of good cream, mix with it two table-spoonsful
+of flour very nicely, and the yelks of two eggs beaten well, strain this
+mixture, and add some chopped parsley; pour some soup on by degrees,
+stir it well, and pour it into the pot, continuing to stir until it has
+boiled two or three minutes to take off the raw taste of the eggs. If
+the cream be not perfectly sweet, and the eggs quite new, the thickening
+will curdle in the soup. For a change you may put a dozen ripe tomatos
+in, first taking off their skins, by letting them stand a few minutes in
+hot water, when they may be easily peeled. When made in this way you
+must thicken it with the flour only. Any part of the veal may be used,
+but the shin or knuckle is the nicest.
+
+This is a mighty fine recipe!
diff --git a/tests/revert/workdir.c b/tests/revert/workdir.c
index 9f83bd842..802819c75 100644
--- a/tests/revert/workdir.c
+++ b/tests/revert/workdir.c
@@ -410,7 +410,7 @@ void test_revert_workdir__rename_1_of_2(void)
{ 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 2, "file6.txt" },
};
- opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ opts.merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
opts.merge_opts.rename_threshold = 50;
git_oid_fromstr(&head_oid, "cef56612d71a6af8d8015691e4865f7fece905b5");
@@ -444,7 +444,7 @@ void test_revert_workdir__rename(void)
{ "file4.txt", "file5.txt", "" },
};
- opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES;
+ opts.merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
opts.merge_opts.rename_threshold = 50;
git_oid_fromstr(&head_oid, "55568c8de5322ff9a95d72747a239cdb64a19965");