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

Compare changes

Choose any two refs to compare.

+1214 -23
Cargo.lock
··· 29 29 ] 30 30 31 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]] 32 38 name = "autocfg" 33 39 version = "1.5.0" 34 40 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 41 47 checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 42 48 dependencies = [ 43 49 "addr2line", 44 - "cfg-if", 50 + "cfg-if 1.0.3", 45 51 "libc", 46 52 "miniz_oxide", 47 53 "object", ··· 50 56 ] 51 57 52 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]] 53 65 name = "bitflags" 54 66 version = "1.3.2" 55 67 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 62 74 checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 63 75 64 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]] 65 148 name = "cfg-if" 66 149 version = "1.0.3" 67 150 source = "registry+https://github.com/rust-lang/crates.io-index" 68 151 checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 69 152 70 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]] 71 170 name = "data-encoding" 72 171 version = "2.9.0" 73 172 source = "registry+https://github.com/rust-lang/crates.io-index" 74 173 checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 75 174 76 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]] 77 185 name = "displaydoc" 78 186 version = "0.2.5" 79 187 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 85 193 ] 86 194 87 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]] 88 205 name = "enum-as-inner" 89 206 version = "0.3.4" 90 207 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 97 214 ] 98 215 99 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]] 100 272 name = "form_urlencoded" 101 273 version = "1.2.2" 102 274 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 106 278 ] 107 279 108 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]] 109 297 name = "futures-channel" 110 298 version = "0.3.31" 111 299 source = "registry+https://github.com/rust-lang/crates.io-index" 112 300 checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 113 301 dependencies = [ 114 302 "futures-core", 303 + "futures-sink", 115 304 ] 116 305 117 306 [[package]] ··· 127 316 checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 128 317 129 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]] 130 325 name = "futures-task" 131 326 version = "0.3.31" 132 327 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 139 334 checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 140 335 dependencies = [ 141 336 "futures-core", 337 + "futures-io", 338 + "futures-sink", 142 339 "futures-task", 340 + "memchr", 143 341 "pin-project-lite", 144 342 "pin-utils", 145 343 "slab", 146 344 ] 147 345 148 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]] 149 367 name = "getrandom" 150 368 version = "0.2.16" 151 369 source = "registry+https://github.com/rust-lang/crates.io-index" 152 370 checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 153 371 dependencies = [ 154 - "cfg-if", 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", 155 384 "libc", 156 - "wasi", 385 + "r-efi", 386 + "wasi 0.14.4+wasi-0.2.4", 157 387 ] 158 388 159 389 [[package]] ··· 163 393 checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 164 394 165 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]] 166 421 name = "heck" 167 422 version = "0.4.1" 168 423 source = "registry+https://github.com/rust-lang/crates.io-index" 169 424 checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 170 425 171 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]] 172 547 name = "icu_collections" 173 548 version = "2.0.0" 174 549 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 287 662 ] 288 663 289 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]] 290 675 name = "instant" 291 676 version = "0.1.13" 292 677 source = "registry+https://github.com/rust-lang/crates.io-index" 293 678 checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 294 679 dependencies = [ 295 - "cfg-if", 680 + "cfg-if 1.0.3", 296 681 ] 297 682 298 683 [[package]] ··· 302 687 checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 303 688 dependencies = [ 304 689 "bitflags 2.9.4", 305 - "cfg-if", 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 = [ 306 700 "libc", 307 701 ] 308 702 ··· 314 708 dependencies = [ 315 709 "socket2 0.3.19", 316 710 "widestring", 317 - "winapi", 711 + "winapi 0.3.9", 318 712 "winreg", 319 713 ] 320 714 ··· 325 719 checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 326 720 327 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]] 328 748 name = "json" 329 749 version = "0.12.4" 330 750 source = "registry+https://github.com/rust-lang/crates.io-index" 331 751 checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" 332 752 333 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]] 334 764 name = "lazy_static" 335 765 version = "1.5.0" 336 766 source = "registry+https://github.com/rust-lang/crates.io-index" 337 767 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 338 768 339 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]] 340 776 name = "libc" 341 777 version = "0.2.175" 342 778 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 347 783 version = "0.5.6" 348 784 source = "registry+https://github.com/rust-lang/crates.io-index" 349 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" 350 792 351 793 [[package]] 352 794 name = "litemap" ··· 392 834 checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 393 835 394 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]] 395 843 name = "miniz_oxide" 396 844 version = "0.8.9" 397 845 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 402 850 403 851 [[package]] 404 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" 405 872 version = "1.0.4" 406 873 source = "registry+https://github.com/rust-lang/crates.io-index" 407 874 checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 408 875 dependencies = [ 409 876 "libc", 410 - "wasi", 411 - "windows-sys", 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", 412 931 ] 413 932 414 933 [[package]] ··· 421 940 ] 422 941 423 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]] 424 999 name = "parking_lot" 425 1000 version = "0.11.2" 426 1001 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 437 1012 source = "registry+https://github.com/rust-lang/crates.io-index" 438 1013 checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" 439 1014 dependencies = [ 440 - "cfg-if", 1015 + "cfg-if 1.0.3", 441 1016 "instant", 442 1017 "libc", 443 1018 "redox_syscall", 444 1019 "smallvec", 445 - "winapi", 1020 + "winapi 0.3.9", 446 1021 ] 447 1022 448 1023 [[package]] ··· 464 1039 checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 465 1040 466 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]] 467 1048 name = "potential_utf" 468 1049 version = "0.1.3" 469 1050 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 500 1081 ] 501 1082 502 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]] 503 1103 name = "rand" 504 1104 version = "0.8.5" 505 1105 source = "registry+https://github.com/rust-lang/crates.io-index" 506 1106 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 507 1107 dependencies = [ 508 1108 "libc", 509 - "rand_chacha", 510 - "rand_core", 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", 511 1121 ] 512 1122 513 1123 [[package]] ··· 517 1127 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 518 1128 dependencies = [ 519 1129 "ppv-lite86", 520 - "rand_core", 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", 521 1140 ] 522 1141 523 1142 [[package]] ··· 526 1145 source = "registry+https://github.com/rust-lang/crates.io-index" 527 1146 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 528 1147 dependencies = [ 529 - "getrandom", 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", 530 1158 ] 531 1159 532 1160 [[package]] ··· 539 1167 ] 540 1168 541 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]] 542 1212 name = "resolv-conf" 543 1213 version = "0.7.4" 544 1214 source = "registry+https://github.com/rust-lang/crates.io-index" 545 1215 checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" 546 1216 547 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]] 548 1232 name = "rustc-demangle" 549 1233 version = "0.1.26" 550 1234 source = "registry+https://github.com/rust-lang/crates.io-index" 551 1235 checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 552 1236 553 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]] 554 1305 name = "scopeguard" 555 1306 version = "1.2.0" 556 1307 source = "registry+https://github.com/rust-lang/crates.io-index" 557 1308 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 558 1309 559 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]] 560 1334 name = "serde" 561 1335 version = "1.0.219" 562 1336 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 577 1351 ] 578 1352 579 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]] 580 1396 name = "slab" 581 1397 version = "0.4.11" 582 1398 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 594 1410 source = "registry+https://github.com/rust-lang/crates.io-index" 595 1411 checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" 596 1412 dependencies = [ 597 - "cfg-if", 1413 + "cfg-if 1.0.3", 598 1414 "libc", 599 - "winapi", 1415 + "winapi 0.3.9", 600 1416 ] 601 1417 602 1418 [[package]] ··· 606 1422 checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 607 1423 dependencies = [ 608 1424 "libc", 609 - "windows-sys", 1425 + "windows-sys 0.59.0", 610 1426 ] 611 1427 612 1428 [[package]] ··· 616 1432 checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 617 1433 618 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]] 619 1441 name = "syn" 620 1442 version = "1.0.109" 621 1443 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 638 1460 ] 639 1461 640 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]] 641 1472 name = "synstructure" 642 1473 version = "0.13.2" 643 1474 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 649 1480 ] 650 1481 651 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]] 652 1504 name = "tangled-on-commit" 653 1505 version = "0.1.0" 654 1506 dependencies = [ 655 1507 "json", 1508 + "reqwest", 656 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", 657 1524 ] 658 1525 659 1526 [[package]] ··· 708 1575 checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 709 1576 dependencies = [ 710 1577 "backtrace", 1578 + "bytes 1.10.1", 711 1579 "io-uring", 712 1580 "libc", 713 - "mio", 1581 + "mio 1.0.4", 714 1582 "pin-project-lite", 715 1583 "slab", 716 1584 "socket2 0.6.0", 717 - "windows-sys", 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", 718 1683 ] 719 1684 720 1685 [[package]] ··· 724 1689 checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" 725 1690 dependencies = [ 726 1691 "async-trait", 727 - "cfg-if", 1692 + "cfg-if 1.0.3", 728 1693 "data-encoding", 729 1694 "enum-as-inner", 730 1695 "futures-channel", ··· 734 1699 "ipnet", 735 1700 "lazy_static", 736 1701 "log", 737 - "rand", 1702 + "rand 0.8.5", 738 1703 "smallvec", 739 1704 "thiserror", 740 1705 "tinyvec", ··· 748 1713 source = "registry+https://github.com/rust-lang/crates.io-index" 749 1714 checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a" 750 1715 dependencies = [ 751 - "cfg-if", 1716 + "cfg-if 1.0.3", 752 1717 "futures-util", 753 1718 "ipconfig", 754 1719 "lazy_static", ··· 763 1728 ] 764 1729 765 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]] 766 1743 name = "unicode-bidi" 767 1744 version = "0.3.18" 768 1745 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 784 1761 ] 785 1762 786 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]] 787 1770 name = "url" 788 1771 version = "2.5.7" 789 1772 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 802 1785 checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 803 1786 804 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]] 805 1809 name = "wasi" 806 1810 version = "0.11.1+wasi-snapshot-preview1" 807 1811 source = "registry+https://github.com/rust-lang/crates.io-index" 808 1812 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 809 1813 810 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]] 811 1906 name = "widestring" 812 1907 version = "0.4.3" 813 1908 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 815 1910 816 1911 [[package]] 817 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" 818 1919 version = "0.3.9" 819 1920 source = "registry+https://github.com/rust-lang/crates.io-index" 820 1921 checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" ··· 822 1923 "winapi-i686-pc-windows-gnu", 823 1924 "winapi-x86_64-pc-windows-gnu", 824 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" 825 1932 826 1933 [[package]] 827 1934 name = "winapi-i686-pc-windows-gnu" ··· 836 1943 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 837 1944 838 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]] 839 1990 name = "windows-sys" 840 1991 version = "0.59.0" 841 1992 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 914 2065 source = "registry+https://github.com/rust-lang/crates.io-index" 915 2066 checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" 916 2067 dependencies = [ 917 - "winapi", 2068 + "winapi 0.3.9", 918 2069 ] 919 2070 920 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]] 921 2078 name = "writeable" 922 2079 version = "0.6.1" 923 2080 source = "registry+https://github.com/rust-lang/crates.io-index" 924 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 + ] 925 2110 926 2111 [[package]] 927 2112 name = "yoke" ··· 987 2172 "syn 2.0.106", 988 2173 "synstructure", 989 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" 990 2181 991 2182 [[package]] 992 2183 name = "zerotrie"
+2
Cargo.toml
··· 8 8 [dependencies] 9 9 json = "0.12.4" 10 10 trust-dns-resolver = "0.20.1" 11 + reqwest = { version = "0.12.23", features = ["blocking"] } 12 + ws = "0.9.2"
+48 -4
README.md
··· 6 6 $ tangled-on-commit @vielle.dev/tangled-on-commit ./commit.sh 7 7 ``` 8 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 + 9 12 ## Installation 10 13 11 - // TODO 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` 12 28 13 29 ## Usage 14 30 15 - // TODO 31 + ### CLI Arguments 16 32 17 - ## Configuration 33 + - `tangled-on-commit (-h | --help)` 34 + Displays this message 18 35 19 - // TODO 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.
+1
src/args.rs
··· 92 92 if val.contains("/") { 93 93 let entries: Vec<_> = val.split("/").collect(); 94 94 if entries.len() != 2 { 95 + println!("Invalid argument: `{}` is malformed", val); 95 96 return Err(()); 96 97 } 97 98 handle = Some(entries[0][1..].to_string());
+145 -7
src/did.rs
··· 4 4 #[derive(Debug)] 5 5 pub struct DidDoc { 6 6 pub did: String, 7 + pub pds: String, 7 8 } 8 9 9 10 fn get_txt_did(handle: &String) -> Result<String, ()> { 11 + println!(" Trying dns TXT for _atproto.{}", handle); 10 12 // create a txt resolver 11 13 let resolver = match Resolver::new(ResolverConfig::default(), ResolverOpts::default()) { 12 14 Ok(val) => val, 13 - Err(_) => return Err(()), 15 + Err(_) => { 16 + println!(" Couldn't create a DNS resolver"); 17 + return Err(()); 18 + } 14 19 }; 15 20 16 21 // resolve _atproto.handle to a TXT record 17 22 let txt_res = match resolver.txt_lookup("_atproto.".to_owned() + &handle) { 18 23 Ok(val) => val, 19 - Err(_) => return Err(()), // collect all entries and convert to strings 24 + Err(_) => { 25 + println!(" Couldn't resolve to a TXT record"); 26 + return Err(()); 27 + } // collect all entries and convert to strings 20 28 } 21 29 .into_iter() 22 30 .map(|x| x.to_string()) ··· 30 38 // only 1 did= can exist 31 39 // https://atproto.com/specs/handle#:~:text=If%20multiple%20valid%20records%20with%20different%20DIDs%20are%20present,%20resolution%20should%20fail. 32 40 if did_res.len() != 1 { 41 + println!(" Found too many DIDs for this handle"); 33 42 return Err(()); 34 43 } 35 - let did = did_res[0].clone(); 36 44 37 - return Ok(did.clone()); 45 + return Ok(did_res[0][4..].to_string()); 38 46 } 39 47 40 48 fn get_http_did(handle: &String) -> Result<String, ()> { 41 - return Ok(String::new()); 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)); 42 86 } 43 87 44 - pub fn get_did(handle: String) -> Result<DidDoc, ()> { 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); 45 172 let did = if let Ok(did) = get_txt_did(&handle) { 46 173 did 47 174 } else { 48 175 if let Ok(did) = get_http_did(&handle) { 49 176 did 50 177 } else { 178 + println!(" Could not get a DID"); 51 179 return Err(()); 52 180 } 53 181 }; 54 182 55 - return Ok(DidDoc { did }); 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; 56 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 + }
+65 -16
src/main.rs
··· 1 + use std::process::Command; 2 + 1 3 mod args; 2 4 mod did; 5 + mod knot; 3 6 4 7 fn main() -> Result<(), ()> { 5 8 // load configuration 6 9 let config = match args::load_config() { 7 10 Ok(res) => res, 8 - Err(_) => { 9 - // q 10 - return Err(()); 11 - } 11 + Err(_) => return Err(()), 12 12 }; 13 - println!("{:#?}", config); 14 13 15 14 // resolve handle to did 16 - let did_doc = match did::get_did(config.handle) { 15 + println!("Resolving {}", config.handle); 16 + let did_doc = match did::get_did(&config.handle) { 17 17 Ok(res) => res, 18 - Err(_) => { 19 - // q 20 - return Err(()); 21 - } 18 + Err(_) => return Err(()), 22 19 }; 23 - println!("{:#?}", did_doc); 20 + println!( 21 + " Found DID `{0}` hosted at `{1}`", 22 + did_doc.did, did_doc.pds 23 + ); 24 + 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); 25 32 26 33 // connect to /events on knotserver 34 + println!( 35 + "Connecting to `{}`", 36 + format!("wss://{}/events", knot_server) 37 + ); 27 38 28 - // on event: 29 - // parse json 30 - // validate meets expected schema (allow unknown vals) 31 - // filter by did and reponame 32 - // exec shell command in user shell (/bin/sh as fallback) 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 + }; 53 + 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 + }; 33 82 34 83 return Ok(()); 35 84 }
+1 -1
tangled-on-commit.json
··· 1 1 { 2 2 "handle": "vielle.dev", 3 3 "repo_name": "tangled-on-commit", 4 - "shell": "./commit.sh" 4 + "shell": "echo \\\"Got a new commit\\!\\!\\\" 2>&1 > out.txt" 5 5 }