Radish alpha
r
rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5
Radicle web interface
Radicle
Git
httpd: Add API endpoint for job cobs
Rūdolfs Ošiņš committed 9 days ago
commit 7cef0618ce08bc7bb49393a019577306231230ad
parent 78ccb93
4 files changed +653 -88
modified radicle-httpd/Cargo.lock
@@ -118,12 +118,6 @@ dependencies = [
]

[[package]]
-
name = "android-tzdata"
-
version = "0.1.1"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
-

-
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -133,6 +127,36 @@ dependencies = [
]

[[package]]
+
name = "anstream"
+
version = "0.6.21"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
+
dependencies = [
+
 "anstyle",
+
 "anstyle-parse",
+
 "anstyle-query",
+
 "anstyle-wincon",
+
 "colorchoice",
+
 "is_terminal_polyfill",
+
 "utf8parse",
+
]
+

+
[[package]]
+
name = "anstyle"
+
version = "1.0.13"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
+

+
[[package]]
+
name = "anstyle-parse"
+
version = "0.2.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+
dependencies = [
+
 "utf8parse",
+
]
+

+
[[package]]
name = "anstyle-query"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -142,6 +166,17 @@ dependencies = [
]

[[package]]
+
name = "anstyle-wincon"
+
version = "3.0.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+
dependencies = [
+
 "anstyle",
+
 "once_cell_polyfill",
+
 "windows-sys 0.61.2",
+
]
+

