diff --git a/_spm/repositories/swift-collections-9a58d5cf/FETCH_HEAD b/_spm/repositories/swift-collections-9a58d5cf/FETCH_HEAD new file mode 100644 index 0000000..a78d4e9 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/FETCH_HEAD @@ -0,0 +1,469 @@ +1f8dcd4726717a4b724e5408ca24829bdef67a49 not-for-merge branch 'action-xcode-versions' of https://github.com/apple/swift-collections +7ae9880f0fb622992a8a5328fd4af78af5b6b26f not-for-merge branch 'dn/remove-retain-release-during-find' of https://github.com/apple/swift-collections +ddff9004d745c4b2d13e35ebdd1a3d0b67e14717 not-for-merge branch 'doc-basic-span-index-mutation' of https://github.com/apple/swift-collections +ebd51171f0e45788e2cdb3cc6d54233e11d7443c not-for-merge branch 'future' of https://github.com/apple/swift-collections +534c0cbbfef9d2f6e7a6519930967d75f7c60336 not-for-merge branch 'main' of https://github.com/apple/swift-collections +68c32ed80b138d1f8a6ec5dcf1b105f32fcaaf12 not-for-merge branch 'maxd/run-wasm-tests' of https://github.com/apple/swift-collections +762bc5757de4bcf86cc3b3266e3df93f76469089 not-for-merge branch 'nate/zip_dispatch_benchmarking' of https://github.com/apple/swift-collections +d029d9d39c87bed85b1c50adee7c41795261a192 not-for-merge branch 'release/1.0' of https://github.com/apple/swift-collections +c11818f3cae0780656baa430b49e7f163f08dffd not-for-merge branch 'release/1.1' of https://github.com/apple/swift-collections +2d1f4172091ca272b461397748fd2c32847036dd not-for-merge branch 'release/1.2' of https://github.com/apple/swift-collections +c55cbe540366c704c279298ca6ad4c09a067ebe0 not-for-merge branch 'release/1.3' of https://github.com/apple/swift-collections +a26fc8e7e4c6e0d63b08951f5b7268044fb95c83 not-for-merge branch 'span-prototype' of https://github.com/apple/swift-collections +434d30dae30fbb57699370260c69c2108c1abf8f not-for-merge branch 'wasm-tests' of https://github.com/apple/swift-collections +c65cd649fb91f64636f2f1ef5da4991987139f68 not-for-merge 'refs/pull/10/head' of https://github.com/apple/swift-collections +6a9703c3f13061291eff1baf8af4fce1e6ce35af not-for-merge 'refs/pull/100/head' of https://github.com/apple/swift-collections +8303a77bc2915be76777d6fc17b702146b6fb192 not-for-merge 'refs/pull/102/head' of https://github.com/apple/swift-collections +6cd03922372c85e2dca476f665527976911e7397 not-for-merge 'refs/pull/105/head' of https://github.com/apple/swift-collections +96100d4b6ad61bbfbf549ee42dc73239325b353f not-for-merge 'refs/pull/106/head' of https://github.com/apple/swift-collections +f69104b5071ef9a44112e3c4fef8904b5e8b6d73 not-for-merge 'refs/pull/107/head' of https://github.com/apple/swift-collections +5f255a887e51093f058e7ee9ea0b959051be38d4 not-for-merge 'refs/pull/108/head' of https://github.com/apple/swift-collections +c46c77f7f85f9efe83cc5cb8d54b32c538b06450 not-for-merge 'refs/pull/109/head' of https://github.com/apple/swift-collections +cfca1038b53eecd4fc50da15cc715f966904012e not-for-merge 'refs/pull/11/head' of https://github.com/apple/swift-collections +103008aca495f3b80a50713086d451b08cef9f50 not-for-merge 'refs/pull/110/head' of https://github.com/apple/swift-collections +39a16a15cc8c7e11486015d2deb78468b4a64c85 not-for-merge 'refs/pull/111/head' of https://github.com/apple/swift-collections +7f57a0ed1c8b1d44eacab95d3cfd57d87482b25a not-for-merge 'refs/pull/112/head' of https://github.com/apple/swift-collections +efefae56531b30d75553f234134e3c83bd26c6a6 not-for-merge 'refs/pull/113/head' of https://github.com/apple/swift-collections +565b1ab20bef052f52fad4ebe112803facb325e3 not-for-merge 'refs/pull/114/head' of https://github.com/apple/swift-collections +8b3af12ece11ea7b0e748749c39a59c59269ca25 not-for-merge 'refs/pull/115/head' of https://github.com/apple/swift-collections +8be0f192e8f120969427cb2645aabe6f5fdf15a1 not-for-merge 'refs/pull/116/head' of https://github.com/apple/swift-collections +771bca404c0ee603bb6cc2ea3a19cfc4ebc3d001 not-for-merge 'refs/pull/117/head' of https://github.com/apple/swift-collections +95be379a3ac1e4278d114a22501267065062b39a not-for-merge 'refs/pull/118/head' of https://github.com/apple/swift-collections +f41f2cae69dc6ffcc178227a0a46607561fa925c not-for-merge 'refs/pull/119/head' of https://github.com/apple/swift-collections +276ddee5df4ea0f44c5edea0dbe726cb74682498 not-for-merge 'refs/pull/121/head' of https://github.com/apple/swift-collections +1c1e6206fa1a4b0a6bf97ac979f841c1d1821ad7 not-for-merge 'refs/pull/122/head' of https://github.com/apple/swift-collections +074b0ad21387e767b5b3ff1cb014a118a3b80bde not-for-merge 'refs/pull/123/head' of https://github.com/apple/swift-collections +ddc8b9c66d07cb0af38e98ca160f1f7cc85c88d3 not-for-merge 'refs/pull/126/head' of https://github.com/apple/swift-collections +9dde4b560323d43ec2ca8225a6c5c79a9bc0735d not-for-merge 'refs/pull/128/head' of https://github.com/apple/swift-collections +453adb695f615886cd7a897d62676713aeb25bf9 not-for-merge 'refs/pull/13/head' of https://github.com/apple/swift-collections +286fedb1e8f6b2567cd214cf1127a9322dea1400 not-for-merge 'refs/pull/130/head' of https://github.com/apple/swift-collections +e77d82c71271b7848e3ac9e007a52f36f04a1c7e not-for-merge 'refs/pull/132/head' of https://github.com/apple/swift-collections +1bde9674f42e41bfb62deb96d8b247a537171ba7 not-for-merge 'refs/pull/132/merge' of https://github.com/apple/swift-collections +cee04e96ed96fefa5527e33a4a055482e4ea14e9 not-for-merge 'refs/pull/14/head' of https://github.com/apple/swift-collections +50e6a1ac71df96e5cd257c565e9a3299f491ba3e not-for-merge 'refs/pull/140/head' of https://github.com/apple/swift-collections +29120ea6406a856c36496b4f5d3b13ca381436a6 not-for-merge 'refs/pull/141/head' of https://github.com/apple/swift-collections +867231031ac792328eff9133a289ce9e693a03c3 not-for-merge 'refs/pull/15/head' of https://github.com/apple/swift-collections +6cb037037d45f78622fd7cab3f62e3c6a4ff5ddb not-for-merge 'refs/pull/153/head' of https://github.com/apple/swift-collections +7016a13f0e8d0d0a36f3566a6dc6acaf5b83fbf4 not-for-merge 'refs/pull/155/head' of https://github.com/apple/swift-collections +00a99aa77c4982a6e7343982220e44b15e4d5974 not-for-merge 'refs/pull/156/head' of https://github.com/apple/swift-collections +74a800ac534877875d5d1187ac04f35b31a0b98c not-for-merge 'refs/pull/159/head' of https://github.com/apple/swift-collections +b9d73a5bab8d71e121687f79ed4aabfbd73d016b not-for-merge 'refs/pull/16/head' of https://github.com/apple/swift-collections +ddb6d141b3e4e8726a15e3e9e916ee697bd310db not-for-merge 'refs/pull/160/head' of https://github.com/apple/swift-collections +3437abecc49cfbbb91893e3a0d0f124db163637f not-for-merge 'refs/pull/161/head' of https://github.com/apple/swift-collections +1071b372942289dbd3209ede40f613d339cca8e1 not-for-merge 'refs/pull/162/head' of https://github.com/apple/swift-collections +b9d91f4a9aa3cfd6c8589aee997c4399e6d7d83d not-for-merge 'refs/pull/163/head' of https://github.com/apple/swift-collections +ee1b2de06edf18545084d99a5c99995e9c1ff8d4 not-for-merge 'refs/pull/165/head' of https://github.com/apple/swift-collections +b379fa7aee604738bd0b4076984c934e242bb7a5 not-for-merge 'refs/pull/168/head' of https://github.com/apple/swift-collections +71aa4a39ae59addf40e9dd40e79a4968f1c857cc not-for-merge 'refs/pull/169/head' of https://github.com/apple/swift-collections +feca3b6f4c7bf7adf9fa4a0fd200f96cf1b5a4b5 not-for-merge 'refs/pull/170/head' of https://github.com/apple/swift-collections +9a9d7d87d844b2a14ec602792d9ae216ea57ea53 not-for-merge 'refs/pull/172/head' of https://github.com/apple/swift-collections +8cc0b1d43975a9d547053cf0e943498c0d6d7992 not-for-merge 'refs/pull/173/head' of https://github.com/apple/swift-collections +aa428d0489be5888c72de4a4327f0f316a586632 not-for-merge 'refs/pull/174/head' of https://github.com/apple/swift-collections +14f90620c89e311a067a1fa49813d8bbcd539950 not-for-merge 'refs/pull/175/head' of https://github.com/apple/swift-collections +77edbef16d24e657fc3d7b0bc9adb57e6b0567d9 not-for-merge 'refs/pull/176/head' of https://github.com/apple/swift-collections +9d9659a079644d300d3571fb64ac7bb14322e506 not-for-merge 'refs/pull/177/head' of https://github.com/apple/swift-collections +9f38e7424baa3497e4d481790fc6ec2950725de8 not-for-merge 'refs/pull/178/head' of https://github.com/apple/swift-collections +d45f264ef0dc625a37801ee6e05b764ccbef30b4 not-for-merge 'refs/pull/179/head' of https://github.com/apple/swift-collections +58579394fc929c1b89b762c3ef68a1657442ca7d not-for-merge 'refs/pull/18/head' of https://github.com/apple/swift-collections +39fc818e0efaa148e038e3d89cd78be64567849a not-for-merge 'refs/pull/180/head' of https://github.com/apple/swift-collections +4c4154ca2350d981cd6abeadbdcad18071fe3b95 not-for-merge 'refs/pull/181/head' of https://github.com/apple/swift-collections +59858a77210f506e622a68e5b92e36bae6fc9215 not-for-merge 'refs/pull/182/head' of https://github.com/apple/swift-collections +ba303dca1d72860f0b253778f193010af20f9b79 not-for-merge 'refs/pull/184/head' of https://github.com/apple/swift-collections +778b8ae977c420dfe323b27ed3a1cf3f747f936b not-for-merge 'refs/pull/185/head' of https://github.com/apple/swift-collections +0f92943ba349d0337d254789bc49e9a5c45ff74e not-for-merge 'refs/pull/187/head' of https://github.com/apple/swift-collections +f71ebd9494b3b0b8c1450017f8c30fb61e4dcc37 not-for-merge 'refs/pull/188/head' of https://github.com/apple/swift-collections +66651795d89e760188908bb65b3398aa30b84897 not-for-merge 'refs/pull/189/head' of https://github.com/apple/swift-collections +832e58027cdb86e618089ebdf2e3474da915c357 not-for-merge 'refs/pull/190/head' of https://github.com/apple/swift-collections +9b7c6ecb10599568876b1108005b189de54d9ce9 not-for-merge 'refs/pull/191/head' of https://github.com/apple/swift-collections +4604c1bc381c4d164a030d11830701b2897a0002 not-for-merge 'refs/pull/192/head' of https://github.com/apple/swift-collections +0b86bb11d24e187ab6ab930f582f75ae00bcabf9 not-for-merge 'refs/pull/193/head' of https://github.com/apple/swift-collections +c7c0a094f91bd5cce90b1dc1f3feeb9d2508e7f5 not-for-merge 'refs/pull/194/head' of https://github.com/apple/swift-collections +1b71d2cd942459049b870264b7db649ba7509046 not-for-merge 'refs/pull/195/head' of https://github.com/apple/swift-collections +7cec5d1ed71d0c29fc7515725401c8a711a01074 not-for-merge 'refs/pull/196/head' of https://github.com/apple/swift-collections +b83d06b43337cc2855c1b55ba1cdba854724110b not-for-merge 'refs/pull/197/head' of https://github.com/apple/swift-collections +6286cd0b99741db984e5c1115a4c748bc42efec1 not-for-merge 'refs/pull/198/head' of https://github.com/apple/swift-collections +8b06c61c7e4ecb6777895a8fba275a44ec8c5e01 not-for-merge 'refs/pull/199/head' of https://github.com/apple/swift-collections +5aed92655d73228211985c933e0d5141d8203a09 not-for-merge 'refs/pull/200/head' of https://github.com/apple/swift-collections +51604cd196265a1e4444cef0a7ac749e34f5e64e not-for-merge 'refs/pull/201/head' of https://github.com/apple/swift-collections +2a81cb1186ac3483183df32ba8c3e2fe7360cbcb not-for-merge 'refs/pull/202/head' of https://github.com/apple/swift-collections +6dbc8b8c4f36ff470060464d69066e2e094a194f not-for-merge 'refs/pull/203/head' of https://github.com/apple/swift-collections +6b428b5a7fadfae0120db4fc96a3d5b14f7b7c36 not-for-merge 'refs/pull/204/head' of https://github.com/apple/swift-collections +b1506b62250f074d23cddc6d0318277dda5d21dc not-for-merge 'refs/pull/205/head' of https://github.com/apple/swift-collections +2e872739d3a6201e2b888c73f08ef54ae4125d6d not-for-merge 'refs/pull/206/head' of https://github.com/apple/swift-collections +4c842df1b8cfc9611762bdf5fbd9023ab2d3d333 not-for-merge 'refs/pull/207/head' of https://github.com/apple/swift-collections +1228e9c1628925843575a11c1de8342e402c7c30 not-for-merge 'refs/pull/208/head' of https://github.com/apple/swift-collections +b6184b667bd8f636558522f18cc2fe993a825679 not-for-merge 'refs/pull/21/head' of https://github.com/apple/swift-collections +fc8092d0441e0073831d6b170c74b6cca0da9bf5 not-for-merge 'refs/pull/210/head' of https://github.com/apple/swift-collections +cfc3d4a5179e61c36d77babd9fd3029a0f85cff4 not-for-merge 'refs/pull/211/head' of https://github.com/apple/swift-collections +02ea4e849230bc2326c83c5560822a228d83afab not-for-merge 'refs/pull/212/head' of https://github.com/apple/swift-collections +1490835b289653b145b91a16fe5522d928509efb not-for-merge 'refs/pull/213/head' of https://github.com/apple/swift-collections +2b4ec22949acbfa99f9e22c390d850a650f3d298 not-for-merge 'refs/pull/214/head' of https://github.com/apple/swift-collections +5e0a0149a4c9b2ab407f65b257b5b36bc589307d not-for-merge 'refs/pull/215/head' of https://github.com/apple/swift-collections +734730d72460e7bd536e8021d4aa711cb3aa75b2 not-for-merge 'refs/pull/216/head' of https://github.com/apple/swift-collections +381cf5d17e46f2d3266bd1be7295118647443313 not-for-merge 'refs/pull/217/head' of https://github.com/apple/swift-collections +3c6cb8cd56d04392bf9f79a2d5020fc2abf1958d not-for-merge 'refs/pull/218/head' of https://github.com/apple/swift-collections +67fdff5a25539a51ce2a8bf574a7e4a6b72ebfb8 not-for-merge 'refs/pull/219/head' of https://github.com/apple/swift-collections +fbdf73e1b787a0ac113e930dff73382f612698d4 not-for-merge 'refs/pull/22/head' of https://github.com/apple/swift-collections +d3987c79a1214e279a49a09304c13322560c8a1b not-for-merge 'refs/pull/220/head' of https://github.com/apple/swift-collections +5783b82d72e620f37545924d46bdbfb429f03cbb not-for-merge 'refs/pull/221/head' of https://github.com/apple/swift-collections +2df7f6d3a8fe5f9bb12b5034da2e095424694d44 not-for-merge 'refs/pull/222/head' of https://github.com/apple/swift-collections +72e2df59e3ea600f4d5e67a324bd6df1a7acbd41 not-for-merge 'refs/pull/223/head' of https://github.com/apple/swift-collections +98d62d236bef8c30af5b7015ccbb7db66f43399e not-for-merge 'refs/pull/224/head' of https://github.com/apple/swift-collections +ba7e3927e76ff55b0579770fb036ffce6ea07b3c not-for-merge 'refs/pull/225/head' of https://github.com/apple/swift-collections +207029a613dca008e708370c09fc69010cf6a11d not-for-merge 'refs/pull/226/head' of https://github.com/apple/swift-collections +68bc6567be4c1ae96cfea1217b9e5cee63421c6a not-for-merge 'refs/pull/227/head' of https://github.com/apple/swift-collections +1c147e3b06edbe0b00217e38e94d2d3bc4b4c6a7 not-for-merge 'refs/pull/228/head' of https://github.com/apple/swift-collections +5aa603edfe8c13e0256141cb45f70ec427fe94c1 not-for-merge 'refs/pull/23/head' of https://github.com/apple/swift-collections +d19fb14c46266a20cba9c5362923c6a076e74407 not-for-merge 'refs/pull/230/head' of https://github.com/apple/swift-collections +a32048d44ee028b915565c3093ec5305e41aa6f1 not-for-merge 'refs/pull/231/head' of https://github.com/apple/swift-collections +4448454fbc79b8052acc6b6e7eb6c75c70d1ee2f not-for-merge 'refs/pull/232/head' of https://github.com/apple/swift-collections +14e86daeebe18bd32466a1f2bd2d8da936aa6508 not-for-merge 'refs/pull/233/head' of https://github.com/apple/swift-collections +581490a7351be07e465100628ded472aaa137a99 not-for-merge 'refs/pull/234/head' of https://github.com/apple/swift-collections +ff2d526c1baa53df478db47156bbdd68fcaed4df not-for-merge 'refs/pull/235/head' of https://github.com/apple/swift-collections +98d519ec12ec6bc209ad61fed2e7e2101e312566 not-for-merge 'refs/pull/237/head' of https://github.com/apple/swift-collections +339f1677450d7a8f43518d61cfd93be85fa080c3 not-for-merge 'refs/pull/238/head' of https://github.com/apple/swift-collections +ff85ea9e4f1cf6fd50fb758cde3dedf01a742f52 not-for-merge 'refs/pull/240/head' of https://github.com/apple/swift-collections +18c4f6dc5a771cd3f90ef3e7ae02a99e09e89115 not-for-merge 'refs/pull/241/head' of https://github.com/apple/swift-collections +3d66da5f5baa3585aa4b5fe8f9d9eaaee5e5a6ef not-for-merge 'refs/pull/242/head' of https://github.com/apple/swift-collections +2c33149e4e2cb9a5b2616cdbad9eabb5f51f0e0c not-for-merge 'refs/pull/243/head' of https://github.com/apple/swift-collections +a2f4b18ae02cd14a8488c357c75fef3f2c2a9013 not-for-merge 'refs/pull/244/head' of https://github.com/apple/swift-collections +69768b6eacd442681bc8424cc76516e7e24fdacc not-for-merge 'refs/pull/245/head' of https://github.com/apple/swift-collections +f8252436e5e4384eaa1a68560db380d83b7c71eb not-for-merge 'refs/pull/246/head' of https://github.com/apple/swift-collections +07032a92671dea282cbc935383dd3d5a0a598682 not-for-merge 'refs/pull/246/merge' of https://github.com/apple/swift-collections +b8ed4950368d4d54cefd2b8bfe14c329e057172c not-for-merge 'refs/pull/247/head' of https://github.com/apple/swift-collections +10a01bd9fb383668a987ec8f512da627dbe55f9e not-for-merge 'refs/pull/248/head' of https://github.com/apple/swift-collections +470bf29d014757caae7222f3a41aea0b86b6ee1c not-for-merge 'refs/pull/249/head' of https://github.com/apple/swift-collections +b43076ca7b46b8216590766fd446ae538ab91c5a not-for-merge 'refs/pull/25/head' of https://github.com/apple/swift-collections +c0853ebef8dad7eddb6a44b76dac0f42f699b96a not-for-merge 'refs/pull/251/head' of https://github.com/apple/swift-collections +089666b32ba82c06a166e072ebcdf988108b66b7 not-for-merge 'refs/pull/252/head' of https://github.com/apple/swift-collections +fef38395004569688a967b88c70d8774c63f5fc5 not-for-merge 'refs/pull/254/head' of https://github.com/apple/swift-collections +972578a44da6463eb8f88552cc7d30cf0b6de9a4 not-for-merge 'refs/pull/259/head' of https://github.com/apple/swift-collections +0c2071ecda7a50dcdc8ec435a45b3b830b3e5bcf not-for-merge 'refs/pull/259/merge' of https://github.com/apple/swift-collections +4e2f86b6cd24a124d69bf9257d2ffa751d11da8f not-for-merge 'refs/pull/26/head' of https://github.com/apple/swift-collections +580beb4c121a85f60aaf6f10403e7f457c81ccb9 not-for-merge 'refs/pull/260/head' of https://github.com/apple/swift-collections +5b4e4e032fc56ca77b888ca36b7a342e9932e5fa not-for-merge 'refs/pull/260/merge' of https://github.com/apple/swift-collections +3e6df33472d54ed83dffe3bca7a3c8f65bab4c43 not-for-merge 'refs/pull/263/head' of https://github.com/apple/swift-collections +fcd6800b9d1171fbe0a00f51a72afac32b0a1987 not-for-merge 'refs/pull/264/head' of https://github.com/apple/swift-collections +5dc7a8970eabcf6aaa49529b5ef6401f5128637e not-for-merge 'refs/pull/265/head' of https://github.com/apple/swift-collections +1666222de2200b2a614a0d5184751b8b6f7309b0 not-for-merge 'refs/pull/266/head' of https://github.com/apple/swift-collections +e6ecdac581c3f03f442111b87655702e0664df67 not-for-merge 'refs/pull/267/head' of https://github.com/apple/swift-collections +26de4aa094c87a9efd793f3ec37ec7facea24184 not-for-merge 'refs/pull/268/head' of https://github.com/apple/swift-collections +73936bba69bd49e025aa8113fa81caa7f76ed571 not-for-merge 'refs/pull/269/head' of https://github.com/apple/swift-collections +454c84b5e4253e462dac5472b853ee222ca93368 not-for-merge 'refs/pull/270/head' of https://github.com/apple/swift-collections +9c3328e235e5f17c06328f021a5d11e7221690f5 not-for-merge 'refs/pull/271/head' of https://github.com/apple/swift-collections +96d71628887275fc3010a0979cdebef15edde911 not-for-merge 'refs/pull/272/head' of https://github.com/apple/swift-collections +4b6978bf8b220c9c7d03d1f8124d537fbbddc32a not-for-merge 'refs/pull/273/head' of https://github.com/apple/swift-collections +7f63914a7161923e9af6889ed0f954de1ed4c7f0 not-for-merge 'refs/pull/275/head' of https://github.com/apple/swift-collections +ac0c075ccc0fe2754a41dd777bb39507e73efe5b not-for-merge 'refs/pull/276/head' of https://github.com/apple/swift-collections +a8dad62bc9c76f1f455a372c91759e7bb1e92e63 not-for-merge 'refs/pull/277/head' of https://github.com/apple/swift-collections +99adbe97af48017fb51d884936f6bb87c27166c2 not-for-merge 'refs/pull/278/head' of https://github.com/apple/swift-collections +b0fe7ca8bad02599faa6a308b561f71d4d5e3b4b not-for-merge 'refs/pull/279/head' of https://github.com/apple/swift-collections +dce7b156e7276d44c3641f05bf675d90fea16523 not-for-merge 'refs/pull/280/head' of https://github.com/apple/swift-collections +c4ad48826105dd299f45473784d22bf395b56863 not-for-merge 'refs/pull/281/head' of https://github.com/apple/swift-collections +1f204555aa1678c0aa01cfba5836920acb8c5537 not-for-merge 'refs/pull/282/head' of https://github.com/apple/swift-collections +992e0f3446b4f608f5ead9dd6edc92f6bbc0b0a0 not-for-merge 'refs/pull/283/head' of https://github.com/apple/swift-collections +3f4d8f9912c9c3f5bacef6e6543b3f5b93168f65 not-for-merge 'refs/pull/284/head' of https://github.com/apple/swift-collections +9befd06185369d287deee36f3d0de65f41edabb1 not-for-merge 'refs/pull/285/head' of https://github.com/apple/swift-collections +0c002200bbee27acc8a663075da69120f666b4e5 not-for-merge 'refs/pull/286/head' of https://github.com/apple/swift-collections +de0f59418503fc0c4866395751d930be3abbf17c not-for-merge 'refs/pull/287/head' of https://github.com/apple/swift-collections +a5fda7c368e06561fba87dd33c47443e879dd6da not-for-merge 'refs/pull/288/head' of https://github.com/apple/swift-collections +989bd7f2db6d9e7aa91881389359e369d621e3d9 not-for-merge 'refs/pull/29/head' of https://github.com/apple/swift-collections +03c9ef743ad9de4eea816225afa2fc52490339cc not-for-merge 'refs/pull/290/head' of https://github.com/apple/swift-collections +03e7f0c401e771f4a4c529eae4d3fde91f5bd355 not-for-merge 'refs/pull/291/head' of https://github.com/apple/swift-collections +9c88dce30d213e1844ce60476e7d3eba2b1f1e60 not-for-merge 'refs/pull/292/head' of https://github.com/apple/swift-collections +671cff0b3e579cbdad3a0818031063588d866ad2 not-for-merge 'refs/pull/296/head' of https://github.com/apple/swift-collections +b3d089e37d0d4adc07bdbf1ecd14e9be3786bf25 not-for-merge 'refs/pull/297/head' of https://github.com/apple/swift-collections +2f6606401781d32f3ffe3e245f2ba946acefe97e not-for-merge 'refs/pull/298/head' of https://github.com/apple/swift-collections +8fbc1d318cf4c48931ffc6d204123284087fad0c not-for-merge 'refs/pull/299/head' of https://github.com/apple/swift-collections +cf2cbd6ce39cbbdf7c60b76a8dca8e38b80486fc not-for-merge 'refs/pull/300/head' of https://github.com/apple/swift-collections +09c09f0f734c006186df57595dc823159e0d49ef not-for-merge 'refs/pull/302/head' of https://github.com/apple/swift-collections +a58628449c5e398433472b1bfd7e67e0acbe09fc not-for-merge 'refs/pull/303/head' of https://github.com/apple/swift-collections +a82138e714dcd28ef5b7bacc4b708acc118e87ac not-for-merge 'refs/pull/304/head' of https://github.com/apple/swift-collections +f15c276542595cb0f55368f8abf9f277e8eb51c9 not-for-merge 'refs/pull/304/merge' of https://github.com/apple/swift-collections +1cf3b88cb3d237183cacd6482e4adaec48b17bb5 not-for-merge 'refs/pull/307/head' of https://github.com/apple/swift-collections +ccd11e55dd4991055b260bb39d7e20ceb09046e9 not-for-merge 'refs/pull/31/head' of https://github.com/apple/swift-collections +9efa05c583441159bd505dfde340cf774d6144e0 not-for-merge 'refs/pull/314/head' of https://github.com/apple/swift-collections +bf742617f30870372ed235c6ccf4515ea0a204d3 not-for-merge 'refs/pull/315/head' of https://github.com/apple/swift-collections +b6e227b9d779fe7405dc410812cb3aba6d2b529a not-for-merge 'refs/pull/316/head' of https://github.com/apple/swift-collections +5c9ee680d20c4a758b0ffe06876fdca823f8068a not-for-merge 'refs/pull/316/merge' of https://github.com/apple/swift-collections +de2c8a90865dcdbd97defe3c2c7396a2400e455a not-for-merge 'refs/pull/318/head' of https://github.com/apple/swift-collections +bd1a62273592d5ad6ef388a70f53a61e33ffcba4 not-for-merge 'refs/pull/319/head' of https://github.com/apple/swift-collections +171edb86e347f70d85ac593c139d26d6b4d3bbea not-for-merge 'refs/pull/32/head' of https://github.com/apple/swift-collections +33f23b6a06f4a9f6b013fdef108cc1c82153afe4 not-for-merge 'refs/pull/320/head' of https://github.com/apple/swift-collections +b67553e0c27857bbc5310f40cd6e68daa2d585de not-for-merge 'refs/pull/321/head' of https://github.com/apple/swift-collections +b72a6cfd9384bc3ace8ea2412e79d5ec34c24934 not-for-merge 'refs/pull/322/head' of https://github.com/apple/swift-collections +90b67c44eae7277d57e79e3c25c5dc72939a3b93 not-for-merge 'refs/pull/323/head' of https://github.com/apple/swift-collections +19ec155f6089f6de453f8835aad46c09f5fd0b4d not-for-merge 'refs/pull/326/head' of https://github.com/apple/swift-collections +069dd4e5df442e813eb30e3216aafa1cc1696a5f not-for-merge 'refs/pull/327/head' of https://github.com/apple/swift-collections +53831b3a2264e24ca6c7ffcfe33c8653a72d51e1 not-for-merge 'refs/pull/328/head' of https://github.com/apple/swift-collections +0b7ebf49775a8e5177eeaea6513083363a20e08c not-for-merge 'refs/pull/330/head' of https://github.com/apple/swift-collections +3bd3d3ba28c6e72515e56b535b8a638144c12413 not-for-merge 'refs/pull/331/head' of https://github.com/apple/swift-collections +cd03e5b471755b00aa948f7de950932c2c5a5d79 not-for-merge 'refs/pull/332/head' of https://github.com/apple/swift-collections +e732790fde08a5e3d4f2347ac4a3e74399a5b457 not-for-merge 'refs/pull/333/head' of https://github.com/apple/swift-collections +d2662892cd218eec7b56e505e4a343e5c676f02c not-for-merge 'refs/pull/335/head' of https://github.com/apple/swift-collections +2bc657fad1def9519f88d851ef9e91bc01dc0e47 not-for-merge 'refs/pull/336/head' of https://github.com/apple/swift-collections +6e91291cb24b777f0db29a6d50a728a2183ab660 not-for-merge 'refs/pull/337/head' of https://github.com/apple/swift-collections +f9c400fb1c9bb8f2f76484b1a398135175d87a7f not-for-merge 'refs/pull/338/head' of https://github.com/apple/swift-collections +071a1011d1f02ac96f92164b0313c429a159ad80 not-for-merge 'refs/pull/339/head' of https://github.com/apple/swift-collections +85b00faba7071b5d7babb426bc06aa401ac8814d not-for-merge 'refs/pull/34/head' of https://github.com/apple/swift-collections +525bb545c4c1f7dfe3ca461136c072af11cb6e4f not-for-merge 'refs/pull/340/head' of https://github.com/apple/swift-collections +2122327782b71345cce48f23b688deebf582adc3 not-for-merge 'refs/pull/341/head' of https://github.com/apple/swift-collections +40e737cdaf9341d821cba518ee990406fdcfd7e3 not-for-merge 'refs/pull/342/head' of https://github.com/apple/swift-collections +8bfcaddd5fadea396620871451ca9ffc43b0985d not-for-merge 'refs/pull/343/head' of https://github.com/apple/swift-collections +9d4a1e5ad279e6bc1c4230f90208b0886608a387 not-for-merge 'refs/pull/346/head' of https://github.com/apple/swift-collections +cdcf9e606a12221e123a642353fbcfdc5d48bcf6 not-for-merge 'refs/pull/347/head' of https://github.com/apple/swift-collections +1a0ac8c06c5a27f330a55a61464eaebc840d89d1 not-for-merge 'refs/pull/348/head' of https://github.com/apple/swift-collections +258df0792818d6c331ccee923736ea234c24cf07 not-for-merge 'refs/pull/349/head' of https://github.com/apple/swift-collections +3c9df19f7da674295f58f07f6dffa5d9e114fbc8 not-for-merge 'refs/pull/351/head' of https://github.com/apple/swift-collections +c61e5e23c89b99d26aaaec6ec6c58bda1b502ebc not-for-merge 'refs/pull/352/head' of https://github.com/apple/swift-collections +8dd4e591b3789ea14e8bd8cfde3ed81aa6edfefe not-for-merge 'refs/pull/353/head' of https://github.com/apple/swift-collections +50f6307501712d87110f3f4d2e4959e84ace3bc8 not-for-merge 'refs/pull/354/head' of https://github.com/apple/swift-collections +8e64f064f562a918993b147a3872e92c157e8e01 not-for-merge 'refs/pull/355/head' of https://github.com/apple/swift-collections +ab744afc39dcd099948bfeb7fa4ac14f3f53dd36 not-for-merge 'refs/pull/356/head' of https://github.com/apple/swift-collections +75395832459d3e7a05ec51ca2ea081fe99be5e8e not-for-merge 'refs/pull/357/head' of https://github.com/apple/swift-collections +e004cd36fa3900c67d97f9944320a213e0d62c42 not-for-merge 'refs/pull/358/head' of https://github.com/apple/swift-collections +f6380bb6608eb7d43c199b3d0ab2f932d300a338 not-for-merge 'refs/pull/36/head' of https://github.com/apple/swift-collections +e424b487611d755ee5fe94271dd69677cc7688f0 not-for-merge 'refs/pull/360/head' of https://github.com/apple/swift-collections +a45e90653a50d7cd8813775cbf3d4ae546db1479 not-for-merge 'refs/pull/361/head' of https://github.com/apple/swift-collections +1e132acbb4f4aceea67ac8cdd5a4afdb1053e13d not-for-merge 'refs/pull/362/head' of https://github.com/apple/swift-collections +09566acb3a06bcb80147555395ae564402a4013f not-for-merge 'refs/pull/367/head' of https://github.com/apple/swift-collections +7425af3a9e29913aeb7cae881f9583f204ca5310 not-for-merge 'refs/pull/368/head' of https://github.com/apple/swift-collections +e9112f40dd90d800c46adf88c7ad58653276bb5b not-for-merge 'refs/pull/370/head' of https://github.com/apple/swift-collections +f46333d4a7c3a3f408131e268589203a68b84a09 not-for-merge 'refs/pull/371/head' of https://github.com/apple/swift-collections +37feda1bb815269044e98991edf011dd713eda6a not-for-merge 'refs/pull/372/head' of https://github.com/apple/swift-collections +ba5154b934dde320698eb31623e6c61eb63675e8 not-for-merge 'refs/pull/373/head' of https://github.com/apple/swift-collections +e3954cdae4f9e97fbd7fd3ec1e80f01abbd6c06c not-for-merge 'refs/pull/375/head' of https://github.com/apple/swift-collections +89b3ca0146f7371dd1008b0f6dd1d1452840deb2 not-for-merge 'refs/pull/377/head' of https://github.com/apple/swift-collections +8d9e1e32484fa7fbbfe49df058fee41304c47213 not-for-merge 'refs/pull/378/head' of https://github.com/apple/swift-collections +5d891350f44eecd7767b85259b1fd3068afe3c16 not-for-merge 'refs/pull/379/head' of https://github.com/apple/swift-collections +d46a563351a5785e7ece59366fb80d1ffc21885c not-for-merge 'refs/pull/38/head' of https://github.com/apple/swift-collections +ead6314a1cb17c2ecce50c80876f1998dcff6286 not-for-merge 'refs/pull/381/head' of https://github.com/apple/swift-collections +35d5746117b42a556f81cff9fe016fdff8a6ddaa not-for-merge 'refs/pull/382/head' of https://github.com/apple/swift-collections +a0b839d7de3278c5003836ad27d8ab75b994cbf5 not-for-merge 'refs/pull/384/head' of https://github.com/apple/swift-collections +d10a328f79966ada76c0f5e1f13922363e1d7da9 not-for-merge 'refs/pull/385/head' of https://github.com/apple/swift-collections +21264913c5162a74f58ef8af8d675417b188b8b9 not-for-merge 'refs/pull/386/head' of https://github.com/apple/swift-collections +dbf90bd36bcfdd3659670e26259e1a1cf40b053a not-for-merge 'refs/pull/388/head' of https://github.com/apple/swift-collections +5c2623b1a8d01d670455c739d07d94ba4f731f72 not-for-merge 'refs/pull/389/head' of https://github.com/apple/swift-collections +7d18b37a95732fa58da3863efb4f8f142524abdb not-for-merge 'refs/pull/390/head' of https://github.com/apple/swift-collections +094bf7ff2c87c735eb7ef41e1eeaedb41c8c0625 not-for-merge 'refs/pull/391/head' of https://github.com/apple/swift-collections +16fcea238788bd5d298d96a199ffbbeea9f0845a not-for-merge 'refs/pull/392/head' of https://github.com/apple/swift-collections +b7ccc7206cefa77e0139cd01af053895a5021fce not-for-merge 'refs/pull/393/head' of https://github.com/apple/swift-collections +79e3fee891cf132262e66a192424cc5a5892c732 not-for-merge 'refs/pull/394/head' of https://github.com/apple/swift-collections +7afbd7686e3ed22f4fff4f12721e944fb94c3476 not-for-merge 'refs/pull/394/merge' of https://github.com/apple/swift-collections +36d53620b57f2c90b897525049d50d327f174edf not-for-merge 'refs/pull/395/head' of https://github.com/apple/swift-collections +ce574378f856d15eec794157225005947534a6ca not-for-merge 'refs/pull/396/head' of https://github.com/apple/swift-collections +99b025049e3fd4f1a791349716d7e3a6e6742ea7 not-for-merge 'refs/pull/397/head' of https://github.com/apple/swift-collections +09f9340dcec6744e7238c0d966cad57e302a7419 not-for-merge 'refs/pull/398/head' of https://github.com/apple/swift-collections +f049c7ae66996b3be81be9688aecc313fb62d2bd not-for-merge 'refs/pull/399/head' of https://github.com/apple/swift-collections +3595ca05808ce018fb0fe6ca985a94d162cee300 not-for-merge 'refs/pull/4/head' of https://github.com/apple/swift-collections +ec1893ac2372b7f596f4bdcff9b3fdbf1017dddc not-for-merge 'refs/pull/40/head' of https://github.com/apple/swift-collections +105afd86fbc2a40752f4d522f7168c4f5c68f551 not-for-merge 'refs/pull/400/head' of https://github.com/apple/swift-collections +3dd72d1c289e56fac76e5a5416c397da4946e98d not-for-merge 'refs/pull/401/head' of https://github.com/apple/swift-collections +edb00bd980448f956a07b3d513f27fca32a1bb08 not-for-merge 'refs/pull/402/head' of https://github.com/apple/swift-collections +cf241c3b6c32196768d825f961fc9b00e7e6b53f not-for-merge 'refs/pull/402/merge' of https://github.com/apple/swift-collections +6b8276e2521d63ae1adc2cfd41d9e5a03e099ebe not-for-merge 'refs/pull/403/head' of https://github.com/apple/swift-collections +6f4d9d856088be4b13c96717e45e94f902bb3fbd not-for-merge 'refs/pull/404/head' of https://github.com/apple/swift-collections +5e1fe6e8f04e609273ee4fafe2fb77922ac2012f not-for-merge 'refs/pull/405/head' of https://github.com/apple/swift-collections +93efdb9e4e967a0ad0cb735721b0a67447cd12b2 not-for-merge 'refs/pull/406/head' of https://github.com/apple/swift-collections +effb33569a926c12dc8e7bae979ac2075c219189 not-for-merge 'refs/pull/408/head' of https://github.com/apple/swift-collections +e14970493019b12d03046f2fdd01b76fd4f9fa3c not-for-merge 'refs/pull/409/head' of https://github.com/apple/swift-collections +897b7c1a387e7afc2c95b4022c3b303137631c62 not-for-merge 'refs/pull/41/head' of https://github.com/apple/swift-collections +5dd817c33df1a62776320437413ad7afbeaab414 not-for-merge 'refs/pull/410/head' of https://github.com/apple/swift-collections +75aa5b075534ab11b77bc694f4c6d7cc29eab26f not-for-merge 'refs/pull/411/head' of https://github.com/apple/swift-collections +0f138be4021524c1b9b8fa2dcd343876695b8101 not-for-merge 'refs/pull/414/head' of https://github.com/apple/swift-collections +ca0c7a28b9b94243cac476dc4275db29f5d0be46 not-for-merge 'refs/pull/415/head' of https://github.com/apple/swift-collections +0030b455f42d9a8588cb9791fdf9e62a4d0e401c not-for-merge 'refs/pull/417/head' of https://github.com/apple/swift-collections +0030b455f42d9a8588cb9791fdf9e62a4d0e401c not-for-merge 'refs/pull/418/head' of https://github.com/apple/swift-collections +7f49fa5164ce43bd1bfcdfe2b43b56cdf6845bd6 not-for-merge 'refs/pull/419/head' of https://github.com/apple/swift-collections +ea4ab58dbc0a886c8a50752068de817ba1e49e81 not-for-merge 'refs/pull/42/head' of https://github.com/apple/swift-collections +fec5a5a6302e3bd30b71cbb8a22706d417eb5e72 not-for-merge 'refs/pull/421/head' of https://github.com/apple/swift-collections +a49afbe1be5e5d26f74b32d77057bf01ecee83bf not-for-merge 'refs/pull/422/head' of https://github.com/apple/swift-collections +ccff1fbf71b315e0eee2ba2b46b82dda44fac55d not-for-merge 'refs/pull/423/head' of https://github.com/apple/swift-collections +3f6522fef12acbebec4e425fec2a0d63a4bbac60 not-for-merge 'refs/pull/424/head' of https://github.com/apple/swift-collections +b33922ed298ce150cd04d0ee330d0c85b3cee104 not-for-merge 'refs/pull/426/head' of https://github.com/apple/swift-collections +84087c786e25744e47affbaae0b44415a973bdc9 not-for-merge 'refs/pull/427/head' of https://github.com/apple/swift-collections +ebe01ea88769ec788cdcd91bdd9d24ae5ceb4f55 not-for-merge 'refs/pull/43/head' of https://github.com/apple/swift-collections +2709b9694779797954b7bebb18764c2a85876e7e not-for-merge 'refs/pull/433/head' of https://github.com/apple/swift-collections +98d345bd66496d36a1d62506d405e6d7b07e8cde not-for-merge 'refs/pull/436/head' of https://github.com/apple/swift-collections +2d4df7d85dea6c6e81edb7a51de92c413318b6c9 not-for-merge 'refs/pull/438/head' of https://github.com/apple/swift-collections +8d73c7cced4d9a8403e2353f02359844bd33b5b9 not-for-merge 'refs/pull/438/merge' of https://github.com/apple/swift-collections +117c81053b70de031bac51b53288c001662c9305 not-for-merge 'refs/pull/44/head' of https://github.com/apple/swift-collections +4450b7c62274bc08f21b94269e0316e2799afe90 not-for-merge 'refs/pull/445/head' of https://github.com/apple/swift-collections +99db3179fcfab1add1a2418ed5f5392f25156aa0 not-for-merge 'refs/pull/446/head' of https://github.com/apple/swift-collections +40adeb7fd7e86a3d84779a2c43c2211ae805b804 not-for-merge 'refs/pull/447/head' of https://github.com/apple/swift-collections +1cb3ca50a63e8eac9dc503b3fba69ef56a99bce2 not-for-merge 'refs/pull/449/head' of https://github.com/apple/swift-collections +0f73f0ace74ea44f39ab10f23a3d2c03afd54a8f not-for-merge 'refs/pull/450/head' of https://github.com/apple/swift-collections +7ae9880f0fb622992a8a5328fd4af78af5b6b26f not-for-merge 'refs/pull/451/head' of https://github.com/apple/swift-collections +c5ac12e2bc1ad8df1df0ee9d1236ab6366a2c32d not-for-merge 'refs/pull/452/head' of https://github.com/apple/swift-collections +cfbebf4c80d0bc18609e7d603366f384dbdc8ef3 not-for-merge 'refs/pull/453/head' of https://github.com/apple/swift-collections +dbc2866bb5f564d3be3fa5efdda769f2946ee968 not-for-merge 'refs/pull/454/head' of https://github.com/apple/swift-collections +225159599d37106d63795d2df1bcbe0ccf7b3479 not-for-merge 'refs/pull/455/head' of https://github.com/apple/swift-collections +25509c0b883738629b6a13c013b6274538112fbe not-for-merge 'refs/pull/456/head' of https://github.com/apple/swift-collections +c42b4d1ebc5d198401f3efbcda36874b987e29d4 not-for-merge 'refs/pull/457/head' of https://github.com/apple/swift-collections +fd9ee69e0ba4e389a5ecdd85822a0932b0496e3c not-for-merge 'refs/pull/458/head' of https://github.com/apple/swift-collections +769bc7b07c3b986d928540d74d53bdd3d73f4374 not-for-merge 'refs/pull/459/head' of https://github.com/apple/swift-collections +ca939f84e132eb64a44db49c8092c8ec261b3092 not-for-merge 'refs/pull/46/head' of https://github.com/apple/swift-collections +75837a77174c0dd3243a599fae8c1675c64860d1 not-for-merge 'refs/pull/460/head' of https://github.com/apple/swift-collections +3fffe2ad2062eabe93dddb4d2e37bffe9bf278dc not-for-merge 'refs/pull/461/head' of https://github.com/apple/swift-collections +fea1d24e7be3284646858ef7bc9950f685adaa61 not-for-merge 'refs/pull/462/head' of https://github.com/apple/swift-collections +b765db28be0063341ef9048a8c4f6efb8b0e4cbd not-for-merge 'refs/pull/463/head' of https://github.com/apple/swift-collections +6385ebbe4d5fd7235dca833a4b041b14f06d46cf not-for-merge 'refs/pull/464/head' of https://github.com/apple/swift-collections +7ec497fb53a8d0a680576f1e0b0781fb71c99429 not-for-merge 'refs/pull/47/head' of https://github.com/apple/swift-collections +a7fec81fc4c4af5e49d2ce19f3b39ef51202fd22 not-for-merge 'refs/pull/470/head' of https://github.com/apple/swift-collections +117a1aad2d8194b8632bb46483573bb0b7aa50f1 not-for-merge 'refs/pull/471/head' of https://github.com/apple/swift-collections +0bd8dec08b8bb484f4a39e8d241a40c8e0c8a051 not-for-merge 'refs/pull/472/head' of https://github.com/apple/swift-collections +d5f3b81e690242c750deb4ede721539250297bd6 not-for-merge 'refs/pull/473/head' of https://github.com/apple/swift-collections +c25a388c1375c634d42a6f5608a863a4b6aace2c not-for-merge 'refs/pull/474/head' of https://github.com/apple/swift-collections +a09d7cdf458769f6f9586a2782b03d624d710428 not-for-merge 'refs/pull/475/head' of https://github.com/apple/swift-collections +e1be57c0f55f90d9489773dec69449bd86fce692 not-for-merge 'refs/pull/476/head' of https://github.com/apple/swift-collections +1812091001b264fc9b0db6a4b847ef9b330f5fd4 not-for-merge 'refs/pull/478/head' of https://github.com/apple/swift-collections +e337c2b936320f538fc8b9e8b66d51bff56646e4 not-for-merge 'refs/pull/479/head' of https://github.com/apple/swift-collections +137bd464c14792cadc721d90afd412c2e7735424 not-for-merge 'refs/pull/48/head' of https://github.com/apple/swift-collections +6819c6d1491caf6819649a0635d35956700cd165 not-for-merge 'refs/pull/480/head' of https://github.com/apple/swift-collections +c50c57f52eaae3f241dd3a4338d05f199d0bd94d not-for-merge 'refs/pull/481/head' of https://github.com/apple/swift-collections +83457e19c8b17548bf30f43bdfe7563cc6621633 not-for-merge 'refs/pull/482/head' of https://github.com/apple/swift-collections +d5568ee899f3b9487cf752cb28027910f84aad46 not-for-merge 'refs/pull/483/head' of https://github.com/apple/swift-collections +65f99e3eff346e5033d9ac9310021a4ff55a9a64 not-for-merge 'refs/pull/485/head' of https://github.com/apple/swift-collections +fc411858ee8c2d1ca4113555c185752f5d8212f5 not-for-merge 'refs/pull/486/head' of https://github.com/apple/swift-collections +05ad8633a8d6e407bd9dfce36da47b3fe36b3da2 not-for-merge 'refs/pull/487/head' of https://github.com/apple/swift-collections +a1f8f33a5b5ae60c6bdad045176e3fc96427a0a5 not-for-merge 'refs/pull/488/head' of https://github.com/apple/swift-collections +3fe754c0804d97b446a8ca70b3e4aa8d9c17c831 not-for-merge 'refs/pull/49/head' of https://github.com/apple/swift-collections +2d5ed365ff0a9d7c7bf9a84e8ac0692b80caed92 not-for-merge 'refs/pull/490/head' of https://github.com/apple/swift-collections +9f68408a70172d6c4ce3ba4e3a7528f489629e43 not-for-merge 'refs/pull/491/head' of https://github.com/apple/swift-collections +2fe5c4a31d9e599dfb55d21a02b8f9b74c5b3165 not-for-merge 'refs/pull/492/head' of https://github.com/apple/swift-collections +1f8dcd4726717a4b724e5408ca24829bdef67a49 not-for-merge 'refs/pull/493/head' of https://github.com/apple/swift-collections +c883a1729ac36de8cfc30729dd9650a98ce5c5a3 not-for-merge 'refs/pull/494/head' of https://github.com/apple/swift-collections +f44eabc30ee11beb77577f4c059bc6cf1643885b not-for-merge 'refs/pull/495/head' of https://github.com/apple/swift-collections +ab46d6415275a4f1c66923aad5d9759394b9999f not-for-merge 'refs/pull/496/head' of https://github.com/apple/swift-collections +31183bf059d3d1698d2b5e10a17bfb892a57876b not-for-merge 'refs/pull/497/head' of https://github.com/apple/swift-collections +b33592ebce263de67a30234f5952833e58f519f8 not-for-merge 'refs/pull/498/head' of https://github.com/apple/swift-collections +efac873c1357fd397b246e601021930c2a1561b9 not-for-merge 'refs/pull/499/head' of https://github.com/apple/swift-collections +efac873c1357fd397b246e601021930c2a1561b9 not-for-merge 'refs/pull/500/head' of https://github.com/apple/swift-collections +f6256df2628c6dc9b8637a81c9ce3bd9354b4df5 not-for-merge 'refs/pull/501/head' of https://github.com/apple/swift-collections +a98fbaba8b4236b1f98a9a4ee8269f5beb054425 not-for-merge 'refs/pull/502/head' of https://github.com/apple/swift-collections +8db0c6eb7539e9e73dce1a74be02093f531c8c60 not-for-merge 'refs/pull/503/head' of https://github.com/apple/swift-collections +890f33b56a7c03f5d8c680b5b566b07669adf6fb not-for-merge 'refs/pull/504/head' of https://github.com/apple/swift-collections +16f8d5b6bf91315e87e3922d2acae52d38c6bfe1 not-for-merge 'refs/pull/505/head' of https://github.com/apple/swift-collections +4ea19dd03e4c9632ee09a94f32f18a12df02da9e not-for-merge 'refs/pull/506/head' of https://github.com/apple/swift-collections +21757b6add20f67be68cad7c3b36e3ef3ec6875a not-for-merge 'refs/pull/507/head' of https://github.com/apple/swift-collections +5cd51978a44752b0432329904e72fe3ffbe22523 not-for-merge 'refs/pull/508/head' of https://github.com/apple/swift-collections +5f92d48d0d590f68340a9a6acdf0c7ae9638bb7e not-for-merge 'refs/pull/509/head' of https://github.com/apple/swift-collections +dff2b1783badd696c3135abd8e26c3b7ad2e67fd not-for-merge 'refs/pull/51/head' of https://github.com/apple/swift-collections +434d30dae30fbb57699370260c69c2108c1abf8f not-for-merge 'refs/pull/512/head' of https://github.com/apple/swift-collections +fb75c41e703f7ddaf22edfce3488c888cbb3136e not-for-merge 'refs/pull/512/merge' of https://github.com/apple/swift-collections +43367db377713ef76db6e16df128a96a7db5a805 not-for-merge 'refs/pull/513/head' of https://github.com/apple/swift-collections +50a9c6c655766bcbabac0453a5dce8cddd3e8cf7 not-for-merge 'refs/pull/514/head' of https://github.com/apple/swift-collections +101bac2d30cce81a24eb2b223aa64d928ca6598d not-for-merge 'refs/pull/515/head' of https://github.com/apple/swift-collections +6340fa0e9b818a19be3982951106ec6071075843 not-for-merge 'refs/pull/516/head' of https://github.com/apple/swift-collections +90934a152b26db2cacafaf26c0f85261815f2344 not-for-merge 'refs/pull/517/head' of https://github.com/apple/swift-collections +3fe1bb8561a92c45a56afb6dc3af95755cc2273c not-for-merge 'refs/pull/519/head' of https://github.com/apple/swift-collections +42e6045ca1307cdd5b13a69aef57336abb7ea486 not-for-merge 'refs/pull/519/merge' of https://github.com/apple/swift-collections +5e6b95649be69c3e9d6c326f2a7c2ba88c25f460 not-for-merge 'refs/pull/52/head' of https://github.com/apple/swift-collections +377d2a55a8b9506d56d4eedefe26565240b208f0 not-for-merge 'refs/pull/520/head' of https://github.com/apple/swift-collections +4cc6cad50849690b2c551f306265509d7168730b not-for-merge 'refs/pull/521/head' of https://github.com/apple/swift-collections +b88e7d0b00bcd6721cc0b11ac2b948a32a9c444d not-for-merge 'refs/pull/522/head' of https://github.com/apple/swift-collections +f4d851a739f6f1cfd0364b1c1ceb9aadd1b07f2f not-for-merge 'refs/pull/523/head' of https://github.com/apple/swift-collections +68eca941248011fdc278bd752f39fbd3f62e46c7 not-for-merge 'refs/pull/524/head' of https://github.com/apple/swift-collections +ccb60599696d69e9744224367ca927e6ba3f74b3 not-for-merge 'refs/pull/525/head' of https://github.com/apple/swift-collections +bb8d56683375160bdcc35d0ca7dcf06bb875bece not-for-merge 'refs/pull/526/head' of https://github.com/apple/swift-collections +ab7ca1353732f13ba1b24f4b95efe3dc148a0a73 not-for-merge 'refs/pull/527/head' of https://github.com/apple/swift-collections +f9669dc4186220345d8a856550386492aae74e5c not-for-merge 'refs/pull/528/head' of https://github.com/apple/swift-collections +b0f915ac6981dc529e3aa27bfe13b93c067da83e not-for-merge 'refs/pull/529/head' of https://github.com/apple/swift-collections +cf2685d6213f8966f3e453d66aa51c5f993cb514 not-for-merge 'refs/pull/529/merge' of https://github.com/apple/swift-collections +4432aa8d79607328e6e96ae2a89f878ea58b27fe not-for-merge 'refs/pull/53/head' of https://github.com/apple/swift-collections +fa45e0e0cc63150df8ff27c49a8385f1f989d2fb not-for-merge 'refs/pull/530/head' of https://github.com/apple/swift-collections +a2a4bbd3dcd04b7ec7fc84258c1732298fb95d60 not-for-merge 'refs/pull/530/merge' of https://github.com/apple/swift-collections +ea71bf2ce9a4420dc5716b94c0e02032ef3b0486 not-for-merge 'refs/pull/531/head' of https://github.com/apple/swift-collections +347825dd43e9c7f3b346aff777ae4a0cffe93ea0 not-for-merge 'refs/pull/532/head' of https://github.com/apple/swift-collections +ab649ca5fc756ed6b3b290662fb273460c4a038b not-for-merge 'refs/pull/533/head' of https://github.com/apple/swift-collections +a7e40d20551cab8bdf753c9ea809f80443903290 not-for-merge 'refs/pull/534/head' of https://github.com/apple/swift-collections +55130cecb0b8eb39da9c281e9124168d1068079e not-for-merge 'refs/pull/535/head' of https://github.com/apple/swift-collections +e5e653088cb61fae41189623b208cb100624b0d8 not-for-merge 'refs/pull/535/merge' of https://github.com/apple/swift-collections +fa408c9e853e04971c32351bab2e2200c4e07349 not-for-merge 'refs/pull/536/head' of https://github.com/apple/swift-collections +f2b51f49978351bc6225aec3cb18a916b0c4245a not-for-merge 'refs/pull/536/merge' of https://github.com/apple/swift-collections +65d174cc77577c972ed34fa03efa8c982c72f0ac not-for-merge 'refs/pull/537/head' of https://github.com/apple/swift-collections +e2e2d0088182c22f26a007d3ea4fdb3497cc830a not-for-merge 'refs/pull/538/head' of https://github.com/apple/swift-collections +0cf0071c1db25a01454339aa1dac6f8c984f8244 not-for-merge 'refs/pull/538/merge' of https://github.com/apple/swift-collections +691855a60fca67d1176bbca0871ce9beb9170bbb not-for-merge 'refs/pull/539/head' of https://github.com/apple/swift-collections +788c17c16b5bc88466d1a0a96f0bf7eaef8b9352 not-for-merge 'refs/pull/54/head' of https://github.com/apple/swift-collections +8b3d2878dea8451badb5b66094e7b4d0e4d1c658 not-for-merge 'refs/pull/540/head' of https://github.com/apple/swift-collections +ddff9004d745c4b2d13e35ebdd1a3d0b67e14717 not-for-merge 'refs/pull/541/head' of https://github.com/apple/swift-collections +5e091e541bc88b91fc750bb908aab665a4f13334 not-for-merge 'refs/pull/541/merge' of https://github.com/apple/swift-collections +1d63cdd629a5fc9e2b15a25b667f804d872f9e47 not-for-merge 'refs/pull/542/head' of https://github.com/apple/swift-collections +a617f5e2b1e7bee60846a2033645f28015990d2b not-for-merge 'refs/pull/543/head' of https://github.com/apple/swift-collections +92baa3289dee72e28b5add8cfd88c3a909d68f17 not-for-merge 'refs/pull/545/head' of https://github.com/apple/swift-collections +cf642a237ea2c2c0e345fdb856e203d418aedc81 not-for-merge 'refs/pull/545/merge' of https://github.com/apple/swift-collections +347825dd43e9c7f3b346aff777ae4a0cffe93ea0 not-for-merge 'refs/pull/547/head' of https://github.com/apple/swift-collections +2b5cbd54cf8d59e4780dad338b31cf31c3ea4aa8 not-for-merge 'refs/pull/547/merge' of https://github.com/apple/swift-collections +68c32ed80b138d1f8a6ec5dcf1b105f32fcaaf12 not-for-merge 'refs/pull/548/head' of https://github.com/apple/swift-collections +c35ca292f71bd0c2d7eb37e1dbac9318fae5bb68 not-for-merge 'refs/pull/548/merge' of https://github.com/apple/swift-collections +ad176827391e97cc1a919f38f3f6af655184facb not-for-merge 'refs/pull/549/head' of https://github.com/apple/swift-collections +ff76bbdc775050687a8495f75122faa8fef37d84 not-for-merge 'refs/pull/55/head' of https://github.com/apple/swift-collections +353496019475df6047027998d1cf69505fef172f not-for-merge 'refs/pull/550/head' of https://github.com/apple/swift-collections +7f8a32c5a9c9b07f57ebef314a5a289c7eb51021 not-for-merge 'refs/pull/551/head' of https://github.com/apple/swift-collections +a0e7df98638abbdaa452dc08b929538bda94ae18 not-for-merge 'refs/pull/552/head' of https://github.com/apple/swift-collections +174b3135c3a20094b65edb2e2c4e3e1c13693d58 not-for-merge 'refs/pull/553/head' of https://github.com/apple/swift-collections +c5d5d97c43f38162bb49fef37149ea6c4a136c50 not-for-merge 'refs/pull/554/head' of https://github.com/apple/swift-collections +7c926083822b8eea2c51cf6c6f425b9101b5d2bf not-for-merge 'refs/pull/556/head' of https://github.com/apple/swift-collections +b36804e15608a070213059cf803cc353ef88263a not-for-merge 'refs/pull/556/merge' of https://github.com/apple/swift-collections +80b8a6fb80ebb1ce7f5e918027b77a99fc57759c not-for-merge 'refs/pull/557/head' of https://github.com/apple/swift-collections +6274c2a3b1ed55f5227f54b37c1437b74a060b3c not-for-merge 'refs/pull/558/head' of https://github.com/apple/swift-collections +81514112d770a2ceeddcbba2207204661f40c650 not-for-merge 'refs/pull/558/merge' of https://github.com/apple/swift-collections +fdaf3fe24c72ac54998e4d2361aaa5d9fedd12b5 not-for-merge 'refs/pull/560/head' of https://github.com/apple/swift-collections +59bb505b1a18e05342fd58d873a967b484f2f268 not-for-merge 'refs/pull/562/head' of https://github.com/apple/swift-collections +de54709ca9dffef94ee4f1b04f6a6483d620d1a3 not-for-merge 'refs/pull/563/head' of https://github.com/apple/swift-collections +d1efcb19db72befae31841116b43586350a60a72 not-for-merge 'refs/pull/565/head' of https://github.com/apple/swift-collections +b7d2cf8908b42f35b5a3929e18ab63d3a321a3a1 not-for-merge 'refs/pull/58/head' of https://github.com/apple/swift-collections +956ea437dfdfcc6b431315fe54a9388271f5b512 not-for-merge 'refs/pull/6/head' of https://github.com/apple/swift-collections +175e1eb6b3395e3808218e72910235658819bdc5 not-for-merge 'refs/pull/60/head' of https://github.com/apple/swift-collections +083102e1e2bad3bfc869f3072f134fc48a401550 not-for-merge 'refs/pull/61/head' of https://github.com/apple/swift-collections +0b963fe790c694a35c34b2b31caa84a681f74945 not-for-merge 'refs/pull/62/head' of https://github.com/apple/swift-collections +cfe64fa1f270ff99ae4c5bf36502656d5c77596f not-for-merge 'refs/pull/63/head' of https://github.com/apple/swift-collections +787c4fac1492d4d877127ccf086195b5051b5c01 not-for-merge 'refs/pull/64/head' of https://github.com/apple/swift-collections +478d3cc73fe173775883d35a2b0a073567da3b4b not-for-merge 'refs/pull/65/head' of https://github.com/apple/swift-collections +2a60245369a3e88485ed4f8c92ca5c378ce77c06 not-for-merge 'refs/pull/76/head' of https://github.com/apple/swift-collections +b70b6fec29949244914e7501725deb52370da0b0 not-for-merge 'refs/pull/77/head' of https://github.com/apple/swift-collections +303e1990d6317fc39c5c072483d18e4f0235db60 not-for-merge 'refs/pull/78/head' of https://github.com/apple/swift-collections +cfaab9a73140595755a5bcc138c45ad817dc4f44 not-for-merge 'refs/pull/79/head' of https://github.com/apple/swift-collections +8de85365808b3d984148d0adb5dc36125a71c36f not-for-merge 'refs/pull/8/head' of https://github.com/apple/swift-collections +976a8c276338a00a436f620f9cb8d3c0f74f6d81 not-for-merge 'refs/pull/80/head' of https://github.com/apple/swift-collections +1146f2644c44ff629c5dfc8f5588d6d4cc734a22 not-for-merge 'refs/pull/80/merge' of https://github.com/apple/swift-collections +07134a5bce472917a2fc2f2a19401861a688530b not-for-merge 'refs/pull/81/head' of https://github.com/apple/swift-collections +3d4aca47308287244f2dd7b9c2085dea63c27b60 not-for-merge 'refs/pull/82/head' of https://github.com/apple/swift-collections +140a1752fdfa9788db9e5b23ee32d8bdbed4c9f7 not-for-merge 'refs/pull/83/head' of https://github.com/apple/swift-collections +40ab3405b25719a490abea591d80b7ce27ab8803 not-for-merge 'refs/pull/84/head' of https://github.com/apple/swift-collections +52f77c4486ea96a3c5ed373932ee0220d5a7ebee not-for-merge 'refs/pull/85/head' of https://github.com/apple/swift-collections +029dd258a1d19cbcd8e22523b0811c7dcb6d450a not-for-merge 'refs/pull/86/head' of https://github.com/apple/swift-collections +8ef7b779cd17e95baeef138a612c48b063036aca not-for-merge 'refs/pull/87/head' of https://github.com/apple/swift-collections +ace0073826e3e2bdc1b08d78e6fe6f1efc700aab not-for-merge 'refs/pull/9/head' of https://github.com/apple/swift-collections +e78605942c7fb08c3e8812a166e85bcae2ddd15e not-for-merge 'refs/pull/91/head' of https://github.com/apple/swift-collections +7c68b05ed94391100c1933770cd18e95533bd53d not-for-merge 'refs/pull/92/head' of https://github.com/apple/swift-collections +d6774be62f7f857f0b30dae49a3a6f02b58e5679 not-for-merge 'refs/pull/93/head' of https://github.com/apple/swift-collections +6192ad1fc8795b647f8fb9eec20257ae2cb4716d not-for-merge 'refs/pull/95/head' of https://github.com/apple/swift-collections +dcdd7ebabbdcac6442e45db68f6e3d10b96f0c88 not-for-merge 'refs/pull/96/head' of https://github.com/apple/swift-collections +41bfaaae0af3809b808405df0fab4a5e02ddd206 not-for-merge 'refs/pull/97/head' of https://github.com/apple/swift-collections +462fb1d3fc318f4e1f81d6945b87f1dc32dd8079 not-for-merge 'refs/pull/98/head' of https://github.com/apple/swift-collections +c1c9541a3b91ec076076ad8e9a4e28a00b80cb6b not-for-merge 'refs/pull/99/head' of https://github.com/apple/swift-collections +bd924007a25488900d2e3f3437a0388a97636020 not-for-merge tag '0.0.1' of https://github.com/apple/swift-collections +2d719d75a2065f213e58a5164384a3d2fcf9b59a not-for-merge tag '0.0.2' of https://github.com/apple/swift-collections +d45e63421d3dff834949ac69d3c37691e994bd69 not-for-merge tag '0.0.3' of https://github.com/apple/swift-collections +3426dba9ee5c9f8e4981b0fc9d39a818d36eec28 not-for-merge tag '0.0.4' of https://github.com/apple/swift-collections +0959ba76a1d4a98fd11163aa83fd49c25b93bfae not-for-merge tag '0.0.5' of https://github.com/apple/swift-collections +9d8719c8bebdc79740b6969c912ac706eb721d7a not-for-merge tag '0.0.7' of https://github.com/apple/swift-collections +07e47b1e93e5a1e0ef0c50fcb2d6739fb6be4003 not-for-merge tag '1.0.0' of https://github.com/apple/swift-collections +2d33a0ea89c961dcb2b3da2157963d9c0370347e not-for-merge tag '1.0.1' of https://github.com/apple/swift-collections +48254824bb4248676bf7ce56014ff57b142b77eb not-for-merge tag '1.0.2' of https://github.com/apple/swift-collections +f504716c27d2e5d4144fa4794b12129301d17729 not-for-merge tag '1.0.3' of https://github.com/apple/swift-collections +937e904258d22af6e447a0b72c0bc67583ef64a2 not-for-merge tag '1.0.4' of https://github.com/apple/swift-collections +a902f1823a7ff3c9ab2fba0f992396b948eda307 not-for-merge tag '1.0.5' of https://github.com/apple/swift-collections +d029d9d39c87bed85b1c50adee7c41795261a192 not-for-merge tag '1.0.6' of https://github.com/apple/swift-collections +94cf62b3ba8d4bed62680a282d4c25f9c63c2efb not-for-merge tag '1.1.0' of https://github.com/apple/swift-collections +ee97538f5b81ae89698fd95938896dec5217b148 not-for-merge tag '1.1.1' of https://github.com/apple/swift-collections +3d2dc41a01f9e49d84f0a3925fb858bed64f702d not-for-merge tag '1.1.2' of https://github.com/apple/swift-collections +9bf03ff58ce34478e66aaee630e491823326fd06 not-for-merge tag '1.1.3' of https://github.com/apple/swift-collections +671108c96644956dddcd89dd59c203dcdb36cec7 not-for-merge tag '1.1.4' of https://github.com/apple/swift-collections +ad9f6723fd29591e6c0a19a9c4982cae51d65b1d not-for-merge tag '1.1.5' of https://github.com/apple/swift-collections +c11818f3cae0780656baa430b49e7f163f08dffd not-for-merge tag '1.1.6' of https://github.com/apple/swift-collections +c1805596154bb3a265fd91b8ac0c4433b4348fb0 not-for-merge tag '1.2.0' of https://github.com/apple/swift-collections +8c0c0a8b49e080e54e5e328cc552821ff07cd341 not-for-merge tag '1.2.1' of https://github.com/apple/swift-collections +7b847a3b7008b2dc2f47ca3110d8c782fb2e5c7e not-for-merge tag '1.3.0' of https://github.com/apple/swift-collections diff --git a/_spm/repositories/swift-collections-9a58d5cf/HEAD b/_spm/repositories/swift-collections-9a58d5cf/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/_spm/repositories/swift-collections-9a58d5cf/config b/_spm/repositories/swift-collections-9a58d5cf/config new file mode 100644 index 0000000..7275a2c --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = https://github.com/apple/swift-collections.git + fetch = +refs/*:refs/* + mirror = true diff --git a/_spm/repositories/swift-collections-9a58d5cf/description b/_spm/repositories/swift-collections-9a58d5cf/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/applypatch-msg.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/commit-msg.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/fsmonitor-watchman.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/post-update.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-applypatch.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-commit.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-commit.sample new file mode 100755 index 0000000..e144712 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-merge-commit.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-push.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-rebase.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-receive.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/prepare-commit-msg.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/_spm/repositories/swift-collections-9a58d5cf/hooks/push-to-checkout.sample b/_spm/repositories/swift-collections-9a58d5cf/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/_spm/repositories/swift-collections-9a58d5cf/info/exclude b/_spm/repositories/swift-collections-9a58d5cf/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-28447238b9290d4677b09a0fc96325a19294b5ba.idx b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-28447238b9290d4677b09a0fc96325a19294b5ba.idx new file mode 100644 index 0000000..5b84313 Binary files /dev/null and b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-28447238b9290d4677b09a0fc96325a19294b5ba.idx differ diff --git a/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-28447238b9290d4677b09a0fc96325a19294b5ba.pack b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-28447238b9290d4677b09a0fc96325a19294b5ba.pack new file mode 100644 index 0000000..c40250e Binary files /dev/null and b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-28447238b9290d4677b09a0fc96325a19294b5ba.pack differ diff --git a/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-c04e06fb0330f31e7d742acd5d97f3d070ca42f2.idx b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-c04e06fb0330f31e7d742acd5d97f3d070ca42f2.idx new file mode 100644 index 0000000..d3625aa Binary files /dev/null and b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-c04e06fb0330f31e7d742acd5d97f3d070ca42f2.idx differ diff --git a/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-c04e06fb0330f31e7d742acd5d97f3d070ca42f2.pack b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-c04e06fb0330f31e7d742acd5d97f3d070ca42f2.pack new file mode 100644 index 0000000..9f3acf7 Binary files /dev/null and b/_spm/repositories/swift-collections-9a58d5cf/objects/pack/pack-c04e06fb0330f31e7d742acd5d97f3d070ca42f2.pack differ diff --git a/_spm/repositories/swift-collections-9a58d5cf/packed-refs b/_spm/repositories/swift-collections-9a58d5cf/packed-refs new file mode 100644 index 0000000..b0dff96 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/packed-refs @@ -0,0 +1,466 @@ +# pack-refs with: peeled fully-peeled sorted +1f8dcd4726717a4b724e5408ca24829bdef67a49 refs/heads/action-xcode-versions +7ae9880f0fb622992a8a5328fd4af78af5b6b26f refs/heads/dn/remove-retain-release-during-find +ddff9004d745c4b2d13e35ebdd1a3d0b67e14717 refs/heads/doc-basic-span-index-mutation +ebd51171f0e45788e2cdb3cc6d54233e11d7443c refs/heads/future +39b83a1f44289d67e422b6030c498b8a2c6ff7ce refs/heads/main +68c32ed80b138d1f8a6ec5dcf1b105f32fcaaf12 refs/heads/maxd/run-wasm-tests +762bc5757de4bcf86cc3b3266e3df93f76469089 refs/heads/nate/zip_dispatch_benchmarking +d029d9d39c87bed85b1c50adee7c41795261a192 refs/heads/release/1.0 +c11818f3cae0780656baa430b49e7f163f08dffd refs/heads/release/1.1 +2d1f4172091ca272b461397748fd2c32847036dd refs/heads/release/1.2 +c55cbe540366c704c279298ca6ad4c09a067ebe0 refs/heads/release/1.3 +a26fc8e7e4c6e0d63b08951f5b7268044fb95c83 refs/heads/span-prototype +434d30dae30fbb57699370260c69c2108c1abf8f refs/heads/wasm-tests +c65cd649fb91f64636f2f1ef5da4991987139f68 refs/pull/10/head +6a9703c3f13061291eff1baf8af4fce1e6ce35af refs/pull/100/head +8303a77bc2915be76777d6fc17b702146b6fb192 refs/pull/102/head +6cd03922372c85e2dca476f665527976911e7397 refs/pull/105/head +96100d4b6ad61bbfbf549ee42dc73239325b353f refs/pull/106/head +f69104b5071ef9a44112e3c4fef8904b5e8b6d73 refs/pull/107/head +5f255a887e51093f058e7ee9ea0b959051be38d4 refs/pull/108/head +c46c77f7f85f9efe83cc5cb8d54b32c538b06450 refs/pull/109/head +cfca1038b53eecd4fc50da15cc715f966904012e refs/pull/11/head +103008aca495f3b80a50713086d451b08cef9f50 refs/pull/110/head +39a16a15cc8c7e11486015d2deb78468b4a64c85 refs/pull/111/head +7f57a0ed1c8b1d44eacab95d3cfd57d87482b25a refs/pull/112/head +efefae56531b30d75553f234134e3c83bd26c6a6 refs/pull/113/head +565b1ab20bef052f52fad4ebe112803facb325e3 refs/pull/114/head +8b3af12ece11ea7b0e748749c39a59c59269ca25 refs/pull/115/head +8be0f192e8f120969427cb2645aabe6f5fdf15a1 refs/pull/116/head +771bca404c0ee603bb6cc2ea3a19cfc4ebc3d001 refs/pull/117/head +95be379a3ac1e4278d114a22501267065062b39a refs/pull/118/head +f41f2cae69dc6ffcc178227a0a46607561fa925c refs/pull/119/head +276ddee5df4ea0f44c5edea0dbe726cb74682498 refs/pull/121/head +1c1e6206fa1a4b0a6bf97ac979f841c1d1821ad7 refs/pull/122/head +074b0ad21387e767b5b3ff1cb014a118a3b80bde refs/pull/123/head +ddc8b9c66d07cb0af38e98ca160f1f7cc85c88d3 refs/pull/126/head +9dde4b560323d43ec2ca8225a6c5c79a9bc0735d refs/pull/128/head +453adb695f615886cd7a897d62676713aeb25bf9 refs/pull/13/head +286fedb1e8f6b2567cd214cf1127a9322dea1400 refs/pull/130/head +e77d82c71271b7848e3ac9e007a52f36f04a1c7e refs/pull/132/head +1bde9674f42e41bfb62deb96d8b247a537171ba7 refs/pull/132/merge +cee04e96ed96fefa5527e33a4a055482e4ea14e9 refs/pull/14/head +50e6a1ac71df96e5cd257c565e9a3299f491ba3e refs/pull/140/head +29120ea6406a856c36496b4f5d3b13ca381436a6 refs/pull/141/head +867231031ac792328eff9133a289ce9e693a03c3 refs/pull/15/head +6cb037037d45f78622fd7cab3f62e3c6a4ff5ddb refs/pull/153/head +7016a13f0e8d0d0a36f3566a6dc6acaf5b83fbf4 refs/pull/155/head +00a99aa77c4982a6e7343982220e44b15e4d5974 refs/pull/156/head +74a800ac534877875d5d1187ac04f35b31a0b98c refs/pull/159/head +b9d73a5bab8d71e121687f79ed4aabfbd73d016b refs/pull/16/head +ddb6d141b3e4e8726a15e3e9e916ee697bd310db refs/pull/160/head +3437abecc49cfbbb91893e3a0d0f124db163637f refs/pull/161/head +1071b372942289dbd3209ede40f613d339cca8e1 refs/pull/162/head +b9d91f4a9aa3cfd6c8589aee997c4399e6d7d83d refs/pull/163/head +ee1b2de06edf18545084d99a5c99995e9c1ff8d4 refs/pull/165/head +b379fa7aee604738bd0b4076984c934e242bb7a5 refs/pull/168/head +71aa4a39ae59addf40e9dd40e79a4968f1c857cc refs/pull/169/head +feca3b6f4c7bf7adf9fa4a0fd200f96cf1b5a4b5 refs/pull/170/head +9a9d7d87d844b2a14ec602792d9ae216ea57ea53 refs/pull/172/head +8cc0b1d43975a9d547053cf0e943498c0d6d7992 refs/pull/173/head +aa428d0489be5888c72de4a4327f0f316a586632 refs/pull/174/head +14f90620c89e311a067a1fa49813d8bbcd539950 refs/pull/175/head +77edbef16d24e657fc3d7b0bc9adb57e6b0567d9 refs/pull/176/head +9d9659a079644d300d3571fb64ac7bb14322e506 refs/pull/177/head +9f38e7424baa3497e4d481790fc6ec2950725de8 refs/pull/178/head +d45f264ef0dc625a37801ee6e05b764ccbef30b4 refs/pull/179/head +58579394fc929c1b89b762c3ef68a1657442ca7d refs/pull/18/head +39fc818e0efaa148e038e3d89cd78be64567849a refs/pull/180/head +4c4154ca2350d981cd6abeadbdcad18071fe3b95 refs/pull/181/head +59858a77210f506e622a68e5b92e36bae6fc9215 refs/pull/182/head +ba303dca1d72860f0b253778f193010af20f9b79 refs/pull/184/head +778b8ae977c420dfe323b27ed3a1cf3f747f936b refs/pull/185/head +0f92943ba349d0337d254789bc49e9a5c45ff74e refs/pull/187/head +f71ebd9494b3b0b8c1450017f8c30fb61e4dcc37 refs/pull/188/head +66651795d89e760188908bb65b3398aa30b84897 refs/pull/189/head +832e58027cdb86e618089ebdf2e3474da915c357 refs/pull/190/head +9b7c6ecb10599568876b1108005b189de54d9ce9 refs/pull/191/head +4604c1bc381c4d164a030d11830701b2897a0002 refs/pull/192/head +0b86bb11d24e187ab6ab930f582f75ae00bcabf9 refs/pull/193/head +c7c0a094f91bd5cce90b1dc1f3feeb9d2508e7f5 refs/pull/194/head +1b71d2cd942459049b870264b7db649ba7509046 refs/pull/195/head +7cec5d1ed71d0c29fc7515725401c8a711a01074 refs/pull/196/head +b83d06b43337cc2855c1b55ba1cdba854724110b refs/pull/197/head +6286cd0b99741db984e5c1115a4c748bc42efec1 refs/pull/198/head +8b06c61c7e4ecb6777895a8fba275a44ec8c5e01 refs/pull/199/head +5aed92655d73228211985c933e0d5141d8203a09 refs/pull/200/head +51604cd196265a1e4444cef0a7ac749e34f5e64e refs/pull/201/head +2a81cb1186ac3483183df32ba8c3e2fe7360cbcb refs/pull/202/head +6dbc8b8c4f36ff470060464d69066e2e094a194f refs/pull/203/head +6b428b5a7fadfae0120db4fc96a3d5b14f7b7c36 refs/pull/204/head +b1506b62250f074d23cddc6d0318277dda5d21dc refs/pull/205/head +2e872739d3a6201e2b888c73f08ef54ae4125d6d refs/pull/206/head +4c842df1b8cfc9611762bdf5fbd9023ab2d3d333 refs/pull/207/head +1228e9c1628925843575a11c1de8342e402c7c30 refs/pull/208/head +b6184b667bd8f636558522f18cc2fe993a825679 refs/pull/21/head +fc8092d0441e0073831d6b170c74b6cca0da9bf5 refs/pull/210/head +cfc3d4a5179e61c36d77babd9fd3029a0f85cff4 refs/pull/211/head +02ea4e849230bc2326c83c5560822a228d83afab refs/pull/212/head +1490835b289653b145b91a16fe5522d928509efb refs/pull/213/head +2b4ec22949acbfa99f9e22c390d850a650f3d298 refs/pull/214/head +5e0a0149a4c9b2ab407f65b257b5b36bc589307d refs/pull/215/head +734730d72460e7bd536e8021d4aa711cb3aa75b2 refs/pull/216/head +381cf5d17e46f2d3266bd1be7295118647443313 refs/pull/217/head +3c6cb8cd56d04392bf9f79a2d5020fc2abf1958d refs/pull/218/head +67fdff5a25539a51ce2a8bf574a7e4a6b72ebfb8 refs/pull/219/head +fbdf73e1b787a0ac113e930dff73382f612698d4 refs/pull/22/head +d3987c79a1214e279a49a09304c13322560c8a1b refs/pull/220/head +5783b82d72e620f37545924d46bdbfb429f03cbb refs/pull/221/head +2df7f6d3a8fe5f9bb12b5034da2e095424694d44 refs/pull/222/head +72e2df59e3ea600f4d5e67a324bd6df1a7acbd41 refs/pull/223/head +98d62d236bef8c30af5b7015ccbb7db66f43399e refs/pull/224/head +ba7e3927e76ff55b0579770fb036ffce6ea07b3c refs/pull/225/head +207029a613dca008e708370c09fc69010cf6a11d refs/pull/226/head +68bc6567be4c1ae96cfea1217b9e5cee63421c6a refs/pull/227/head +1c147e3b06edbe0b00217e38e94d2d3bc4b4c6a7 refs/pull/228/head +5aa603edfe8c13e0256141cb45f70ec427fe94c1 refs/pull/23/head +d19fb14c46266a20cba9c5362923c6a076e74407 refs/pull/230/head +a32048d44ee028b915565c3093ec5305e41aa6f1 refs/pull/231/head +4448454fbc79b8052acc6b6e7eb6c75c70d1ee2f refs/pull/232/head +14e86daeebe18bd32466a1f2bd2d8da936aa6508 refs/pull/233/head +581490a7351be07e465100628ded472aaa137a99 refs/pull/234/head +ff2d526c1baa53df478db47156bbdd68fcaed4df refs/pull/235/head +98d519ec12ec6bc209ad61fed2e7e2101e312566 refs/pull/237/head +339f1677450d7a8f43518d61cfd93be85fa080c3 refs/pull/238/head +ff85ea9e4f1cf6fd50fb758cde3dedf01a742f52 refs/pull/240/head +18c4f6dc5a771cd3f90ef3e7ae02a99e09e89115 refs/pull/241/head +3d66da5f5baa3585aa4b5fe8f9d9eaaee5e5a6ef refs/pull/242/head +2c33149e4e2cb9a5b2616cdbad9eabb5f51f0e0c refs/pull/243/head +a2f4b18ae02cd14a8488c357c75fef3f2c2a9013 refs/pull/244/head +69768b6eacd442681bc8424cc76516e7e24fdacc refs/pull/245/head +f8252436e5e4384eaa1a68560db380d83b7c71eb refs/pull/246/head +07032a92671dea282cbc935383dd3d5a0a598682 refs/pull/246/merge +b8ed4950368d4d54cefd2b8bfe14c329e057172c refs/pull/247/head +10a01bd9fb383668a987ec8f512da627dbe55f9e refs/pull/248/head +470bf29d014757caae7222f3a41aea0b86b6ee1c refs/pull/249/head +b43076ca7b46b8216590766fd446ae538ab91c5a refs/pull/25/head +c0853ebef8dad7eddb6a44b76dac0f42f699b96a refs/pull/251/head +089666b32ba82c06a166e072ebcdf988108b66b7 refs/pull/252/head +fef38395004569688a967b88c70d8774c63f5fc5 refs/pull/254/head +972578a44da6463eb8f88552cc7d30cf0b6de9a4 refs/pull/259/head +0c2071ecda7a50dcdc8ec435a45b3b830b3e5bcf refs/pull/259/merge +4e2f86b6cd24a124d69bf9257d2ffa751d11da8f refs/pull/26/head +580beb4c121a85f60aaf6f10403e7f457c81ccb9 refs/pull/260/head +5b4e4e032fc56ca77b888ca36b7a342e9932e5fa refs/pull/260/merge +3e6df33472d54ed83dffe3bca7a3c8f65bab4c43 refs/pull/263/head +fcd6800b9d1171fbe0a00f51a72afac32b0a1987 refs/pull/264/head +5dc7a8970eabcf6aaa49529b5ef6401f5128637e refs/pull/265/head +1666222de2200b2a614a0d5184751b8b6f7309b0 refs/pull/266/head +e6ecdac581c3f03f442111b87655702e0664df67 refs/pull/267/head +26de4aa094c87a9efd793f3ec37ec7facea24184 refs/pull/268/head +73936bba69bd49e025aa8113fa81caa7f76ed571 refs/pull/269/head +454c84b5e4253e462dac5472b853ee222ca93368 refs/pull/270/head +9c3328e235e5f17c06328f021a5d11e7221690f5 refs/pull/271/head +96d71628887275fc3010a0979cdebef15edde911 refs/pull/272/head +4b6978bf8b220c9c7d03d1f8124d537fbbddc32a refs/pull/273/head +7f63914a7161923e9af6889ed0f954de1ed4c7f0 refs/pull/275/head +ac0c075ccc0fe2754a41dd777bb39507e73efe5b refs/pull/276/head +a8dad62bc9c76f1f455a372c91759e7bb1e92e63 refs/pull/277/head +99adbe97af48017fb51d884936f6bb87c27166c2 refs/pull/278/head +b0fe7ca8bad02599faa6a308b561f71d4d5e3b4b refs/pull/279/head +dce7b156e7276d44c3641f05bf675d90fea16523 refs/pull/280/head +c4ad48826105dd299f45473784d22bf395b56863 refs/pull/281/head +1f204555aa1678c0aa01cfba5836920acb8c5537 refs/pull/282/head +992e0f3446b4f608f5ead9dd6edc92f6bbc0b0a0 refs/pull/283/head +3f4d8f9912c9c3f5bacef6e6543b3f5b93168f65 refs/pull/284/head +9befd06185369d287deee36f3d0de65f41edabb1 refs/pull/285/head +0c002200bbee27acc8a663075da69120f666b4e5 refs/pull/286/head +de0f59418503fc0c4866395751d930be3abbf17c refs/pull/287/head +a5fda7c368e06561fba87dd33c47443e879dd6da refs/pull/288/head +989bd7f2db6d9e7aa91881389359e369d621e3d9 refs/pull/29/head +03c9ef743ad9de4eea816225afa2fc52490339cc refs/pull/290/head +03e7f0c401e771f4a4c529eae4d3fde91f5bd355 refs/pull/291/head +9c88dce30d213e1844ce60476e7d3eba2b1f1e60 refs/pull/292/head +671cff0b3e579cbdad3a0818031063588d866ad2 refs/pull/296/head +b3d089e37d0d4adc07bdbf1ecd14e9be3786bf25 refs/pull/297/head +2f6606401781d32f3ffe3e245f2ba946acefe97e refs/pull/298/head +8fbc1d318cf4c48931ffc6d204123284087fad0c refs/pull/299/head +cf2cbd6ce39cbbdf7c60b76a8dca8e38b80486fc refs/pull/300/head +09c09f0f734c006186df57595dc823159e0d49ef refs/pull/302/head +a58628449c5e398433472b1bfd7e67e0acbe09fc refs/pull/303/head +a82138e714dcd28ef5b7bacc4b708acc118e87ac refs/pull/304/head +f15c276542595cb0f55368f8abf9f277e8eb51c9 refs/pull/304/merge +1cf3b88cb3d237183cacd6482e4adaec48b17bb5 refs/pull/307/head +ccd11e55dd4991055b260bb39d7e20ceb09046e9 refs/pull/31/head +9efa05c583441159bd505dfde340cf774d6144e0 refs/pull/314/head +bf742617f30870372ed235c6ccf4515ea0a204d3 refs/pull/315/head +b6e227b9d779fe7405dc410812cb3aba6d2b529a refs/pull/316/head +5c9ee680d20c4a758b0ffe06876fdca823f8068a refs/pull/316/merge +de2c8a90865dcdbd97defe3c2c7396a2400e455a refs/pull/318/head +bd1a62273592d5ad6ef388a70f53a61e33ffcba4 refs/pull/319/head +171edb86e347f70d85ac593c139d26d6b4d3bbea refs/pull/32/head +33f23b6a06f4a9f6b013fdef108cc1c82153afe4 refs/pull/320/head +b67553e0c27857bbc5310f40cd6e68daa2d585de refs/pull/321/head +b72a6cfd9384bc3ace8ea2412e79d5ec34c24934 refs/pull/322/head +90b67c44eae7277d57e79e3c25c5dc72939a3b93 refs/pull/323/head +19ec155f6089f6de453f8835aad46c09f5fd0b4d refs/pull/326/head +069dd4e5df442e813eb30e3216aafa1cc1696a5f refs/pull/327/head +53831b3a2264e24ca6c7ffcfe33c8653a72d51e1 refs/pull/328/head +0b7ebf49775a8e5177eeaea6513083363a20e08c refs/pull/330/head +3bd3d3ba28c6e72515e56b535b8a638144c12413 refs/pull/331/head +cd03e5b471755b00aa948f7de950932c2c5a5d79 refs/pull/332/head +e732790fde08a5e3d4f2347ac4a3e74399a5b457 refs/pull/333/head +d2662892cd218eec7b56e505e4a343e5c676f02c refs/pull/335/head +2bc657fad1def9519f88d851ef9e91bc01dc0e47 refs/pull/336/head +6e91291cb24b777f0db29a6d50a728a2183ab660 refs/pull/337/head +f9c400fb1c9bb8f2f76484b1a398135175d87a7f refs/pull/338/head +071a1011d1f02ac96f92164b0313c429a159ad80 refs/pull/339/head +85b00faba7071b5d7babb426bc06aa401ac8814d refs/pull/34/head +525bb545c4c1f7dfe3ca461136c072af11cb6e4f refs/pull/340/head +2122327782b71345cce48f23b688deebf582adc3 refs/pull/341/head +40e737cdaf9341d821cba518ee990406fdcfd7e3 refs/pull/342/head +8bfcaddd5fadea396620871451ca9ffc43b0985d refs/pull/343/head +9d4a1e5ad279e6bc1c4230f90208b0886608a387 refs/pull/346/head +cdcf9e606a12221e123a642353fbcfdc5d48bcf6 refs/pull/347/head +1a0ac8c06c5a27f330a55a61464eaebc840d89d1 refs/pull/348/head +258df0792818d6c331ccee923736ea234c24cf07 refs/pull/349/head +3c9df19f7da674295f58f07f6dffa5d9e114fbc8 refs/pull/351/head +c61e5e23c89b99d26aaaec6ec6c58bda1b502ebc refs/pull/352/head +8dd4e591b3789ea14e8bd8cfde3ed81aa6edfefe refs/pull/353/head +50f6307501712d87110f3f4d2e4959e84ace3bc8 refs/pull/354/head +8e64f064f562a918993b147a3872e92c157e8e01 refs/pull/355/head +ab744afc39dcd099948bfeb7fa4ac14f3f53dd36 refs/pull/356/head +75395832459d3e7a05ec51ca2ea081fe99be5e8e refs/pull/357/head +e004cd36fa3900c67d97f9944320a213e0d62c42 refs/pull/358/head +f6380bb6608eb7d43c199b3d0ab2f932d300a338 refs/pull/36/head +e424b487611d755ee5fe94271dd69677cc7688f0 refs/pull/360/head +a45e90653a50d7cd8813775cbf3d4ae546db1479 refs/pull/361/head +1e132acbb4f4aceea67ac8cdd5a4afdb1053e13d refs/pull/362/head +09566acb3a06bcb80147555395ae564402a4013f refs/pull/367/head +7425af3a9e29913aeb7cae881f9583f204ca5310 refs/pull/368/head +e9112f40dd90d800c46adf88c7ad58653276bb5b refs/pull/370/head +f46333d4a7c3a3f408131e268589203a68b84a09 refs/pull/371/head +37feda1bb815269044e98991edf011dd713eda6a refs/pull/372/head +ba5154b934dde320698eb31623e6c61eb63675e8 refs/pull/373/head +e3954cdae4f9e97fbd7fd3ec1e80f01abbd6c06c refs/pull/375/head +89b3ca0146f7371dd1008b0f6dd1d1452840deb2 refs/pull/377/head +8d9e1e32484fa7fbbfe49df058fee41304c47213 refs/pull/378/head +5d891350f44eecd7767b85259b1fd3068afe3c16 refs/pull/379/head +d46a563351a5785e7ece59366fb80d1ffc21885c refs/pull/38/head +ead6314a1cb17c2ecce50c80876f1998dcff6286 refs/pull/381/head +35d5746117b42a556f81cff9fe016fdff8a6ddaa refs/pull/382/head +a0b839d7de3278c5003836ad27d8ab75b994cbf5 refs/pull/384/head +d10a328f79966ada76c0f5e1f13922363e1d7da9 refs/pull/385/head +21264913c5162a74f58ef8af8d675417b188b8b9 refs/pull/386/head +dbf90bd36bcfdd3659670e26259e1a1cf40b053a refs/pull/388/head +5c2623b1a8d01d670455c739d07d94ba4f731f72 refs/pull/389/head +7d18b37a95732fa58da3863efb4f8f142524abdb refs/pull/390/head +094bf7ff2c87c735eb7ef41e1eeaedb41c8c0625 refs/pull/391/head +16fcea238788bd5d298d96a199ffbbeea9f0845a refs/pull/392/head +b7ccc7206cefa77e0139cd01af053895a5021fce refs/pull/393/head +79e3fee891cf132262e66a192424cc5a5892c732 refs/pull/394/head +7afbd7686e3ed22f4fff4f12721e944fb94c3476 refs/pull/394/merge +36d53620b57f2c90b897525049d50d327f174edf refs/pull/395/head +ce574378f856d15eec794157225005947534a6ca refs/pull/396/head +99b025049e3fd4f1a791349716d7e3a6e6742ea7 refs/pull/397/head +09f9340dcec6744e7238c0d966cad57e302a7419 refs/pull/398/head +f049c7ae66996b3be81be9688aecc313fb62d2bd refs/pull/399/head +3595ca05808ce018fb0fe6ca985a94d162cee300 refs/pull/4/head +ec1893ac2372b7f596f4bdcff9b3fdbf1017dddc refs/pull/40/head +105afd86fbc2a40752f4d522f7168c4f5c68f551 refs/pull/400/head +3dd72d1c289e56fac76e5a5416c397da4946e98d refs/pull/401/head +edb00bd980448f956a07b3d513f27fca32a1bb08 refs/pull/402/head +cf241c3b6c32196768d825f961fc9b00e7e6b53f refs/pull/402/merge +6b8276e2521d63ae1adc2cfd41d9e5a03e099ebe refs/pull/403/head +6f4d9d856088be4b13c96717e45e94f902bb3fbd refs/pull/404/head +5e1fe6e8f04e609273ee4fafe2fb77922ac2012f refs/pull/405/head +93efdb9e4e967a0ad0cb735721b0a67447cd12b2 refs/pull/406/head +effb33569a926c12dc8e7bae979ac2075c219189 refs/pull/408/head +e14970493019b12d03046f2fdd01b76fd4f9fa3c refs/pull/409/head +897b7c1a387e7afc2c95b4022c3b303137631c62 refs/pull/41/head +5dd817c33df1a62776320437413ad7afbeaab414 refs/pull/410/head +75aa5b075534ab11b77bc694f4c6d7cc29eab26f refs/pull/411/head +0f138be4021524c1b9b8fa2dcd343876695b8101 refs/pull/414/head +ca0c7a28b9b94243cac476dc4275db29f5d0be46 refs/pull/415/head +0030b455f42d9a8588cb9791fdf9e62a4d0e401c refs/pull/417/head +0030b455f42d9a8588cb9791fdf9e62a4d0e401c refs/pull/418/head +7f49fa5164ce43bd1bfcdfe2b43b56cdf6845bd6 refs/pull/419/head +ea4ab58dbc0a886c8a50752068de817ba1e49e81 refs/pull/42/head +fec5a5a6302e3bd30b71cbb8a22706d417eb5e72 refs/pull/421/head +a49afbe1be5e5d26f74b32d77057bf01ecee83bf refs/pull/422/head +ccff1fbf71b315e0eee2ba2b46b82dda44fac55d refs/pull/423/head +3f6522fef12acbebec4e425fec2a0d63a4bbac60 refs/pull/424/head +b33922ed298ce150cd04d0ee330d0c85b3cee104 refs/pull/426/head +84087c786e25744e47affbaae0b44415a973bdc9 refs/pull/427/head +ebe01ea88769ec788cdcd91bdd9d24ae5ceb4f55 refs/pull/43/head +2709b9694779797954b7bebb18764c2a85876e7e refs/pull/433/head +98d345bd66496d36a1d62506d405e6d7b07e8cde refs/pull/436/head +2d4df7d85dea6c6e81edb7a51de92c413318b6c9 refs/pull/438/head +8d73c7cced4d9a8403e2353f02359844bd33b5b9 refs/pull/438/merge +117c81053b70de031bac51b53288c001662c9305 refs/pull/44/head +4450b7c62274bc08f21b94269e0316e2799afe90 refs/pull/445/head +99db3179fcfab1add1a2418ed5f5392f25156aa0 refs/pull/446/head +40adeb7fd7e86a3d84779a2c43c2211ae805b804 refs/pull/447/head +1cb3ca50a63e8eac9dc503b3fba69ef56a99bce2 refs/pull/449/head +0f73f0ace74ea44f39ab10f23a3d2c03afd54a8f refs/pull/450/head +7ae9880f0fb622992a8a5328fd4af78af5b6b26f refs/pull/451/head +c5ac12e2bc1ad8df1df0ee9d1236ab6366a2c32d refs/pull/452/head +cfbebf4c80d0bc18609e7d603366f384dbdc8ef3 refs/pull/453/head +dbc2866bb5f564d3be3fa5efdda769f2946ee968 refs/pull/454/head +225159599d37106d63795d2df1bcbe0ccf7b3479 refs/pull/455/head +25509c0b883738629b6a13c013b6274538112fbe refs/pull/456/head +c42b4d1ebc5d198401f3efbcda36874b987e29d4 refs/pull/457/head +fd9ee69e0ba4e389a5ecdd85822a0932b0496e3c refs/pull/458/head +769bc7b07c3b986d928540d74d53bdd3d73f4374 refs/pull/459/head +ca939f84e132eb64a44db49c8092c8ec261b3092 refs/pull/46/head +75837a77174c0dd3243a599fae8c1675c64860d1 refs/pull/460/head +3fffe2ad2062eabe93dddb4d2e37bffe9bf278dc refs/pull/461/head +fea1d24e7be3284646858ef7bc9950f685adaa61 refs/pull/462/head +b765db28be0063341ef9048a8c4f6efb8b0e4cbd refs/pull/463/head +6385ebbe4d5fd7235dca833a4b041b14f06d46cf refs/pull/464/head +7ec497fb53a8d0a680576f1e0b0781fb71c99429 refs/pull/47/head +a7fec81fc4c4af5e49d2ce19f3b39ef51202fd22 refs/pull/470/head +117a1aad2d8194b8632bb46483573bb0b7aa50f1 refs/pull/471/head +0bd8dec08b8bb484f4a39e8d241a40c8e0c8a051 refs/pull/472/head +d5f3b81e690242c750deb4ede721539250297bd6 refs/pull/473/head +c25a388c1375c634d42a6f5608a863a4b6aace2c refs/pull/474/head +a09d7cdf458769f6f9586a2782b03d624d710428 refs/pull/475/head +e1be57c0f55f90d9489773dec69449bd86fce692 refs/pull/476/head +1812091001b264fc9b0db6a4b847ef9b330f5fd4 refs/pull/478/head +e337c2b936320f538fc8b9e8b66d51bff56646e4 refs/pull/479/head +137bd464c14792cadc721d90afd412c2e7735424 refs/pull/48/head +6819c6d1491caf6819649a0635d35956700cd165 refs/pull/480/head +c50c57f52eaae3f241dd3a4338d05f199d0bd94d refs/pull/481/head +83457e19c8b17548bf30f43bdfe7563cc6621633 refs/pull/482/head +d5568ee899f3b9487cf752cb28027910f84aad46 refs/pull/483/head +65f99e3eff346e5033d9ac9310021a4ff55a9a64 refs/pull/485/head +fc411858ee8c2d1ca4113555c185752f5d8212f5 refs/pull/486/head +05ad8633a8d6e407bd9dfce36da47b3fe36b3da2 refs/pull/487/head +a1f8f33a5b5ae60c6bdad045176e3fc96427a0a5 refs/pull/488/head +3fe754c0804d97b446a8ca70b3e4aa8d9c17c831 refs/pull/49/head +2d5ed365ff0a9d7c7bf9a84e8ac0692b80caed92 refs/pull/490/head +9f68408a70172d6c4ce3ba4e3a7528f489629e43 refs/pull/491/head +2fe5c4a31d9e599dfb55d21a02b8f9b74c5b3165 refs/pull/492/head +1f8dcd4726717a4b724e5408ca24829bdef67a49 refs/pull/493/head +c883a1729ac36de8cfc30729dd9650a98ce5c5a3 refs/pull/494/head +f44eabc30ee11beb77577f4c059bc6cf1643885b refs/pull/495/head +ab46d6415275a4f1c66923aad5d9759394b9999f refs/pull/496/head +31183bf059d3d1698d2b5e10a17bfb892a57876b refs/pull/497/head +b33592ebce263de67a30234f5952833e58f519f8 refs/pull/498/head +efac873c1357fd397b246e601021930c2a1561b9 refs/pull/499/head +efac873c1357fd397b246e601021930c2a1561b9 refs/pull/500/head +f6256df2628c6dc9b8637a81c9ce3bd9354b4df5 refs/pull/501/head +a98fbaba8b4236b1f98a9a4ee8269f5beb054425 refs/pull/502/head +8db0c6eb7539e9e73dce1a74be02093f531c8c60 refs/pull/503/head +890f33b56a7c03f5d8c680b5b566b07669adf6fb refs/pull/504/head +16f8d5b6bf91315e87e3922d2acae52d38c6bfe1 refs/pull/505/head +4ea19dd03e4c9632ee09a94f32f18a12df02da9e refs/pull/506/head +21757b6add20f67be68cad7c3b36e3ef3ec6875a refs/pull/507/head +5cd51978a44752b0432329904e72fe3ffbe22523 refs/pull/508/head +5f92d48d0d590f68340a9a6acdf0c7ae9638bb7e refs/pull/509/head +dff2b1783badd696c3135abd8e26c3b7ad2e67fd refs/pull/51/head +434d30dae30fbb57699370260c69c2108c1abf8f refs/pull/512/head +fb75c41e703f7ddaf22edfce3488c888cbb3136e refs/pull/512/merge +43367db377713ef76db6e16df128a96a7db5a805 refs/pull/513/head +50a9c6c655766bcbabac0453a5dce8cddd3e8cf7 refs/pull/514/head +101bac2d30cce81a24eb2b223aa64d928ca6598d refs/pull/515/head +6340fa0e9b818a19be3982951106ec6071075843 refs/pull/516/head +90934a152b26db2cacafaf26c0f85261815f2344 refs/pull/517/head +3fe1bb8561a92c45a56afb6dc3af95755cc2273c refs/pull/519/head +42e6045ca1307cdd5b13a69aef57336abb7ea486 refs/pull/519/merge +5e6b95649be69c3e9d6c326f2a7c2ba88c25f460 refs/pull/52/head +377d2a55a8b9506d56d4eedefe26565240b208f0 refs/pull/520/head +4cc6cad50849690b2c551f306265509d7168730b refs/pull/521/head +b88e7d0b00bcd6721cc0b11ac2b948a32a9c444d refs/pull/522/head +f4d851a739f6f1cfd0364b1c1ceb9aadd1b07f2f refs/pull/523/head +68eca941248011fdc278bd752f39fbd3f62e46c7 refs/pull/524/head +ccb60599696d69e9744224367ca927e6ba3f74b3 refs/pull/525/head +bb8d56683375160bdcc35d0ca7dcf06bb875bece refs/pull/526/head +ab7ca1353732f13ba1b24f4b95efe3dc148a0a73 refs/pull/527/head +f9669dc4186220345d8a856550386492aae74e5c refs/pull/528/head +b0f915ac6981dc529e3aa27bfe13b93c067da83e refs/pull/529/head +cf2685d6213f8966f3e453d66aa51c5f993cb514 refs/pull/529/merge +4432aa8d79607328e6e96ae2a89f878ea58b27fe refs/pull/53/head +fa45e0e0cc63150df8ff27c49a8385f1f989d2fb refs/pull/530/head +a2a4bbd3dcd04b7ec7fc84258c1732298fb95d60 refs/pull/530/merge +ea71bf2ce9a4420dc5716b94c0e02032ef3b0486 refs/pull/531/head +347825dd43e9c7f3b346aff777ae4a0cffe93ea0 refs/pull/532/head +ab649ca5fc756ed6b3b290662fb273460c4a038b refs/pull/533/head +a7e40d20551cab8bdf753c9ea809f80443903290 refs/pull/534/head +55130cecb0b8eb39da9c281e9124168d1068079e refs/pull/535/head +e5e653088cb61fae41189623b208cb100624b0d8 refs/pull/535/merge +fa408c9e853e04971c32351bab2e2200c4e07349 refs/pull/536/head +f2b51f49978351bc6225aec3cb18a916b0c4245a refs/pull/536/merge +65d174cc77577c972ed34fa03efa8c982c72f0ac refs/pull/537/head +e2e2d0088182c22f26a007d3ea4fdb3497cc830a refs/pull/538/head +0cf0071c1db25a01454339aa1dac6f8c984f8244 refs/pull/538/merge +691855a60fca67d1176bbca0871ce9beb9170bbb refs/pull/539/head +788c17c16b5bc88466d1a0a96f0bf7eaef8b9352 refs/pull/54/head +8b3d2878dea8451badb5b66094e7b4d0e4d1c658 refs/pull/540/head +ddff9004d745c4b2d13e35ebdd1a3d0b67e14717 refs/pull/541/head +5e091e541bc88b91fc750bb908aab665a4f13334 refs/pull/541/merge +1d63cdd629a5fc9e2b15a25b667f804d872f9e47 refs/pull/542/head +a617f5e2b1e7bee60846a2033645f28015990d2b refs/pull/543/head +92baa3289dee72e28b5add8cfd88c3a909d68f17 refs/pull/545/head +cf642a237ea2c2c0e345fdb856e203d418aedc81 refs/pull/545/merge +347825dd43e9c7f3b346aff777ae4a0cffe93ea0 refs/pull/547/head +2b5cbd54cf8d59e4780dad338b31cf31c3ea4aa8 refs/pull/547/merge +68c32ed80b138d1f8a6ec5dcf1b105f32fcaaf12 refs/pull/548/head +218066a6698047a111ce5fe6c77999db3cfb11ad refs/pull/548/merge +ad176827391e97cc1a919f38f3f6af655184facb refs/pull/549/head +ff76bbdc775050687a8495f75122faa8fef37d84 refs/pull/55/head +353496019475df6047027998d1cf69505fef172f refs/pull/550/head +7f8a32c5a9c9b07f57ebef314a5a289c7eb51021 refs/pull/551/head +a0e7df98638abbdaa452dc08b929538bda94ae18 refs/pull/552/head +174b3135c3a20094b65edb2e2c4e3e1c13693d58 refs/pull/553/head +c5d5d97c43f38162bb49fef37149ea6c4a136c50 refs/pull/554/head +7c926083822b8eea2c51cf6c6f425b9101b5d2bf refs/pull/556/head +5c119d9eb367474bd9cbca0e37481af4913d2db6 refs/pull/556/merge +29b31e5e0d3ca3d85bc1c546aeb16ad2f510c6f3 refs/pull/557/head +6274c2a3b1ed55f5227f54b37c1437b74a060b3c refs/pull/558/head +81514112d770a2ceeddcbba2207204661f40c650 refs/pull/558/merge +b7d2cf8908b42f35b5a3929e18ab63d3a321a3a1 refs/pull/58/head +956ea437dfdfcc6b431315fe54a9388271f5b512 refs/pull/6/head +175e1eb6b3395e3808218e72910235658819bdc5 refs/pull/60/head +083102e1e2bad3bfc869f3072f134fc48a401550 refs/pull/61/head +0b963fe790c694a35c34b2b31caa84a681f74945 refs/pull/62/head +cfe64fa1f270ff99ae4c5bf36502656d5c77596f refs/pull/63/head +787c4fac1492d4d877127ccf086195b5051b5c01 refs/pull/64/head +478d3cc73fe173775883d35a2b0a073567da3b4b refs/pull/65/head +2a60245369a3e88485ed4f8c92ca5c378ce77c06 refs/pull/76/head +b70b6fec29949244914e7501725deb52370da0b0 refs/pull/77/head +303e1990d6317fc39c5c072483d18e4f0235db60 refs/pull/78/head +cfaab9a73140595755a5bcc138c45ad817dc4f44 refs/pull/79/head +8de85365808b3d984148d0adb5dc36125a71c36f refs/pull/8/head +976a8c276338a00a436f620f9cb8d3c0f74f6d81 refs/pull/80/head +1146f2644c44ff629c5dfc8f5588d6d4cc734a22 refs/pull/80/merge +07134a5bce472917a2fc2f2a19401861a688530b refs/pull/81/head +3d4aca47308287244f2dd7b9c2085dea63c27b60 refs/pull/82/head +140a1752fdfa9788db9e5b23ee32d8bdbed4c9f7 refs/pull/83/head +40ab3405b25719a490abea591d80b7ce27ab8803 refs/pull/84/head +52f77c4486ea96a3c5ed373932ee0220d5a7ebee refs/pull/85/head +029dd258a1d19cbcd8e22523b0811c7dcb6d450a refs/pull/86/head +8ef7b779cd17e95baeef138a612c48b063036aca refs/pull/87/head +ace0073826e3e2bdc1b08d78e6fe6f1efc700aab refs/pull/9/head +e78605942c7fb08c3e8812a166e85bcae2ddd15e refs/pull/91/head +7c68b05ed94391100c1933770cd18e95533bd53d refs/pull/92/head +d6774be62f7f857f0b30dae49a3a6f02b58e5679 refs/pull/93/head +6192ad1fc8795b647f8fb9eec20257ae2cb4716d refs/pull/95/head +dcdd7ebabbdcac6442e45db68f6e3d10b96f0c88 refs/pull/96/head +41bfaaae0af3809b808405df0fab4a5e02ddd206 refs/pull/97/head +462fb1d3fc318f4e1f81d6945b87f1dc32dd8079 refs/pull/98/head +c1c9541a3b91ec076076ad8e9a4e28a00b80cb6b refs/pull/99/head +bd924007a25488900d2e3f3437a0388a97636020 refs/tags/0.0.1 +2d719d75a2065f213e58a5164384a3d2fcf9b59a refs/tags/0.0.2 +d45e63421d3dff834949ac69d3c37691e994bd69 refs/tags/0.0.3 +3426dba9ee5c9f8e4981b0fc9d39a818d36eec28 refs/tags/0.0.4 +0959ba76a1d4a98fd11163aa83fd49c25b93bfae refs/tags/0.0.5 +9d8719c8bebdc79740b6969c912ac706eb721d7a refs/tags/0.0.7 +07e47b1e93e5a1e0ef0c50fcb2d6739fb6be4003 refs/tags/1.0.0 +2d33a0ea89c961dcb2b3da2157963d9c0370347e refs/tags/1.0.1 +48254824bb4248676bf7ce56014ff57b142b77eb refs/tags/1.0.2 +f504716c27d2e5d4144fa4794b12129301d17729 refs/tags/1.0.3 +937e904258d22af6e447a0b72c0bc67583ef64a2 refs/tags/1.0.4 +a902f1823a7ff3c9ab2fba0f992396b948eda307 refs/tags/1.0.5 +d029d9d39c87bed85b1c50adee7c41795261a192 refs/tags/1.0.6 +94cf62b3ba8d4bed62680a282d4c25f9c63c2efb refs/tags/1.1.0 +ee97538f5b81ae89698fd95938896dec5217b148 refs/tags/1.1.1 +3d2dc41a01f9e49d84f0a3925fb858bed64f702d refs/tags/1.1.2 +9bf03ff58ce34478e66aaee630e491823326fd06 refs/tags/1.1.3 +671108c96644956dddcd89dd59c203dcdb36cec7 refs/tags/1.1.4 +ad9f6723fd29591e6c0a19a9c4982cae51d65b1d refs/tags/1.1.5 +c11818f3cae0780656baa430b49e7f163f08dffd refs/tags/1.1.6 +c1805596154bb3a265fd91b8ac0c4433b4348fb0 refs/tags/1.2.0 +8c0c0a8b49e080e54e5e328cc552821ff07cd341 refs/tags/1.2.1 +7b847a3b7008b2dc2f47ca3110d8c782fb2e5c7e refs/tags/1.3.0 diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/heads/main b/_spm/repositories/swift-collections-9a58d5cf/refs/heads/main new file mode 100644 index 0000000..8091728 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/heads/main @@ -0,0 +1 @@ +534c0cbbfef9d2f6e7a6519930967d75f7c60336 diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/548/merge b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/548/merge new file mode 100644 index 0000000..94893d0 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/548/merge @@ -0,0 +1 @@ +c35ca292f71bd0c2d7eb37e1dbac9318fae5bb68 diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/556/merge b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/556/merge new file mode 100644 index 0000000..ddad22c --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/556/merge @@ -0,0 +1 @@ +b36804e15608a070213059cf803cc353ef88263a diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/557/head b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/557/head new file mode 100644 index 0000000..a84d97c --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/557/head @@ -0,0 +1 @@ +80b8a6fb80ebb1ce7f5e918027b77a99fc57759c diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/560/head b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/560/head new file mode 100644 index 0000000..9b2dece --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/560/head @@ -0,0 +1 @@ +fdaf3fe24c72ac54998e4d2361aaa5d9fedd12b5 diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/562/head b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/562/head new file mode 100644 index 0000000..888f2ae --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/562/head @@ -0,0 +1 @@ +59bb505b1a18e05342fd58d873a967b484f2f268 diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/563/head b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/563/head new file mode 100644 index 0000000..3b74e91 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/563/head @@ -0,0 +1 @@ +de54709ca9dffef94ee4f1b04f6a6483d620d1a3 diff --git a/_spm/repositories/swift-collections-9a58d5cf/refs/pull/565/head b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/565/head new file mode 100644 index 0000000..4da02d1 --- /dev/null +++ b/_spm/repositories/swift-collections-9a58d5cf/refs/pull/565/head @@ -0,0 +1 @@ +d1efcb19db72befae31841116b43586350a60a72 diff --git a/_spm/workspace-state.json b/_spm/workspace-state.json new file mode 100644 index 0000000..4453ef9 --- /dev/null +++ b/_spm/workspace-state.json @@ -0,0 +1,30 @@ +{ + "object" : { + "artifacts" : [ + + ], + "dependencies" : [ + { + "basedOn" : null, + "packageRef" : { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "name" : "swift-collections" + }, + "state" : { + "checkoutState" : { + "revision" : "7b847a3b7008b2dc2f47ca3110d8c782fb2e5c7e", + "version" : "1.3.0" + }, + "name" : "sourceControlCheckout" + }, + "subpath" : "swift-collections" + } + ], + "prebuilts" : [ + + ] + }, + "version" : 7 +} \ No newline at end of file diff --git a/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.h b/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.h index 8537fe8..2944651 100644 --- a/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.h +++ b/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.h @@ -24,6 +24,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, weak) id delegate; +/// 是否倒置列表(倒置后:视觉底部为 row=0,历史消息向上追加) +@property (nonatomic, assign) BOOL inverted; + /// 添加用户消息 - (void)addUserMessage:(NSString *)text; @@ -84,6 +87,10 @@ NS_ASSUME_NONNULL_BEGIN - (void)prependHistoryMessages:(NSArray *)messages openingMessage:(nullable KBAiChatMessage *)openingMessage; +/// 追加历史消息(倒置模式使用:把更老的消息插入到 openingMessage 之前/末尾) +- (void)appendHistoryMessages:(NSArray *)messages + openingMessage:(nullable KBAiChatMessage *)openingMessage; + @end NS_ASSUME_NONNULL_END diff --git a/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.m b/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.m index da7551b..3b22a42 100644 --- a/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.m +++ b/keyBoard/Class/AiTalk/V/Chat/KBChatTableView.m @@ -127,6 +127,60 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 #pragma mark - Public Methods +- (void)setInverted:(BOOL)inverted { + if (_inverted == inverted) { + return; + } + _inverted = inverted; + + self.tableView.transform = inverted ? CGAffineTransformMakeScale(1, -1) : CGAffineTransformIdentity; + [self updateContentBottomInset:self.contentBottomInset]; + [self.tableView reloadData]; + [self.tableView layoutIfNeeded]; +} + +static inline CGFloat KBChatAbsTimeInterval(NSTimeInterval interval) { + return interval < 0 ? -interval : interval; +} + +- (BOOL)shouldInsertTimestampBetweenMessage:(KBAiChatMessage *)message + andReference:(KBAiChatMessage *)reference { + if (!message.timestamp || !reference.timestamp) { + return YES; + } + + NSTimeInterval interval = KBChatAbsTimeInterval([message.timestamp timeIntervalSinceDate:reference.timestamp]); + if (interval >= kTimestampInterval) { + return YES; + } + + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSDateComponents *a = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear + fromDate:reference.timestamp]; + NSDateComponents *b = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear + fromDate:message.timestamp]; + return ![a isEqual:b]; +} + +- (NSInteger)firstNonTimeIndex { + for (NSInteger i = 0; i < self.messages.count; i++) { + if (self.messages[i].type != KBAiChatMessageTypeTime) { + return i; + } + } + return NSNotFound; +} + +- (NSInteger)lastNonTimeIndexBeforeIndex:(NSInteger)index { + NSInteger maxIndex = MIN(index, self.messages.count); + for (NSInteger i = maxIndex - 1; i >= 0; i--) { + if (self.messages[i].type != KBAiChatMessageTypeTime) { + return i; + } + } + return NSNotFound; +} + - (void)addUserMessage:(NSString *)text { KBAiChatMessage *message = [KBAiChatMessage userMessageWithText:text]; [self addMessage:message autoScroll:YES]; @@ -138,17 +192,31 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 } - (void)updateLastUserMessage:(NSString *)text { - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeUser && message.isLoading) { - message.text = text; - message.isLoading = NO; - message.isComplete = YES; - - // 刷新该行 - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; - return; + if (self.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser && message.isLoading) { + message.text = text; + message.isLoading = NO; + message.isComplete = YES; + + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; + return; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser && message.isLoading) { + message.text = text; + message.isLoading = NO; + message.isComplete = YES; + + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; + return; + } } } } @@ -172,24 +240,44 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 - (void)updateLastAssistantMessage:(NSString *)text { // 查找最后一条未完成的 AI 消息 - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeAssistant && !message.isComplete) { - NSLog(@"[KBChatTableView] 更新最后一条 AI 消息 - 索引: %ld, 文本长度: %lu, needsTypewriter: %d", - (long)i, (unsigned long)text.length, message.needsTypewriterEffect); - message.text = text; - - // 直接更新 Cell 的文本,不刷新整个 Cell(避免打断打字机效果) - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - KBChatAssistantMessageCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; - if ([cell isKindOfClass:[KBChatAssistantMessageCell class]]) { - NSLog(@"[KBChatTableView] 找到 Cell,直接配置消息"); - // 直接调用 configureWithMessage,让 Cell 自己决定是否使用打字机效果 - [cell configureWithMessage:message]; - } else { - NSLog(@"[KBChatTableView] 未找到 Cell 或类型不匹配"); + if (self.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant && !message.isComplete) { + NSLog(@"[KBChatTableView] 更新最后一条 AI 消息 - 索引: %ld, 文本长度: %lu, needsTypewriter: %d", + (long)i, (unsigned long)text.length, message.needsTypewriterEffect); + message.text = text; + + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + KBChatAssistantMessageCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; + if ([cell isKindOfClass:[KBChatAssistantMessageCell class]]) { + NSLog(@"[KBChatTableView] 找到 Cell,直接配置消息"); + [cell configureWithMessage:message]; + cell.contentView.transform = self.inverted ? CGAffineTransformMakeScale(1, -1) : CGAffineTransformIdentity; + } else { + NSLog(@"[KBChatTableView] 未找到 Cell 或类型不匹配"); + } + return; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant && !message.isComplete) { + NSLog(@"[KBChatTableView] 更新最后一条 AI 消息 - 索引: %ld, 文本长度: %lu, needsTypewriter: %d", + (long)i, (unsigned long)text.length, message.needsTypewriterEffect); + message.text = text; + + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + KBChatAssistantMessageCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; + if ([cell isKindOfClass:[KBChatAssistantMessageCell class]]) { + NSLog(@"[KBChatTableView] 找到 Cell,直接配置消息"); + [cell configureWithMessage:message]; + } else { + NSLog(@"[KBChatTableView] 未找到 Cell 或类型不匹配"); + } + return; } - return; } } @@ -199,33 +287,63 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 } - (void)markLastAssistantMessageComplete { - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeAssistant) { - NSLog(@"[KBChatTableView] 标记消息完成 - 索引: %ld, 文本: %@", (long)i, message.text); - message.isComplete = YES; - message.needsTypewriterEffect = NO; // 完成后不再需要打字机效果 - - // 刷新 Cell 以显示完整文本 - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - [self.tableView reloadRowsAtIndexPaths:@[indexPath] - withRowAnimation:UITableViewRowAnimationNone]; - return; + if (self.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant) { + NSLog(@"[KBChatTableView] 标记消息完成 - 索引: %ld, 文本: %@", (long)i, message.text); + message.isComplete = YES; + message.needsTypewriterEffect = NO; + + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView reloadRowsAtIndexPaths:@[indexPath] + withRowAnimation:UITableViewRowAnimationNone]; + return; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant) { + NSLog(@"[KBChatTableView] 标记消息完成 - 索引: %ld, 文本: %@", (long)i, message.text); + message.isComplete = YES; + message.needsTypewriterEffect = NO; // 完成后不再需要打字机效果 + + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView reloadRowsAtIndexPaths:@[indexPath] + withRowAnimation:UITableViewRowAnimationNone]; + return; + } } } } - (void)markLastUserMessageLoadingComplete { - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeUser) { - message.isLoading = NO; - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - [self.tableView reloadRowsAtIndexPaths:@[indexPath] - withRowAnimation:UITableViewRowAnimationNone]; - [self.tableView layoutIfNeeded]; - [self scrollToBottomAnimated:NO]; - return; + if (self.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser) { + message.isLoading = NO; + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView reloadRowsAtIndexPaths:@[indexPath] + withRowAnimation:UITableViewRowAnimationNone]; + [self.tableView layoutIfNeeded]; + [self scrollToBottomAnimated:NO]; + return; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser) { + message.isLoading = NO; + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView reloadRowsAtIndexPaths:@[indexPath] + withRowAnimation:UITableViewRowAnimationNone]; + [self.tableView layoutIfNeeded]; + [self scrollToBottomAnimated:NO]; + return; + } } } } @@ -237,14 +355,41 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 } - (void)removeLoadingAssistantMessage { - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) { - [self.messages removeObjectAtIndex:i]; - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; - NSLog(@"[KBChatTableView] 移除 loading AI 消息,索引: %ld", (long)i); - break; + if (self.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) { + if (self.playingCellIndexPath) { + if (self.playingCellIndexPath.row == i) { + [self stopPlayingAudio]; + } else if (self.playingCellIndexPath.row > i) { + self.playingCellIndexPath = [NSIndexPath indexPathForRow:self.playingCellIndexPath.row - 1 inSection:0]; + } + } + [self.messages removeObjectAtIndex:i]; + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; + NSLog(@"[KBChatTableView] 移除 loading AI 消息,索引: %ld", (long)i); + break; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) { + if (self.playingCellIndexPath) { + if (self.playingCellIndexPath.row == i) { + [self stopPlayingAudio]; + } else if (self.playingCellIndexPath.row > i) { + self.playingCellIndexPath = [NSIndexPath indexPathForRow:self.playingCellIndexPath.row - 1 inSection:0]; + } + } + [self.messages removeObjectAtIndex:i]; + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; + NSLog(@"[KBChatTableView] 移除 loading AI 消息,索引: %ld", (long)i); + break; + } } } } @@ -258,6 +403,12 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 // 关键修复:使用 layoutIfNeeded 确保布局完成后再滚动 [self.tableView layoutIfNeeded]; + + if (self.inverted) { + CGFloat minOffsetY = -self.tableView.contentInset.top; + [self.tableView setContentOffset:CGPointMake(0, minOffsetY) animated:animated]; + return; + } // 计算需要滚动到的位置 CGFloat contentHeight = self.tableView.contentSize.height; @@ -299,7 +450,11 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 // 直接设置 contentInset UIEdgeInsets insets = UIEdgeInsetsZero; - insets.bottom = bottomInset; + if (self.inverted) { + insets.top = bottomInset; + } else { + insets.bottom = bottomInset; + } self.tableView.contentInset = insets; self.tableView.scrollIndicatorInsets = insets; @@ -319,22 +474,46 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 } NSInteger oldCount = self.messages.count; - [self insertMessageWithTimestamp:message]; + NSArray *itemsToInsert = nil; + NSInteger insertIndex = oldCount; + + if (self.inverted) { + itemsToInsert = [self invertedItemsForNewMessageAtBeginning:message]; + insertIndex = 0; + if (itemsToInsert.count > 0) { + NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, itemsToInsert.count)]; + [self.messages insertObjects:itemsToInsert atIndexes:set]; + } + } else { + [self insertMessageWithTimestamp:message]; + itemsToInsert = nil; + insertIndex = oldCount; + } NSInteger newCount = self.messages.count; NSInteger insertedCount = newCount - oldCount; if (insertedCount > 0) { - NSMutableArray *indexPaths = [NSMutableArray array]; - for (NSInteger i = oldCount; i < newCount; i++) { - [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; + if (self.inverted && self.playingCellIndexPath) { + self.playingCellIndexPath = [NSIndexPath indexPathForRow:self.playingCellIndexPath.row + insertedCount inSection:0]; + } + + NSMutableArray *indexPaths = [NSMutableArray array]; + if (self.inverted) { + for (NSInteger i = 0; i < insertedCount; i++) { + [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; + } + } else { + for (NSInteger i = insertIndex; i < newCount; i++) { + [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; + } } - // 关键修复:批量插入前先布局,避免高度计算不准确 [self.tableView layoutIfNeeded]; - [self.tableView insertRowsAtIndexPaths:indexPaths - withRowAnimation:UITableViewRowAnimationNone]; + [self.tableView beginUpdates]; + [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; + [self.tableView endUpdates]; } [self updateFooterVisibility]; @@ -362,6 +541,9 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 - (void)reloadWithMessages:(NSArray *)messages keepOffset:(BOOL)keepOffset scrollToBottom:(BOOL)scrollToBottom { + if (self.inverted) { + keepOffset = NO; + } CGFloat oldContentHeight = self.tableView.contentSize.height; CGFloat oldOffsetY = self.tableView.contentOffset.y; KBAiChatMessage *anchorMessage = nil; @@ -400,8 +582,14 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 [self.messages removeAllObjects]; if (messages.count > 0) { - for (KBAiChatMessage *message in messages) { - [self insertMessageWithTimestamp:message]; + if (self.inverted) { + NSArray *rebuilt = [self invertedMessagesByInsertingTimestamps:messages + startingReference:nil]; + [self.messages addObjectsFromArray:rebuilt]; + } else { + for (KBAiChatMessage *message in messages) { + [self insertMessageWithTimestamp:message]; + } } } @@ -432,6 +620,9 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 NSLog(@"[KBChatTableView] ========== reloadWithMessages 结束 =========="); if (keepOffset) { + if (self.inverted) { + keepOffset = NO; + } CGFloat offsetY = oldOffsetY; if (anchorMessage) { NSInteger newIndex = [self.messages indexOfObjectIdenticalTo:anchorMessage]; @@ -480,6 +671,36 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 [self.messages addObject:message]; } +- (NSArray *)invertedItemsForNewMessageAtBeginning:(KBAiChatMessage *)message { + NSMutableArray *result = [NSMutableArray array]; + NSInteger firstIndex = [self firstNonTimeIndex]; + KBAiChatMessage *reference = (firstIndex != NSNotFound) ? self.messages[firstIndex] : nil; + + [result addObject:message]; + if (!reference || [self shouldInsertTimestampBetweenMessage:message andReference:reference]) { + KBAiChatMessage *timeMessage = [KBAiChatMessage timeMessageWithTimestamp:message.timestamp]; + [result addObject:timeMessage]; + } + return result; +} + +- (NSArray *)invertedMessagesByInsertingTimestamps:(NSArray *)messages + startingReference:(nullable KBAiChatMessage *)reference { + NSMutableArray *result = [NSMutableArray array]; + KBAiChatMessage *ref = reference; + for (KBAiChatMessage *msg in messages) { + if (ref && [self shouldInsertTimestampBetweenMessage:msg andReference:ref]) { + KBAiChatMessage *timeMessage = [KBAiChatMessage timeMessageWithTimestamp:msg.timestamp]; + [result addObject:timeMessage]; + } else if (!ref) { + // 第一条消息不强制插时间,避免底部多一条时间戳 + } + [result addObject:msg]; + ref = msg; + } + return result; +} + - (NSInteger)firstVisibleNonTimeRowExcludingMessage:(KBAiChatMessage *)excludedMessage { NSArray *visible = self.tableView.indexPathsForVisibleRows; if (visible.count == 0) { return NSNotFound; } @@ -605,6 +826,48 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 }]; } +- (void)appendHistoryMessages:(NSArray *)messages + openingMessage:(nullable KBAiChatMessage *)openingMessage { + if (messages.count == 0) { + return; + } + + NSInteger insertIndex = self.messages.count; + if (openingMessage) { + NSInteger openingIndex = [self.messages indexOfObjectIdenticalTo:openingMessage]; + if (openingIndex != NSNotFound) { + insertIndex = openingIndex; + } + } + + NSInteger referenceIndex = [self lastNonTimeIndexBeforeIndex:insertIndex]; + KBAiChatMessage *reference = (referenceIndex != NSNotFound) ? self.messages[referenceIndex] : nil; + + NSArray *toInsert = nil; + if (self.inverted) { + toInsert = [self invertedMessagesByInsertingTimestamps:messages startingReference:reference]; + } else { + toInsert = [self messagesByInsertingTimestamps:messages]; + } + + [UIView performWithoutAnimation:^{ + NSRange range = NSMakeRange(insertIndex, toInsert.count); + NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range]; + [self.messages insertObjects:toInsert atIndexes:set]; + + NSMutableArray *indexPaths = [NSMutableArray array]; + for (NSInteger i = 0; i < toInsert.count; i++) { + [indexPaths addObject:[NSIndexPath indexPathForRow:insertIndex + i inSection:0]]; + } + + [self.tableView beginUpdates]; + [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; + [self.tableView endUpdates]; + + [self.tableView layoutIfNeeded]; + }]; +} + /// 判断是否需要插入时间戳 - (BOOL)shouldInsertTimestampForMessage:(KBAiChatMessage *)message { // 第一条消息总是显示时间 @@ -659,19 +922,37 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 } - (void)stopPreviousIncompleteAssistantMessageIfNeeded { - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *msg = self.messages[i]; - if (msg.type == KBAiChatMessageTypeAssistant && !msg.isComplete) { - msg.isComplete = YES; - msg.needsTypewriterEffect = NO; - - NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; - KBChatAssistantMessageCell *oldCell = [self.tableView cellForRowAtIndexPath:oldIndexPath]; - if ([oldCell isKindOfClass:[KBChatAssistantMessageCell class]]) { - [oldCell stopTypewriterEffect]; - oldCell.messageLabel.text = msg.text; + if (self.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *msg = self.messages[i]; + if (msg.type == KBAiChatMessageTypeAssistant && !msg.isComplete) { + msg.isComplete = YES; + msg.needsTypewriterEffect = NO; + + NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; + KBChatAssistantMessageCell *oldCell = [self.tableView cellForRowAtIndexPath:oldIndexPath]; + if ([oldCell isKindOfClass:[KBChatAssistantMessageCell class]]) { + [oldCell stopTypewriterEffect]; + oldCell.messageLabel.text = msg.text; + } + break; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *msg = self.messages[i]; + if (msg.type == KBAiChatMessageTypeAssistant && !msg.isComplete) { + msg.isComplete = YES; + msg.needsTypewriterEffect = NO; + + NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; + KBChatAssistantMessageCell *oldCell = [self.tableView cellForRowAtIndexPath:oldIndexPath]; + if ([oldCell isKindOfClass:[KBChatAssistantMessageCell class]]) { + [oldCell stopTypewriterEffect]; + oldCell.messageLabel.text = msg.text; + } + break; } - break; } } } @@ -700,6 +981,7 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 KBChatUserMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:kUserCellIdentifier forIndexPath:indexPath]; [cell configureWithMessage:message]; + cell.contentView.transform = self.inverted ? CGAffineTransformMakeScale(1, -1) : CGAffineTransformIdentity; return cell; } @@ -713,6 +995,7 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 BOOL isPlaying = [indexPath isEqual:self.playingCellIndexPath]; [cell updateVoicePlayingState:isPlaying]; + cell.contentView.transform = self.inverted ? CGAffineTransformMakeScale(1, -1) : CGAffineTransformIdentity; return cell; } @@ -720,6 +1003,7 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 KBChatTimeCell *cell = [tableView dequeueReusableCellWithIdentifier:kTimeCellIdentifier forIndexPath:indexPath]; [cell configureWithMessage:message]; + cell.contentView.transform = self.inverted ? CGAffineTransformMakeScale(1, -1) : CGAffineTransformIdentity; return cell; } } @@ -732,6 +1016,42 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 #pragma mark - UIScrollViewDelegate +- (UICollectionView *)nearestCollectionView { + UIView *view = self; + while (view) { + if ([view isKindOfClass:[UICollectionView class]]) { + return (UICollectionView *)view; + } + view = view.superview; + } + return nil; +} + +- (void)setNearestCollectionViewScrollEnabled:(BOOL)enabled { + UICollectionView *collectionView = [self nearestCollectionView]; + if (!collectionView) { + return; + } + if (collectionView.scrollEnabled == enabled) { + return; + } + collectionView.scrollEnabled = enabled; +} + +- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { + [self setNearestCollectionViewScrollEnabled:NO]; +} + +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { + if (!decelerate) { + [self setNearestCollectionViewScrollEnabled:YES]; + } +} + +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + [self setNearestCollectionViewScrollEnabled:YES]; +} + - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if ([self.delegate respondsToSelector:@selector(chatTableViewDidScroll:scrollView:)]) { [self.delegate chatTableViewDidScroll:self scrollView:scrollView]; @@ -743,23 +1063,18 @@ static const NSTimeInterval kTimestampInterval = 5 * 60; // 5 分钟 withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { - CGFloat offsetY = scrollView.contentOffset.y; CGFloat contentHeight = scrollView.contentSize.height; CGFloat scrollViewHeight = scrollView.bounds.size.height; + CGFloat minOffset = -scrollView.contentInset.top; + CGFloat maxOffset = contentHeight - scrollViewHeight + scrollView.contentInset.bottom; + if (maxOffset < minOffset) { + maxOffset = minOffset; + } - // 如果内容不够长,禁用弹簧效果 - if (contentHeight <= scrollViewHeight) { - scrollView.bounces = NO; - } else { - scrollView.bounces = YES; - - // 在快速滑动到底部时,避免过度弹簧导致抖动 - if (velocity.y < 0) { // 向上滑动(到底部) - CGFloat maxOffset = contentHeight - scrollViewHeight + scrollView.contentInset.bottom; - if (targetContentOffset->y > maxOffset) { - targetContentOffset->y = maxOffset; - } - } + if (targetContentOffset->y < minOffset) { + targetContentOffset->y = minOffset; + } else if (targetContentOffset->y > maxOffset) { + targetContentOffset->y = maxOffset; } } diff --git a/keyBoard/Class/AiTalk/V/Chat/KBPersonaChatCell.m b/keyBoard/Class/AiTalk/V/Chat/KBPersonaChatCell.m index 8d16fee..69091e7 100644 --- a/keyBoard/Class/AiTalk/V/Chat/KBPersonaChatCell.m +++ b/keyBoard/Class/AiTalk/V/Chat/KBPersonaChatCell.m @@ -260,7 +260,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe __weak typeof(self) weakSelf = self; [self.aiVM fetchChatHistoryWithCompanionId:companionId pageNum:self.currentPage - pageSize:20 + pageSize:10 completion:^(KBChatHistoryPageModel *pageModel, NSError *error) { __strong typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) { @@ -304,8 +304,8 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe message.isComplete = YES; message.needsTypewriterEffect = NO; -// [newMessages addObject:message]; - [newMessages insertObject:message atIndex:0]; + [newMessages addObject:message]; +// [newMessages insertObject:message atIndex:0]; } // 插入历史消息(确保开场白始终是第一条) @@ -317,12 +317,19 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe strongSelf.messages = newMessages; [strongSelf ensureOpeningMessageAtTop]; } else { - // 后续页,插入到开场白之后 + // 后续页,继续加载历史 [strongSelf ensureOpeningMessageAtTop]; if (newMessages.count > 0) { - NSUInteger insertIndex = [strongSelf hasOpeningMessageAtTop] ? 1 : 0; - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)]; - [strongSelf.messages insertObjects:newMessages atIndexes:indexSet]; + if (strongSelf.chatView.inverted) { + NSInteger openingIndex = [strongSelf openingMessageIndexInMessages]; + NSUInteger insertIndex = (openingIndex != NSNotFound) ? (NSUInteger)openingIndex : strongSelf.messages.count; + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)]; + [strongSelf.messages insertObjects:newMessages atIndexes:indexSet]; + } else { + NSUInteger insertIndex = [strongSelf hasOpeningMessageAtTop] ? 1 : 0; + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)]; + [strongSelf.messages insertObjects:newMessages atIndexes:indexSet]; + } } } @@ -335,10 +342,16 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe keepOffset:NO scrollToBottom:YES]; } else { - NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, prependHistory", - (long)loadedPage); - KBAiChatMessage *openingMessage = [strongSelf hasOpeningMessageAtTop] ? strongSelf.messages.firstObject : nil; - [strongSelf.chatView prependHistoryMessages:newMessages openingMessage:openingMessage]; + if (strongSelf.chatView.inverted) { + NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, appendHistory", (long)loadedPage); + KBAiChatMessage *openingMessage = [strongSelf openingMessageInMessages]; + [strongSelf.chatView appendHistoryMessages:newMessages openingMessage:openingMessage]; + } else { + NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, prependHistory", + (long)loadedPage); + KBAiChatMessage *openingMessage = [strongSelf hasOpeningMessageAtTop] ? strongSelf.messages.firstObject : nil; + [strongSelf.chatView prependHistoryMessages:newMessages openingMessage:openingMessage]; + } } [strongSelf.chatView endLoadMoreWithHasMoreData:strongSelf.hasMoreHistory]; @@ -381,6 +394,9 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe if (self.messages.count == 0) { return NO; } + if (self.chatView.inverted) { + return [self isOpeningMessage:self.messages.lastObject]; + } return [self isOpeningMessage:self.messages.firstObject]; } @@ -409,7 +425,35 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe KBAiChatMessage *openingMsg = [KBAiChatMessage assistantMessageWithText:introText]; openingMsg.isComplete = YES; openingMsg.needsTypewriterEffect = NO; - [self.messages insertObject:openingMsg atIndex:0]; + if (self.chatView.inverted) { + [self.messages addObject:openingMsg]; + } else { + [self.messages insertObject:openingMsg atIndex:0]; + } +} + +- (nullable KBAiChatMessage *)openingMessageInMessages { + NSInteger index = [self openingMessageIndexInMessages]; + if (index == NSNotFound) { + return nil; + } + return self.messages[index]; +} + +- (NSInteger)openingMessageIndexInMessages { + NSString *introText = self.persona.introText ?: @""; + if (introText.length == 0 || self.messages.count == 0) { + return NSNotFound; + } + + if (self.chatView.inverted) { + NSInteger lastIndex = self.messages.count - 1; + KBAiChatMessage *msg = self.messages[lastIndex]; + return [self isOpeningMessage:msg] ? lastIndex : NSNotFound; + } + + KBAiChatMessage *first = self.messages.firstObject; + return [self isOpeningMessage:first] ? 0 : NSNotFound; } #pragma mark - 通知处理 @@ -454,7 +498,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe [self ensureOpeningMessageAtTop]; KBAiChatMessage *message = [KBAiChatMessage userMessageWithText:text]; - [self.messages addObject:message]; + if (self.chatView.inverted) { + [self.messages insertObject:message atIndex:0]; + } else { + [self.messages addObject:message]; + } [self.chatView addMessage:message autoScroll:YES]; } @@ -465,7 +513,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe [self ensureOpeningMessageAtTop]; KBAiChatMessage *message = [KBAiChatMessage loadingUserMessage]; - [self.messages addObject:message]; + if (self.chatView.inverted) { + [self.messages insertObject:message atIndex:0]; + } else { + [self.messages addObject:message]; + } [self.chatView addMessage:message autoScroll:YES]; } @@ -473,13 +525,25 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe [self.chatView updateLastUserMessage:text]; // 更新数据源中的消息 - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeUser && message.isLoading) { - message.text = text; - message.isLoading = NO; - message.isComplete = YES; - break; + if (self.chatView.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser && message.isLoading) { + message.text = text; + message.isLoading = NO; + message.isComplete = YES; + break; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser && message.isLoading) { + message.text = text; + message.isLoading = NO; + message.isComplete = YES; + break; + } } } } @@ -488,11 +552,21 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe [self.chatView markLastUserMessageLoadingComplete]; // 同步更新数据源 - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeUser && message.isLoading) { - message.isLoading = NO; - break; + if (self.chatView.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser && message.isLoading) { + message.isLoading = NO; + break; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeUser && message.isLoading) { + message.isLoading = NO; + break; + } } } } @@ -515,7 +589,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe KBAiChatMessage *message = [KBAiChatMessage assistantMessageWithText:text audioId:audioId]; message.needsTypewriterEffect = YES; - [self.messages addObject:message]; + if (self.chatView.inverted) { + [self.messages insertObject:message atIndex:0]; + } else { + [self.messages addObject:message]; + } [self.chatView addMessage:message autoScroll:YES]; } @@ -527,18 +605,32 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe [self ensureOpeningMessageAtTop]; KBAiChatMessage *message = [KBAiChatMessage loadingAssistantMessage]; - [self.messages addObject:message]; + if (self.chatView.inverted) { + [self.messages insertObject:message atIndex:0]; + } else { + [self.messages addObject:message]; + } [self.chatView addMessage:message autoScroll:YES]; } /// 移除 loading AI 消息 - (void)removeLoadingAssistantMessage { // 从数据源中移除 - for (NSInteger i = self.messages.count - 1; i >= 0; i--) { - KBAiChatMessage *message = self.messages[i]; - if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) { - [self.messages removeObjectAtIndex:i]; - break; + if (self.chatView.inverted) { + for (NSInteger i = 0; i < self.messages.count; i++) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) { + [self.messages removeObjectAtIndex:i]; + break; + } + } + } else { + for (NSInteger i = self.messages.count - 1; i >= 0; i--) { + KBAiChatMessage *message = self.messages[i]; + if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) { + [self.messages removeObjectAtIndex:i]; + break; + } } } @@ -556,7 +648,22 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe scrollView:(UIScrollView *)scrollView { CGFloat offsetY = scrollView.contentOffset.y; - // 下拉到顶部,加载历史消息 + if (chatView.inverted) { + CGFloat contentHeight = scrollView.contentSize.height; + CGFloat scrollViewHeight = scrollView.bounds.size.height; + CGFloat maxOffsetY = contentHeight - scrollViewHeight + scrollView.contentInset.bottom; + if (maxOffsetY < 0) { + maxOffsetY = 0; + } + if (offsetY >= maxOffsetY - 50 && !self.isLoading && self.canTriggerLoadMore && self.hasMoreHistory) { + self.canTriggerLoadMore = NO; + [self loadMoreHistory]; + } else if (offsetY < maxOffsetY - 100) { + self.canTriggerLoadMore = YES; + } + return; + } + if (offsetY <= 50 && !self.isLoading && self.canTriggerLoadMore && self.hasMoreHistory) { self.canTriggerLoadMore = NO; [self loadMoreHistory]; @@ -622,6 +729,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe if (!_chatView) { _chatView = [[KBChatTableView alloc] init]; _chatView.backgroundColor = [UIColor clearColor]; + _chatView.inverted = YES; _chatView.delegate = self; } return _chatView;