fix: keep pull request filters session-local

This commit is contained in:
Valdemar Lorenzen
2026-10-21 13:56:24 +02:00
parent fbcb519e13
commit ea7c240eb6
9 changed files with 86 additions and 53 deletions
+2 -1
View File
@@ -5346,8 +5346,9 @@ impl Editor {
diff.handle(input);
if std::mem::take(&mut diff.pull_request_preferences_changed) {
let preferences = diff.pull_request_preferences.clone();
self.pull_request_preferences_changed |=
self.pull_request_preferences.sort != preferences.sort;
self.pull_request_preferences = preferences.clone();
self.pull_request_preferences_changed = true;
for diff in self
.diff
.iter_mut()
+1 -1
View File
@@ -110,7 +110,7 @@ Pull requests: :pull_requests [REMOTE]; GitHub/GitLab/Gitea Open/Closed/Drafts/A
🙏 marks a personal review request; 👍 marks your active approval (API account)
Ctrl+s sort menu: 1-4 precedence, Backspace clear, Left/Right date direction
Ctrl+f filter menu: Space includes/excludes personal review states; Enter applies, Esc cancels
Applied choices persist; config.pull_request_sort / config.pull_request_filters override at startup
Sorting persists; filters last for this session; config.pull_request_sort / config.pull_request_filters set startup choices
Symbols: config.pull_request_review_requested_symbol / config.pull_request_approved_symbol
Resolve jj conflicts: :resolve opens the current working-copy conflicts in a dedicated workspace
Editable marker-free Draft vs readonly Alternative; :resolve.history shows inputs/base
+22 -5
View File
@@ -1,4 +1,4 @@
use crate::pull_requests::Preferences;
use crate::pull_requests::{Preferences, SortSettings};
use serde::{Deserialize, Serialize};
use std::{
ffi::OsStr,
@@ -17,6 +17,16 @@ struct StoredPreferences<T> {
preferences: T,
}
#[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
struct StoredSort<T> {
#[serde(default)]
sort: T,
// Previously saved filters are deliberately ignored, including invalid values.
#[serde(default, rename = "filters", skip_serializing)]
_filters: serde::de::IgnoredAny,
}
pub(crate) fn default_path() -> Result<PathBuf, String> {
path_from(
std::env::var_os("XDG_STATE_HOME").as_deref(),
@@ -46,7 +56,7 @@ fn read_preferences(path: &Path) -> Result<Option<Preferences>, String> {
Ok(_) => {}
}
let bytes = fs::read(path).map_err(|error| error.to_string())?;
let stored: StoredPreferences<Preferences> =
let stored: StoredPreferences<StoredSort<SortSettings>> =
serde_json::from_slice(&bytes).map_err(|error| error.to_string())?;
if stored.version != 1 {
return Err(format!(
@@ -54,8 +64,12 @@ fn read_preferences(path: &Path) -> Result<Option<Preferences>, String> {
stored.version
));
}
stored.preferences.validate()?;
Ok(Some(stored.preferences))
let preferences = Preferences {
sort: stored.preferences.sort,
..Preferences::default()
};
preferences.validate()?;
Ok(Some(preferences))
}
pub(crate) struct Store {
@@ -113,7 +127,10 @@ impl Store {
read_preferences(path)?;
let bytes = serde_json::to_vec_pretty(&StoredPreferences {
version: 1,
preferences,
preferences: StoredSort {
sort: &preferences.sort,
_filters: serde::de::IgnoredAny,
},
})
.map_err(|error| error.to_string())?;
let parent = path.parent().ok_or("preferences path has no parent")?;