@@ -133,23 +133,9 @@ pub async fn migrate_all(cache_dir: &Path, settings_dir: &Path) -> Result<Option
133
133
let mut settings: serde_json:: Value =
134
134
serde_json:: from_reader ( & settings_bytes[ ..] ) . map_err ( Error :: Deserialize ) ?;
135
135
136
- if !settings. is_object ( ) {
137
- return Err ( Error :: InvalidSettingsContent ) ;
138
- }
139
-
140
136
let old_settings = settings. clone ( ) ;
141
137
142
- v1:: migrate ( & mut settings) ?;
143
- v2:: migrate ( & mut settings) ?;
144
- v3:: migrate ( & mut settings) ?;
145
- v4:: migrate ( & mut settings) ?;
146
-
147
- account_history:: migrate_location ( cache_dir, settings_dir) . await ;
148
- account_history:: migrate_formats ( settings_dir, & mut settings) . await ?;
149
-
150
- let migration_data = v5:: migrate ( & mut settings) ?;
151
- v6:: migrate ( & mut settings) ?;
152
- v7:: migrate ( & mut settings) ?;
138
+ let migration_data = migrate_settings ( Some ( ( cache_dir, settings_dir) ) , & mut settings) . await ?;
153
139
154
140
if settings == old_settings {
155
141
// Nothing changed
@@ -175,6 +161,31 @@ pub async fn migrate_all(cache_dir: &Path, settings_dir: &Path) -> Result<Option
175
161
Ok ( migration_data)
176
162
}
177
163
164
+ async fn migrate_settings (
165
+ directories : Option < ( & Path , & Path ) > ,
166
+ settings : & mut serde_json:: Value ,
167
+ ) -> Result < Option < MigrationData > > {
168
+ if !settings. is_object ( ) {
169
+ return Err ( Error :: InvalidSettingsContent ) ;
170
+ }
171
+
172
+ v1:: migrate ( settings) ?;
173
+ v2:: migrate ( settings) ?;
174
+ v3:: migrate ( settings) ?;
175
+ v4:: migrate ( settings) ?;
176
+
177
+ if let Some ( ( cache_dir, settings_dir) ) = directories {
178
+ account_history:: migrate_location ( cache_dir, settings_dir) . await ;
179
+ account_history:: migrate_formats ( settings_dir, settings) . await ?;
180
+ }
181
+
182
+ let migration_data = v5:: migrate ( settings) ?;
183
+ v6:: migrate ( settings) ?;
184
+ v7:: migrate ( settings) ?;
185
+
186
+ Ok ( migration_data)
187
+ }
188
+
178
189
pub ( crate ) fn migrate_device (
179
190
migration_data : MigrationData ,
180
191
rest_handle : mullvad_api:: rest:: MullvadRestHandle ,
@@ -383,3 +394,24 @@ mod windows {
383
394
unsafe { IsWellKnownSid ( sid as * const SID as * mut _ , well_known_sid_type) == 1 }
384
395
}
385
396
}
397
+
398
+ #[ cfg( test) ]
399
+ mod test {
400
+ use mullvad_types:: settings:: Settings ;
401
+
402
+ use crate :: migrations:: migrate_settings;
403
+
404
+ /// Ensure that no migration logic runs for the default settings by checking whether anything
405
+ /// has changed after running the migration code
406
+ #[ tokio:: test]
407
+ async fn test_settings_format_version ( ) {
408
+ let default_settings = serde_json:: to_value ( Settings :: default ( ) ) . unwrap ( ) ;
409
+ let mut migrated_settings = default_settings. clone ( ) ;
410
+
411
+ migrate_settings ( None , & mut migrated_settings)
412
+ . await
413
+ . unwrap ( ) ;
414
+
415
+ assert_eq ! ( default_settings, migrated_settings) ;
416
+ }
417
+ }
0 commit comments