Listen to git commits for a specific repo and run a shell command

Compare changes

Choose any two refs to compare.

+674
COPYING
··· 1 + GNU GENERAL PUBLIC LICENSE 2 + Version 3, 29 June 2007 3 + 4 + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> 5 + Everyone is permitted to copy and distribute verbatim copies 6 + of this license document, but changing it is not allowed. 7 + 8 + Preamble 9 + 10 + The GNU General Public License is a free, copyleft license for 11 + software and other kinds of works. 12 + 13 + The licenses for most software and other practical works are designed 14 + to take away your freedom to share and change the works. By contrast, 15 + the GNU General Public License is intended to guarantee your freedom to 16 + share and change all versions of a program--to make sure it remains free 17 + software for all its users. We, the Free Software Foundation, use the 18 + GNU General Public License for most of our software; it applies also to 19 + any other work released this way by its authors. You can apply it to 20 + your programs, too. 21 + 22 + When we speak of free software, we are referring to freedom, not 23 + price. Our General Public Licenses are designed to make sure that you 24 + have the freedom to distribute copies of free software (and charge for 25 + them if you wish), that you receive source code or can get it if you 26 + want it, that you can change the software or use pieces of it in new 27 + free programs, and that you know you can do these things. 28 + 29 + To protect your rights, we need to prevent others from denying you 30 + these rights or asking you to surrender the rights. Therefore, you have 31 + certain responsibilities if you distribute copies of the software, or if 32 + you modify it: responsibilities to respect the freedom of others. 33 + 34 + For example, if you distribute copies of such a program, whether 35 + gratis or for a fee, you must pass on to the recipients the same 36 + freedoms that you received. You must make sure that they, too, receive 37 + or can get the source code. And you must show them these terms so they 38 + know their rights. 39 + 40 + Developers that use the GNU GPL protect your rights with two steps: 41 + (1) assert copyright on the software, and (2) offer you this License 42 + giving you legal permission to copy, distribute and/or modify it. 43 + 44 + For the developers' and authors' protection, the GPL clearly explains 45 + that there is no warranty for this free software. For both users' and 46 + authors' sake, the GPL requires that modified versions be marked as 47 + changed, so that their problems will not be attributed erroneously to 48 + authors of previous versions. 49 + 50 + Some devices are designed to deny users access to install or run 51 + modified versions of the software inside them, although the manufacturer 52 + can do so. This is fundamentally incompatible with the aim of 53 + protecting users' freedom to change the software. The systematic 54 + pattern of such abuse occurs in the area of products for individuals to 55 + use, which is precisely where it is most unacceptable. Therefore, we 56 + have designed this version of the GPL to prohibit the practice for those 57 + products. If such problems arise substantially in other domains, we 58 + stand ready to extend this provision to those domains in future versions 59 + of the GPL, as needed to protect the freedom of users. 60 + 61 + Finally, every program is threatened constantly by software patents. 62 + States should not allow patents to restrict development and use of 63 + software on general-purpose computers, but in those that do, we wish to 64 + avoid the special danger that patents applied to a free program could 65 + make it effectively proprietary. To prevent this, the GPL assures that 66 + patents cannot be used to render the program non-free. 67 + 68 + The precise terms and conditions for copying, distribution and 69 + modification follow. 70 + 71 + TERMS AND CONDITIONS 72 + 73 + 0. Definitions. 74 + 75 + "This License" refers to version 3 of the GNU General Public License. 76 + 77 + "Copyright" also means copyright-like laws that apply to other kinds of 78 + works, such as semiconductor masks. 79 + 80 + "The Program" refers to any copyrightable work licensed under this 81 + License. Each licensee is addressed as "you". "Licensees" and 82 + "recipients" may be individuals or organizations. 83 + 84 + To "modify" a work means to copy from or adapt all or part of the work 85 + in a fashion requiring copyright permission, other than the making of an 86 + exact copy. The resulting work is called a "modified version" of the 87 + earlier work or a work "based on" the earlier work. 88 + 89 + A "covered work" means either the unmodified Program or a work based 90 + on the Program. 91 + 92 + To "propagate" a work means to do anything with it that, without 93 + permission, would make you directly or secondarily liable for 94 + infringement under applicable copyright law, except executing it on a 95 + computer or modifying a private copy. Propagation includes copying, 96 + distribution (with or without modification), making available to the 97 + public, and in some countries other activities as well. 98 + 99 + To "convey" a work means any kind of propagation that enables other 100 + parties to make or receive copies. Mere interaction with a user through 101 + a computer network, with no transfer of a copy, is not conveying. 102 + 103 + An interactive user interface displays "Appropriate Legal Notices" 104 + to the extent that it includes a convenient and prominently visible 105 + feature that (1) displays an appropriate copyright notice, and (2) 106 + tells the user that there is no warranty for the work (except to the 107 + extent that warranties are provided), that licensees may convey the 108 + work under this License, and how to view a copy of this License. If 109 + the interface presents a list of user commands or options, such as a 110 + menu, a prominent item in the list meets this criterion. 111 + 112 + 1. Source Code. 113 + 114 + The "source code" for a work means the preferred form of the work 115 + for making modifications to it. "Object code" means any non-source 116 + form of a work. 117 + 118 + A "Standard Interface" means an interface that either is an official 119 + standard defined by a recognized standards body, or, in the case of 120 + interfaces specified for a particular programming language, one that 121 + is widely used among developers working in that language. 122 + 123 + The "System Libraries" of an executable work include anything, other 124 + than the work as a whole, that (a) is included in the normal form of 125 + packaging a Major Component, but which is not part of that Major 126 + Component, and (b) serves only to enable use of the work with that 127 + Major Component, or to implement a Standard Interface for which an 128 + implementation is available to the public in source code form. A 129 + "Major Component", in this context, means a major essential component 130 + (kernel, window system, and so on) of the specific operating system 131 + (if any) on which the executable work runs, or a compiler used to 132 + produce the work, or an object code interpreter used to run it. 133 + 134 + The "Corresponding Source" for a work in object code form means all 135 + the source code needed to generate, install, and (for an executable 136 + work) run the object code and to modify the work, including scripts to 137 + control those activities. However, it does not include the work's 138 + System Libraries, or general-purpose tools or generally available free 139 + programs which are used unmodified in performing those activities but 140 + which are not part of the work. For example, Corresponding Source 141 + includes interface definition files associated with source files for 142 + the work, and the source code for shared libraries and dynamically 143 + linked subprograms that the work is specifically designed to require, 144 + such as by intimate data communication or control flow between those 145 + subprograms and other parts of the work. 146 + 147 + The Corresponding Source need not include anything that users 148 + can regenerate automatically from other parts of the Corresponding 149 + Source. 150 + 151 + The Corresponding Source for a work in source code form is that 152 + same work. 153 + 154 + 2. Basic Permissions. 155 + 156 + All rights granted under this License are granted for the term of 157 + copyright on the Program, and are irrevocable provided the stated 158 + conditions are met. This License explicitly affirms your unlimited 159 + permission to run the unmodified Program. The output from running a 160 + covered work is covered by this License only if the output, given its 161 + content, constitutes a covered work. This License acknowledges your 162 + rights of fair use or other equivalent, as provided by copyright law. 163 + 164 + You may make, run and propagate covered works that you do not 165 + convey, without conditions so long as your license otherwise remains 166 + in force. You may convey covered works to others for the sole purpose 167 + of having them make modifications exclusively for you, or provide you 168 + with facilities for running those works, provided that you comply with 169 + the terms of this License in conveying all material for which you do 170 + not control copyright. Those thus making or running the covered works 171 + for you must do so exclusively on your behalf, under your direction 172 + and control, on terms that prohibit them from making any copies of 173 + your copyrighted material outside their relationship with you. 174 + 175 + Conveying under any other circumstances is permitted solely under 176 + the conditions stated below. Sublicensing is not allowed; section 10 177 + makes it unnecessary. 178 + 179 + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 + 181 + No covered work shall be deemed part of an effective technological 182 + measure under any applicable law fulfilling obligations under article 183 + 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 + similar laws prohibiting or restricting circumvention of such 185 + measures. 186 + 187 + When you convey a covered work, you waive any legal power to forbid 188 + circumvention of technological measures to the extent such circumvention 189 + is effected by exercising rights under this License with respect to 190 + the covered work, and you disclaim any intention to limit operation or 191 + modification of the work as a means of enforcing, against the work's 192 + users, your or third parties' legal rights to forbid circumvention of 193 + technological measures. 194 + 195 + 4. Conveying Verbatim Copies. 196 + 197 + You may convey verbatim copies of the Program's source code as you 198 + receive it, in any medium, provided that you conspicuously and 199 + appropriately publish on each copy an appropriate copyright notice; 200 + keep intact all notices stating that this License and any 201 + non-permissive terms added in accord with section 7 apply to the code; 202 + keep intact all notices of the absence of any warranty; and give all 203 + recipients a copy of this License along with the Program. 204 + 205 + You may charge any price or no price for each copy that you convey, 206 + and you may offer support or warranty protection for a fee. 207 + 208 + 5. Conveying Modified Source Versions. 209 + 210 + You may convey a work based on the Program, or the modifications to 211 + produce it from the Program, in the form of source code under the 212 + terms of section 4, provided that you also meet all of these conditions: 213 + 214 + a) The work must carry prominent notices stating that you modified 215 + it, and giving a relevant date. 216 + 217 + b) The work must carry prominent notices stating that it is 218 + released under this License and any conditions added under section 219 + 7. This requirement modifies the requirement in section 4 to 220 + "keep intact all notices". 221 + 222 + c) You must license the entire work, as a whole, under this 223 + License to anyone who comes into possession of a copy. This 224 + License will therefore apply, along with any applicable section 7 225 + additional terms, to the whole of the work, and all its parts, 226 + regardless of how they are packaged. This License gives no 227 + permission to license the work in any other way, but it does not 228 + invalidate such permission if you have separately received it. 229 + 230 + d) If the work has interactive user interfaces, each must display 231 + Appropriate Legal Notices; however, if the Program has interactive 232 + interfaces that do not display Appropriate Legal Notices, your 233 + work need not make them do so. 234 + 235 + A compilation of a covered work with other separate and independent 236 + works, which are not by their nature extensions of the covered work, 237 + and which are not combined with it such as to form a larger program, 238 + in or on a volume of a storage or distribution medium, is called an 239 + "aggregate" if the compilation and its resulting copyright are not 240 + used to limit the access or legal rights of the compilation's users 241 + beyond what the individual works permit. Inclusion of a covered work 242 + in an aggregate does not cause this License to apply to the other 243 + parts of the aggregate. 244 + 245 + 6. Conveying Non-Source Forms. 246 + 247 + You may convey a covered work in object code form under the terms 248 + of sections 4 and 5, provided that you also convey the 249 + machine-readable Corresponding Source under the terms of this License, 250 + in one of these ways: 251 + 252 + a) Convey the object code in, or embodied in, a physical product 253 + (including a physical distribution medium), accompanied by the 254 + Corresponding Source fixed on a durable physical medium 255 + customarily used for software interchange. 256 + 257 + b) Convey the object code in, or embodied in, a physical product 258 + (including a physical distribution medium), accompanied by a 259 + written offer, valid for at least three years and valid for as 260 + long as you offer spare parts or customer support for that product 261 + model, to give anyone who possesses the object code either (1) a 262 + copy of the Corresponding Source for all the software in the 263 + product that is covered by this License, on a durable physical 264 + medium customarily used for software interchange, for a price no 265 + more than your reasonable cost of physically performing this 266 + conveying of source, or (2) access to copy the 267 + Corresponding Source from a network server at no charge. 268 + 269 + c) Convey individual copies of the object code with a copy of the 270 + written offer to provide the Corresponding Source. This 271 + alternative is allowed only occasionally and noncommercially, and 272 + only if you received the object code with such an offer, in accord 273 + with subsection 6b. 274 + 275 + d) Convey the object code by offering access from a designated 276 + place (gratis or for a charge), and offer equivalent access to the 277 + Corresponding Source in the same way through the same place at no 278 + further charge. You need not require recipients to copy the 279 + Corresponding Source along with the object code. If the place to 280 + copy the object code is a network server, the Corresponding Source 281 + may be on a different server (operated by you or a third party) 282 + that supports equivalent copying facilities, provided you maintain 283 + clear directions next to the object code saying where to find the 284 + Corresponding Source. Regardless of what server hosts the 285 + Corresponding Source, you remain obligated to ensure that it is 286 + available for as long as needed to satisfy these requirements. 287 + 288 + e) Convey the object code using peer-to-peer transmission, provided 289 + you inform other peers where the object code and Corresponding 290 + Source of the work are being offered to the general public at no 291 + charge under subsection 6d. 292 + 293 + A separable portion of the object code, whose source code is excluded 294 + from the Corresponding Source as a System Library, need not be 295 + included in conveying the object code work. 296 + 297 + A "User Product" is either (1) a "consumer product", which means any 298 + tangible personal property which is normally used for personal, family, 299 + or household purposes, or (2) anything designed or sold for incorporation 300 + into a dwelling. In determining whether a product is a consumer product, 301 + doubtful cases shall be resolved in favor of coverage. For a particular 302 + product received by a particular user, "normally used" refers to a 303 + typical or common use of that class of product, regardless of the status 304 + of the particular user or of the way in which the particular user 305 + actually uses, or expects or is expected to use, the product. A product 306 + is a consumer product regardless of whether the product has substantial 307 + commercial, industrial or non-consumer uses, unless such uses represent 308 + the only significant mode of use of the product. 309 + 310 + "Installation Information" for a User Product means any methods, 311 + procedures, authorization keys, or other information required to install 312 + and execute modified versions of a covered work in that User Product from 313 + a modified version of its Corresponding Source. The information must 314 + suffice to ensure that the continued functioning of the modified object 315 + code is in no case prevented or interfered with solely because 316 + modification has been made. 317 + 318 + If you convey an object code work under this section in, or with, or 319 + specifically for use in, a User Product, and the conveying occurs as 320 + part of a transaction in which the right of possession and use of the 321 + User Product is transferred to the recipient in perpetuity or for a 322 + fixed term (regardless of how the transaction is characterized), the 323 + Corresponding Source conveyed under this section must be accompanied 324 + by the Installation Information. But this requirement does not apply 325 + if neither you nor any third party retains the ability to install 326 + modified object code on the User Product (for example, the work has 327 + been installed in ROM). 328 + 329 + The requirement to provide Installation Information does not include a 330 + requirement to continue to provide support service, warranty, or updates 331 + for a work that has been modified or installed by the recipient, or for 332 + the User Product in which it has been modified or installed. Access to a 333 + network may be denied when the modification itself materially and 334 + adversely affects the operation of the network or violates the rules and 335 + protocols for communication across the network. 336 + 337 + Corresponding Source conveyed, and Installation Information provided, 338 + in accord with this section must be in a format that is publicly 339 + documented (and with an implementation available to the public in 340 + source code form), and must require no special password or key for 341 + unpacking, reading or copying. 342 + 343 + 7. Additional Terms. 344 + 345 + "Additional permissions" are terms that supplement the terms of this 346 + License by making exceptions from one or more of its conditions. 347 + Additional permissions that are applicable to the entire Program shall 348 + be treated as though they were included in this License, to the extent 349 + that they are valid under applicable law. If additional permissions 350 + apply only to part of the Program, that part may be used separately 351 + under those permissions, but the entire Program remains governed by 352 + this License without regard to the additional permissions. 353 + 354 + When you convey a copy of a covered work, you may at your option 355 + remove any additional permissions from that copy, or from any part of 356 + it. (Additional permissions may be written to require their own 357 + removal in certain cases when you modify the work.) You may place 358 + additional permissions on material, added by you to a covered work, 359 + for which you have or can give appropriate copyright permission. 360 + 361 + Notwithstanding any other provision of this License, for material you 362 + add to a covered work, you may (if authorized by the copyright holders of 363 + that material) supplement the terms of this License with terms: 364 + 365 + a) Disclaiming warranty or limiting liability differently from the 366 + terms of sections 15 and 16 of this License; or 367 + 368 + b) Requiring preservation of specified reasonable legal notices or 369 + author attributions in that material or in the Appropriate Legal 370 + Notices displayed by works containing it; or 371 + 372 + c) Prohibiting misrepresentation of the origin of that material, or 373 + requiring that modified versions of such material be marked in 374 + reasonable ways as different from the original version; or 375 + 376 + d) Limiting the use for publicity purposes of names of licensors or 377 + authors of the material; or 378 + 379 + e) Declining to grant rights under trademark law for use of some 380 + trade names, trademarks, or service marks; or 381 + 382 + f) Requiring indemnification of licensors and authors of that 383 + material by anyone who conveys the material (or modified versions of 384 + it) with contractual assumptions of liability to the recipient, for 385 + any liability that these contractual assumptions directly impose on 386 + those licensors and authors. 387 + 388 + All other non-permissive additional terms are considered "further 389 + restrictions" within the meaning of section 10. If the Program as you 390 + received it, or any part of it, contains a notice stating that it is 391 + governed by this License along with a term that is a further 392 + restriction, you may remove that term. If a license document contains 393 + a further restriction but permits relicensing or conveying under this 394 + License, you may add to a covered work material governed by the terms 395 + of that license document, provided that the further restriction does 396 + not survive such relicensing or conveying. 397 + 398 + If you add terms to a covered work in accord with this section, you 399 + must place, in the relevant source files, a statement of the 400 + additional terms that apply to those files, or a notice indicating 401 + where to find the applicable terms. 402 + 403 + Additional terms, permissive or non-permissive, may be stated in the 404 + form of a separately written license, or stated as exceptions; 405 + the above requirements apply either way. 406 + 407 + 8. Termination. 408 + 409 + You may not propagate or modify a covered work except as expressly 410 + provided under this License. Any attempt otherwise to propagate or 411 + modify it is void, and will automatically terminate your rights under 412 + this License (including any patent licenses granted under the third 413 + paragraph of section 11). 414 + 415 + However, if you cease all violation of this License, then your 416 + license from a particular copyright holder is reinstated (a) 417 + provisionally, unless and until the copyright holder explicitly and 418 + finally terminates your license, and (b) permanently, if the copyright 419 + holder fails to notify you of the violation by some reasonable means 420 + prior to 60 days after the cessation. 421 + 422 + Moreover, your license from a particular copyright holder is 423 + reinstated permanently if the copyright holder notifies you of the 424 + violation by some reasonable means, this is the first time you have 425 + received notice of violation of this License (for any work) from that 426 + copyright holder, and you cure the violation prior to 30 days after 427 + your receipt of the notice. 428 + 429 + Termination of your rights under this section does not terminate the 430 + licenses of parties who have received copies or rights from you under 431 + this License. If your rights have been terminated and not permanently 432 + reinstated, you do not qualify to receive new licenses for the same 433 + material under section 10. 434 + 435 + 9. Acceptance Not Required for Having Copies. 436 + 437 + You are not required to accept this License in order to receive or 438 + run a copy of the Program. Ancillary propagation of a covered work 439 + occurring solely as a consequence of using peer-to-peer transmission 440 + to receive a copy likewise does not require acceptance. However, 441 + nothing other than this License grants you permission to propagate or 442 + modify any covered work. These actions infringe copyright if you do 443 + not accept this License. Therefore, by modifying or propagating a 444 + covered work, you indicate your acceptance of this License to do so. 445 + 446 + 10. Automatic Licensing of Downstream Recipients. 447 + 448 + Each time you convey a covered work, the recipient automatically 449 + receives a license from the original licensors, to run, modify and 450 + propagate that work, subject to this License. You are not responsible 451 + for enforcing compliance by third parties with this License. 452 + 453 + An "entity transaction" is a transaction transferring control of an 454 + organization, or substantially all assets of one, or subdividing an 455 + organization, or merging organizations. If propagation of a covered 456 + work results from an entity transaction, each party to that 457 + transaction who receives a copy of the work also receives whatever 458 + licenses to the work the party's predecessor in interest had or could 459 + give under the previous paragraph, plus a right to possession of the 460 + Corresponding Source of the work from the predecessor in interest, if 461 + the predecessor has it or can get it with reasonable efforts. 462 + 463 + You may not impose any further restrictions on the exercise of the 464 + rights granted or affirmed under this License. For example, you may 465 + not impose a license fee, royalty, or other charge for exercise of 466 + rights granted under this License, and you may not initiate litigation 467 + (including a cross-claim or counterclaim in a lawsuit) alleging that 468 + any patent claim is infringed by making, using, selling, offering for 469 + sale, or importing the Program or any portion of it. 470 + 471 + 11. Patents. 472 + 473 + A "contributor" is a copyright holder who authorizes use under this 474 + License of the Program or a work on which the Program is based. The 475 + work thus licensed is called the contributor's "contributor version". 476 + 477 + A contributor's "essential patent claims" are all patent claims 478 + owned or controlled by the contributor, whether already acquired or 479 + hereafter acquired, that would be infringed by some manner, permitted 480 + by this License, of making, using, or selling its contributor version, 481 + but do not include claims that would be infringed only as a 482 + consequence of further modification of the contributor version. For 483 + purposes of this definition, "control" includes the right to grant 484 + patent sublicenses in a manner consistent with the requirements of 485 + this License. 486 + 487 + Each contributor grants you a non-exclusive, worldwide, royalty-free 488 + patent license under the contributor's essential patent claims, to 489 + make, use, sell, offer for sale, import and otherwise run, modify and 490 + propagate the contents of its contributor version. 491 + 492 + In the following three paragraphs, a "patent license" is any express 493 + agreement or commitment, however denominated, not to enforce a patent 494 + (such as an express permission to practice a patent or covenant not to 495 + sue for patent infringement). To "grant" such a patent license to a 496 + party means to make such an agreement or commitment not to enforce a 497 + patent against the party. 498 + 499 + If you convey a covered work, knowingly relying on a patent license, 500 + and the Corresponding Source of the work is not available for anyone 501 + to copy, free of charge and under the terms of this License, through a 502 + publicly available network server or other readily accessible means, 503 + then you must either (1) cause the Corresponding Source to be so 504 + available, or (2) arrange to deprive yourself of the benefit of the 505 + patent license for this particular work, or (3) arrange, in a manner 506 + consistent with the requirements of this License, to extend the patent 507 + license to downstream recipients. "Knowingly relying" means you have 508 + actual knowledge that, but for the patent license, your conveying the 509 + covered work in a country, or your recipient's use of the covered work 510 + in a country, would infringe one or more identifiable patents in that 511 + country that you have reason to believe are valid. 512 + 513 + If, pursuant to or in connection with a single transaction or 514 + arrangement, you convey, or propagate by procuring conveyance of, a 515 + covered work, and grant a patent license to some of the parties 516 + receiving the covered work authorizing them to use, propagate, modify 517 + or convey a specific copy of the covered work, then the patent license 518 + you grant is automatically extended to all recipients of the covered 519 + work and works based on it. 520 + 521 + A patent license is "discriminatory" if it does not include within 522 + the scope of its coverage, prohibits the exercise of, or is 523 + conditioned on the non-exercise of one or more of the rights that are 524 + specifically granted under this License. You may not convey a covered 525 + work if you are a party to an arrangement with a third party that is 526 + in the business of distributing software, under which you make payment 527 + to the third party based on the extent of your activity of conveying 528 + the work, and under which the third party grants, to any of the 529 + parties who would receive the covered work from you, a discriminatory 530 + patent license (a) in connection with copies of the covered work 531 + conveyed by you (or copies made from those copies), or (b) primarily 532 + for and in connection with specific products or compilations that 533 + contain the covered work, unless you entered into that arrangement, 534 + or that patent license was granted, prior to 28 March 2007. 535 + 536 + Nothing in this License shall be construed as excluding or limiting 537 + any implied license or other defenses to infringement that may 538 + otherwise be available to you under applicable patent law. 539 + 540 + 12. No Surrender of Others' Freedom. 541 + 542 + If conditions are imposed on you (whether by court order, agreement or 543 + otherwise) that contradict the conditions of this License, they do not 544 + excuse you from the conditions of this License. If you cannot convey a 545 + covered work so as to satisfy simultaneously your obligations under this 546 + License and any other pertinent obligations, then as a consequence you may 547 + not convey it at all. For example, if you agree to terms that obligate you 548 + to collect a royalty for further conveying from those to whom you convey 549 + the Program, the only way you could satisfy both those terms and this 550 + License would be to refrain entirely from conveying the Program. 551 + 552 + 13. Use with the GNU Affero General Public License. 553 + 554 + Notwithstanding any other provision of this License, you have 555 + permission to link or combine any covered work with a work licensed 556 + under version 3 of the GNU Affero General Public License into a single 557 + combined work, and to convey the resulting work. The terms of this 558 + License will continue to apply to the part which is the covered work, 559 + but the special requirements of the GNU Affero General Public License, 560 + section 13, concerning interaction through a network will apply to the 561 + combination as such. 562 + 563 + 14. Revised Versions of this License. 564 + 565 + The Free Software Foundation may publish revised and/or new versions of 566 + the GNU General Public License from time to time. Such new versions will 567 + be similar in spirit to the present version, but may differ in detail to 568 + address new problems or concerns. 569 + 570 + Each version is given a distinguishing version number. If the 571 + Program specifies that a certain numbered version of the GNU General 572 + Public License "or any later version" applies to it, you have the 573 + option of following the terms and conditions either of that numbered 574 + version or of any later version published by the Free Software 575 + Foundation. If the Program does not specify a version number of the 576 + GNU General Public License, you may choose any version ever published 577 + by the Free Software Foundation. 578 + 579 + If the Program specifies that a proxy can decide which future 580 + versions of the GNU General Public License can be used, that proxy's 581 + public statement of acceptance of a version permanently authorizes you 582 + to choose that version for the Program. 583 + 584 + Later license versions may give you additional or different 585 + permissions. However, no additional obligations are imposed on any 586 + author or copyright holder as a result of your choosing to follow a 587 + later version. 588 + 589 + 15. Disclaimer of Warranty. 590 + 591 + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 + 600 + 16. Limitation of Liability. 601 + 602 + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 + SUCH DAMAGES. 611 + 612 + 17. Interpretation of Sections 15 and 16. 613 + 614 + If the disclaimer of warranty and limitation of liability provided 615 + above cannot be given local legal effect according to their terms, 616 + reviewing courts shall apply local law that most closely approximates 617 + an absolute waiver of all civil liability in connection with the 618 + Program, unless a warranty or assumption of liability accompanies a 619 + copy of the Program in return for a fee. 620 + 621 + END OF TERMS AND CONDITIONS 622 + 623 + How to Apply These Terms to Your New Programs 624 + 625 + If you develop a new program, and you want it to be of the greatest 626 + possible use to the public, the best way to achieve this is to make it 627 + free software which everyone can redistribute and change under these terms. 628 + 629 + To do so, attach the following notices to the program. It is safest 630 + to attach them to the start of each source file to most effectively 631 + state the exclusion of warranty; and each file should have at least 632 + the "copyright" line and a pointer to where the full notice is found. 633 + 634 + <one line to give the program's name and a brief idea of what it does.> 635 + Copyright (C) <year> <name of author> 636 + 637 + This program is free software: you can redistribute it and/or modify 638 + it under the terms of the GNU General Public License as published by 639 + the Free Software Foundation, either version 3 of the License, or 640 + (at your option) any later version. 641 + 642 + This program is distributed in the hope that it will be useful, 643 + but WITHOUT ANY WARRANTY; without even the implied warranty of 644 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 + GNU General Public License for more details. 646 + 647 + You should have received a copy of the GNU General Public License 648 + along with this program. If not, see <https://www.gnu.org/licenses/>. 649 + 650 + Also add information on how to contact you by electronic and paper mail. 651 + 652 + If the program does terminal interaction, make it output a short 653 + notice like this when it starts in an interactive mode: 654 + 655 + <program> Copyright (C) <year> <name of author> 656 + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 + This is free software, and you are welcome to redistribute it 658 + under certain conditions; type `show c' for details. 659 + 660 + The hypothetical commands `show w' and `show c' should show the appropriate 661 + parts of the General Public License. Of course, your program's commands 662 + might be different; for a GUI interface, you would use an "about box". 663 + 664 + You should also get your employer (if you work as a programmer) or school, 665 + if any, to sign a "copyright disclaimer" for the program, if necessary. 666 + For more information on this, and how to apply and follow the GNU GPL, see 667 + <https://www.gnu.org/licenses/>. 668 + 669 + The GNU General Public License does not permit incorporating your program 670 + into proprietary programs. If your program is a subroutine library, you 671 + may consider it more useful to permit linking proprietary applications with 672 + the library. If this is what you want to do, use the GNU Lesser General 673 + Public License instead of this License. But first, please read 674 + <https://www.gnu.org/licenses/why-not-lgpl.html>.
+2206
Cargo.lock
··· 3 3 version = 4 4 4 5 5 [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.1" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 + 20 + [[package]] 21 + name = "async-trait" 22 + version = "0.1.89" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 25 + dependencies = [ 26 + "proc-macro2", 27 + "quote", 28 + "syn 2.0.106", 29 + ] 30 + 31 + [[package]] 32 + name = "atomic-waker" 33 + version = "1.1.2" 34 + source = "registry+https://github.com/rust-lang/crates.io-index" 35 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 36 + 37 + [[package]] 38 + name = "autocfg" 39 + version = "1.5.0" 40 + source = "registry+https://github.com/rust-lang/crates.io-index" 41 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 42 + 43 + [[package]] 44 + name = "backtrace" 45 + version = "0.3.75" 46 + source = "registry+https://github.com/rust-lang/crates.io-index" 47 + checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 48 + dependencies = [ 49 + "addr2line", 50 + "cfg-if 1.0.3", 51 + "libc", 52 + "miniz_oxide", 53 + "object", 54 + "rustc-demangle", 55 + "windows-targets", 56 + ] 57 + 58 + [[package]] 59 + name = "base64" 60 + version = "0.22.1" 61 + source = "registry+https://github.com/rust-lang/crates.io-index" 62 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 63 + 64 + [[package]] 65 + name = "bitflags" 66 + version = "1.3.2" 67 + source = "registry+https://github.com/rust-lang/crates.io-index" 68 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 69 + 70 + [[package]] 71 + name = "bitflags" 72 + version = "2.9.4" 73 + source = "registry+https://github.com/rust-lang/crates.io-index" 74 + checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 75 + 76 + [[package]] 77 + name = "block-buffer" 78 + version = "0.7.3" 79 + source = "registry+https://github.com/rust-lang/crates.io-index" 80 + checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 81 + dependencies = [ 82 + "block-padding", 83 + "byte-tools", 84 + "byteorder", 85 + "generic-array", 86 + ] 87 + 88 + [[package]] 89 + name = "block-padding" 90 + version = "0.1.5" 91 + source = "registry+https://github.com/rust-lang/crates.io-index" 92 + checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 93 + dependencies = [ 94 + "byte-tools", 95 + ] 96 + 97 + [[package]] 98 + name = "bumpalo" 99 + version = "3.19.0" 100 + source = "registry+https://github.com/rust-lang/crates.io-index" 101 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 102 + 103 + [[package]] 104 + name = "byte-tools" 105 + version = "0.3.1" 106 + source = "registry+https://github.com/rust-lang/crates.io-index" 107 + checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 108 + 109 + [[package]] 110 + name = "byteorder" 111 + version = "1.5.0" 112 + source = "registry+https://github.com/rust-lang/crates.io-index" 113 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 114 + 115 + [[package]] 116 + name = "bytes" 117 + version = "0.4.12" 118 + source = "registry+https://github.com/rust-lang/crates.io-index" 119 + checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 120 + dependencies = [ 121 + "byteorder", 122 + "iovec", 123 + ] 124 + 125 + [[package]] 126 + name = "bytes" 127 + version = "1.10.1" 128 + source = "registry+https://github.com/rust-lang/crates.io-index" 129 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 130 + 131 + [[package]] 132 + name = "cc" 133 + version = "1.2.36" 134 + source = "registry+https://github.com/rust-lang/crates.io-index" 135 + checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" 136 + dependencies = [ 137 + "find-msvc-tools", 138 + "shlex", 139 + ] 140 + 141 + [[package]] 142 + name = "cfg-if" 143 + version = "0.1.10" 144 + source = "registry+https://github.com/rust-lang/crates.io-index" 145 + checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 146 + 147 + [[package]] 148 + name = "cfg-if" 149 + version = "1.0.3" 150 + source = "registry+https://github.com/rust-lang/crates.io-index" 151 + checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 152 + 153 + [[package]] 154 + name = "core-foundation" 155 + version = "0.9.4" 156 + source = "registry+https://github.com/rust-lang/crates.io-index" 157 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 158 + dependencies = [ 159 + "core-foundation-sys", 160 + "libc", 161 + ] 162 + 163 + [[package]] 164 + name = "core-foundation-sys" 165 + version = "0.8.7" 166 + source = "registry+https://github.com/rust-lang/crates.io-index" 167 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 168 + 169 + [[package]] 170 + name = "data-encoding" 171 + version = "2.9.0" 172 + source = "registry+https://github.com/rust-lang/crates.io-index" 173 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 174 + 175 + [[package]] 176 + name = "digest" 177 + version = "0.8.1" 178 + source = "registry+https://github.com/rust-lang/crates.io-index" 179 + checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 180 + dependencies = [ 181 + "generic-array", 182 + ] 183 + 184 + [[package]] 185 + name = "displaydoc" 186 + version = "0.2.5" 187 + source = "registry+https://github.com/rust-lang/crates.io-index" 188 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 189 + dependencies = [ 190 + "proc-macro2", 191 + "quote", 192 + "syn 2.0.106", 193 + ] 194 + 195 + [[package]] 196 + name = "encoding_rs" 197 + version = "0.8.35" 198 + source = "registry+https://github.com/rust-lang/crates.io-index" 199 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 200 + dependencies = [ 201 + "cfg-if 1.0.3", 202 + ] 203 + 204 + [[package]] 205 + name = "enum-as-inner" 206 + version = "0.3.4" 207 + source = "registry+https://github.com/rust-lang/crates.io-index" 208 + checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" 209 + dependencies = [ 210 + "heck", 211 + "proc-macro2", 212 + "quote", 213 + "syn 1.0.109", 214 + ] 215 + 216 + [[package]] 217 + name = "equivalent" 218 + version = "1.0.2" 219 + source = "registry+https://github.com/rust-lang/crates.io-index" 220 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 221 + 222 + [[package]] 223 + name = "errno" 224 + version = "0.3.13" 225 + source = "registry+https://github.com/rust-lang/crates.io-index" 226 + checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 227 + dependencies = [ 228 + "libc", 229 + "windows-sys 0.59.0", 230 + ] 231 + 232 + [[package]] 233 + name = "fake-simd" 234 + version = "0.1.2" 235 + source = "registry+https://github.com/rust-lang/crates.io-index" 236 + checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 237 + 238 + [[package]] 239 + name = "fastrand" 240 + version = "2.3.0" 241 + source = "registry+https://github.com/rust-lang/crates.io-index" 242 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 243 + 244 + [[package]] 245 + name = "find-msvc-tools" 246 + version = "0.1.1" 247 + source = "registry+https://github.com/rust-lang/crates.io-index" 248 + checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" 249 + 250 + [[package]] 251 + name = "fnv" 252 + version = "1.0.7" 253 + source = "registry+https://github.com/rust-lang/crates.io-index" 254 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 255 + 256 + [[package]] 257 + name = "foreign-types" 258 + version = "0.3.2" 259 + source = "registry+https://github.com/rust-lang/crates.io-index" 260 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 261 + dependencies = [ 262 + "foreign-types-shared", 263 + ] 264 + 265 + [[package]] 266 + name = "foreign-types-shared" 267 + version = "0.1.1" 268 + source = "registry+https://github.com/rust-lang/crates.io-index" 269 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 270 + 271 + [[package]] 272 + name = "form_urlencoded" 273 + version = "1.2.2" 274 + source = "registry+https://github.com/rust-lang/crates.io-index" 275 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 276 + dependencies = [ 277 + "percent-encoding", 278 + ] 279 + 280 + [[package]] 281 + name = "fuchsia-zircon" 282 + version = "0.3.3" 283 + source = "registry+https://github.com/rust-lang/crates.io-index" 284 + checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 285 + dependencies = [ 286 + "bitflags 1.3.2", 287 + "fuchsia-zircon-sys", 288 + ] 289 + 290 + [[package]] 291 + name = "fuchsia-zircon-sys" 292 + version = "0.3.3" 293 + source = "registry+https://github.com/rust-lang/crates.io-index" 294 + checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 295 + 296 + [[package]] 297 + name = "futures-channel" 298 + version = "0.3.31" 299 + source = "registry+https://github.com/rust-lang/crates.io-index" 300 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 301 + dependencies = [ 302 + "futures-core", 303 + "futures-sink", 304 + ] 305 + 306 + [[package]] 307 + name = "futures-core" 308 + version = "0.3.31" 309 + source = "registry+https://github.com/rust-lang/crates.io-index" 310 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 311 + 312 + [[package]] 313 + name = "futures-io" 314 + version = "0.3.31" 315 + source = "registry+https://github.com/rust-lang/crates.io-index" 316 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 317 + 318 + [[package]] 319 + name = "futures-sink" 320 + version = "0.3.31" 321 + source = "registry+https://github.com/rust-lang/crates.io-index" 322 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 323 + 324 + [[package]] 325 + name = "futures-task" 326 + version = "0.3.31" 327 + source = "registry+https://github.com/rust-lang/crates.io-index" 328 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 329 + 330 + [[package]] 331 + name = "futures-util" 332 + version = "0.3.31" 333 + source = "registry+https://github.com/rust-lang/crates.io-index" 334 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 335 + dependencies = [ 336 + "futures-core", 337 + "futures-io", 338 + "futures-sink", 339 + "futures-task", 340 + "memchr", 341 + "pin-project-lite", 342 + "pin-utils", 343 + "slab", 344 + ] 345 + 346 + [[package]] 347 + name = "generic-array" 348 + version = "0.12.4" 349 + source = "registry+https://github.com/rust-lang/crates.io-index" 350 + checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 351 + dependencies = [ 352 + "typenum", 353 + ] 354 + 355 + [[package]] 356 + name = "getrandom" 357 + version = "0.1.16" 358 + source = "registry+https://github.com/rust-lang/crates.io-index" 359 + checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 360 + dependencies = [ 361 + "cfg-if 1.0.3", 362 + "libc", 363 + "wasi 0.9.0+wasi-snapshot-preview1", 364 + ] 365 + 366 + [[package]] 367 + name = "getrandom" 368 + version = "0.2.16" 369 + source = "registry+https://github.com/rust-lang/crates.io-index" 370 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 371 + dependencies = [ 372 + "cfg-if 1.0.3", 373 + "libc", 374 + "wasi 0.11.1+wasi-snapshot-preview1", 375 + ] 376 + 377 + [[package]] 378 + name = "getrandom" 379 + version = "0.3.3" 380 + source = "registry+https://github.com/rust-lang/crates.io-index" 381 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 382 + dependencies = [ 383 + "cfg-if 1.0.3", 384 + "libc", 385 + "r-efi", 386 + "wasi 0.14.4+wasi-0.2.4", 387 + ] 388 + 389 + [[package]] 390 + name = "gimli" 391 + version = "0.31.1" 392 + source = "registry+https://github.com/rust-lang/crates.io-index" 393 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 394 + 395 + [[package]] 396 + name = "h2" 397 + version = "0.4.12" 398 + source = "registry+https://github.com/rust-lang/crates.io-index" 399 + checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 400 + dependencies = [ 401 + "atomic-waker", 402 + "bytes 1.10.1", 403 + "fnv", 404 + "futures-core", 405 + "futures-sink", 406 + "http", 407 + "indexmap", 408 + "slab", 409 + "tokio", 410 + "tokio-util", 411 + "tracing", 412 + ] 413 + 414 + [[package]] 415 + name = "hashbrown" 416 + version = "0.15.5" 417 + source = "registry+https://github.com/rust-lang/crates.io-index" 418 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 419 + 420 + [[package]] 421 + name = "heck" 422 + version = "0.4.1" 423 + source = "registry+https://github.com/rust-lang/crates.io-index" 424 + checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 425 + 426 + [[package]] 427 + name = "http" 428 + version = "1.3.1" 429 + source = "registry+https://github.com/rust-lang/crates.io-index" 430 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 431 + dependencies = [ 432 + "bytes 1.10.1", 433 + "fnv", 434 + "itoa", 435 + ] 436 + 437 + [[package]] 438 + name = "http-body" 439 + version = "1.0.1" 440 + source = "registry+https://github.com/rust-lang/crates.io-index" 441 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 442 + dependencies = [ 443 + "bytes 1.10.1", 444 + "http", 445 + ] 446 + 447 + [[package]] 448 + name = "http-body-util" 449 + version = "0.1.3" 450 + source = "registry+https://github.com/rust-lang/crates.io-index" 451 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 452 + dependencies = [ 453 + "bytes 1.10.1", 454 + "futures-core", 455 + "http", 456 + "http-body", 457 + "pin-project-lite", 458 + ] 459 + 460 + [[package]] 461 + name = "httparse" 462 + version = "1.10.1" 463 + source = "registry+https://github.com/rust-lang/crates.io-index" 464 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 465 + 466 + [[package]] 467 + name = "hyper" 468 + version = "1.7.0" 469 + source = "registry+https://github.com/rust-lang/crates.io-index" 470 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 471 + dependencies = [ 472 + "atomic-waker", 473 + "bytes 1.10.1", 474 + "futures-channel", 475 + "futures-core", 476 + "h2", 477 + "http", 478 + "http-body", 479 + "httparse", 480 + "itoa", 481 + "pin-project-lite", 482 + "pin-utils", 483 + "smallvec", 484 + "tokio", 485 + "want", 486 + ] 487 + 488 + [[package]] 489 + name = "hyper-rustls" 490 + version = "0.27.7" 491 + source = "registry+https://github.com/rust-lang/crates.io-index" 492 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 493 + dependencies = [ 494 + "http", 495 + "hyper", 496 + "hyper-util", 497 + "rustls", 498 + "rustls-pki-types", 499 + "tokio", 500 + "tokio-rustls", 501 + "tower-service", 502 + ] 503 + 504 + [[package]] 505 + name = "hyper-tls" 506 + version = "0.6.0" 507 + source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 509 + dependencies = [ 510 + "bytes 1.10.1", 511 + "http-body-util", 512 + "hyper", 513 + "hyper-util", 514 + "native-tls", 515 + "tokio", 516 + "tokio-native-tls", 517 + "tower-service", 518 + ] 519 + 520 + [[package]] 521 + name = "hyper-util" 522 + version = "0.1.16" 523 + source = "registry+https://github.com/rust-lang/crates.io-index" 524 + checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 525 + dependencies = [ 526 + "base64", 527 + "bytes 1.10.1", 528 + "futures-channel", 529 + "futures-core", 530 + "futures-util", 531 + "http", 532 + "http-body", 533 + "hyper", 534 + "ipnet", 535 + "libc", 536 + "percent-encoding", 537 + "pin-project-lite", 538 + "socket2 0.6.0", 539 + "system-configuration", 540 + "tokio", 541 + "tower-service", 542 + "tracing", 543 + "windows-registry", 544 + ] 545 + 546 + [[package]] 547 + name = "icu_collections" 548 + version = "2.0.0" 549 + source = "registry+https://github.com/rust-lang/crates.io-index" 550 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 551 + dependencies = [ 552 + "displaydoc", 553 + "potential_utf", 554 + "yoke", 555 + "zerofrom", 556 + "zerovec", 557 + ] 558 + 559 + [[package]] 560 + name = "icu_locale_core" 561 + version = "2.0.0" 562 + source = "registry+https://github.com/rust-lang/crates.io-index" 563 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 564 + dependencies = [ 565 + "displaydoc", 566 + "litemap", 567 + "tinystr", 568 + "writeable", 569 + "zerovec", 570 + ] 571 + 572 + [[package]] 573 + name = "icu_normalizer" 574 + version = "2.0.0" 575 + source = "registry+https://github.com/rust-lang/crates.io-index" 576 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 577 + dependencies = [ 578 + "displaydoc", 579 + "icu_collections", 580 + "icu_normalizer_data", 581 + "icu_properties", 582 + "icu_provider", 583 + "smallvec", 584 + "zerovec", 585 + ] 586 + 587 + [[package]] 588 + name = "icu_normalizer_data" 589 + version = "2.0.0" 590 + source = "registry+https://github.com/rust-lang/crates.io-index" 591 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 592 + 593 + [[package]] 594 + name = "icu_properties" 595 + version = "2.0.1" 596 + source = "registry+https://github.com/rust-lang/crates.io-index" 597 + checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 598 + dependencies = [ 599 + "displaydoc", 600 + "icu_collections", 601 + "icu_locale_core", 602 + "icu_properties_data", 603 + "icu_provider", 604 + "potential_utf", 605 + "zerotrie", 606 + "zerovec", 607 + ] 608 + 609 + [[package]] 610 + name = "icu_properties_data" 611 + version = "2.0.1" 612 + source = "registry+https://github.com/rust-lang/crates.io-index" 613 + checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 614 + 615 + [[package]] 616 + name = "icu_provider" 617 + version = "2.0.0" 618 + source = "registry+https://github.com/rust-lang/crates.io-index" 619 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 620 + dependencies = [ 621 + "displaydoc", 622 + "icu_locale_core", 623 + "stable_deref_trait", 624 + "tinystr", 625 + "writeable", 626 + "yoke", 627 + "zerofrom", 628 + "zerotrie", 629 + "zerovec", 630 + ] 631 + 632 + [[package]] 633 + name = "idna" 634 + version = "0.2.3" 635 + source = "registry+https://github.com/rust-lang/crates.io-index" 636 + checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 637 + dependencies = [ 638 + "matches", 639 + "unicode-bidi", 640 + "unicode-normalization", 641 + ] 642 + 643 + [[package]] 644 + name = "idna" 645 + version = "1.1.0" 646 + source = "registry+https://github.com/rust-lang/crates.io-index" 647 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 648 + dependencies = [ 649 + "idna_adapter", 650 + "smallvec", 651 + "utf8_iter", 652 + ] 653 + 654 + [[package]] 655 + name = "idna_adapter" 656 + version = "1.2.1" 657 + source = "registry+https://github.com/rust-lang/crates.io-index" 658 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 659 + dependencies = [ 660 + "icu_normalizer", 661 + "icu_properties", 662 + ] 663 + 664 + [[package]] 665 + name = "indexmap" 666 + version = "2.11.0" 667 + source = "registry+https://github.com/rust-lang/crates.io-index" 668 + checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" 669 + dependencies = [ 670 + "equivalent", 671 + "hashbrown", 672 + ] 673 + 674 + [[package]] 675 + name = "instant" 676 + version = "0.1.13" 677 + source = "registry+https://github.com/rust-lang/crates.io-index" 678 + checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 679 + dependencies = [ 680 + "cfg-if 1.0.3", 681 + ] 682 + 683 + [[package]] 684 + name = "io-uring" 685 + version = "0.7.10" 686 + source = "registry+https://github.com/rust-lang/crates.io-index" 687 + checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 688 + dependencies = [ 689 + "bitflags 2.9.4", 690 + "cfg-if 1.0.3", 691 + "libc", 692 + ] 693 + 694 + [[package]] 695 + name = "iovec" 696 + version = "0.1.4" 697 + source = "registry+https://github.com/rust-lang/crates.io-index" 698 + checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 699 + dependencies = [ 700 + "libc", 701 + ] 702 + 703 + [[package]] 704 + name = "ipconfig" 705 + version = "0.2.2" 706 + source = "registry+https://github.com/rust-lang/crates.io-index" 707 + checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" 708 + dependencies = [ 709 + "socket2 0.3.19", 710 + "widestring", 711 + "winapi 0.3.9", 712 + "winreg", 713 + ] 714 + 715 + [[package]] 716 + name = "ipnet" 717 + version = "2.11.0" 718 + source = "registry+https://github.com/rust-lang/crates.io-index" 719 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 720 + 721 + [[package]] 722 + name = "iri-string" 723 + version = "0.7.8" 724 + source = "registry+https://github.com/rust-lang/crates.io-index" 725 + checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 726 + dependencies = [ 727 + "memchr", 728 + "serde", 729 + ] 730 + 731 + [[package]] 732 + name = "itoa" 733 + version = "1.0.15" 734 + source = "registry+https://github.com/rust-lang/crates.io-index" 735 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 736 + 737 + [[package]] 738 + name = "js-sys" 739 + version = "0.3.78" 740 + source = "registry+https://github.com/rust-lang/crates.io-index" 741 + checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" 742 + dependencies = [ 743 + "once_cell", 744 + "wasm-bindgen", 745 + ] 746 + 747 + [[package]] 748 + name = "json" 749 + version = "0.12.4" 750 + source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" 752 + 753 + [[package]] 754 + name = "kernel32-sys" 755 + version = "0.2.2" 756 + source = "registry+https://github.com/rust-lang/crates.io-index" 757 + checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 758 + dependencies = [ 759 + "winapi 0.2.8", 760 + "winapi-build", 761 + ] 762 + 763 + [[package]] 764 + name = "lazy_static" 765 + version = "1.5.0" 766 + source = "registry+https://github.com/rust-lang/crates.io-index" 767 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 768 + 769 + [[package]] 770 + name = "lazycell" 771 + version = "1.3.0" 772 + source = "registry+https://github.com/rust-lang/crates.io-index" 773 + checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 774 + 775 + [[package]] 776 + name = "libc" 777 + version = "0.2.175" 778 + source = "registry+https://github.com/rust-lang/crates.io-index" 779 + checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 780 + 781 + [[package]] 782 + name = "linked-hash-map" 783 + version = "0.5.6" 784 + source = "registry+https://github.com/rust-lang/crates.io-index" 785 + checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 786 + 787 + [[package]] 788 + name = "linux-raw-sys" 789 + version = "0.9.4" 790 + source = "registry+https://github.com/rust-lang/crates.io-index" 791 + checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 792 + 793 + [[package]] 794 + name = "litemap" 795 + version = "0.8.0" 796 + source = "registry+https://github.com/rust-lang/crates.io-index" 797 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 798 + 799 + [[package]] 800 + name = "lock_api" 801 + version = "0.4.13" 802 + source = "registry+https://github.com/rust-lang/crates.io-index" 803 + checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 804 + dependencies = [ 805 + "autocfg", 806 + "scopeguard", 807 + ] 808 + 809 + [[package]] 810 + name = "log" 811 + version = "0.4.28" 812 + source = "registry+https://github.com/rust-lang/crates.io-index" 813 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 814 + 815 + [[package]] 816 + name = "lru-cache" 817 + version = "0.1.2" 818 + source = "registry+https://github.com/rust-lang/crates.io-index" 819 + checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" 820 + dependencies = [ 821 + "linked-hash-map", 822 + ] 823 + 824 + [[package]] 825 + name = "matches" 826 + version = "0.1.10" 827 + source = "registry+https://github.com/rust-lang/crates.io-index" 828 + checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 829 + 830 + [[package]] 831 + name = "memchr" 832 + version = "2.7.5" 833 + source = "registry+https://github.com/rust-lang/crates.io-index" 834 + checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 835 + 836 + [[package]] 837 + name = "mime" 838 + version = "0.3.17" 839 + source = "registry+https://github.com/rust-lang/crates.io-index" 840 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 841 + 842 + [[package]] 843 + name = "miniz_oxide" 844 + version = "0.8.9" 845 + source = "registry+https://github.com/rust-lang/crates.io-index" 846 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 847 + dependencies = [ 848 + "adler2", 849 + ] 850 + 851 + [[package]] 852 + name = "mio" 853 + version = "0.6.23" 854 + source = "registry+https://github.com/rust-lang/crates.io-index" 855 + checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" 856 + dependencies = [ 857 + "cfg-if 0.1.10", 858 + "fuchsia-zircon", 859 + "fuchsia-zircon-sys", 860 + "iovec", 861 + "kernel32-sys", 862 + "libc", 863 + "log", 864 + "miow", 865 + "net2", 866 + "slab", 867 + "winapi 0.2.8", 868 + ] 869 + 870 + [[package]] 871 + name = "mio" 872 + version = "1.0.4" 873 + source = "registry+https://github.com/rust-lang/crates.io-index" 874 + checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 875 + dependencies = [ 876 + "libc", 877 + "wasi 0.11.1+wasi-snapshot-preview1", 878 + "windows-sys 0.59.0", 879 + ] 880 + 881 + [[package]] 882 + name = "mio-extras" 883 + version = "2.0.6" 884 + source = "registry+https://github.com/rust-lang/crates.io-index" 885 + checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" 886 + dependencies = [ 887 + "lazycell", 888 + "log", 889 + "mio 0.6.23", 890 + "slab", 891 + ] 892 + 893 + [[package]] 894 + name = "miow" 895 + version = "0.2.2" 896 + source = "registry+https://github.com/rust-lang/crates.io-index" 897 + checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" 898 + dependencies = [ 899 + "kernel32-sys", 900 + "net2", 901 + "winapi 0.2.8", 902 + "ws2_32-sys", 903 + ] 904 + 905 + [[package]] 906 + name = "native-tls" 907 + version = "0.2.14" 908 + source = "registry+https://github.com/rust-lang/crates.io-index" 909 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 910 + dependencies = [ 911 + "libc", 912 + "log", 913 + "openssl", 914 + "openssl-probe", 915 + "openssl-sys", 916 + "schannel", 917 + "security-framework", 918 + "security-framework-sys", 919 + "tempfile", 920 + ] 921 + 922 + [[package]] 923 + name = "net2" 924 + version = "0.2.39" 925 + source = "registry+https://github.com/rust-lang/crates.io-index" 926 + checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" 927 + dependencies = [ 928 + "cfg-if 0.1.10", 929 + "libc", 930 + "winapi 0.3.9", 931 + ] 932 + 933 + [[package]] 934 + name = "object" 935 + version = "0.36.7" 936 + source = "registry+https://github.com/rust-lang/crates.io-index" 937 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 938 + dependencies = [ 939 + "memchr", 940 + ] 941 + 942 + [[package]] 943 + name = "once_cell" 944 + version = "1.21.3" 945 + source = "registry+https://github.com/rust-lang/crates.io-index" 946 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 947 + 948 + [[package]] 949 + name = "opaque-debug" 950 + version = "0.2.3" 951 + source = "registry+https://github.com/rust-lang/crates.io-index" 952 + checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 953 + 954 + [[package]] 955 + name = "openssl" 956 + version = "0.10.73" 957 + source = "registry+https://github.com/rust-lang/crates.io-index" 958 + checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 959 + dependencies = [ 960 + "bitflags 2.9.4", 961 + "cfg-if 1.0.3", 962 + "foreign-types", 963 + "libc", 964 + "once_cell", 965 + "openssl-macros", 966 + "openssl-sys", 967 + ] 968 + 969 + [[package]] 970 + name = "openssl-macros" 971 + version = "0.1.1" 972 + source = "registry+https://github.com/rust-lang/crates.io-index" 973 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 974 + dependencies = [ 975 + "proc-macro2", 976 + "quote", 977 + "syn 2.0.106", 978 + ] 979 + 980 + [[package]] 981 + name = "openssl-probe" 982 + version = "0.1.6" 983 + source = "registry+https://github.com/rust-lang/crates.io-index" 984 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 985 + 986 + [[package]] 987 + name = "openssl-sys" 988 + version = "0.9.109" 989 + source = "registry+https://github.com/rust-lang/crates.io-index" 990 + checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 991 + dependencies = [ 992 + "cc", 993 + "libc", 994 + "pkg-config", 995 + "vcpkg", 996 + ] 997 + 998 + [[package]] 999 + name = "parking_lot" 1000 + version = "0.11.2" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1003 + dependencies = [ 1004 + "instant", 1005 + "lock_api", 1006 + "parking_lot_core", 1007 + ] 1008 + 1009 + [[package]] 1010 + name = "parking_lot_core" 1011 + version = "0.8.6" 1012 + source = "registry+https://github.com/rust-lang/crates.io-index" 1013 + checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" 1014 + dependencies = [ 1015 + "cfg-if 1.0.3", 1016 + "instant", 1017 + "libc", 1018 + "redox_syscall", 1019 + "smallvec", 1020 + "winapi 0.3.9", 1021 + ] 1022 + 1023 + [[package]] 1024 + name = "percent-encoding" 1025 + version = "2.3.2" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1028 + 1029 + [[package]] 1030 + name = "pin-project-lite" 1031 + version = "0.2.16" 1032 + source = "registry+https://github.com/rust-lang/crates.io-index" 1033 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1034 + 1035 + [[package]] 1036 + name = "pin-utils" 1037 + version = "0.1.0" 1038 + source = "registry+https://github.com/rust-lang/crates.io-index" 1039 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1040 + 1041 + [[package]] 1042 + name = "pkg-config" 1043 + version = "0.3.32" 1044 + source = "registry+https://github.com/rust-lang/crates.io-index" 1045 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1046 + 1047 + [[package]] 1048 + name = "potential_utf" 1049 + version = "0.1.3" 1050 + source = "registry+https://github.com/rust-lang/crates.io-index" 1051 + checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 1052 + dependencies = [ 1053 + "zerovec", 1054 + ] 1055 + 1056 + [[package]] 1057 + name = "ppv-lite86" 1058 + version = "0.2.21" 1059 + source = "registry+https://github.com/rust-lang/crates.io-index" 1060 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1061 + dependencies = [ 1062 + "zerocopy", 1063 + ] 1064 + 1065 + [[package]] 1066 + name = "proc-macro2" 1067 + version = "1.0.101" 1068 + source = "registry+https://github.com/rust-lang/crates.io-index" 1069 + checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1070 + dependencies = [ 1071 + "unicode-ident", 1072 + ] 1073 + 1074 + [[package]] 1075 + name = "quote" 1076 + version = "1.0.40" 1077 + source = "registry+https://github.com/rust-lang/crates.io-index" 1078 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1079 + dependencies = [ 1080 + "proc-macro2", 1081 + ] 1082 + 1083 + [[package]] 1084 + name = "r-efi" 1085 + version = "5.3.0" 1086 + source = "registry+https://github.com/rust-lang/crates.io-index" 1087 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1088 + 1089 + [[package]] 1090 + name = "rand" 1091 + version = "0.7.3" 1092 + source = "registry+https://github.com/rust-lang/crates.io-index" 1093 + checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1094 + dependencies = [ 1095 + "getrandom 0.1.16", 1096 + "libc", 1097 + "rand_chacha 0.2.2", 1098 + "rand_core 0.5.1", 1099 + "rand_hc", 1100 + ] 1101 + 1102 + [[package]] 1103 + name = "rand" 1104 + version = "0.8.5" 1105 + source = "registry+https://github.com/rust-lang/crates.io-index" 1106 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1107 + dependencies = [ 1108 + "libc", 1109 + "rand_chacha 0.3.1", 1110 + "rand_core 0.6.4", 1111 + ] 1112 + 1113 + [[package]] 1114 + name = "rand_chacha" 1115 + version = "0.2.2" 1116 + source = "registry+https://github.com/rust-lang/crates.io-index" 1117 + checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1118 + dependencies = [ 1119 + "ppv-lite86", 1120 + "rand_core 0.5.1", 1121 + ] 1122 + 1123 + [[package]] 1124 + name = "rand_chacha" 1125 + version = "0.3.1" 1126 + source = "registry+https://github.com/rust-lang/crates.io-index" 1127 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1128 + dependencies = [ 1129 + "ppv-lite86", 1130 + "rand_core 0.6.4", 1131 + ] 1132 + 1133 + [[package]] 1134 + name = "rand_core" 1135 + version = "0.5.1" 1136 + source = "registry+https://github.com/rust-lang/crates.io-index" 1137 + checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1138 + dependencies = [ 1139 + "getrandom 0.1.16", 1140 + ] 1141 + 1142 + [[package]] 1143 + name = "rand_core" 1144 + version = "0.6.4" 1145 + source = "registry+https://github.com/rust-lang/crates.io-index" 1146 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1147 + dependencies = [ 1148 + "getrandom 0.2.16", 1149 + ] 1150 + 1151 + [[package]] 1152 + name = "rand_hc" 1153 + version = "0.2.0" 1154 + source = "registry+https://github.com/rust-lang/crates.io-index" 1155 + checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1156 + dependencies = [ 1157 + "rand_core 0.5.1", 1158 + ] 1159 + 1160 + [[package]] 1161 + name = "redox_syscall" 1162 + version = "0.2.16" 1163 + source = "registry+https://github.com/rust-lang/crates.io-index" 1164 + checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1165 + dependencies = [ 1166 + "bitflags 1.3.2", 1167 + ] 1168 + 1169 + [[package]] 1170 + name = "reqwest" 1171 + version = "0.12.23" 1172 + source = "registry+https://github.com/rust-lang/crates.io-index" 1173 + checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 1174 + dependencies = [ 1175 + "base64", 1176 + "bytes 1.10.1", 1177 + "encoding_rs", 1178 + "futures-channel", 1179 + "futures-core", 1180 + "futures-util", 1181 + "h2", 1182 + "http", 1183 + "http-body", 1184 + "http-body-util", 1185 + "hyper", 1186 + "hyper-rustls", 1187 + "hyper-tls", 1188 + "hyper-util", 1189 + "js-sys", 1190 + "log", 1191 + "mime", 1192 + "native-tls", 1193 + "percent-encoding", 1194 + "pin-project-lite", 1195 + "rustls-pki-types", 1196 + "serde", 1197 + "serde_json", 1198 + "serde_urlencoded", 1199 + "sync_wrapper", 1200 + "tokio", 1201 + "tokio-native-tls", 1202 + "tower", 1203 + "tower-http", 1204 + "tower-service", 1205 + "url", 1206 + "wasm-bindgen", 1207 + "wasm-bindgen-futures", 1208 + "web-sys", 1209 + ] 1210 + 1211 + [[package]] 1212 + name = "resolv-conf" 1213 + version = "0.7.4" 1214 + source = "registry+https://github.com/rust-lang/crates.io-index" 1215 + checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" 1216 + 1217 + [[package]] 1218 + name = "ring" 1219 + version = "0.17.14" 1220 + source = "registry+https://github.com/rust-lang/crates.io-index" 1221 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1222 + dependencies = [ 1223 + "cc", 1224 + "cfg-if 1.0.3", 1225 + "getrandom 0.2.16", 1226 + "libc", 1227 + "untrusted", 1228 + "windows-sys 0.52.0", 1229 + ] 1230 + 1231 + [[package]] 1232 + name = "rustc-demangle" 1233 + version = "0.1.26" 1234 + source = "registry+https://github.com/rust-lang/crates.io-index" 1235 + checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1236 + 1237 + [[package]] 1238 + name = "rustix" 1239 + version = "1.0.8" 1240 + source = "registry+https://github.com/rust-lang/crates.io-index" 1241 + checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 1242 + dependencies = [ 1243 + "bitflags 2.9.4", 1244 + "errno", 1245 + "libc", 1246 + "linux-raw-sys", 1247 + "windows-sys 0.59.0", 1248 + ] 1249 + 1250 + [[package]] 1251 + name = "rustls" 1252 + version = "0.23.31" 1253 + source = "registry+https://github.com/rust-lang/crates.io-index" 1254 + checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" 1255 + dependencies = [ 1256 + "once_cell", 1257 + "rustls-pki-types", 1258 + "rustls-webpki", 1259 + "subtle", 1260 + "zeroize", 1261 + ] 1262 + 1263 + [[package]] 1264 + name = "rustls-pki-types" 1265 + version = "1.12.0" 1266 + source = "registry+https://github.com/rust-lang/crates.io-index" 1267 + checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1268 + dependencies = [ 1269 + "zeroize", 1270 + ] 1271 + 1272 + [[package]] 1273 + name = "rustls-webpki" 1274 + version = "0.103.4" 1275 + source = "registry+https://github.com/rust-lang/crates.io-index" 1276 + checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" 1277 + dependencies = [ 1278 + "ring", 1279 + "rustls-pki-types", 1280 + "untrusted", 1281 + ] 1282 + 1283 + [[package]] 1284 + name = "rustversion" 1285 + version = "1.0.22" 1286 + source = "registry+https://github.com/rust-lang/crates.io-index" 1287 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1288 + 1289 + [[package]] 1290 + name = "ryu" 1291 + version = "1.0.20" 1292 + source = "registry+https://github.com/rust-lang/crates.io-index" 1293 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1294 + 1295 + [[package]] 1296 + name = "schannel" 1297 + version = "0.1.27" 1298 + source = "registry+https://github.com/rust-lang/crates.io-index" 1299 + checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1300 + dependencies = [ 1301 + "windows-sys 0.59.0", 1302 + ] 1303 + 1304 + [[package]] 1305 + name = "scopeguard" 1306 + version = "1.2.0" 1307 + source = "registry+https://github.com/rust-lang/crates.io-index" 1308 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1309 + 1310 + [[package]] 1311 + name = "security-framework" 1312 + version = "2.11.1" 1313 + source = "registry+https://github.com/rust-lang/crates.io-index" 1314 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1315 + dependencies = [ 1316 + "bitflags 2.9.4", 1317 + "core-foundation", 1318 + "core-foundation-sys", 1319 + "libc", 1320 + "security-framework-sys", 1321 + ] 1322 + 1323 + [[package]] 1324 + name = "security-framework-sys" 1325 + version = "2.14.0" 1326 + source = "registry+https://github.com/rust-lang/crates.io-index" 1327 + checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1328 + dependencies = [ 1329 + "core-foundation-sys", 1330 + "libc", 1331 + ] 1332 + 1333 + [[package]] 1334 + name = "serde" 1335 + version = "1.0.219" 1336 + source = "registry+https://github.com/rust-lang/crates.io-index" 1337 + checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1338 + dependencies = [ 1339 + "serde_derive", 1340 + ] 1341 + 1342 + [[package]] 1343 + name = "serde_derive" 1344 + version = "1.0.219" 1345 + source = "registry+https://github.com/rust-lang/crates.io-index" 1346 + checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1347 + dependencies = [ 1348 + "proc-macro2", 1349 + "quote", 1350 + "syn 2.0.106", 1351 + ] 1352 + 1353 + [[package]] 1354 + name = "serde_json" 1355 + version = "1.0.143" 1356 + source = "registry+https://github.com/rust-lang/crates.io-index" 1357 + checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" 1358 + dependencies = [ 1359 + "itoa", 1360 + "memchr", 1361 + "ryu", 1362 + "serde", 1363 + ] 1364 + 1365 + [[package]] 1366 + name = "serde_urlencoded" 1367 + version = "0.7.1" 1368 + source = "registry+https://github.com/rust-lang/crates.io-index" 1369 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1370 + dependencies = [ 1371 + "form_urlencoded", 1372 + "itoa", 1373 + "ryu", 1374 + "serde", 1375 + ] 1376 + 1377 + [[package]] 1378 + name = "sha-1" 1379 + version = "0.8.2" 1380 + source = "registry+https://github.com/rust-lang/crates.io-index" 1381 + checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" 1382 + dependencies = [ 1383 + "block-buffer", 1384 + "digest", 1385 + "fake-simd", 1386 + "opaque-debug", 1387 + ] 1388 + 1389 + [[package]] 1390 + name = "shlex" 1391 + version = "1.3.0" 1392 + source = "registry+https://github.com/rust-lang/crates.io-index" 1393 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1394 + 1395 + [[package]] 1396 + name = "slab" 1397 + version = "0.4.11" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1400 + 1401 + [[package]] 1402 + name = "smallvec" 1403 + version = "1.15.1" 1404 + source = "registry+https://github.com/rust-lang/crates.io-index" 1405 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1406 + 1407 + [[package]] 1408 + name = "socket2" 1409 + version = "0.3.19" 1410 + source = "registry+https://github.com/rust-lang/crates.io-index" 1411 + checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" 1412 + dependencies = [ 1413 + "cfg-if 1.0.3", 1414 + "libc", 1415 + "winapi 0.3.9", 1416 + ] 1417 + 1418 + [[package]] 1419 + name = "socket2" 1420 + version = "0.6.0" 1421 + source = "registry+https://github.com/rust-lang/crates.io-index" 1422 + checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1423 + dependencies = [ 1424 + "libc", 1425 + "windows-sys 0.59.0", 1426 + ] 1427 + 1428 + [[package]] 1429 + name = "stable_deref_trait" 1430 + version = "1.2.0" 1431 + source = "registry+https://github.com/rust-lang/crates.io-index" 1432 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1433 + 1434 + [[package]] 1435 + name = "subtle" 1436 + version = "2.6.1" 1437 + source = "registry+https://github.com/rust-lang/crates.io-index" 1438 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1439 + 1440 + [[package]] 1441 + name = "syn" 1442 + version = "1.0.109" 1443 + source = "registry+https://github.com/rust-lang/crates.io-index" 1444 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1445 + dependencies = [ 1446 + "proc-macro2", 1447 + "quote", 1448 + "unicode-ident", 1449 + ] 1450 + 1451 + [[package]] 1452 + name = "syn" 1453 + version = "2.0.106" 1454 + source = "registry+https://github.com/rust-lang/crates.io-index" 1455 + checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 1456 + dependencies = [ 1457 + "proc-macro2", 1458 + "quote", 1459 + "unicode-ident", 1460 + ] 1461 + 1462 + [[package]] 1463 + name = "sync_wrapper" 1464 + version = "1.0.2" 1465 + source = "registry+https://github.com/rust-lang/crates.io-index" 1466 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1467 + dependencies = [ 1468 + "futures-core", 1469 + ] 1470 + 1471 + [[package]] 1472 + name = "synstructure" 1473 + version = "0.13.2" 1474 + source = "registry+https://github.com/rust-lang/crates.io-index" 1475 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1476 + dependencies = [ 1477 + "proc-macro2", 1478 + "quote", 1479 + "syn 2.0.106", 1480 + ] 1481 + 1482 + [[package]] 1483 + name = "system-configuration" 1484 + version = "0.6.1" 1485 + source = "registry+https://github.com/rust-lang/crates.io-index" 1486 + checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1487 + dependencies = [ 1488 + "bitflags 2.9.4", 1489 + "core-foundation", 1490 + "system-configuration-sys", 1491 + ] 1492 + 1493 + [[package]] 1494 + name = "system-configuration-sys" 1495 + version = "0.6.0" 1496 + source = "registry+https://github.com/rust-lang/crates.io-index" 1497 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 1498 + dependencies = [ 1499 + "core-foundation-sys", 1500 + "libc", 1501 + ] 1502 + 1503 + [[package]] 6 1504 name = "tangled-on-commit" 7 1505 version = "0.1.0" 1506 + dependencies = [ 1507 + "json", 1508 + "reqwest", 1509 + "trust-dns-resolver", 1510 + "ws", 1511 + ] 1512 + 1513 + [[package]] 1514 + name = "tempfile" 1515 + version = "3.21.0" 1516 + source = "registry+https://github.com/rust-lang/crates.io-index" 1517 + checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" 1518 + dependencies = [ 1519 + "fastrand", 1520 + "getrandom 0.3.3", 1521 + "once_cell", 1522 + "rustix", 1523 + "windows-sys 0.59.0", 1524 + ] 1525 + 1526 + [[package]] 1527 + name = "thiserror" 1528 + version = "1.0.69" 1529 + source = "registry+https://github.com/rust-lang/crates.io-index" 1530 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1531 + dependencies = [ 1532 + "thiserror-impl", 1533 + ] 1534 + 1535 + [[package]] 1536 + name = "thiserror-impl" 1537 + version = "1.0.69" 1538 + source = "registry+https://github.com/rust-lang/crates.io-index" 1539 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1540 + dependencies = [ 1541 + "proc-macro2", 1542 + "quote", 1543 + "syn 2.0.106", 1544 + ] 1545 + 1546 + [[package]] 1547 + name = "tinystr" 1548 + version = "0.8.1" 1549 + source = "registry+https://github.com/rust-lang/crates.io-index" 1550 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1551 + dependencies = [ 1552 + "displaydoc", 1553 + "zerovec", 1554 + ] 1555 + 1556 + [[package]] 1557 + name = "tinyvec" 1558 + version = "1.10.0" 1559 + source = "registry+https://github.com/rust-lang/crates.io-index" 1560 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 1561 + dependencies = [ 1562 + "tinyvec_macros", 1563 + ] 1564 + 1565 + [[package]] 1566 + name = "tinyvec_macros" 1567 + version = "0.1.1" 1568 + source = "registry+https://github.com/rust-lang/crates.io-index" 1569 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1570 + 1571 + [[package]] 1572 + name = "tokio" 1573 + version = "1.47.1" 1574 + source = "registry+https://github.com/rust-lang/crates.io-index" 1575 + checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 1576 + dependencies = [ 1577 + "backtrace", 1578 + "bytes 1.10.1", 1579 + "io-uring", 1580 + "libc", 1581 + "mio 1.0.4", 1582 + "pin-project-lite", 1583 + "slab", 1584 + "socket2 0.6.0", 1585 + "windows-sys 0.59.0", 1586 + ] 1587 + 1588 + [[package]] 1589 + name = "tokio-native-tls" 1590 + version = "0.3.1" 1591 + source = "registry+https://github.com/rust-lang/crates.io-index" 1592 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1593 + dependencies = [ 1594 + "native-tls", 1595 + "tokio", 1596 + ] 1597 + 1598 + [[package]] 1599 + name = "tokio-rustls" 1600 + version = "0.26.2" 1601 + source = "registry+https://github.com/rust-lang/crates.io-index" 1602 + checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 1603 + dependencies = [ 1604 + "rustls", 1605 + "tokio", 1606 + ] 1607 + 1608 + [[package]] 1609 + name = "tokio-util" 1610 + version = "0.7.16" 1611 + source = "registry+https://github.com/rust-lang/crates.io-index" 1612 + checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 1613 + dependencies = [ 1614 + "bytes 1.10.1", 1615 + "futures-core", 1616 + "futures-sink", 1617 + "pin-project-lite", 1618 + "tokio", 1619 + ] 1620 + 1621 + [[package]] 1622 + name = "tower" 1623 + version = "0.5.2" 1624 + source = "registry+https://github.com/rust-lang/crates.io-index" 1625 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1626 + dependencies = [ 1627 + "futures-core", 1628 + "futures-util", 1629 + "pin-project-lite", 1630 + "sync_wrapper", 1631 + "tokio", 1632 + "tower-layer", 1633 + "tower-service", 1634 + ] 1635 + 1636 + [[package]] 1637 + name = "tower-http" 1638 + version = "0.6.6" 1639 + source = "registry+https://github.com/rust-lang/crates.io-index" 1640 + checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 1641 + dependencies = [ 1642 + "bitflags 2.9.4", 1643 + "bytes 1.10.1", 1644 + "futures-util", 1645 + "http", 1646 + "http-body", 1647 + "iri-string", 1648 + "pin-project-lite", 1649 + "tower", 1650 + "tower-layer", 1651 + "tower-service", 1652 + ] 1653 + 1654 + [[package]] 1655 + name = "tower-layer" 1656 + version = "0.3.3" 1657 + source = "registry+https://github.com/rust-lang/crates.io-index" 1658 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1659 + 1660 + [[package]] 1661 + name = "tower-service" 1662 + version = "0.3.3" 1663 + source = "registry+https://github.com/rust-lang/crates.io-index" 1664 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1665 + 1666 + [[package]] 1667 + name = "tracing" 1668 + version = "0.1.41" 1669 + source = "registry+https://github.com/rust-lang/crates.io-index" 1670 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1671 + dependencies = [ 1672 + "pin-project-lite", 1673 + "tracing-core", 1674 + ] 1675 + 1676 + [[package]] 1677 + name = "tracing-core" 1678 + version = "0.1.34" 1679 + source = "registry+https://github.com/rust-lang/crates.io-index" 1680 + checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 1681 + dependencies = [ 1682 + "once_cell", 1683 + ] 1684 + 1685 + [[package]] 1686 + name = "trust-dns-proto" 1687 + version = "0.20.4" 1688 + source = "registry+https://github.com/rust-lang/crates.io-index" 1689 + checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" 1690 + dependencies = [ 1691 + "async-trait", 1692 + "cfg-if 1.0.3", 1693 + "data-encoding", 1694 + "enum-as-inner", 1695 + "futures-channel", 1696 + "futures-io", 1697 + "futures-util", 1698 + "idna 0.2.3", 1699 + "ipnet", 1700 + "lazy_static", 1701 + "log", 1702 + "rand 0.8.5", 1703 + "smallvec", 1704 + "thiserror", 1705 + "tinyvec", 1706 + "tokio", 1707 + "url", 1708 + ] 1709 + 1710 + [[package]] 1711 + name = "trust-dns-resolver" 1712 + version = "0.20.4" 1713 + source = "registry+https://github.com/rust-lang/crates.io-index" 1714 + checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a" 1715 + dependencies = [ 1716 + "cfg-if 1.0.3", 1717 + "futures-util", 1718 + "ipconfig", 1719 + "lazy_static", 1720 + "log", 1721 + "lru-cache", 1722 + "parking_lot", 1723 + "resolv-conf", 1724 + "smallvec", 1725 + "thiserror", 1726 + "tokio", 1727 + "trust-dns-proto", 1728 + ] 1729 + 1730 + [[package]] 1731 + name = "try-lock" 1732 + version = "0.2.5" 1733 + source = "registry+https://github.com/rust-lang/crates.io-index" 1734 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1735 + 1736 + [[package]] 1737 + name = "typenum" 1738 + version = "1.18.0" 1739 + source = "registry+https://github.com/rust-lang/crates.io-index" 1740 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1741 + 1742 + [[package]] 1743 + name = "unicode-bidi" 1744 + version = "0.3.18" 1745 + source = "registry+https://github.com/rust-lang/crates.io-index" 1746 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 1747 + 1748 + [[package]] 1749 + name = "unicode-ident" 1750 + version = "1.0.18" 1751 + source = "registry+https://github.com/rust-lang/crates.io-index" 1752 + checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1753 + 1754 + [[package]] 1755 + name = "unicode-normalization" 1756 + version = "0.1.24" 1757 + source = "registry+https://github.com/rust-lang/crates.io-index" 1758 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 1759 + dependencies = [ 1760 + "tinyvec", 1761 + ] 1762 + 1763 + [[package]] 1764 + name = "untrusted" 1765 + version = "0.9.0" 1766 + source = "registry+https://github.com/rust-lang/crates.io-index" 1767 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1768 + 1769 + [[package]] 1770 + name = "url" 1771 + version = "2.5.7" 1772 + source = "registry+https://github.com/rust-lang/crates.io-index" 1773 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 1774 + dependencies = [ 1775 + "form_urlencoded", 1776 + "idna 1.1.0", 1777 + "percent-encoding", 1778 + "serde", 1779 + ] 1780 + 1781 + [[package]] 1782 + name = "utf8_iter" 1783 + version = "1.0.4" 1784 + source = "registry+https://github.com/rust-lang/crates.io-index" 1785 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1786 + 1787 + [[package]] 1788 + name = "vcpkg" 1789 + version = "0.2.15" 1790 + source = "registry+https://github.com/rust-lang/crates.io-index" 1791 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1792 + 1793 + [[package]] 1794 + name = "want" 1795 + version = "0.3.1" 1796 + source = "registry+https://github.com/rust-lang/crates.io-index" 1797 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1798 + dependencies = [ 1799 + "try-lock", 1800 + ] 1801 + 1802 + [[package]] 1803 + name = "wasi" 1804 + version = "0.9.0+wasi-snapshot-preview1" 1805 + source = "registry+https://github.com/rust-lang/crates.io-index" 1806 + checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1807 + 1808 + [[package]] 1809 + name = "wasi" 1810 + version = "0.11.1+wasi-snapshot-preview1" 1811 + source = "registry+https://github.com/rust-lang/crates.io-index" 1812 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1813 + 1814 + [[package]] 1815 + name = "wasi" 1816 + version = "0.14.4+wasi-0.2.4" 1817 + source = "registry+https://github.com/rust-lang/crates.io-index" 1818 + checksum = "88a5f4a424faf49c3c2c344f166f0662341d470ea185e939657aaff130f0ec4a" 1819 + dependencies = [ 1820 + "wit-bindgen", 1821 + ] 1822 + 1823 + [[package]] 1824 + name = "wasm-bindgen" 1825 + version = "0.2.101" 1826 + source = "registry+https://github.com/rust-lang/crates.io-index" 1827 + checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" 1828 + dependencies = [ 1829 + "cfg-if 1.0.3", 1830 + "once_cell", 1831 + "rustversion", 1832 + "wasm-bindgen-macro", 1833 + "wasm-bindgen-shared", 1834 + ] 1835 + 1836 + [[package]] 1837 + name = "wasm-bindgen-backend" 1838 + version = "0.2.101" 1839 + source = "registry+https://github.com/rust-lang/crates.io-index" 1840 + checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" 1841 + dependencies = [ 1842 + "bumpalo", 1843 + "log", 1844 + "proc-macro2", 1845 + "quote", 1846 + "syn 2.0.106", 1847 + "wasm-bindgen-shared", 1848 + ] 1849 + 1850 + [[package]] 1851 + name = "wasm-bindgen-futures" 1852 + version = "0.4.51" 1853 + source = "registry+https://github.com/rust-lang/crates.io-index" 1854 + checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" 1855 + dependencies = [ 1856 + "cfg-if 1.0.3", 1857 + "js-sys", 1858 + "once_cell", 1859 + "wasm-bindgen", 1860 + "web-sys", 1861 + ] 1862 + 1863 + [[package]] 1864 + name = "wasm-bindgen-macro" 1865 + version = "0.2.101" 1866 + source = "registry+https://github.com/rust-lang/crates.io-index" 1867 + checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" 1868 + dependencies = [ 1869 + "quote", 1870 + "wasm-bindgen-macro-support", 1871 + ] 1872 + 1873 + [[package]] 1874 + name = "wasm-bindgen-macro-support" 1875 + version = "0.2.101" 1876 + source = "registry+https://github.com/rust-lang/crates.io-index" 1877 + checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" 1878 + dependencies = [ 1879 + "proc-macro2", 1880 + "quote", 1881 + "syn 2.0.106", 1882 + "wasm-bindgen-backend", 1883 + "wasm-bindgen-shared", 1884 + ] 1885 + 1886 + [[package]] 1887 + name = "wasm-bindgen-shared" 1888 + version = "0.2.101" 1889 + source = "registry+https://github.com/rust-lang/crates.io-index" 1890 + checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" 1891 + dependencies = [ 1892 + "unicode-ident", 1893 + ] 1894 + 1895 + [[package]] 1896 + name = "web-sys" 1897 + version = "0.3.78" 1898 + source = "registry+https://github.com/rust-lang/crates.io-index" 1899 + checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" 1900 + dependencies = [ 1901 + "js-sys", 1902 + "wasm-bindgen", 1903 + ] 1904 + 1905 + [[package]] 1906 + name = "widestring" 1907 + version = "0.4.3" 1908 + source = "registry+https://github.com/rust-lang/crates.io-index" 1909 + checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" 1910 + 1911 + [[package]] 1912 + name = "winapi" 1913 + version = "0.2.8" 1914 + source = "registry+https://github.com/rust-lang/crates.io-index" 1915 + checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1916 + 1917 + [[package]] 1918 + name = "winapi" 1919 + version = "0.3.9" 1920 + source = "registry+https://github.com/rust-lang/crates.io-index" 1921 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1922 + dependencies = [ 1923 + "winapi-i686-pc-windows-gnu", 1924 + "winapi-x86_64-pc-windows-gnu", 1925 + ] 1926 + 1927 + [[package]] 1928 + name = "winapi-build" 1929 + version = "0.1.1" 1930 + source = "registry+https://github.com/rust-lang/crates.io-index" 1931 + checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1932 + 1933 + [[package]] 1934 + name = "winapi-i686-pc-windows-gnu" 1935 + version = "0.4.0" 1936 + source = "registry+https://github.com/rust-lang/crates.io-index" 1937 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1938 + 1939 + [[package]] 1940 + name = "winapi-x86_64-pc-windows-gnu" 1941 + version = "0.4.0" 1942 + source = "registry+https://github.com/rust-lang/crates.io-index" 1943 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1944 + 1945 + [[package]] 1946 + name = "windows-link" 1947 + version = "0.1.3" 1948 + source = "registry+https://github.com/rust-lang/crates.io-index" 1949 + checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1950 + 1951 + [[package]] 1952 + name = "windows-registry" 1953 + version = "0.5.3" 1954 + source = "registry+https://github.com/rust-lang/crates.io-index" 1955 + checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 1956 + dependencies = [ 1957 + "windows-link", 1958 + "windows-result", 1959 + "windows-strings", 1960 + ] 1961 + 1962 + [[package]] 1963 + name = "windows-result" 1964 + version = "0.3.4" 1965 + source = "registry+https://github.com/rust-lang/crates.io-index" 1966 + checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 1967 + dependencies = [ 1968 + "windows-link", 1969 + ] 1970 + 1971 + [[package]] 1972 + name = "windows-strings" 1973 + version = "0.4.2" 1974 + source = "registry+https://github.com/rust-lang/crates.io-index" 1975 + checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 1976 + dependencies = [ 1977 + "windows-link", 1978 + ] 1979 + 1980 + [[package]] 1981 + name = "windows-sys" 1982 + version = "0.52.0" 1983 + source = "registry+https://github.com/rust-lang/crates.io-index" 1984 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1985 + dependencies = [ 1986 + "windows-targets", 1987 + ] 1988 + 1989 + [[package]] 1990 + name = "windows-sys" 1991 + version = "0.59.0" 1992 + source = "registry+https://github.com/rust-lang/crates.io-index" 1993 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1994 + dependencies = [ 1995 + "windows-targets", 1996 + ] 1997 + 1998 + [[package]] 1999 + name = "windows-targets" 2000 + version = "0.52.6" 2001 + source = "registry+https://github.com/rust-lang/crates.io-index" 2002 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2003 + dependencies = [ 2004 + "windows_aarch64_gnullvm", 2005 + "windows_aarch64_msvc", 2006 + "windows_i686_gnu", 2007 + "windows_i686_gnullvm", 2008 + "windows_i686_msvc", 2009 + "windows_x86_64_gnu", 2010 + "windows_x86_64_gnullvm", 2011 + "windows_x86_64_msvc", 2012 + ] 2013 + 2014 + [[package]] 2015 + name = "windows_aarch64_gnullvm" 2016 + version = "0.52.6" 2017 + source = "registry+https://github.com/rust-lang/crates.io-index" 2018 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2019 + 2020 + [[package]] 2021 + name = "windows_aarch64_msvc" 2022 + version = "0.52.6" 2023 + source = "registry+https://github.com/rust-lang/crates.io-index" 2024 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2025 + 2026 + [[package]] 2027 + name = "windows_i686_gnu" 2028 + version = "0.52.6" 2029 + source = "registry+https://github.com/rust-lang/crates.io-index" 2030 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2031 + 2032 + [[package]] 2033 + name = "windows_i686_gnullvm" 2034 + version = "0.52.6" 2035 + source = "registry+https://github.com/rust-lang/crates.io-index" 2036 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2037 + 2038 + [[package]] 2039 + name = "windows_i686_msvc" 2040 + version = "0.52.6" 2041 + source = "registry+https://github.com/rust-lang/crates.io-index" 2042 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2043 + 2044 + [[package]] 2045 + name = "windows_x86_64_gnu" 2046 + version = "0.52.6" 2047 + source = "registry+https://github.com/rust-lang/crates.io-index" 2048 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2049 + 2050 + [[package]] 2051 + name = "windows_x86_64_gnullvm" 2052 + version = "0.52.6" 2053 + source = "registry+https://github.com/rust-lang/crates.io-index" 2054 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2055 + 2056 + [[package]] 2057 + name = "windows_x86_64_msvc" 2058 + version = "0.52.6" 2059 + source = "registry+https://github.com/rust-lang/crates.io-index" 2060 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2061 + 2062 + [[package]] 2063 + name = "winreg" 2064 + version = "0.6.2" 2065 + source = "registry+https://github.com/rust-lang/crates.io-index" 2066 + checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" 2067 + dependencies = [ 2068 + "winapi 0.3.9", 2069 + ] 2070 + 2071 + [[package]] 2072 + name = "wit-bindgen" 2073 + version = "0.45.1" 2074 + source = "registry+https://github.com/rust-lang/crates.io-index" 2075 + checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" 2076 + 2077 + [[package]] 2078 + name = "writeable" 2079 + version = "0.6.1" 2080 + source = "registry+https://github.com/rust-lang/crates.io-index" 2081 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 2082 + 2083 + [[package]] 2084 + name = "ws" 2085 + version = "0.9.2" 2086 + source = "registry+https://github.com/rust-lang/crates.io-index" 2087 + checksum = "25fe90c75f236a0a00247d5900226aea4f2d7b05ccc34da9e7a8880ff59b5848" 2088 + dependencies = [ 2089 + "byteorder", 2090 + "bytes 0.4.12", 2091 + "httparse", 2092 + "log", 2093 + "mio 0.6.23", 2094 + "mio-extras", 2095 + "rand 0.7.3", 2096 + "sha-1", 2097 + "slab", 2098 + "url", 2099 + ] 2100 + 2101 + [[package]] 2102 + name = "ws2_32-sys" 2103 + version = "0.2.1" 2104 + source = "registry+https://github.com/rust-lang/crates.io-index" 2105 + checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2106 + dependencies = [ 2107 + "winapi 0.2.8", 2108 + "winapi-build", 2109 + ] 2110 + 2111 + [[package]] 2112 + name = "yoke" 2113 + version = "0.8.0" 2114 + source = "registry+https://github.com/rust-lang/crates.io-index" 2115 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 2116 + dependencies = [ 2117 + "serde", 2118 + "stable_deref_trait", 2119 + "yoke-derive", 2120 + "zerofrom", 2121 + ] 2122 + 2123 + [[package]] 2124 + name = "yoke-derive" 2125 + version = "0.8.0" 2126 + source = "registry+https://github.com/rust-lang/crates.io-index" 2127 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 2128 + dependencies = [ 2129 + "proc-macro2", 2130 + "quote", 2131 + "syn 2.0.106", 2132 + "synstructure", 2133 + ] 2134 + 2135 + [[package]] 2136 + name = "zerocopy" 2137 + version = "0.8.26" 2138 + source = "registry+https://github.com/rust-lang/crates.io-index" 2139 + checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 2140 + dependencies = [ 2141 + "zerocopy-derive", 2142 + ] 2143 + 2144 + [[package]] 2145 + name = "zerocopy-derive" 2146 + version = "0.8.26" 2147 + source = "registry+https://github.com/rust-lang/crates.io-index" 2148 + checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 2149 + dependencies = [ 2150 + "proc-macro2", 2151 + "quote", 2152 + "syn 2.0.106", 2153 + ] 2154 + 2155 + [[package]] 2156 + name = "zerofrom" 2157 + version = "0.1.6" 2158 + source = "registry+https://github.com/rust-lang/crates.io-index" 2159 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2160 + dependencies = [ 2161 + "zerofrom-derive", 2162 + ] 2163 + 2164 + [[package]] 2165 + name = "zerofrom-derive" 2166 + version = "0.1.6" 2167 + source = "registry+https://github.com/rust-lang/crates.io-index" 2168 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2169 + dependencies = [ 2170 + "proc-macro2", 2171 + "quote", 2172 + "syn 2.0.106", 2173 + "synstructure", 2174 + ] 2175 + 2176 + [[package]] 2177 + name = "zeroize" 2178 + version = "1.8.1" 2179 + source = "registry+https://github.com/rust-lang/crates.io-index" 2180 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2181 + 2182 + [[package]] 2183 + name = "zerotrie" 2184 + version = "0.2.2" 2185 + source = "registry+https://github.com/rust-lang/crates.io-index" 2186 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 2187 + dependencies = [ 2188 + "displaydoc", 2189 + "yoke", 2190 + "zerofrom", 2191 + ] 2192 + 2193 + [[package]] 2194 + name = "zerovec" 2195 + version = "0.11.4" 2196 + source = "registry+https://github.com/rust-lang/crates.io-index" 2197 + checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 2198 + dependencies = [ 2199 + "yoke", 2200 + "zerofrom", 2201 + "zerovec-derive", 2202 + ] 2203 + 2204 + [[package]] 2205 + name = "zerovec-derive" 2206 + version = "0.11.1" 2207 + source = "registry+https://github.com/rust-lang/crates.io-index" 2208 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2209 + dependencies = [ 2210 + "proc-macro2", 2211 + "quote", 2212 + "syn 2.0.106", 2213 + ]
+6
Cargo.toml
··· 2 2 name = "tangled-on-commit" 3 3 version = "0.1.0" 4 4 edition = "2024" 5 + license = "GPL-3.0-or-later" 6 + rust-version = "1.88" 5 7 6 8 [dependencies] 9 + json = "0.12.4" 10 + trust-dns-resolver = "0.20.1" 11 + reqwest = { version = "0.12.23", features = ["blocking"] } 12 + ws = "0.9.2"
+63
README.md
··· 1 + # `tangled-on-commit` 2 + 3 + Run a shell command whenever a specific repo gets a commit 4 + 5 + ```sh 6 + $ tangled-on-commit @vielle.dev/tangled-on-commit ./commit.sh 7 + ``` 8 + 9 + > Created for linux. Should work fine on MacOS. Will not work on windows. 10 + > Note: The shell command is placed inside `/bin/sh -c "COMMAND"`, so make sure to escape quotes and backslashes. I reccomend executing a shell file and piping stdout and stderr to a log file 11 + 12 + ## Installation 13 + 14 + Prerequisites: 15 + 16 + - `Git` 17 + - `Rust` (1.88+) 18 + - `Cargo` 19 + - `OpenSSL` (required for ssl connection) 20 + - `pkg-config` (required for ssl connection) 21 + 22 + 1. Clone this repo: 23 + `git clone git@tangled.sh:vielle.dev/tangled-on-commit` 24 + 2. Compile the binary: 25 + `cargo build --release` 26 + 3. Copy the binary to your path: 27 + `sudo cp ./target/release/tangled-on-commit /bin` 28 + 29 + ## Usage 30 + 31 + ### CLI Arguments 32 + 33 + - `tangled-on-commit (-h | --help)` 34 + Displays this message 35 + 36 + - `tangled-on-commit` 37 + No specified handle, repo, or command. Falls back to config/env 38 + 39 + - `tangled-on-commit SHELL` 40 + Uses config/env for handle and repo 41 + 42 + - `tangled-on-commit @HANDLE SHELL` 43 + Uses config/env for repo 44 + 45 + - `tangled-on-commit REPO SHELL` 46 + Uses config/env for handle 47 + 48 + - `tangled-on-commit @HANDLE/REPO SHELL` 49 + `tangled-on-commit HANDLE REPO SHELL` 50 + No config/env 51 + 52 + ### JSON 53 + 54 + Loads the file `tangled-on-commit.json` from cwd if it exists. 55 + Reads keys \"handle\", \"repo_name\", and \"shell\". 56 + Unknown keys are ignored and any key can be ommitted 57 + JSON is used if the arguments aren't passed to the CLI 58 + 59 + ### Env 60 + 61 + Loads the environment variables `TANGLED_ON_COMMIT_HANDLE` and `TANGLED_ON_COMMIT_REPO_NAME` 62 + Shell cannot be set by environment variables. 63 + Env variables are used if relevant keys are ommitted an arguments aren't passed to the CLI.
+215
src/args.rs
··· 1 + fn help() { 2 + println!( 3 + "Help: tangled-on-commit 4 + Listen for commits on a specified repository and execute a shell command. 5 + 6 + CLI Arguments: 7 + `tangled-on-commit (-h | --help)` 8 + Displays this message 9 + 10 + `tangled-on-commit` 11 + No specified handle, repo, or command. Falls back to config/env 12 + 13 + `tangled-on-commit SHELL` 14 + Uses config/env for handle and repo 15 + 16 + `tangled-on-commit @HANDLE SHELL` 17 + Uses config/env for repo 18 + 19 + `tangled-on-commit REPO SHELL` 20 + Uses config/env for handle 21 + 22 + `tangled-on-commit @HANDLE/REPO SHELL` 23 + `tangled-on-commit HANDLE REPO SHELL` 24 + No config/env 25 + 26 + JSON: 27 + Loads the file `tangled-on-commit.json` from cwd if it exists. 28 + Reads keys \"handle\", \"repo_name\", and \"shell\". 29 + Unknown keys are ignored and any key can be ommitted 30 + JSON is used if the arguments aren't passed to the CLI 31 + 32 + Env: 33 + Loads the environment variables `TANGLED_ON_COMMIT_HANDLE` and `TANGLED_ON_COMMIT_REPO_NAME` 34 + Shell cannot be set by environment variables. 35 + Env variables are used if relevant keys are ommitted an arguments aren't passed to the CLI. 36 + " 37 + ) 38 + } 39 + 40 + #[derive(Debug)] 41 + pub struct Config { 42 + pub handle: String, 43 + pub repo_name: String, 44 + pub shell: String, 45 + } 46 + 47 + pub fn load_config() -> Result<Config, ()> { 48 + // load config from cli args if present 49 + // if omitted, fallback to a local `tangled-on-commit.json` file 50 + // if key omitted or file not found, fall back to env 51 + // if env omitted, error out and quit 52 + // note: shell is not loaded from env (to avoid the user unknowingly executing scripts) 53 + 54 + // if any args are `-h` || `--help` display help and quit 55 + for arg in std::env::args() { 56 + if arg == "-h" || arg == "--help" { 57 + help(); 58 + return Err(()); 59 + } 60 + } 61 + 62 + // if 0 args are passed, skip 63 + // if 1 arg is passed, its the shell command 64 + // if 2 args are passed: 65 + // if arg 1 starts in @ its a handle 66 + // if it contains a / the contents after the slash is the reponame 67 + // else its the reponame 68 + // arg 2 is always the shell command 69 + // if 3 args are passed its handle repo shell 70 + // if more args are passed its an error 71 + 72 + let mut handle: Option<String> = None; 73 + let mut repo_name: Option<String> = None; 74 + let mut shell: Option<String> = None; 75 + match std::env::args().collect::<Vec<_>>().len() { 76 + // 0 args (std env args includes this script) 77 + 1 => {} 78 + 2 => { 79 + shell = Some( 80 + std::env::args() 81 + .last() 82 + .expect("Invalid state: 2 `Some` std::env::args() but found no Some values"), 83 + ) 84 + } 85 + 3 => { 86 + // load args and consume first 87 + let mut args = std::env::args(); 88 + args.next(); 89 + 90 + if let Some(val) = args.next() { 91 + if val.starts_with("@") { 92 + if val.contains("/") { 93 + let entries: Vec<_> = val.split("/").collect(); 94 + if entries.len() != 2 { 95 + println!("Invalid argument: `{}` is malformed", val); 96 + return Err(()); 97 + } 98 + handle = Some(entries[0][1..].to_string()); 99 + repo_name = Some(entries[1].to_string()); 100 + } else { 101 + handle = Some(val[1..].to_string()); 102 + } 103 + } else { 104 + repo_name = Some(val) 105 + }; 106 + } 107 + shell = Some( 108 + args.next() 109 + .expect("Invalid state: 3 `Some` std::env::args() but only found 2"), 110 + ); 111 + } 112 + 4 => { 113 + // load args and consume first 114 + let mut args = std::env::args(); 115 + args.next(); 116 + 117 + handle = Some( 118 + args.next() 119 + .expect("Invalid state: 4 `Some` std::env::args() but only found 1"), 120 + ); 121 + repo_name = Some( 122 + args.next() 123 + .expect("Invalid state: 4 `Some` std::env::args() but only found 2"), 124 + ); 125 + shell = Some( 126 + args.next() 127 + .expect("Invalid state: 4 `Some` std::env::args() but only found 3"), 128 + ); 129 + } 130 + _ => { 131 + // err 132 + } 133 + } 134 + 135 + if let Some(ref handle) = handle 136 + && let Some(ref repo_name) = repo_name 137 + && let Some(ref shell) = shell 138 + { 139 + return Ok(Config { 140 + handle: handle.to_string(), 141 + repo_name: repo_name.to_string(), 142 + shell: shell.to_string(), 143 + }); 144 + } 145 + 146 + // now load config 147 + if let Ok(file) = std::fs::read_to_string("./tangled-on-commit.json") { 148 + if let Ok(parsed) = json::parse(&file) { 149 + if handle.is_none() 150 + && let Some(json_handle) = parsed["handle"].as_str() 151 + { 152 + handle = Some(String::from(json_handle)) 153 + } 154 + if repo_name.is_none() 155 + && let Some(json_repo_name) = parsed["repo_name"].as_str() 156 + { 157 + repo_name = Some(String::from(json_repo_name)) 158 + } 159 + if shell.is_none() 160 + && let Some(json_shell) = parsed["shell"].as_str() 161 + { 162 + shell = Some(String::from(json_shell)) 163 + } 164 + } 165 + } 166 + 167 + if let Some(ref handle) = handle 168 + && let Some(ref repo_name) = repo_name 169 + && let Some(ref shell) = shell 170 + { 171 + return Ok(Config { 172 + handle: handle.to_string(), 173 + repo_name: repo_name.to_string(), 174 + shell: shell.to_string(), 175 + }); 176 + } 177 + 178 + // now load from env 179 + if handle.is_none() 180 + && let Ok(env_handle) = std::env::var("TANGLED_ON_COMMIT_HANDLE") 181 + { 182 + handle = Some(String::from(env_handle)) 183 + } 184 + if repo_name.is_none() 185 + && let Ok(env_repo_name) = std::env::var("TANGLED_ON_COMMIT_REPO_NAME") 186 + { 187 + repo_name = Some(String::from(env_repo_name)) 188 + } 189 + 190 + if let Some(ref handle) = handle 191 + && let Some(ref repo_name) = repo_name 192 + && let Some(ref shell) = shell 193 + { 194 + return Ok(Config { 195 + handle: handle.to_string(), 196 + repo_name: repo_name.to_string(), 197 + shell: shell.to_string(), 198 + }); 199 + } 200 + 201 + // couldnt resolve every value 202 + // print an error and quit 203 + println!("Unable to find a value for every setting. Missing values for:"); 204 + if handle.is_none() { 205 + println!("- handle"); 206 + } 207 + if repo_name.is_none() { 208 + println!("- repo_name"); 209 + } 210 + if shell.is_none() { 211 + println!("- shell"); 212 + } 213 + println!("\nRun `tangled-on-commit --help` to see the help message"); 214 + return Err(()); 215 + }
+194
src/did.rs
··· 1 + use trust_dns_resolver::Resolver; 2 + use trust_dns_resolver::config::{ResolverConfig, ResolverOpts}; 3 + 4 + #[derive(Debug)] 5 + pub struct DidDoc { 6 + pub did: String, 7 + pub pds: String, 8 + } 9 + 10 + fn get_txt_did(handle: &String) -> Result<String, ()> { 11 + println!(" Trying dns TXT for _atproto.{}", handle); 12 + // create a txt resolver 13 + let resolver = match Resolver::new(ResolverConfig::default(), ResolverOpts::default()) { 14 + Ok(val) => val, 15 + Err(_) => { 16 + println!(" Couldn't create a DNS resolver"); 17 + return Err(()); 18 + } 19 + }; 20 + 21 + // resolve _atproto.handle to a TXT record 22 + let txt_res = match resolver.txt_lookup("_atproto.".to_owned() + &handle) { 23 + Ok(val) => val, 24 + Err(_) => { 25 + println!(" Couldn't resolve to a TXT record"); 26 + return Err(()); 27 + } // collect all entries and convert to strings 28 + } 29 + .into_iter() 30 + .map(|x| x.to_string()) 31 + .collect::<Vec<_>>(); 32 + 33 + // filter entries which do not start with `did=` 34 + let did_res = txt_res 35 + .clone() 36 + .extract_if(.., |x| x.starts_with("did=")) 37 + .collect::<Vec<_>>(); 38 + // only 1 did= can exist 39 + // https://atproto.com/specs/handle#:~:text=If%20multiple%20valid%20records%20with%20different%20DIDs%20are%20present,%20resolution%20should%20fail. 40 + if did_res.len() != 1 { 41 + println!(" Found too many DIDs for this handle"); 42 + return Err(()); 43 + } 44 + 45 + return Ok(did_res[0][4..].to_string()); 46 + } 47 + 48 + fn get_http_did(handle: &String) -> Result<String, ()> { 49 + println!( 50 + " Trying https for https://{}/.well-known/atproto-did", 51 + handle 52 + ); 53 + let res = 54 + match reqwest::blocking::get("https://".to_owned() + handle + "/.well-known/atproto-did") { 55 + Ok(val) => val, 56 + Err(_) => { 57 + println!(" GET request failed"); 58 + return Err(()); 59 + } 60 + }; 61 + 62 + // as per spec, non 2xx code means failure 63 + if !res.status().is_success() { 64 + println!( 65 + " Got non 2xx status code: {}", 66 + res.status().as_str() 67 + ); 68 + return Err(()); 69 + } 70 + 71 + let did_unparsed = match res.text() { 72 + Ok(val) => val, 73 + Err(_) => { 74 + println!(" Missing or malformed body response"); 75 + return Err(()); 76 + } 77 + }; 78 + 79 + let did = did_unparsed.trim(); 80 + 81 + if !did.starts_with("did:") { 82 + println!(" Did not find a DID"); 83 + return Err(()); 84 + }; 85 + return Ok(String::from(did)); 86 + } 87 + 88 + fn parse_doc(did: String, text: String) -> Result<DidDoc, ()> { 89 + let text_json = match json::parse(&text) { 90 + Ok(val) => val, 91 + Err(_) => { 92 + println!(" Malformed DID document"); 93 + return Err(()); 94 + } 95 + }; 96 + 97 + for service in text_json["service"].members() { 98 + if service["id"] 99 + .as_str() 100 + .is_some_and(|x| x.ends_with("#atproto_pds")) 101 + && service["type"] 102 + .as_str() 103 + .is_some_and(|x| x == "AtprotoPersonalDataServer") 104 + && let Some(pds) = service["serviceEndpoint"].as_str() 105 + { 106 + return Ok(DidDoc { 107 + did: did, 108 + pds: pds.to_string(), 109 + }); 110 + } 111 + } 112 + 113 + println!(" Missing fields from DID document"); 114 + return Err(()); 115 + } 116 + 117 + fn get_plc_doc(plc: &str) -> Result<DidDoc, ()> { 118 + let res = match reqwest::blocking::get("https://plc.directory/did:plc:".to_owned() + plc) { 119 + Ok(val) => val, 120 + Err(_) => { 121 + println!(" GET request failed"); 122 + return Err(()); 123 + } 124 + }; 125 + 126 + if !res.status().is_success() { 127 + println!(" Got non 2xx status code: {}", res.status().as_str()); 128 + 129 + return Err(()); 130 + } 131 + 132 + return parse_doc( 133 + "did:plc:".to_owned() + plc, 134 + match res.text() { 135 + Ok(val) => val, 136 + Err(_) => { 137 + println!(" Missing or malformed body response"); 138 + return Err(()); 139 + } 140 + }, 141 + ); 142 + } 143 + 144 + fn get_web_doc(web: &str) -> Result<DidDoc, ()> { 145 + let res = match reqwest::blocking::get("https://".to_owned() + web + "/.well-known/did.json") { 146 + Ok(val) => val, 147 + Err(_) => { 148 + println!(" GET request failed"); 149 + return Err(()); 150 + } 151 + }; 152 + 153 + if !res.status().is_success() { 154 + println!(" Got non 2xx status code: {}", res.status().as_str()); 155 + return Err(()); 156 + } 157 + 158 + return parse_doc( 159 + "did:web:".to_owned() + web, 160 + match res.text() { 161 + Ok(val) => val, 162 + Err(_) => { 163 + println!(" Missing or malformed body response"); 164 + return Err(()); 165 + } 166 + }, 167 + ); 168 + } 169 + 170 + pub fn get_did(handle: &String) -> Result<DidDoc, ()> { 171 + println!(" Getting DID for {}", handle); 172 + let did = if let Ok(did) = get_txt_did(&handle) { 173 + did 174 + } else { 175 + if let Ok(did) = get_http_did(&handle) { 176 + did 177 + } else { 178 + println!(" Could not get a DID"); 179 + return Err(()); 180 + } 181 + }; 182 + 183 + println!(" Getting DID document for {}", did); 184 + let did_doc = if did.starts_with("did:plc:") { 185 + get_plc_doc(&did[8..]) 186 + } else if did.starts_with("did:web:") { 187 + get_web_doc(&did[8..]) 188 + } else { 189 + println!(" Could not get a DID document"); 190 + Err(()) 191 + }; 192 + 193 + return did_doc; 194 + }
+66
src/knot.rs
··· 1 + pub fn find_knot(did: &String, repo_name: &String, pds: &String) -> Result<String, ()> { 2 + // https://docs.bsky.app/docs/api/com-atproto-repo-list-records 3 + let mut cursor: Option<String> = None; 4 + 5 + loop { 6 + let url = format!( 7 + "{0}/xrpc/com.atproto.repo.listRecords?collection=sh.tangled.repo&repo={1}&cursor={2}", 8 + pds.clone(), 9 + did.clone(), 10 + cursor.clone().unwrap_or(String::new()) 11 + ); 12 + 13 + let res = match reqwest::blocking::get(url) { 14 + Ok(val) => val, 15 + Err(_) => { 16 + println!(" Failed to load repos."); 17 + return Err(()); 18 + } 19 + }; 20 + 21 + if !res.status().is_success() { 22 + println!(" Got non 2xx code when loading repos"); 23 + return Err(()); 24 + } 25 + 26 + let body = match res.text() { 27 + Ok(val) => match json::parse(&val) { 28 + Ok(val) => val, 29 + Err(_) => { 30 + println!(" Invalid or malformed response response"); 31 + return Err(()); 32 + } 33 + }, 34 + Err(_) => { 35 + println!(" Missing body from response"); 36 + return Err(()); 37 + } 38 + }; 39 + 40 + // must contain a records array 41 + if !body["records"].is_array() { 42 + println!(" Invalid or malformed response response"); 43 + return Err(()); 44 + } 45 + for record in body["records"].members() { 46 + if let Some(val) = record["value"]["name"].as_str() 47 + && val == repo_name 48 + { 49 + if let Some(knot) = record["value"]["knot"].as_str() { 50 + return Ok(String::from(knot)); 51 + } else { 52 + println!(" Repo didn't have a valid knot"); 53 + return Err(()); 54 + } 55 + } 56 + } 57 + 58 + if let Some(val) = body["cursor"].as_str() { 59 + cursor = Some(String::from(val)) 60 + } else { 61 + break; 62 + } 63 + } 64 + 65 + return Err(()); 66 + }
+82 -3
src/main.rs
··· 1 - fn main() -> Result<(), i32> { 2 - println!("Hello, world!"); 1 + use std::process::Command; 2 + 3 + mod args; 4 + mod did; 5 + mod knot; 6 + 7 + fn main() -> Result<(), ()> { 8 + // load configuration 9 + let config = match args::load_config() { 10 + Ok(res) => res, 11 + Err(_) => return Err(()), 12 + }; 13 + 14 + // resolve handle to did 15 + println!("Resolving {}", config.handle); 16 + let did_doc = match did::get_did(&config.handle) { 17 + Ok(res) => res, 18 + Err(_) => return Err(()), 19 + }; 20 + println!( 21 + " Found DID `{0}` hosted at `{1}`", 22 + did_doc.did, did_doc.pds 23 + ); 24 + 25 + // resolve did+repoName to knotserver 26 + println!("Resolving @{0}/{1}", config.handle, config.repo_name); 27 + let knot_server = match knot::find_knot(&did_doc.did, &config.repo_name, &did_doc.pds) { 28 + Ok(val) => val, 29 + Err(_) => return Err(()), 30 + }; 31 + println!(" Found knot `{}`", knot_server); 32 + 33 + // connect to /events on knotserver 34 + println!( 35 + "Connecting to `{}`", 36 + format!("wss://{}/events", knot_server) 37 + ); 38 + 39 + match ws::connect(format!("ws://{}/events", knot_server), |_out| { 40 + println!(" Connection successful"); 41 + |msg: ws::Message| { 42 + // parse json 43 + let body = match json::parse(match msg.as_text() { 44 + Ok(val) => val, 45 + Err(_) => return Ok(()), 46 + }) { 47 + Ok(val) => val, 48 + Err(_) => { 49 + println!(" Invalid body. Skipping message"); 50 + return Ok(()); 51 + } 52 + }; 3 53 4 - return Ok(()) 54 + // filter by did and reponame 55 + if let Some(repo_did) = body["event"]["repoDid"].as_str() 56 + && let Some(repo) = body["event"]["repoName"].as_str() 57 + && repo_did != &did_doc.did 58 + && repo != &config.repo_name 59 + { 60 + // repo doesnt match so skip 61 + return Ok(()); 62 + } 63 + 64 + println!(" Executing `/bin/sh -c {}`", &config.shell); 65 + 66 + // exec shell command in /bin/sh 67 + match Command::new("/bin/sh") 68 + .arg("-c") 69 + .arg(&config.shell) 70 + .output() 71 + { 72 + Ok(val) => val, 73 + Err(_) => return Ok(()), 74 + }; 75 + 76 + Ok(()) 77 + } 78 + }) { 79 + Ok(_) => {} 80 + Err(err) => println!(" Connection failed: {}", err), 81 + }; 82 + 83 + return Ok(()); 5 84 }
+5
tangled-on-commit.json
··· 1 + { 2 + "handle": "vielle.dev", 3 + "repo_name": "tangled-on-commit", 4 + "shell": "echo \\\"Got a new commit\\!\\!\\\" 2>&1 > out.txt" 5 + }