Scope repository favorites by pane
This commit is contained in:
@@ -3,10 +3,17 @@ use std::{env, fs, path::PathBuf};
|
||||
use gotcha_gitea::Client;
|
||||
use security_framework::passwords::{get_generic_password, set_generic_password};
|
||||
|
||||
use crate::domain::{Preferences, Server, open_status};
|
||||
use crate::{
|
||||
RepositoryPane,
|
||||
domain::{Preferences, Server, open_status},
|
||||
};
|
||||
|
||||
pub fn favorite_key(server: &str, owner: &str, repository: &str) -> String {
|
||||
repository_key(server, owner, repository)
|
||||
pub fn favorite_key(pane: RepositoryPane, server: &str, owner: &str, repository: &str) -> String {
|
||||
format!(
|
||||
"{}|{}",
|
||||
pane.key(),
|
||||
repository_key(server, owner, repository)
|
||||
)
|
||||
}
|
||||
|
||||
pub fn repository_key(server: &str, owner: &str, repository: &str) -> String {
|
||||
@@ -39,6 +46,7 @@ pub fn load_preferences() -> Result<Preferences, String> {
|
||||
let mut preferences: Preferences =
|
||||
serde_json::from_slice(&fs::read(&path).map_err(|error| error.to_string())?)
|
||||
.map_err(|error| format!("Cannot read {}: {error}", path.display()))?;
|
||||
let favorites_migrated = migrate_favorites(&mut preferences.favorites);
|
||||
if !matches!(preferences.issue_status.as_str(), "open" | "closed") {
|
||||
preferences.issue_status = open_status();
|
||||
}
|
||||
@@ -52,9 +60,29 @@ pub fn load_preferences() -> Result<Preferences, String> {
|
||||
)
|
||||
.map_err(|_| format!("The token for {} is not valid text.", server.name))?;
|
||||
}
|
||||
if favorites_migrated {
|
||||
save_preferences(&preferences)?;
|
||||
}
|
||||
Ok(preferences)
|
||||
}
|
||||
|
||||
fn migrate_favorites(favorites: &mut std::collections::BTreeSet<String>) -> bool {
|
||||
let legacy: Vec<_> = favorites
|
||||
.iter()
|
||||
.filter(|favorite| {
|
||||
!RepositoryPane::ALL
|
||||
.iter()
|
||||
.any(|pane| favorite.starts_with(&format!("{}|", pane.key())))
|
||||
})
|
||||
.cloned()
|
||||
.collect();
|
||||
for favorite in &legacy {
|
||||
favorites.remove(favorite);
|
||||
favorites.extend(RepositoryPane::ALL.map(|pane| format!("{}|{favorite}", pane.key())));
|
||||
}
|
||||
!legacy.is_empty()
|
||||
}
|
||||
|
||||
pub fn save_preferences(preferences: &Preferences) -> Result<(), String> {
|
||||
let path = preferences_path()?;
|
||||
let parent = path.parent().ok_or("Invalid app data directory.")?;
|
||||
@@ -96,8 +124,13 @@ mod tests {
|
||||
assert!(validate_server("", "https://gitea.example.com", "secret").is_err());
|
||||
assert!(validate_server("Work", "file:///tmp/gitea", "secret").is_err());
|
||||
assert_eq!(
|
||||
favorite_key("https://gitea.example.com", "octo", "demo"),
|
||||
"https://gitea.example.com|octo/demo"
|
||||
favorite_key(
|
||||
RepositoryPane::Issues,
|
||||
"https://gitea.example.com",
|
||||
"octo",
|
||||
"demo"
|
||||
),
|
||||
"issues|https://gitea.example.com|octo/demo"
|
||||
);
|
||||
let preferences: Preferences = serde_json::from_str(
|
||||
r#"{"issue_filters":{"server|octo/demo":{"milestone":"v1","labels":["bug"]}},"pull_filters":{"server":{"milestone":"v2"}}}"#,
|
||||
@@ -136,4 +169,24 @@ mod tests {
|
||||
);
|
||||
assert_eq!(crate::domain::AppearanceMode::from_index(3), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn migrates_global_favorites_to_each_repository_pane() {
|
||||
let mut favorites = ["https://gitea.example.com|octo/demo".to_string()]
|
||||
.into_iter()
|
||||
.collect();
|
||||
|
||||
assert!(migrate_favorites(&mut favorites));
|
||||
assert_eq!(
|
||||
favorites,
|
||||
[
|
||||
"commits|https://gitea.example.com|octo/demo".to_string(),
|
||||
"issues|https://gitea.example.com|octo/demo".to_string(),
|
||||
"milestones|https://gitea.example.com|octo/demo".to_string(),
|
||||
]
|
||||
.into_iter()
|
||||
.collect()
|
||||
);
|
||||
assert!(!migrate_favorites(&mut favorites));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user