Fix literal-tilde fallback bug in breadarr-shared's expand_home

expand_home() fell through to PathBuf::from(input) — the literal,
unexpanded "~/..." string — whenever the HOME env var itself wasn't set,
same bug class as breadclip-core/breadpad-shared/breadmon (found during
this pass's own crate-migration sweep, in a different shape here: the bug
was in this crate's own tilde-expansion helper rather than a
dirs::xxx().unwrap_or_else() chain). Fixed via bread_utils::xdg::home_dir,
which resolves a real home directory before ever needing to fall back.

Builds and tests clean: 205 passed, 1 pre-existing network-dependent test
ignored, 0 failed.
This commit is contained in:
Breadway 2026-07-17 10:13:06 +08:00
parent 8a2936b8fd
commit 830e80622e
3 changed files with 12 additions and 3 deletions

1
Cargo.lock generated
View file

@ -203,6 +203,7 @@ name = "breadarr-shared"
version = "0.1.0"
dependencies = [
"anyhow",
"bread-utils",
"chrono",
"reqwest",
"serde",

View file

@ -9,3 +9,5 @@ anyhow.workspace = true
toml.workspace = true
reqwest.workspace = true
chrono.workspace = true
# TODO(owner): switch to tag-pinned git dependency once bread-utils is merged and tagged, matching the bread-theme pattern
bread-utils = { path = "../../bread-ecosystem-fix-worktree/bread-utils" }

View file

@ -314,10 +314,16 @@ fn config_path() -> PathBuf {
}
fn expand_home(input: &str) -> PathBuf {
// Was: falls through to `PathBuf::from(input)` — a literal, unexpanded
// "~/..." string — whenever the `HOME` env var itself isn't set.
// PathBuf/std::fs never expand `~`, so that fallback silently produced
// a path relative to the current working directory instead of the
// user's actual home. Same bug class as breadclip-core/breadpad-shared/
// breadmon (see bread_utils::xdg's doc comment); bread_utils::xdg::home_dir
// resolves a real home directory (falling back to `/root`, never a
// literal tilde) before this ever needs to fall back at all.
if let Some(stripped) = input.strip_prefix("~/") {
if let Ok(home) = env::var("HOME") {
return Path::new(&home).join(stripped);
}
return bread_utils::xdg::home_dir().join(stripped);
}
PathBuf::from(input)
}