+
[[package]]
name = "anyhow"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -402,14 +437,13 @@ dependencies = [

[[package]]
name = "chrono"
-
version = "0.4.41"
+
version = "0.4.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
+
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
dependencies = [
-
 "android-tzdata",
 "iana-time-zone",
 "num-traits",
-
 "windows-link 0.1.3",
+
 "windows-link",
]

[[package]]
@@ -423,6 +457,53 @@ dependencies = [
]

[[package]]
+
name = "clap"
+
version = "4.5.60"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a"
+
dependencies = [
+
 "clap_builder",
+
 "clap_derive",
+
]
+

+
[[package]]
+
name = "clap_builder"
+
version = "4.5.60"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876"
+
dependencies = [
+
 "anstream",
+
 "anstyle",
+
 "clap_lex",
+
 "strsim",
+
 "terminal_size",
+
]
+

+
[[package]]
+
name = "clap_derive"
+
version = "4.5.55"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
+
dependencies = [
+
 "heck",
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.117",
+
]
+

+
[[package]]
+
name = "clap_lex"
+
version = "1.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831"
+

+
[[package]]
+
name = "colorchoice"
+
version = "1.0.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+

+
[[package]]
name = "console"
version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -671,7 +752,7 @@ dependencies = [
 "convert_case",
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -700,7 +781,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -930,7 +1011,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -1002,11 +1083,24 @@ checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [
 "cfg-if",
 "libc",
-
 "r-efi",
+
 "r-efi 5.3.0",
 "wasi 0.14.2+wasi-0.2.4",
]

[[package]]
+
name = "getrandom"
+
version = "0.4.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+
dependencies = [
+
 "cfg-if",
+
 "libc",
+
 "r-efi 6.0.0",
+
 "wasip2",
+
 "wasip3",
+
]
+

+
[[package]]
name = "ghash"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1051,7 +1145,7 @@ dependencies = [
 "git-ref-format-core",
 "proc-macro-error2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -1080,12 +1174,6 @@ dependencies = [

[[package]]
name = "hashbrown"
-
version = "0.14.5"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-

-
[[package]]
-
name = "hashbrown"
version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
@@ -1096,6 +1184,18 @@ dependencies = [
]

[[package]]
+
name = "hashbrown"
+
version = "0.16.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+

+
[[package]]
+
name = "heck"
+
version = "0.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+

+
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1303,6 +1403,12 @@ dependencies = [
]

[[package]]
+
name = "id-arena"
+
version = "2.3.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+

+
[[package]]
name = "idna"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1325,13 +1431,14 @@ dependencies = [

[[package]]
name = "indexmap"
-
version = "2.5.0"
+
version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
+
checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
 "equivalent",
-
 "hashbrown 0.14.5",
+
 "hashbrown 0.16.1",
 "serde",
+
 "serde_core",
]

[[package]]
@@ -1395,6 +1502,12 @@ dependencies = [
]

[[package]]
+
name = "is_terminal_polyfill"
+
version = "1.70.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+

+
[[package]]
name = "itoa"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1411,10 +1524,11 @@ dependencies = [

[[package]]
name = "js-sys"
-
version = "0.3.70"
+
version = "0.3.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
+
checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c"
dependencies = [
+
 "once_cell",
 "wasm-bindgen",
]

@@ -1437,6 +1551,12 @@ dependencies = [
]

[[package]]
+
name = "leb128fmt"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+

+
[[package]]
name = "lexopt"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1659,6 +1779,12 @@ dependencies = [

[[package]]
name = "nonempty"
+
version = "0.11.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "549e471b99ccaf2f89101bec68f4d244457d5a95a9c3d0672e9564124397741d"
+

+
[[package]]
+
name = "nonempty"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9737e026353e5cd0736f98eddae28665118eb6f6600902a7f50db585621fecb6"
@@ -1740,9 +1866,15 @@ dependencies = [

[[package]]
name = "once_cell"
-
version = "1.19.0"
+
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+

+
[[package]]
+
name = "once_cell_polyfill"
+
version = "1.70.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"

[[package]]
name = "opaque-debug"
@@ -1858,7 +1990,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -1964,6 +2096,16 @@ dependencies = [
]

[[package]]
+
name = "prettyplease"
+
version = "0.2.37"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+
dependencies = [
+
 "proc-macro2",
+
 "syn 2.0.117",
+
]
+

+
[[package]]
name = "primeorder"
version = "0.13.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1991,14 +2133,14 @@ dependencies = [
 "proc-macro-error-attr2",
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
name = "proc-macro2"
-
version = "1.0.86"
+
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
 "unicode-ident",
]
@@ -2028,6 +2170,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"

[[package]]
+
name = "r-efi"
+
version = "6.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+

+
[[package]]
name = "radicle"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2186,6 +2334,7 @@ dependencies = [
 "pretty_assertions",
 "radicle",
 "radicle-crypto",
+
 "radicle-job",
 "radicle-surf",
 "radicle-term",
 "serde",
@@ -2198,6 +2347,28 @@ dependencies = [
 "tracing",
 "tracing-logfmt",
 "tracing-subscriber",
+
 "url",
+
 "uuid",
+
]
+

+
[[package]]
+
name = "radicle-job"
+
version = "0.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "90124dcd988e918e6731fe21260fba1d5954f43617fa0bb75b00d16cc2498766"
+
dependencies = [
+
 "chrono",
+
 "clap",
+
 "indexmap",
+
 "nonempty 0.11.0",
+
 "once_cell",
+
 "qcheck",
+
 "radicle",
+
 "serde",
+
 "serde_json",
+
 "thiserror 2.0.14",
+
 "url",
+
 "uuid",
]

[[package]]
@@ -2344,7 +2515,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -2488,7 +2659,7 @@ dependencies = [
 "proc-macro2",
 "quote",
 "serde_derive_internals",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -2524,11 +2695,18 @@ dependencies = [
]

[[package]]
+
name = "semver"
+
version = "1.0.27"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+

+
[[package]]
name = "serde"
-
version = "1.0.209"
+
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
+
 "serde_core",
 "serde_derive",
]

@@ -2544,14 +2722,23 @@ dependencies = [
]

[[package]]
+
name = "serde_core"
+
version = "1.0.228"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+
dependencies = [
+
 "serde_derive",
+
]
+

+
[[package]]
name = "serde_derive"
-
version = "1.0.209"
+
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -2562,20 +2749,21 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
name = "serde_json"
-
version = "1.0.127"
+
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
+
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
 "indexmap",
 "itoa",
 "memchr",
-
 "ryu",
 "serde",
+
 "serde_core",
+
 "zmij",
]

[[package]]
@@ -2841,6 +3029,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"

[[package]]
+
name = "strsim"
+
version = "0.11.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+

+
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2859,9 +3053,9 @@ dependencies = [

[[package]]
name = "syn"
-
version = "2.0.87"
+
version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
+
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
 "proc-macro2",
 "quote",
@@ -2888,7 +3082,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -2916,6 +3110,16 @@ dependencies = [
]

[[package]]
+
name = "terminal_size"
+
version = "0.4.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0"
+
dependencies = [
+
 "rustix 1.0.8",
+
 "windows-sys 0.60.2",
+
]
+

+
[[package]]
name = "thiserror"
version = "1.0.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2941,7 +3145,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -2952,7 +3156,7 @@ checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -3047,7 +3251,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -3128,7 +3332,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -3247,6 +3451,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"

[[package]]
+
name = "unicode-xid"
+
version = "0.2.6"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+

+
[[package]]
name = "unit-prefix"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3281,10 +3491,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"

[[package]]
+
name = "utf8parse"
+
version = "0.2.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+

+
[[package]]
name = "uuid"
-
version = "1.12.1"
+
version = "1.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b"
+
checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37"
+
dependencies = [
+
 "getrandom 0.4.2",
+
 "js-sys",
+
 "serde_core",
+
 "wasm-bindgen",
+
]

[[package]]
name = "valuable"
@@ -3329,36 +3551,41 @@ dependencies = [
]

[[package]]
-
name = "wasm-bindgen"
-
version = "0.2.93"
+
name = "wasip2"
+
version = "1.0.2+wasi-0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
+
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
dependencies = [
-
 "cfg-if",
-
 "once_cell",
-
 "wasm-bindgen-macro",
+
 "wit-bindgen",
]

[[package]]
-
name = "wasm-bindgen-backend"
-
version = "0.2.93"
+
name = "wasip3"
+
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
+
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
dependencies = [
-
 "bumpalo",
-
 "log",
+
 "wit-bindgen",
+
]
+

+
[[package]]
+
name = "wasm-bindgen"
+
version = "0.2.114"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e"
+
dependencies = [
+
 "cfg-if",
 "once_cell",
-
 "proc-macro2",
-
 "quote",
-
 "syn 2.0.87",
+
 "rustversion",
+
 "wasm-bindgen-macro",
 "wasm-bindgen-shared",
]

[[package]]
name = "wasm-bindgen-macro"
-
version = "0.2.93"
+
version = "0.2.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
+
checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6"
dependencies = [
 "quote",
 "wasm-bindgen-macro-support",
@@ -3366,22 +3593,59 @@ dependencies = [

[[package]]
name = "wasm-bindgen-macro-support"
-
version = "0.2.93"
+
version = "0.2.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
+
checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3"
dependencies = [
+
 "bumpalo",
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
-
 "wasm-bindgen-backend",
+
 "syn 2.0.117",
 "wasm-bindgen-shared",
]

[[package]]
name = "wasm-bindgen-shared"
-
version = "0.2.93"
+
version = "0.2.114"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16"
+
dependencies = [
+
 "unicode-ident",
+
]
+

+
[[package]]
+
name = "wasm-encoder"
+
version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
+
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+
dependencies = [
+
 "leb128fmt",
+
 "wasmparser",
+
]
+

+
[[package]]
+
name = "wasm-metadata"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+
dependencies = [
+
 "anyhow",
+
 "indexmap",
+
 "wasm-encoder",
+
 "wasmparser",
+
]
+

+
[[package]]
+
name = "wasmparser"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+
dependencies = [
+
 "bitflags 2.9.1",
+
 "hashbrown 0.15.5",
+
 "indexmap",
+
 "semver",
+
]

[[package]]
name = "web-time"
@@ -3455,7 +3719,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -3466,17 +3730,11 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
name = "windows-link"
-
version = "0.1.3"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
-

-
[[package]]
-
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
@@ -3529,11 +3787,20 @@ dependencies = [

[[package]]
name = "windows-sys"
+
version = "0.60.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+
dependencies = [
+
 "windows-targets 0.53.5",
+
]
+

+
[[package]]
+
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
-
 "windows-link 0.2.1",
+
 "windows-link",
]

[[package]]
@@ -3560,7 +3827,7 @@ dependencies = [
 "windows_aarch64_gnullvm 0.52.6",
 "windows_aarch64_msvc 0.52.6",
 "windows_i686_gnu 0.52.6",
-
 "windows_i686_gnullvm",
+
 "windows_i686_gnullvm 0.52.6",
 "windows_i686_msvc 0.52.6",
 "windows_x86_64_gnu 0.52.6",
 "windows_x86_64_gnullvm 0.52.6",
@@ -3568,6 +3835,23 @@ dependencies = [
]

[[package]]
+
name = "windows-targets"
+
version = "0.53.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+
dependencies = [
+
 "windows-link",
+
 "windows_aarch64_gnullvm 0.53.1",
+
 "windows_aarch64_msvc 0.53.1",
+
 "windows_i686_gnu 0.53.1",
+
 "windows_i686_gnullvm 0.53.1",
+
 "windows_i686_msvc 0.53.1",
+
 "windows_x86_64_gnu 0.53.1",
+
 "windows_x86_64_gnullvm 0.53.1",
+
 "windows_x86_64_msvc 0.53.1",
+
]
+

+
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3580,6 +3864,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"

[[package]]
+
name = "windows_aarch64_gnullvm"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+

+
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3592,6 +3882,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"

[[package]]
+
name = "windows_aarch64_msvc"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+

+
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3604,12 +3900,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"

[[package]]
+
name = "windows_i686_gnu"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+

+
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"

[[package]]
+
name = "windows_i686_gnullvm"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+

+
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3622,6 +3930,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"

[[package]]
+
name = "windows_i686_msvc"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+

+
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3634,6 +3948,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"

[[package]]
+
name = "windows_x86_64_gnu"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+

+
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3646,6 +3966,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"

[[package]]
+
name = "windows_x86_64_gnullvm"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+

+
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3658,6 +3984,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"

[[package]]
+
name = "windows_x86_64_msvc"
+
version = "0.53.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+

+
[[package]]
name = "winpipe"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3677,6 +4009,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ab703352da6a72f35c39a533526393725640575bb211f61987a2748323ad956"

[[package]]
+
name = "wit-bindgen"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+
dependencies = [
+
 "wit-bindgen-rust-macro",
+
]
+

+
[[package]]
+
name = "wit-bindgen-core"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+
dependencies = [
+
 "anyhow",
+
 "heck",
+
 "wit-parser",
+
]
+

+
[[package]]
name = "wit-bindgen-rt"
version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3686,6 +4038,74 @@ dependencies = [
]

[[package]]
+
name = "wit-bindgen-rust"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
+
dependencies = [
+
 "anyhow",
+
 "heck",
+
 "indexmap",
+
 "prettyplease",
+
 "syn 2.0.117",
+
 "wasm-metadata",
+
 "wit-bindgen-core",
+
 "wit-component",
+
]
+

+
[[package]]
+
name = "wit-bindgen-rust-macro"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+
dependencies = [
+
 "anyhow",
+
 "prettyplease",
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.117",
+
 "wit-bindgen-core",
+
 "wit-bindgen-rust",
+
]
+

+
[[package]]
+
name = "wit-component"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+
dependencies = [
+
 "anyhow",
+
 "bitflags 2.9.1",
+
 "indexmap",
+
 "log",
+
 "serde",
+
 "serde_derive",
+
 "serde_json",
+
 "wasm-encoder",
+
 "wasm-metadata",
+
 "wasmparser",
+
 "wit-parser",
+
]
+

+
[[package]]
+
name = "wit-parser"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+
dependencies = [
+
 "anyhow",
+
 "id-arena",
+
 "indexmap",
+
 "log",
+
 "semver",
+
 "serde",
+
 "serde_derive",
+
 "serde_json",
+
 "unicode-xid",
+
 "wasmparser",
+
]
+

+
[[package]]
name = "writeable"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3728,7 +4148,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
 "synstructure",
]

@@ -3750,7 +4170,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]

[[package]]
@@ -3770,7 +4190,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
 "synstructure",
]

@@ -3810,5 +4230,11 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.87",
+
 "syn 2.0.117",
]
+

+
[[package]]
+
name = "zmij"
+
version = "1.0.21"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
modified radicle-httpd/Cargo.toml
@@ -34,6 +34,7 @@ lru = { version = "0.16.0" }
mime_guess = { version = "2.0.5" }
nonempty = { version = "0.12.0", features = ["serialize"] }
radicle = { version = "0.21.0" }
+
radicle-job = { version = "0.5.1" }
radicle-surf = { version = "0.27.0", default-features = false, features = ["serde"] }
radicle-term = { version = "0.17.0", default-features = false }
serde = { version = "1", features = ["derive"] }
@@ -44,6 +45,8 @@ tower-http = { version = "0.6.6", default-features = false, features = ["trace",
tracing = { version = "0.1.41", default-features = false, features = ["std", "log"] }
tracing-logfmt = { version = "0.3.5", optional = true }
tracing-subscriber = { version = "0.3.19", default-features = false, features = ["std", "ansi", "fmt"] }
+
url = { version = "2.5.4", features = ["serde"] }
+
uuid = { version = "1.13.1", features = ["serde"] }

[dev-dependencies]
hyper = { version = "1.6", default-features = false, features = ["client"] }
modified radicle-httpd/src/api/v1/repos.rs
@@ -1,3 +1,5 @@
+
mod job;
+

use std::collections::{BTreeMap, BTreeSet, HashMap};

use axum::extract::{DefaultBodyLimit, State};
@@ -41,6 +43,7 @@ pub fn router(ctx: Context) -> Router {
        .route("/repos/{rid}/remotes/{peer}", get(remote_handler))
        .route("/repos/{rid}/blob/{sha}/{*path}", get(blob_handler))
        .route("/repos/{rid}/readme/{sha}", get(readme_handler))
+
        .route("/repos/{rid}/xyz.radworks.job/{sha}", get(job::handler))
        .route("/repos/{rid}/issues", get(issues_handler))
        .route("/repos/{rid}/issues/{id}", get(issue_handler))
        .route("/repos/{rid}/patches", get(patches_handler))
added radicle-httpd/src/api/v1/repos/job.rs
@@ -0,0 +1,133 @@
+
use axum::extract::State;
+
use axum::response::IntoResponse;
+
use axum::Json;
+
use serde::Serialize;
+
use url::Url;
+
use uuid::Uuid;
+

+
use radicle::git::Oid;
+
use radicle::identity::{Did, RepoId};
+
use radicle::node::{Alias, AliasStore};
+
use radicle_job::JobId;
+

+
use crate::api::error::Error as ApiError;
+
use crate::api::Context;
+
use crate::axum_extra::Path;
+

+
#[derive(Clone, Serialize, Debug)]
+
#[serde(rename_all = "camelCase")]
+
pub struct Job {
+
    job_id: JobId,
+
    commit: Oid,
+
    runs: Vec<Run>,
+
}
+

+
impl Job {
+
    fn new(id: JobId, job: &radicle_job::Job, aliases: &impl AliasStore) -> Self {
+
        let runs = job
+
            .runs()
+
            .iter()
+
            .flat_map(|(node_id, runs)| {
+
                let did: Did = node_id.into();
+
                let alias = aliases.alias(&did);
+

+
                runs.iter().map(move |(run_id, run)| Run {
+
                    run_id: *run_id,
+
                    node: JobAuthor {
+
                        id: did,
+
                        alias: alias.clone(),
+
                    },
+
                    status: (*run.status()).into(),
+
                    log: run.log().clone(),
+
                })
+
            })
+
            .collect();
+

+
        Self {
+
            job_id: id,
+
            commit: *job.oid(),
+
            runs,
+
        }
+
    }
+
}
+

+
#[derive(Clone, Serialize, Debug)]
+
#[serde(rename_all = "camelCase")]
+
struct JobAuthor {
+
    id: Did,
+
    #[serde(skip_serializing_if = "Option::is_none")]
+
    alias: Option<Alias>,
+
}
+

+
#[derive(Clone, Serialize, Debug)]
+
#[serde(rename_all = "camelCase")]
+
struct Run {
+
    run_id: Uuid,
+
    node: JobAuthor,
+
    status: Status,
+
    log: Url,
+
}
+

+
#[derive(Clone, Copy, Serialize, Debug)]
+
#[serde(rename_all = "camelCase")]
+
enum Status {
+
    Started,
+
    Failed,
+
    Succeeded,
+
}
+

+
impl From<radicle_job::Status> for Status {
+
    fn from(value: radicle_job::Status) -> Self {
+
        match value {
+
            radicle_job::Status::Started => Self::Started,
+
            radicle_job::Status::Finished(radicle_job::Reason::Failed) => Self::Failed,
+
            radicle_job::Status::Finished(radicle_job::Reason::Succeeded) => Self::Succeeded,
+
        }
+
    }
+
}
+

+
pub trait FindJobs {
+
    fn find_by_commit(&self, oid: Oid) -> Result<Vec<(JobId, radicle_job::Job)>, ApiError>;
+

+
    fn jobs_by_commit<A: AliasStore>(
+
        &self,
+
        commit: Oid,
+
        aliases: &A,
+
    ) -> Result<Vec<Job>, ApiError> {
+
        let mut jobs: Vec<Job> = self
+
            .find_by_commit(commit)?
+
            .into_iter()
+
            .map(|(id, job)| Job::new(id, &job, aliases))
+
            .collect();
+
        jobs.sort_by_key(|job| job.job_id);
+

+
        Ok(jobs)
+
    }
+
}
+

+
pub struct JobsSource<'a> {
+
    ctx: &'a Context,
+
    rid: RepoId,
+
}
+

+
impl FindJobs for JobsSource<'_> {
+
    fn find_by_commit(&self, oid: Oid) -> Result<Vec<(JobId, radicle_job::Job)>, ApiError> {
+
        let (repo, _) = self.ctx.repo(self.rid)?;
+
        let store = radicle_job::Jobs::open(&repo)?;
+
        let iter = radicle_job::Jobs::find_by_commit(&store, oid)?;
+

+
        Ok(iter.collect::<Result<_, _>>()?)
+
    }
+
}
+

+
/// Get jobs for a commit.
+
/// `GET /repos/:rid/xyz.radworks.job/:sha`
+
pub async fn handler(
+
    State(ctx): State<Context>,
+
    Path((rid, sha)): Path<(RepoId, Oid)>,
+
) -> impl IntoResponse {
+
    let aliases = ctx.profile.aliases();
+
    let jobs = JobsSource { ctx: &ctx, rid }.jobs_by_commit(sha, &aliases)?;
+

+
    Ok::<_, ApiError>(Json(jobs))
+
}