diff --git a/Cargo.lock b/Cargo.lock index 589129b..c7ad993 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,37 +1,31 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -43,162 +37,165 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "windows-sys", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arc-swap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] -name = "bitflags" -version = "1.3.2" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" -version = "1.5.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ + "find-msvc-tools", "jobserver", "libc", + "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-link 0.2.0", ] [[package]] name = "clap" -version = "4.4.7" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -206,9 +203,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -218,33 +215,33 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -252,19 +249,30 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "deranged" -version = "0.3.9" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -273,15 +281,15 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -291,14 +299,16 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.5" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" -dependencies = [ - "libc", - "windows-sys", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fnv" @@ -308,18 +318,18 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -332,9 +342,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -342,15 +352,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -359,38 +369,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -415,36 +425,50 @@ dependencies = [ "git2", "log", "octocrab", - "thiserror", + "serde", + "thiserror 1.0.69", "tokio", + "toml", ] [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", +] + [[package]] name = "gimli" -version = "0.28.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" -version = "0.18.1" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd" +checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" dependencies = [ - "bitflags 2.4.1", + "bitflags", "libc", "libgit2-sys", "log", @@ -453,23 +477,35 @@ dependencies = [ "url", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -478,9 +514,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -495,9 +531,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -507,15 +543,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -527,7 +563,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -536,9 +572,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", @@ -564,14 +600,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -585,21 +622,139 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "idna" -version = "0.4.0" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "io-uring" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "bitflags", + "cfg-if", + "libc", ] [[package]] name = "iri-string" -version = "0.7.0" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21859b667d66a4c1dacd9df0863b3efb65785474255face87f5bca39dd8407c0" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" dependencies = [ "memchr", "serde", @@ -607,46 +762,54 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", - "rustix", - "windows-sys", + "libc", + "windows-sys 0.59.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "jsonwebtoken" -version = "9.2.0" +version = "9.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ea04a7c5c055c175f189b6dc6ba036fd62306b58c66c9f6389036c503a3f4" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" dependencies = [ - "base64", + "base64 0.22.1", "js-sys", "pem", "ring", @@ -657,15 +820,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libgit2-sys" -version = "0.16.1+1.7.1" +version = "0.16.2+1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c" +checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" dependencies = [ "cc", "libc", @@ -677,9 +840,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" +checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" dependencies = [ "cc", "libc", @@ -691,9 +854,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" dependencies = [ "cc", "libc", @@ -702,16 +865,16 @@ dependencies = [ ] [[package]] -name = "linux-raw-sys" -version = "0.4.10" +name = "litemap" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -719,94 +882,88 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.9" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", - "windows-sys", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" -version = "0.32.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "octocrab" -version = "0.33.3" +version = "0.33.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054a8bf47dfa8f89bb0dcf17e485e9f49f2586c05bf0aa67b8ec5a9e7bc8dfd5" +checksum = "309f1476ea43a6cfb5a92600ef133ae22afbdce545d29666a69197769afb8605" dependencies = [ "arc-swap", "async-trait", - "base64", + "base64 0.21.7", "bytes", "cfg-if", "chrono", @@ -837,21 +994,27 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -861,9 +1024,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -871,58 +1034,58 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] name = "pem" -version = "3.0.3" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ - "base64", + "base64 0.22.1", "serde", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -932,9 +1095,18 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] [[package]] name = "powerfmt" @@ -944,36 +1116,42 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -983,9 +1161,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -994,48 +1172,35 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "ring" -version = "0.17.5" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", - "getrandom", + "cfg-if", + "getrandom 0.2.16", "libc", - "spin", "untrusted", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustix" -version = "0.38.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" -dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -1057,11 +1222,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] @@ -1074,19 +1239,25 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys", + "windows-sys 0.61.0", ] [[package]] @@ -1116,11 +1287,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -1129,9 +1300,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -1139,43 +1310,65 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.189" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.14" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +dependencies = [ + "serde_core", ] [[package]] @@ -1190,41 +1383,44 @@ dependencies = [ "serde", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "simple_asn1" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 2.0.16", "time", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.11.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "snafu" @@ -1243,7 +1439,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn 1.0.109", @@ -1251,35 +1447,35 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "socket2" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] -name = "spin" -version = "0.9.8" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" @@ -1294,52 +1490,84 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.16", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "time" -version = "0.3.30" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -1348,58 +1576,55 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ + "num-conv", "time-core", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.33.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] name = "tokio-io-timeout" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" dependencies = [ "pin-project-lite", "tokio", @@ -1407,13 +1632,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] @@ -1428,9 +1653,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -1439,6 +1664,45 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" + [[package]] name = "tower" version = "0.4.13" @@ -1462,7 +1726,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ - "bitflags 2.4.1", + "bitflags", "bytes", "futures-core", "futures-util", @@ -1479,21 +1743,21 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -1503,50 +1767,35 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "untrusted" @@ -1556,9 +1805,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -1566,11 +1815,17 @@ dependencies = [ "serde", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "vcpkg" @@ -1589,40 +1844,60 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1630,131 +1905,363 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +dependencies = [ + "unicode-ident", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "winapi-util" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "windows-sys 0.61.0", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "windows-core" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.0", + "windows-result", + "windows-strings", +] [[package]] -name = "winapi-util" -version = "0.1.6" +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ - "winapi", + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-result" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", +] [[package]] -name = "windows-core" -version = "0.51.1" +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets", + "windows-targets 0.53.3", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" dependencies = [ - "windows-targets", + "windows-link 0.2.0", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link 0.1.3", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] [[package]] name = "zeroize" -version = "1.6.0" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] diff --git a/Cargo.toml b/Cargo.toml index e510f2c..c467b45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,5 +13,7 @@ env_logger = "0.10.0" git2 = "0.18.1" log = "0.4.20" octocrab = "0.33" +serde = { version = "1.0.224", features = ["derive"] } thiserror = "1.0.40" tokio = { version = "1.33.0", features = ["full"] } +toml = "0.9.6" diff --git a/README.md b/README.md index 8b13789..32aff62 100644 --- a/README.md +++ b/README.md @@ -1 +1,40 @@ +# Gerris +Gerris is a :crab: trying to help with gccrs. + +## Configuration +The easiest way to use `gerris` is to create a config file similar to: + +``` toml +# common part +work = "/path/to/some/gccrs/clone/gccrs" ## existing gccrs clone that gerris can take over +github_project_owner = "github-project-owner" ## Rust-GCC for example +gcc_upstream_branch = "gnu/master" ## remote/branch for the upstream GCC project +gccrs_dev_branch = "upstream-gccrs/master" ## remote/branch for the gccrs dev branch +remote = "dkm" ## git remote where branches are to be pushed +token_file = "dkm_repo.txt" ## github token + +# to-branch = + +# for rebase only +no_fetch = true ## if true, gerris won't `git fetch` and only use current state +linearize_only = false ## only "bubble up" the merge commit +autosquash = false ## when rebasing, should gerris also squash fixup commits? + +# for upstream only +github_upstream_base = "dkm/upstream-base" ## branch name used to store current gcc upstream revision +no_rebase = true ## if true, don't rebase + +``` + +## Sync with upstream gcc + +``` sh + $ gerris --config config.toml rebase +``` + +## Create branch for upstreaming + +``` sh + $ gerris --config config.toml upstream +``` diff --git a/src/git.rs b/src/git.rs index a5093fa..ccbf3fd 100644 --- a/src/git.rs +++ b/src/git.rs @@ -1,3 +1,6 @@ +extern crate log as ext_log; +use ext_log::info; + use std::process::{self, Command, Stdio}; use std::{fmt, io}; @@ -8,14 +11,26 @@ mod branch; mod cherry_pick; mod fetch; mod log; +mod merge; +mod mergebase; +mod push; +mod rebase; mod rev_list; +mod revparse; +mod show; mod switch; pub use branch::{branch, StartingPoint}; pub use cherry_pick::cherry_pick; pub use fetch::fetch; pub use log::log; +pub use merge::merge; +pub use mergebase::merge_base; +pub use push::push; +pub use rebase::rebase; pub use rev_list::rev_list; +pub use revparse::revparse; +pub use show::show; pub use switch::switch; #[derive(Debug, Error)] @@ -35,18 +50,21 @@ impl fmt::Display for Error { #[derive(Clone, Copy)] pub enum Format { Hash, + ShortHash, Title, } impl Format { fn as_str(&self) -> &str { match self { - Format::Hash => "%h", + Format::Hash => "%H", + Format::ShortHash => "%h", Format::Title => "%s", } } } +pub struct Revision>(pub T); pub struct Branch>(pub T); pub struct Commit>(pub T); @@ -57,7 +75,6 @@ pub trait GitCmd: Sized { cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); self.setup(&mut cmd); - let output = cmd.spawn()?.wait_with_output()?; if output.status.success() { @@ -66,6 +83,32 @@ pub trait GitCmd: Sized { Err(Error::Status(output)) } } - fn setup(self, cmd: &mut Command); } + +pub fn split_remote_branch(rev: &str) -> Option<(&str, &str)> { + let split: Vec<&str> = rev.splitn(2, '/').collect(); + + if split.len() < 2 { + return None; + } + + Some((split[0], split[1])) +} + +pub fn maybe_fetch_from_branch(rev: &str) -> Result<(), Error> { + let (remote, _) = if let Some((rem, br)) = split_remote_branch(rev) { + info!("Remote: {rem}, branch: {br}"); + (Some(rem), br) + } else { + info!("branch spec has no remote: {rev}"); + (None, rev) + }; + + if let Some(rem) = remote { + info!("Fetching from {rem}"); + fetch().remote(rem).spawn()?; + } + + Ok(()) +} diff --git a/src/git/log.rs b/src/git/log.rs index 82d1b8d..5c24de6 100644 --- a/src/git/log.rs +++ b/src/git/log.rs @@ -9,6 +9,7 @@ pub struct Log { branch: Option, grep: Option, format: Option, + merges: Option, } pub fn log() -> Log { @@ -43,6 +44,12 @@ impl Log { ..self } } + pub fn merges>(self, merges: T) -> Log { + Log { + merges: Some(merges.into()), + ..self + } + } } impl GitCmd for Log { @@ -54,5 +61,12 @@ impl GitCmd for Log { self.format .map(|f| cmd.arg(format!("--format={}", f.as_str()))); self.branch.map(|b| cmd.arg(b)); + self.merges.map(|b| { + if b { + cmd.arg("--merges") + } else { + cmd.arg("--no-merges") + } + }); } } diff --git a/src/git/merge.rs b/src/git/merge.rs new file mode 100644 index 0000000..1f445e1 --- /dev/null +++ b/src/git/merge.rs @@ -0,0 +1,59 @@ +use super::GitCmd; + +use std::process::Command; + +// FIXME: Add a derive(Builder) +pub struct Merge { + other_branch: String, + strategy: Option, + message: Option, + no_edit: bool, +} + +pub fn merge>(other_branch: T) -> Merge { + Merge { + other_branch: other_branch.into(), + strategy: None, + message: None, + no_edit: false, + } +} + +impl Merge { + pub fn message>(self, message: T) -> Merge { + Merge { + message: Some(message.into()), + ..self + } + } + + pub fn no_edit(self) -> Merge { + Merge { + no_edit: true, + ..self + } + } + + // FIXME add better type for strategy + pub fn strategy>(self, strategy: T) -> Merge { + Merge { + strategy: Some(strategy.into()), + ..self + } + } +} + +impl GitCmd for Merge { + fn setup(self, cmd: &mut Command) { + cmd.arg("merge"); + + self.strategy.map(|s| cmd.arg("--strategy").arg(s)); + + if self.no_edit { + cmd.arg("--no-edit"); + } + + self.message.map(|m| cmd.arg("-m").arg(m.as_str())); + cmd.arg(self.other_branch); + } +} diff --git a/src/git/mergebase.rs b/src/git/mergebase.rs new file mode 100644 index 0000000..c11668c --- /dev/null +++ b/src/git/mergebase.rs @@ -0,0 +1,23 @@ +use super::GitCmd; +use std::process::Command; + +// FIXME: Add a derive(Builder) +pub struct Mergebase { + commit1: String, + commit2: String, +} + +pub fn merge_base, T2: Into>(commit1: T1, commit2: T2) -> Mergebase { + Mergebase { + commit1: commit1.into(), + commit2: commit2.into(), + } +} + +impl GitCmd for Mergebase { + fn setup(self, cmd: &mut Command) { + cmd.arg("merge-base"); + cmd.arg(self.commit1); + cmd.arg(self.commit2); + } +} diff --git a/src/git/push.rs b/src/git/push.rs new file mode 100644 index 0000000..c883a2e --- /dev/null +++ b/src/git/push.rs @@ -0,0 +1,63 @@ +use super::GitCmd; + +use std::process::Command; + +// FIXME: Add a derive(Builder) +#[derive(Default)] +pub struct Push { + set_upstream: bool, + force: bool, + remote: Option, + refspec: Option, +} + +pub fn push() -> Push { + Push::default() +} + +impl Push { + pub fn set_upstream(self) -> Push { + Push { + set_upstream: true, + ..self + } + } + + pub fn force(self) -> Push { + Push { + force: true, + ..self + } + } + + pub fn remote>(self, remote: T) -> Push { + Push { + remote: Some(remote.into()), + ..self + } + } + + pub fn refspec>(self, refspec: T) -> Push { + Push { + refspec: Some(refspec.into()), + ..self + } + } +} + +impl GitCmd for Push { + fn setup(self, cmd: &mut Command) { + cmd.arg("push"); + if self.set_upstream { + cmd.arg("--set-upstream"); + } + + self.remote.map(|x| cmd.arg(x)); + + if self.force { + cmd.arg("--force"); + } + + self.refspec.map(|r| cmd.arg(r)); + } +} diff --git a/src/git/rebase.rs b/src/git/rebase.rs new file mode 100644 index 0000000..589ed2b --- /dev/null +++ b/src/git/rebase.rs @@ -0,0 +1,66 @@ +use super::GitCmd; +use std::process::Command; + +// FIXME: Add a derive(Builder) +pub struct Rebase { + onto: String, + interactive: bool, + autosquash: bool, + add_missing_prefix: bool, +} + +pub fn rebase>(onto: T) -> Rebase { + Rebase { + onto: onto.into(), + interactive: false, + autosquash: false, + add_missing_prefix: false, + } +} + +impl Rebase { + pub fn interactive(self) -> Rebase { + Rebase { + interactive: true, + ..self + } + } + + pub fn autosquash(self) -> Rebase { + Rebase { + autosquash: true, + ..self + } + } + + pub fn add_missing_prefix(self) -> Rebase { + Rebase { + add_missing_prefix: true, + ..self + } + } +} + +impl GitCmd for Rebase { + fn setup(self, cmd: &mut Command) { + if self.interactive { + cmd.arg("-c").arg("sequence.editor=true"); + } + + if self.add_missing_prefix { + cmd.arg("-c").arg("core.editor=sed -i '1{/^gccrs: /!s/^/gccrs: /}'"); + cmd.arg("-c").arg("sequence.editor=sed -i -e 's/pick/reword/g'"); + } + + cmd.arg("rebase"); + + if self.interactive || self.add_missing_prefix { + cmd.arg("--interactive"); + } + + if self.autosquash { + cmd.arg("--autosquash"); + } + cmd.arg(self.onto); + } +} diff --git a/src/git/revparse.rs b/src/git/revparse.rs new file mode 100644 index 0000000..73cab39 --- /dev/null +++ b/src/git/revparse.rs @@ -0,0 +1,27 @@ +use super::{GitCmd, Revision}; + +use std::process::Command; + +// FIXME: Add a derive(Builder) +#[derive(Default)] +pub struct RevParse { + revision: String, +} + +pub fn revparse() -> RevParse { + RevParse::default() +} + +impl RevParse { + pub fn revision>(self, Revision(revision): Revision) -> RevParse { + RevParse { + revision: revision.into(), + } + } +} + +impl GitCmd for RevParse { + fn setup(self, cmd: &mut Command) { + cmd.arg("rev-parse").arg(self.revision); + } +} diff --git a/src/git/show.rs b/src/git/show.rs new file mode 100644 index 0000000..64f47c1 --- /dev/null +++ b/src/git/show.rs @@ -0,0 +1,44 @@ +use super::GitCmd; +use std::process::Command; + +// FIXME: Add a derive(Builder) +pub struct Show { + format: Option, + no_patch: bool, + rev: String, +} + +pub fn show>(rev: T) -> Show { + Show { + rev: rev.into(), + no_patch: false, + format: None, + } +} + +impl Show { + pub fn no_patch(self) -> Show { + Show { + no_patch: true, + ..self + } + } + + pub fn format>(self, format: T) -> Show { + Show { + format: Some(format.into()), + ..self + } + } +} + +impl GitCmd for Show { + fn setup(self, cmd: &mut Command) { + cmd.arg("show"); + self.format.map(|x| cmd.arg(format!("--format={x}"))); + if self.no_patch { + cmd.arg("--no-patch"); + } + cmd.arg(self.rev); + } +} diff --git a/src/git/switch.rs b/src/git/switch.rs index 449aa19..fb18fb9 100644 --- a/src/git/switch.rs +++ b/src/git/switch.rs @@ -1,17 +1,54 @@ -use super::GitCmd; +use super::{GitCmd, Revision}; use std::process::Command; +#[derive(Default)] pub struct Switch { to: String, + create: bool, + start_point: Option, + force: bool, } pub fn switch>(to: T) -> Switch { - Switch { to: to.into() } + let d = Switch::default(); + Switch { to: to.into(), ..d } +} + +impl Switch { + pub fn create(self) -> Switch { + Switch { + create: true, + ..self + } + } + + pub fn start_point>(self, Revision(revision): Revision) -> Switch { + Switch { + start_point: Some(revision.into()), + ..self + } + } + + pub fn force(self) -> Switch { + Switch { + force: true, + ..self + } + } } impl GitCmd for Switch { fn setup(self, cmd: &mut Command) { - cmd.arg("switch").arg(self.to); + cmd.arg("switch"); + if self.create { + if self.force { + cmd.arg("-C"); + } else { + cmd.arg("-c"); + } + } + cmd.arg(self.to); + self.start_point.map(|r| cmd.arg(r.as_str())); } } diff --git a/src/main.rs b/src/main.rs index 0a2b900..bc2439e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,10 @@ +use serde::Deserialize; +use std::fs; +use std::io::Error; + use std::path::PathBuf; +use chrono::Local; use clap::{Parser, Subcommand}; // FIXME: Add env_logger, would fit quite nicely here @@ -9,62 +14,333 @@ use clap::{Parser, Subcommand}; mod clog; pub mod git; mod parser; +mod rebaseupstream; mod upstream; +#[derive(Debug, Deserialize)] +struct Config { + work: Option, + github_project_owner: Option, + gcc_upstream_branch: Option, + gccrs_dev_branch: Option, + remote: Option, + token_file: Option, + to_branch: Option, + no_fetch: Option, + linearize_only: Option, + autosquash: Option, + github_upstream_base: Option, + no_rebase: Option, + add_missing_prefix: Option, +} + +impl Config { + fn new() -> Self { + Config { + work: None, + github_project_owner: None, + gcc_upstream_branch: None, + gccrs_dev_branch: None, + remote: None, + token_file: None, + to_branch: None, + no_fetch: None, + linearize_only: None, + autosquash: None, + github_upstream_base: None, + no_rebase: None, + add_missing_prefix: None, + } + } + + fn to_upstreamopt( + &mut self, + token_file: Option, + github_project_owner: Option, + github_upstream_base: Option, + no_fetch: u8, + no_rebase: u8, + new_branch: Option, + gcc_upstream_branch: Option, + gccrs_dev_branch: Option, + gccrs: Option, + remote: Option, + add_missing_prefix: u8, + ) -> Result { + let token = if let Some(tf) = token_file { + Some(fs::read_to_string(&tf)?.trim().to_string()) + } else if let Some(tf) = &self.token_file { + Some(fs::read_to_string(&tf)?.trim().to_string()) + } else { + None + }; + Ok(upstream::UpstreamOpt { + token, + github_project_owner: github_project_owner.or(self.github_project_owner.take()), + github_upstream_base: github_upstream_base.or(self.github_upstream_base.take()), + no_fetch: no_fetch > 0 || self.no_fetch.map_or(false, |v| v), + no_rebase: no_rebase > 0 || self.no_rebase.map_or(false, |v| v), + new_branch: new_branch + .or(self.to_branch.take()) + .or(Some(create_new_branch_name("rebase-upstream"))) + .unwrap(), + gcc_upstream_branch: gcc_upstream_branch + .or(self.gcc_upstream_branch.take()) + .or(Some("gnu/trunk".to_string())) + .unwrap(), + gccrs_dev_branch: gccrs_dev_branch + .or(self.gccrs_dev_branch.take()) + .or(Some("upstream-gccrs/master".to_string())) + .unwrap(), + gccrs: gccrs.or(self.work.take().map(PathBuf::from)).unwrap(), + remote: remote.or(self.remote.take()), + add_missing_prefix: add_missing_prefix > 0 + || self.add_missing_prefix.map_or(false, |v| v), + }) + } + + fn to_rebaseupstreamopt( + &mut self, + token_file: Option, + github_project_owner: Option, + autosquash: u8, + linearize_only: u8, + no_fetch: u8, + gcc_upstream_branch: Option, + gccrs_dev_branch: Option, + new_branch: Option, + gccrs: Option, + remote: Option, + ) -> Result { + let token = if let Some(tf) = token_file { + Some(fs::read_to_string(&tf)?.trim().to_string()) + } else if let Some(tf) = &self.token_file { + Some(fs::read_to_string(&tf)?.trim().to_string()) + } else { + None + }; + println!("{:#?}", self); + + Ok(rebaseupstream::RebaseUpstreamOpt { + token: token, + github_project_owner: github_project_owner.or(self.github_project_owner.take()), + autosquash: autosquash > 0 || self.autosquash.map_or(false, |v| v), + linearize_only: linearize_only > 0 || self.linearize_only.map_or(false, |v| v), + no_fetch: no_fetch > 0 || self.no_fetch.map_or(false, |v| v), + gcc_upstream_branch: gcc_upstream_branch + .or(self.gcc_upstream_branch.take()) + .or(Some("gnu/trunk".to_string())) + .unwrap(), + gccrs_dev_branch: gccrs_dev_branch + .or(self.gccrs_dev_branch.take()) + .or(Some("upstream-gccrs/master".to_string())) + .unwrap(), + new_branch: new_branch + .or(self.to_branch.take()) + .or(Some(create_new_branch_name("rebase"))) + .unwrap(), + gccrs: gccrs.or(self.work.take().map(PathBuf::from)).unwrap(), + remote: remote.or(self.remote.take()), + }) + } +} + #[derive(Clone, Subcommand)] enum SubCmd { /// Check the output of GCC's changelog checker (`contrib/gcc-changelog/git_check_commit.py`) /// on a range of commit and post a message on GitHub indicating the necessary changes. This /// subcommand takes the output of the above mentioned script as input on `stdin`. ChangeLogs, + /// Updates current branch by rebasing over upstream branch and moving all + /// commits following the latest merge within the existing sequence located + /// before the merge. + Rebase { + #[arg( + short, + long, + help = "Path to file containing the GitHub token to perform actions as gerris" + )] + token_file: Option, + + #[arg(long, help = "GitHub project owner")] + github_project_owner: Option, + + #[arg(long, help = "GCC upstream branch")] + gcc_upstream_branch: Option, + + #[arg(long, help = "Do not update remotes", action = clap::ArgAction::Count)] + no_fetch: u8, + + #[arg( + long, + help = "Only linearize commit sequence, do not rebase over updated upstream", + action = clap::ArgAction::Count + )] + linearize_only: u8, + + #[arg(long, help = "gccrs development branch")] + gccrs_dev_branch: Option, + + #[arg(long, help = "autosquash fixup commits", action = clap::ArgAction::Count)] + autosquash: u8, + + #[arg( + long, + help = "Force branch name that gerris will create for the new pull-request (uses today's date by default)" + )] + to_branch: Option, + + #[arg(short, long, help = "Push the branch to the specified remote")] + remote: Option, + + #[arg( + short, + long, + help = "work directory which contains a copy of the gccrs respository" + )] + work: Option, + }, /// Create a PR on `gccrs`'s repository containing the commits from master which haven't yet /// been formatted properly for upstreaming. Upstream { - #[arg(short, long, help = "GitHub token to perform actions as gerris")] - token: Option, + #[arg( + short, + long, + help = "Path to file containing the GitHub token to perform actions as gerris" + )] + token_file: Option, + + #[arg(long, help = "GitHub project owner")] + github_project_owner: Option, + + #[arg( + long, + help = "Name for the base branch to be used for the pull-request. This should be an upstream branch." + )] + github_upstream_base: Option, + #[arg( long, - help = "Branch on which to base the pull-request gerris will create" + help = "Force branch name that gerris will create for the new pull-request (uses today's date by default)" )] - to: String, + to_branch: Option, + + #[arg(long, help = "Do not update remotes", action = clap::ArgAction::Count)] + no_fetch: u8, + + #[arg(long, help = "Do not rebase onto latest upstream GCC", action = clap::ArgAction::Count)] + no_rebase: u8, + + #[arg(long, help = "GCC upstream branch")] + gcc_upstream_branch: Option, + + #[arg(long, help = "gccrs development branch.")] + gccrs_dev_branch: Option, + #[arg( short, long, help = "Work directory which contains a copy of the gccrs respository" )] - work: PathBuf, + work: Option, + + #[arg(short, long, help = "Push the branch to the specified remote")] + remote: Option, - #[arg(short, long, help = "ssh key to use when pushing created branches")] - ssh: PathBuf, + #[arg(long, help = "Add missing 'gccrs: ' prefix to commit when missing", action = clap::ArgAction::Count)] + add_missing_prefix: u8, }, } #[derive(Parser)] struct Args { + #[arg(long, help = "TOML config file")] + config: Option, + #[command(subcommand)] cmd: SubCmd, } +fn create_new_branch_name(topic: &str) -> String { + format!("gerris/{topic}/{}", Local::now().date_naive()) +} + #[tokio::main] async fn main() -> anyhow::Result<()> { let args = Args::parse(); env_logger::init(); + let mut conf = if let Some(toml_config) = args.config { + let content = std::fs::read_to_string(toml_config)?; + toml::from_str(&content)? + } else { + Config::new() + }; + match args.cmd { SubCmd::ChangeLogs => clog::check_clog_checker_output()?, + SubCmd::Rebase { + token_file, + github_project_owner, + gcc_upstream_branch, + linearize_only, + no_fetch, + gccrs_dev_branch, + autosquash, + to_branch: new_branch, + work, + remote, + } => { + let sconf = conf.to_rebaseupstreamopt( + token_file, + github_project_owner, + autosquash, + linearize_only, + no_fetch, + gcc_upstream_branch, + gccrs_dev_branch, + new_branch, + work, + remote, + )?; + + rebaseupstream::rebase_and_update(sconf).await? + } + SubCmd::Upstream { - token, - to, + token_file, + github_project_owner, + github_upstream_base, + no_fetch, + no_rebase, + to_branch: new_branch, + gcc_upstream_branch, + gccrs_dev_branch, work, - ssh, + remote, + add_missing_prefix, } => { - upstream::prepare_commits(upstream::UpstreamOpt { + let token = if let Some(tf) = token_file { + Some(fs::read_to_string(&tf)?.trim().to_string()) + } else { + None + }; + + let sconf = conf.to_upstreamopt( token, - branch: to, - gccrs: work, - ssh, - }) - .await? + github_project_owner, + github_upstream_base, + no_fetch, + no_rebase, + new_branch, + gcc_upstream_branch, + gccrs_dev_branch, + work, + remote, + add_missing_prefix, + )?; + + upstream::prepare_commits_bis(sconf).await? } } diff --git a/src/rebaseupstream.rs b/src/rebaseupstream.rs new file mode 100644 index 0000000..c080059 --- /dev/null +++ b/src/rebaseupstream.rs @@ -0,0 +1,197 @@ +use crate::git::{self, split_remote_branch, GitCmd}; +use chrono::Local; +use log::info; +use octocrab::OctocrabBuilder; +use std::fmt::{Display, Formatter, Result as FmtResult}; +use std::io; +use std::path::PathBuf; +use std::string; +use thiserror::Error; + +pub struct RebaseUpstreamOpt { + pub token: Option, + pub github_project_owner: Option, + pub autosquash: bool, + pub linearize_only: bool, + pub no_fetch: bool, + pub gcc_upstream_branch: String, + pub gccrs_dev_branch: String, + pub new_branch: String, + pub gccrs: PathBuf, + pub remote: Option, +} + +#[derive(Debug, Error)] +pub enum Error { + Io(#[from] io::Error), + Utf8(#[from] string::FromUtf8Error), + Git(#[from] git::Error), + InvalidInput, +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, "{self:#?}") + } +} + +pub async fn rebase_and_update( + RebaseUpstreamOpt { + token, + github_project_owner, + autosquash, + linearize_only, + no_fetch, + gcc_upstream_branch, + gccrs_dev_branch, + new_branch, + gccrs, + remote, + }: RebaseUpstreamOpt, +) -> Result<(), Error> { + std::env::set_current_dir(gccrs)?; + + if !no_fetch { + git::maybe_fetch_from_branch(&gccrs_dev_branch)?; + git::maybe_fetch_from_branch(&gcc_upstream_branch)?; + } else { + info!("Not fetching from remote."); + } + + info!("Switch to new branch, starting from revision {gccrs_dev_branch}"); + git::switch(&new_branch) + .create() + .start_point(git::Revision(&gccrs_dev_branch)) + .force() + .spawn()?; + + // find last merge commit + let last_merge_commit = String::from_utf8( + git::log() + .amount(1) + .merges(true) + .format(git::Format::Hash) + .spawn()? + .stdout, + )?; + let last_merge_commit = last_merge_commit.trim().to_string(); + info!("Last merge commit is {last_merge_commit}"); + + let head_rev = String::from_utf8( + git::revparse() + .revision(git::Revision("HEAD")) + .spawn()? + .stdout, + )?; + let head_rev = head_rev.trim().to_string(); + info!("Current revision of {gccrs_dev_branch}: {head_rev}"); + + info!("Switching back to parent of {last_merge_commit}"); + git::switch(&new_branch) + .create() + .start_point(git::Revision(format!("{last_merge_commit}^"))) + .force() + .spawn()?; + + // There are some commits after the merge, we need to apply them + if head_rev != last_merge_commit { + info!("Cherry picking commit in range {last_merge_commit}..{head_rev}"); + git::cherry_pick(git::Commit(format!("{last_merge_commit}..{head_rev}"))).spawn()?; + } + + if linearize_only { + info!("Not rebasing."); + } else { + let mut rebase_cmd = git::rebase(&gcc_upstream_branch); + + if autosquash { + info!("Autosquash requested for upcoming rebase"); + rebase_cmd = rebase_cmd.interactive().autosquash(); + } + + info!("Rebasing the sequence onto {gcc_upstream_branch}"); + rebase_cmd.spawn()?; + } + + info!("Creating new merge commit"); + + let merge_commit_message = format!( + "Merge remote-tracking branch '{gccrs_dev_branch}' into {new_branch} + +This branch has a no-op merge as the last commit: + - one arm is the \"current\" development branch from github + - the other arm is a rebased version of the \"current\" master branch onto a recent GCC's master + +The merge is obtained with \"git merge --strategy=ours\" to only keep the changes from second arm." + ); + + git::merge(&gccrs_dev_branch) + .strategy("ours") + .message(merge_commit_message) + .spawn()?; + + // Maybe push the branch. + // ... and if pushing the branch, maybe create a Pull Request + if let Some(remote_for_push) = remote { + info!("Pushing branch to {remote_for_push} {new_branch}"); + git::push() + .remote(remote_for_push) + .force() + .refspec(format!("HEAD:{new_branch}")) + .spawn()?; + + if let Some(token) = token { + info!("creating pull-request..."); + let gh_owner = github_project_owner + .expect("Missing github project owner for pull-request creation"); + + let instance = OctocrabBuilder::new() + .personal_token(token) + .build() + .unwrap(); + + let (_, rem_branch) = if let Some((rem, br)) = split_remote_branch(&gccrs_dev_branch) { + info!("Remote: {rem}, branch: {br}"); + (Some(rem), br) + } else { + info!("branch spec has no remote: {gccrs_dev_branch}"); + (None, gccrs_dev_branch.as_str()) + }; + + info!("head: {new_branch}, base: {rem_branch}"); + + let upstream_rev = String::from_utf8( + git::revparse() + .revision(git::Revision(gcc_upstream_branch)) + .spawn()? + .stdout, + )?; + + let github_rev = String::from_utf8( + git::revparse() + .revision(git::Revision(&gccrs_dev_branch)) + .spawn()? + .stdout, + )?; + + let pr_descr = format!("This is a sync with upstream GCC:\n - upstream GCC revision: {upstream_rev}\n - gccrs github: {github_rev}\n-- [gerris](https://github.com/Rust-GCC/gerris) 🦀\n"); + + instance + .pulls(gh_owner, "gccrs") + .create( + format!( + "Sync with upstream ({}): {upstream_rev}", + Local::now().date_naive() + ), + &new_branch, + rem_branch, + ) + .body(pr_descr) + .maintainer_can_modify(true) + .send() + .await + .unwrap(); + } + } + Ok(()) +} diff --git a/src/upstream.rs b/src/upstream.rs index e4e5f51..5c2dc30 100644 --- a/src/upstream.rs +++ b/src/upstream.rs @@ -73,6 +73,7 @@ // git push -u origin HEAD // create_pr() +use std::collections::BTreeSet; use std::fmt::{Display, Formatter, Result as FmtResult}; use std::io; use std::path::PathBuf; @@ -87,9 +88,16 @@ use crate::git::{self, GitCmd}; pub struct UpstreamOpt { pub token: Option, - pub branch: String, + pub github_project_owner: Option, + pub github_upstream_base: Option, + pub no_fetch: bool, + pub no_rebase: bool, + pub new_branch: String, + pub gcc_upstream_branch: String, + pub gccrs_dev_branch: String, pub gccrs: PathBuf, - pub ssh: PathBuf, + pub remote: Option, + pub add_missing_prefix: bool, } #[derive(Debug, Error)] @@ -98,6 +106,7 @@ pub enum Error { Utf8(#[from] string::FromUtf8Error), Git(#[from] git2::Error), Gitv2(#[from] git::Error), + NotAMerge, } impl Display for Error { @@ -127,29 +136,40 @@ impl Display for Error { pub async fn prepare_commits( UpstreamOpt { token, - branch, + github_project_owner: _gh, + github_upstream_base: _, + no_fetch, + no_rebase: _, + new_branch: _, + gcc_upstream_branch, + gccrs_dev_branch, gccrs, - ssh: _ssh, // FIXME: Use ssh key for pushing + remote: _remote, + add_missing_prefix: _, }: UpstreamOpt, ) -> Result<(), Error> { // let _ = CdRaii::change_path(gccrs); std::env::set_current_dir(gccrs)?; - info!("fetching `upstream`..."); - git::fetch().remote("upstream").spawn()?; + if !no_fetch { + info!("fetching `upstream`..."); + git::fetch().remote("upstream").spawn()?; - info!("fetching `gcc`..."); - git::fetch().remote("gcc").spawn()?; + info!("fetching `gcc`..."); + git::fetch().remote("gcc").spawn()?; + } else { + info!("Not fetching from remotes"); + } let last_upstreamed_commit = git::log() .amount(1) .grep("gccrs: ") - .branch(git::Branch("gcc/trunk")) + .branch(git::Branch(gcc_upstream_branch)) .format(git::Format::Title) .spawn()?; let last_upstreamed_commit = String::from_utf8(last_upstreamed_commit.stdout)?; - info!("found last upstreamed commit: {}", last_upstreamed_commit); + info!("found last upstreamed commit: {last_upstreamed_commit}"); let last_msg = last_upstreamed_commit .strip_prefix("gccrs: ") @@ -166,7 +186,7 @@ pub async fn prepare_commits( let last_commit_us = String::from_utf8(last_commit_us.stdout)?; let last_commit_us = last_commit_us.trim_end(); - info!("found equivalent commit: {}", last_commit_us); + info!("found equivalent commit: {last_commit_us}"); let rev_list = git::rev_list(last_commit_us, "upstream/master") .no_merges() @@ -214,7 +234,7 @@ pub async fn prepare_commits( .create( format!("Commits to upstream: {}", Local::now().date_naive()), new_branch, - branch, + &gccrs_dev_branch, ) .body("Hey there! I'm gerris :)") .maintainer_can_modify(true) @@ -227,3 +247,187 @@ pub async fn prepare_commits( Ok(()) } + +pub async fn prepare_commits_bis( + UpstreamOpt { + token, + github_project_owner, + github_upstream_base, + no_fetch, + no_rebase, + new_branch, + gcc_upstream_branch, + gccrs_dev_branch, + gccrs, + remote, + add_missing_prefix, + }: UpstreamOpt, +) -> Result<(), Error> { + std::env::set_current_dir(gccrs)?; + + if !no_fetch { + info!("fetching `gccrs`..."); + git::maybe_fetch_from_branch(&gccrs_dev_branch)?; + + info!("fetching `upstream gcc`..."); + git::maybe_fetch_from_branch(&gcc_upstream_branch)?; + } else { + info!("Not fetching from remotes"); + } + + let last_commit_parents = String::from_utf8( + git::show(&gccrs_dev_branch) + .no_patch() + .format("%P") + .spawn()? + .stdout, + )?; + + let is_merge = last_commit_parents.split(" ").collect::>().len() > 1; + if !is_merge { + info!("Last commit is not a merge, can't do anything."); + return Err(Error::NotAMerge); + } else { + info!("Last commit is a merge, continuing."); + } + + info!("Switch to new branch, starting from revision {gccrs_dev_branch}^"); + git::switch(&new_branch) + .create() + .start_point(git::Revision(format!("{gccrs_dev_branch}^"))) + .force() + .spawn()?; + + let merge_base = String::from_utf8( + git::merge_base(&gcc_upstream_branch, &new_branch) + .spawn()? + .stdout, + )?; + let merge_base = merge_base.trim().to_string(); + info!("Merge base is {merge_base}"); + + let rev_list_all = git::rev_list(&merge_base, &new_branch).reverse(); + let all_commits = String::from_utf8(rev_list_all.spawn()?.stdout)?; + let mut all_commits: Vec<_> = all_commits.split('\n').collect(); + let all_commits_count = all_commits.len(); + + let do_not_upstream = vec![ + ".github/", + "CODE_OF_CONDUCT.md", + "CONTRIBUTING.md", + "Dockerfile", + "README.md", + "logo.png", + "gcc/rust/gource-gccrs.sh", + "gcc/rust/monthly-diff.py", + ]; + let rev_list_to_drop = git::rev_list(&merge_base, &new_branch).dirs(do_not_upstream); + + let commits_to_drop = String::from_utf8(rev_list_to_drop.spawn()?.stdout)?; + let commits_to_drop: BTreeSet<_> = commits_to_drop.split('\n').collect(); + + all_commits.retain(|rev| !commits_to_drop.contains(rev)); + + info!("All commits: {all_commits_count}"); + info!( + "Commits to drop {}: {:?}", + commits_to_drop.len(), + commits_to_drop + ); + info!( + "Commits to apply: {}/{all_commits_count} [-{}]{:?}", + all_commits.len(), + commits_to_drop.len(), + all_commits + ); + + if no_rebase { + info!("Not rebasing, reseting branch to merge-base {merge_base}"); + git::switch(&new_branch) + .create() + .start_point(git::Revision(merge_base)) + .force() + .spawn()?; + } else { + info!("Rebasing onto new gcc upstream, reseting branch to {gcc_upstream_branch}"); + git::switch(&new_branch) + .create() + .start_point(git::Revision(&gcc_upstream_branch)) + .force() + .spawn()?; + } + + info!("Applying commits over upstream base"); + for commit in all_commits { + info!("Applying {commit}..."); + git::cherry_pick(git::Commit(commit)).spawn()?; + } + info!("Done applying"); + + if add_missing_prefix { + info!("Add missing 'gccrs:' prefix"); + let mut rebase_cmd = git::rebase(&gcc_upstream_branch) + .add_missing_prefix() + .spawn()?; + } + + if let Some(remote_for_push) = &remote { + info!("Pushing branch to {remote_for_push} {new_branch}"); + git::push() + .remote(remote_for_push) + .force() + .refspec(format!("HEAD:{new_branch}")) + .spawn()?; + } + + if let Some(token) = token { + info!("creating pull-request..."); + let gh_owner = + github_project_owner.expect("Missing github project owner for pull-request creation"); + + let github_upstream_base = + github_upstream_base.expect("Missing github upstream branch name"); + + if let Some(remote_for_push) = &remote { + info!("Pushing upstream base branch {gcc_upstream_branch} to {remote_for_push} {github_upstream_base}"); + git::push() + .remote(remote_for_push) + .force() + .refspec(format!( + "{gcc_upstream_branch}:refs/heads/{github_upstream_base}" + )) + .spawn()?; + } + + let instance = OctocrabBuilder::new() + .personal_token(token) + .build() + .unwrap(); + + // let (_, rem_branch) = if let Some((rem, br)) = split_remote_branch(&gccrs_dev_branch) { + // info!("Remote: {rem}, branch: {br}"); + // (Some(rem), br) + // } else { + // info!("branch spec has no remote: {gccrs_dev_branch}"); + // (None, gccrs_dev_branch.as_str()) + // }; + + info!("head: {new_branch}, base: {github_upstream_base}"); + + let pr_descr = format!("This is a fake PR, not meant to be merged. It tries to merge commits to upstream with an upstream base branch {github_upstream_base}.\nWe're only interested by the CI results.\n-- [gerris](https://github.com/Rust-GCC/gerris) 🦀\n"); + instance + .pulls(gh_owner, "gccrs") + .create( + format!("Fake PR to test the upstreaming of commit up to {new_branch}"), + &new_branch, + github_upstream_base, + ) + .body(pr_descr) + .maintainer_can_modify(true) + .send() + .await + .unwrap(); + } + + Ok(()) +}