Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

feat(cli): added hex owner add

author
Niklas Kirschall
committer
Louis Pilfold
date (Mar 26, 2026, 11:46 AM UTC) commit 27309fb4 parent 51801a38 change-id lvqxwptr
+127 -30
+4
CHANGELOG.md
··· 51 51 52 52 ### Build tool 53 53 54 + - The `gleam hex owner add` command has been added, which allows adding 55 + owners to the package. 56 + ([Niklas Kirschall](https://github.com/nkxxll)) 57 + 54 58 - When publishing, the package manager now uses the full term instead of the 55 59 shorthand "MFA" in the prompt and error message. 56 60 ([Luka Ivanović](https://github.com/luka-hash))
+35 -27
Cargo.lock
··· 72 72 73 73 [[package]] 74 74 name = "anstream" 75 - version = "0.6.14" 75 + version = "0.6.21" 76 76 source = "registry+https://github.com/rust-lang/crates.io-index" 77 - checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" 77 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 78 78 dependencies = [ 79 79 "anstyle", 80 80 "anstyle-parse", ··· 87 87 88 88 [[package]] 89 89 name = "anstyle" 90 - version = "1.0.8" 90 + version = "1.0.14" 91 91 source = "registry+https://github.com/rust-lang/crates.io-index" 92 - checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" 92 + checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" 93 93 94 94 [[package]] 95 95 name = "anstyle-parse" 96 - version = "0.2.4" 96 + version = "0.2.7" 97 97 source = "registry+https://github.com/rust-lang/crates.io-index" 98 - checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" 98 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 99 99 dependencies = [ 100 100 "utf8parse", 101 101 ] 102 102 103 103 [[package]] 104 104 name = "anstyle-query" 105 - version = "1.1.0" 105 + version = "1.1.5" 106 106 source = "registry+https://github.com/rust-lang/crates.io-index" 107 - checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" 107 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 108 108 dependencies = [ 109 - "windows-sys 0.52.0", 109 + "windows-sys 0.61.2", 110 110 ] 111 111 112 112 [[package]] 113 113 name = "anstyle-wincon" 114 - version = "3.0.3" 114 + version = "3.0.11" 115 115 source = "registry+https://github.com/rust-lang/crates.io-index" 116 - checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" 116 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 117 117 dependencies = [ 118 118 "anstyle", 119 - "windows-sys 0.52.0", 119 + "once_cell_polyfill", 120 + "windows-sys 0.61.2", 120 121 ] 121 122 122 123 [[package]] ··· 445 446 446 447 [[package]] 447 448 name = "clap" 448 - version = "4.5.49" 449 + version = "4.5.60" 449 450 source = "registry+https://github.com/rust-lang/crates.io-index" 450 - checksum = "f4512b90fa68d3a9932cea5184017c5d200f5921df706d45e853537dea51508f" 451 + checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" 451 452 dependencies = [ 452 453 "clap_builder", 453 454 "clap_derive", ··· 455 456 456 457 [[package]] 457 458 name = "clap_builder" 458 - version = "4.5.49" 459 + version = "4.5.60" 459 460 source = "registry+https://github.com/rust-lang/crates.io-index" 460 - checksum = "0025e98baa12e766c67ba13ff4695a887a1eba19569aad00a472546795bd6730" 461 + checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" 461 462 dependencies = [ 462 463 "anstream", 463 464 "anstyle", ··· 467 468 468 469 [[package]] 469 470 name = "clap_derive" 470 - version = "4.5.49" 471 + version = "4.5.55" 471 472 source = "registry+https://github.com/rust-lang/crates.io-index" 472 - checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" 473 + checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 473 474 dependencies = [ 474 475 "heck", 475 476 "proc-macro2", ··· 479 480 480 481 [[package]] 481 482 name = "clap_lex" 482 - version = "0.7.6" 483 + version = "1.1.0" 483 484 source = "registry+https://github.com/rust-lang/crates.io-index" 484 - checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" 485 + checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" 485 486 486 487 [[package]] 487 488 name = "codespan-reporting" ··· 496 497 497 498 [[package]] 498 499 name = "colorchoice" 499 - version = "1.0.0" 500 + version = "1.0.5" 500 501 source = "registry+https://github.com/rust-lang/crates.io-index" 501 - checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 502 + checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" 502 503 503 504 [[package]] 504 505 name = "console" ··· 1250 1251 dependencies = [ 1251 1252 "base16", 1252 1253 "bytes", 1254 + "clap", 1253 1255 "ecow", 1254 1256 "flate2", 1255 1257 "http", ··· 1709 1711 1710 1712 [[package]] 1711 1713 name = "is_terminal_polyfill" 1712 - version = "1.70.0" 1714 + version = "1.70.2" 1713 1715 source = "registry+https://github.com/rust-lang/crates.io-index" 1714 - checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" 1716 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 1715 1717 1716 1718 [[package]] 1717 1719 name = "itertools" ··· 1943 1945 source = "registry+https://github.com/rust-lang/crates.io-index" 1944 1946 checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 1945 1947 dependencies = [ 1946 - "windows-sys 0.60.2", 1948 + "windows-sys 0.61.2", 1947 1949 ] 1948 1950 1949 1951 [[package]] ··· 2010 2012 version = "1.21.3" 2011 2013 source = "registry+https://github.com/rust-lang/crates.io-index" 2012 2014 checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 2015 + 2016 + [[package]] 2017 + name = "once_cell_polyfill" 2018 + version = "1.70.2" 2019 + source = "registry+https://github.com/rust-lang/crates.io-index" 2020 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 2013 2021 2014 2022 [[package]] 2015 2023 name = "opaque-debug" ··· 3612 3620 3613 3621 [[package]] 3614 3622 name = "utf8parse" 3615 - version = "0.2.1" 3623 + version = "0.2.2" 3616 3624 source = "registry+https://github.com/rust-lang/crates.io-index" 3617 - checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 3625 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3618 3626 3619 3627 [[package]] 3620 3628 name = "valuable"
+2
Cargo.toml
··· 16 16 17 17 # common dependencies 18 18 [workspace.dependencies] 19 + # Command line interface 20 + clap = { version = "4", features = ["derive"] } 19 21 # Immutable data structures 20 22 im = { version = "15", features = ["serde"] } 21 23 # Extra iter methods
+1 -2
compiler-cli/Cargo.toml
··· 12 12 gleam-language-server = { path = "../language-server" } 13 13 # OS SIGINT and SIGTERM signal handling 14 14 ctrlc = { version = "3", features = ["termination"] } 15 - # Command line interface 16 - clap = { version = "4", features = ["derive"] } 17 15 # Recursively traversing directories 18 16 ignore = "0" 19 17 # Allow user to type in sensitive information without showing it in the shell ··· 39 37 async-trait.workspace = true 40 38 base16.workspace = true 41 39 camino = { workspace = true, features = ["serde1"] } 40 + clap = { workspace = true, features = ["derive"] } 42 41 debug-ignore.workspace = true 43 42 ecow.workspace = true 44 43 flate2.workspace = true
+8
compiler-cli/src/cli.rs
··· 199 199 print_colourful_prefix("Transferred", "ownership"); 200 200 } 201 201 202 + pub(crate) fn print_adding_owner() { 203 + print_colourful_prefix("Adding", "owner"); 204 + } 205 + 206 + pub(crate) fn print_added_owner() { 207 + print_colourful_prefix("Added", "owner"); 208 + } 209 + 202 210 fn print_packages_downloaded(start: Instant, count: usize) { 203 211 let elapsed = seconds(start.elapsed()); 204 212 let msg = match count {
+25
compiler-cli/src/lib.rs
··· 591 591 592 592 #[derive(Subcommand, Debug)] 593 593 enum Owner { 594 + /// Adds a new owner to the given package on Hex 595 + /// 596 + /// This command uses this environment variable: 597 + /// 598 + /// - HEXPM_API_KEY: (optional) A Hex API key to authenticate against the Hex package manager. 599 + /// 600 + #[command(verbatim_doc_comment)] 601 + Add { 602 + package: String, 603 + 604 + /// The username or email of the additional owner 605 + #[arg(long = "user")] 606 + username_or_email: String, 607 + 608 + /// The ownership level 609 + #[arg(long, default_value = "maintainer")] 610 + level: hexpm::OwnerLevel, 611 + }, 612 + 594 613 /// Transfers ownership of the given package to a new Hex user 595 614 /// 596 615 /// This command uses this environment variable: ··· 816 835 let paths = find_project_paths()?; 817 836 hex::revert(&paths, package, version) 818 837 } 838 + 839 + Command::Hex(Hex::Owner(Owner::Add { 840 + package, 841 + username_or_email, 842 + level, 843 + })) => owner::add(package, username_or_email, level), 819 844 820 845 Command::Hex(Hex::Owner(Owner::Transfer { 821 846 package,
+25
compiler-cli/src/owner.rs
··· 1 1 use crate::{cli, http::HttpClient}; 2 2 use gleam_core::{Result, hex}; 3 3 4 + pub fn add( 5 + package: String, 6 + new_owner_username_or_email: String, 7 + level: hexpm::OwnerLevel, 8 + ) -> Result<()> { 9 + let runtime = tokio::runtime::Runtime::new().expect("Unable to start Tokio async runtime"); 10 + let http = HttpClient::new(); 11 + let hex_config = hexpm::Config::new(); 12 + let credentials = crate::hex::HexAuthentication::new(&runtime, &http, hex_config.clone()) 13 + .get_or_create_api_credentials()?; 14 + 15 + cli::print_adding_owner(); 16 + runtime.block_on(hex::add_owner( 17 + &crate::hex::write_credentials(&credentials)?, 18 + package, 19 + new_owner_username_or_email, 20 + level, 21 + &hex_config, 22 + &http, 23 + ))?; 24 + cli::print_added_owner(); 25 + 26 + Ok(()) 27 + } 28 + 4 29 pub fn transfer(package: String, new_owner_username_or_email: String) -> Result<()> { 5 30 println!( 6 31 "Transferring ownership of this package will remove all current owners and make
+24
compiler-core/src/hex.rs
··· 66 66 }) 67 67 } 68 68 69 + pub async fn add_owner<Http: HttpClient>( 70 + api_key: &WriteActionCredentials, 71 + package_name: String, 72 + new_owner_username_or_email: String, 73 + level: hexpm::OwnerLevel, 74 + config: &hexpm::Config, 75 + http: &Http, 76 + ) -> Result<()> { 77 + tracing::info!( 78 + "Adding {} as owner of `{}`", 79 + new_owner_username_or_email, 80 + package_name 81 + ); 82 + let request = hexpm::api_add_owner_request( 83 + &package_name, 84 + &new_owner_username_or_email, 85 + level, 86 + api_key, 87 + config, 88 + ); 89 + let response = http.send(request).await?; 90 + hexpm::api_add_owner_response(response).map_err(Error::hex) 91 + } 92 + 69 93 pub async fn transfer_owner<Http: HttpClient>( 70 94 api_key: &WriteActionCredentials, 71 95 package_name: String,
+1
hexpm/Cargo.toml
··· 28 28 prost = "0.13.5" 29 29 30 30 base16 = { workspace = true, features = ["alloc"] } 31 + clap = { workspace = true, features = ["derive"] } 31 32 ecow = { workspace = true, features = ["serde"] } 32 33 http.workspace = true 33 34 pubgrub.workspace = true
+2 -1
hexpm/src/lib.rs
··· 7 7 8 8 use crate::proto::{signed::Signed, versions::Versions}; 9 9 use bytes::buf::Buf; 10 + use clap::ValueEnum; 10 11 use ecow::EcoString; 11 12 use flate2::read::GzDecoder; 12 13 use http::{Method, StatusCode}; ··· 596 597 } 597 598 598 599 /// See: https://github.com/hexpm/hex/blob/main/lib/mix/tasks/hex.owner.ex#L47 599 - #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] 600 + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] 600 601 pub enum OwnerLevel { 601 602 /// Has every package permission EXCEPT the ability to change who owns the package 602 603 Maintainer,