Remember the TUI server selection

This commit is contained in:
Georg Bauer
2026-08-05 17:50:09 +02:00
parent 61e96cc6cf
commit c1cfaa3d23
4 changed files with 101 additions and 1 deletions

View File

@@ -30,6 +30,8 @@ pub struct TuiPreferences {
pub refresh_seconds: u64,
#[serde(default)]
pub favorites: BTreeSet<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_server: Option<String>,
}
impl Default for TuiPreferences {
@@ -37,6 +39,7 @@ impl Default for TuiPreferences {
Self {
refresh_seconds: default_refresh_seconds(),
favorites: BTreeSet::new(),
last_server: None,
}
}
}
@@ -150,6 +153,9 @@ impl Config {
if old_url != new_url {
migrate_favorites(&mut updated.tui.favorites, &old_url, new_url);
}
if updated.tui.last_server.as_deref() == Some(original_name) {
updated.tui.last_server = Some(name.into());
}
updated.save()?;
*self = updated;
Ok(())
@@ -169,6 +175,9 @@ impl Config {
{
remove_favorites(&mut updated.tui.favorites, &removed_url);
}
if updated.tui.last_server.as_deref() == Some(name) {
updated.tui.last_server = updated.servers.keys().next().cloned();
}
updated.save()?;
*self = updated;
Ok(())
@@ -182,6 +191,22 @@ impl Config {
Ok(())
}
pub fn set_tui_last_server(&mut self, name: Option<&str>) -> Result<()> {
if let Some(name) = name
&& !self.servers.contains_key(name)
{
return Err(format!("server profile {name:?} does not exist"));
}
if self.tui.last_server.as_deref() == name {
return Ok(());
}
let mut updated = self.clone();
updated.tui.last_server = name.map(str::to_owned);
updated.save()?;
*self = updated;
Ok(())
}
pub fn is_tui_favorite(&self, pane: &str, server_url: &str, repository: &RepositoryId) -> bool {
self.tui
.favorites
@@ -455,9 +480,11 @@ mod tests {
.login("code.example", "secret", Provider::Forgejo)
.unwrap();
config.set_tui_refresh_seconds(9).unwrap();
config.set_tui_last_server(Some("code.example")).unwrap();
let mut loaded = Config::load_from(path).unwrap();
assert_eq!(loaded.tui.refresh_seconds, 9);
assert_eq!(loaded.tui.last_server.as_deref(), Some("code.example"));
assert_eq!(loaded.servers["code.example"].token, "secret");
assert_eq!(loaded.servers["code.example"].provider, Provider::Forgejo);
assert_eq!(
@@ -484,6 +511,7 @@ mod tests {
assert!(loaded.is_tui_favorite("issues", "https://new.example", &repository));
assert!(!loaded.servers.contains_key("code.example"));
assert_eq!(loaded.servers["new.example"].token, "new-secret");
assert_eq!(loaded.tui.last_server.as_deref(), Some("new.example"));
assert!(
fs::read_to_string(&loaded.path)
.unwrap()
@@ -506,6 +534,8 @@ mod tests {
fs::metadata(&loaded.path).unwrap().permissions().mode() & 0o777,
0o600
);
loaded.logout("new.example").unwrap();
assert_eq!(loaded.tui.last_server, None);
fs::remove_dir_all(directory).unwrap();
}