From 3ffec223a2155bfcf154bfe24f21521b662a7bfe Mon Sep 17 00:00:00 2001 From: Daniel Voogsgerd Date: Wed, 7 Jan 2026 17:28:35 +0100 Subject: [PATCH 1/4] fix: Solve temp docker-compose lifetime issue Switching to temp files introduced a regression where the tempfile was dropped in a replacement on the temp path, causing the temp path to be dropped prematurely. --- brane-ctl/src/lifetime.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/brane-ctl/src/lifetime.rs b/brane-ctl/src/lifetime.rs index b0361b2c..3a1fec91 100644 --- a/brane-ctl/src/lifetime.rs +++ b/brane-ctl/src/lifetime.rs @@ -821,7 +821,7 @@ pub async fn start( opts.compose_verbose, resolve_exe(exe)?, DockerComposeCommand::Up, - resolve_node(file, "central"), + resolve_node(&file, "central"), &node_config.namespace, overridefile, envs, @@ -864,7 +864,7 @@ pub async fn start( opts.compose_verbose, resolve_exe(exe)?, DockerComposeCommand::Up, - resolve_node(file, "worker"), + resolve_node(&file, "worker"), &node_config.namespace, overridefile, envs, @@ -897,7 +897,7 @@ pub async fn start( opts.compose_verbose, resolve_exe(exe)?, DockerComposeCommand::Up, - resolve_node(file, "proxy"), + resolve_node(&file, "proxy"), &node_config.namespace, overridefile, envs, From 6b35629ecbf7228816c690ad114ae14d2237765b Mon Sep 17 00:00:00 2001 From: Daniel Voogsgerd Date: Thu, 8 Jan 2026 11:24:42 +0100 Subject: [PATCH 2/4] fix: Brane remote version format Brane api responds with a version prefixed by a v. semver does not parse this v, so we have to strip it. --- brane-cli/src/version.rs | 3 ++- brane-ctl/src/lifetime.rs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/brane-cli/src/version.rs b/brane-cli/src/version.rs index ddd16a63..42cf739c 100644 --- a/brane-cli/src/version.rs +++ b/brane-cli/src/version.rs @@ -96,10 +96,11 @@ impl RemoteVersion { return Err(VersionError::RequestFailure { url, status: response.status() }); } let version_body: String = response.text().await.map_err(|source| VersionError::RequestBodyError { url: url.clone(), source })?; + let version_str = version_body.strip_prefix("v").unwrap_or(&version_body); // Try to parse the version debug!(" > Parsing remote version..."); - let version = BraneVersion::from_str(&version_body).map_err(|source| VersionError::VersionParseError { raw: version_body, source })?; + let version = BraneVersion::from_str(version_str).map_err(|source| VersionError::VersionParseError { raw: version_body, source })?; // Done! debug!("Remote version number: {}", &version); diff --git a/brane-ctl/src/lifetime.rs b/brane-ctl/src/lifetime.rs index 3a1fec91..12932274 100644 --- a/brane-ctl/src/lifetime.rs +++ b/brane-ctl/src/lifetime.rs @@ -949,7 +949,7 @@ pub fn stop(compose_verbose: bool, exe: impl AsRef, file: Option, let envs: HashMap<&str, OsString> = construct_envs(&brane_version, &node_config_path, &node_config)?; // Resolve the filename and deduce the project name - let file: PathBuf = resolve_node(file, match node_config.node.kind() { + let file: PathBuf = resolve_node(&file, match node_config.node.kind() { NodeKind::Central => "central", NodeKind::Worker => "worker", NodeKind::Proxy => "proxy", @@ -1020,7 +1020,7 @@ pub async fn logs(exe: impl AsRef, file: Option, node_config_path: opts.compose_verbose, resolve_exe(exe)?, DockerComposeCommand::Logs, - resolve_node(file, "$NODE"), + resolve_node(&file, "$NODE"), &node_config.namespace, None, envs, From 567cf4737e30b27d6642fb442ebd466726cec133 Mon Sep 17 00:00:00 2001 From: Daniel Voogsgerd Date: Thu, 8 Jan 2026 13:55:21 +0100 Subject: [PATCH 3/4] fix(cli): Hardcode scheme for version lookup --- brane-cli/src/version.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brane-cli/src/version.rs b/brane-cli/src/version.rs index 42cf739c..5214b6ad 100644 --- a/brane-cli/src/version.rs +++ b/brane-cli/src/version.rs @@ -89,7 +89,7 @@ impl RemoteVersion { async fn from_instance_info(info: InstanceInfo) -> Result { // Use reqwest for the API call debug!(" > Querying..."); - let mut url: String = info.api.to_string(); + let mut url: String = format!("http://{}", info.api); url.push_str("/version"); let response: Response = reqwest::get(&url).await.map_err(|source| VersionError::RequestError { url: url.clone(), source })?; if response.status() != StatusCode::OK { From 6975f889be0ec529242a72628dd4cd7b798dca40 Mon Sep 17 00:00:00 2001 From: Lut99 Date: Tue, 13 Jan 2026 12:38:45 +0100 Subject: [PATCH 4/4] Fix for hitting `todo!()` in `rustyline` Think the problem is that the history feature was missing and rustyline, for some obscene reason, decided to add stubs instead of missing functions. Or it's that it works after two tries. Hard to say. --- Cargo.lock | 12 ++++++++++++ brane-cli/Cargo.toml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 29294221..d82bcb62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1734,6 +1734,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fd-lock" +version = "4.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "file-logger" version = "0.2.0" @@ -3974,6 +3985,7 @@ dependencies = [ "bitflags", "cfg-if", "clipboard-win", + "fd-lock", "libc", "log", "memchr", diff --git a/brane-cli/Cargo.toml b/brane-cli/Cargo.toml index a80ed768..3713468a 100644 --- a/brane-cli/Cargo.toml +++ b/brane-cli/Cargo.toml @@ -27,7 +27,7 @@ indicatif = "0.17.0" parking_lot = "0.12.1" path-clean = "1.0.0" prettytable = "0.10.0" -rustyline = { version = "15.0.0", default-features = false } +rustyline = { version = "15.0.0", default-features = false, features = ["with-file-history"] } rustyline-derive = "0.11.0" semver = "1.0.0" tar = "0.4.21"