Migrate setting to be repo specific

Each attribute of the settings is prefixed with the "id" of the repo.
This commit is contained in:
Vishesh Handa
2020-10-23 15:25:12 +02:00
parent a9abf5d9b3
commit 07d0bdb7d8
3 changed files with 139 additions and 44 deletions

View File

@ -44,7 +44,7 @@ class JournalApp extends StatefulWidget {
gitBaseDir: gitBaseDirectory, gitBaseDir: gitBaseDirectory,
cacheDir: cacheDir, cacheDir: cacheDir,
pref: pref, pref: pref,
id: "0", id: DEFAULT_ID,
); );
Widget app = ChangeNotifierProvider.value( Widget app = ChangeNotifierProvider.value(

View File

@ -10,6 +10,8 @@ import 'package:gitjournal/folder_views/common.dart';
import 'package:gitjournal/screens/note_editor.dart'; import 'package:gitjournal/screens/note_editor.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
const DEFAULT_ID = "0";
class Settings extends ChangeNotifier { class Settings extends ChangeNotifier {
Settings(this.id); Settings(this.id);
@ -40,7 +42,7 @@ class Settings extends ChangeNotifier {
SettingsFolderViewType defaultView = SettingsFolderViewType.Default; SettingsFolderViewType defaultView = SettingsFolderViewType.Default;
bool showNoteSummary = true; bool showNoteSummary = true;
String folderViewHeaderType = "TitleGenerated"; String folderViewHeaderType = "TitleGenerated";
int version = 1; int version = 2;
SettingsHomeScreen homeScreen = SettingsHomeScreen.Default; SettingsHomeScreen homeScreen = SettingsHomeScreen.Default;
@ -69,78 +71,95 @@ class Settings extends ChangeNotifier {
String sshPassword = ""; String sshPassword = "";
void load(SharedPreferences pref) { void load(SharedPreferences pref) {
gitAuthor = pref.getString("gitAuthor") ?? gitAuthor; gitAuthor = _getString(pref, "gitAuthor") ?? gitAuthor;
gitAuthorEmail = pref.getString("gitAuthorEmail") ?? gitAuthorEmail; gitAuthorEmail = _getString(pref, "gitAuthorEmail") ?? gitAuthorEmail;
noteFileNameFormat = NoteFileNameFormat.fromInternalString( noteFileNameFormat = NoteFileNameFormat.fromInternalString(
pref.getString("noteFileNameFormat")); _getString(pref, "noteFileNameFormat"));
journalNoteFileNameFormat = NoteFileNameFormat.fromInternalString( journalNoteFileNameFormat = NoteFileNameFormat.fromInternalString(
pref.getString("journalNoteFileNameFormat")); _getString(pref, "journalNoteFileNameFormat"));
yamlModifiedKey = pref.getString("yamlModifiedKey") ?? yamlModifiedKey; yamlModifiedKey = _getString(pref, "yamlModifiedKey") ?? yamlModifiedKey;
yamlCreatedKey = pref.getString("yamlCreatedKey") ?? yamlCreatedKey; yamlCreatedKey = _getString(pref, "yamlCreatedKey") ?? yamlCreatedKey;
yamlTagsKey = pref.getString("yamlTagsKey") ?? yamlTagsKey; yamlTagsKey = _getString(pref, "yamlTagsKey") ?? yamlTagsKey;
customMetaData = pref.getString("customMetaData") ?? customMetaData; customMetaData = _getString(pref, "customMetaData") ?? customMetaData;
yamlHeaderEnabled = pref.getBool("yamlHeaderEnabled") ?? yamlHeaderEnabled; yamlHeaderEnabled =
defaultNewNoteFolderSpec = _getBool(pref, "yamlHeaderEnabled") ?? yamlHeaderEnabled;
pref.getString("defaultNewNoteFolderSpec") ?? defaultNewNoteFolderSpec; defaultNewNoteFolderSpec = _getString(pref, "defaultNewNoteFolderSpec") ??
defaultNewNoteFolderSpec;
journalEditordefaultNewNoteFolderSpec = journalEditordefaultNewNoteFolderSpec =
pref.getString("journalEditordefaultNewNoteFolderSpec") ?? _getString(pref, "journalEditordefaultNewNoteFolderSpec") ??
journalEditordefaultNewNoteFolderSpec; journalEditordefaultNewNoteFolderSpec;
journalEditorSingleNote = journalEditorSingleNote =
pref.getBool("journalEditorSingleNote") ?? journalEditorSingleNote; _getBool(pref, "journalEditorSingleNote") ?? journalEditorSingleNote;
remoteSyncFrequency = RemoteSyncFrequency.fromInternalString( remoteSyncFrequency = RemoteSyncFrequency.fromInternalString(
pref.getString("remoteSyncFrequency")); _getString(pref, "remoteSyncFrequency"));
sortingField = sortingField =
SortingField.fromInternalString(pref.getString("sortingField")); SortingField.fromInternalString(_getString(pref, "sortingField"));
sortingOrder = sortingOrder =
SortingOrder.fromInternalString(pref.getString("sortingOrder")); SortingOrder.fromInternalString(_getString(pref, "sortingOrder"));
defaultEditor = defaultEditor = SettingsEditorType.fromInternalString(
SettingsEditorType.fromInternalString(pref.getString("defaultEditor")); _getString(pref, "defaultEditor"));
defaultView = SettingsFolderViewType.fromInternalString( defaultView = SettingsFolderViewType.fromInternalString(
pref.getString("defaultView")); _getString(pref, "defaultView"));
markdownDefaultView = SettingsMarkdownDefaultView.fromInternalString( markdownDefaultView = SettingsMarkdownDefaultView.fromInternalString(
pref.getString("markdownDefaultView")); _getString(pref, "markdownDefaultView"));
markdownLastUsedView = SettingsMarkdownDefaultView.fromInternalString( markdownLastUsedView = SettingsMarkdownDefaultView.fromInternalString(
pref.getString("markdownLastUsedView")); _getString(pref, "markdownLastUsedView"));
if (markdownLastUsedView == SettingsMarkdownDefaultView.LastUsed) { if (markdownLastUsedView == SettingsMarkdownDefaultView.LastUsed) {
markdownLastUsedView = SettingsMarkdownDefaultView.Edit; markdownLastUsedView = SettingsMarkdownDefaultView.Edit;
} }
showNoteSummary = pref.getBool("showNoteSummary") ?? showNoteSummary; showNoteSummary = _getBool(pref, "showNoteSummary") ?? showNoteSummary;
folderViewHeaderType = folderViewHeaderType =
pref.getString("folderViewHeaderType") ?? folderViewHeaderType; _getString(pref, "folderViewHeaderType") ?? folderViewHeaderType;
version = pref.getInt("settingsVersion") ?? version; version = _getInt(pref, "settingsVersion") ?? version;
emojiParser = pref.getBool("emojiParser") ?? emojiParser; emojiParser = _getBool(pref, "emojiParser") ?? emojiParser;
homeScreen = homeScreen =
SettingsHomeScreen.fromInternalString(pref.getString("homeScreen")); SettingsHomeScreen.fromInternalString(_getString(pref, "homeScreen"));
imageLocationSpec = imageLocationSpec =
pref.getString("imageLocationSpec") ?? imageLocationSpec; _getString(pref, "imageLocationSpec") ?? imageLocationSpec;
zenMode = pref.getBool("zenMode") ?? zenMode; zenMode = _getBool(pref, "zenMode") ?? zenMode;
saveTitleInH1 = pref.getBool("saveTitleInH1") ?? saveTitleInH1; saveTitleInH1 = _getBool(pref, "saveTitleInH1") ?? saveTitleInH1;
swipeToDelete = pref.getBool("swipeToDelete") ?? swipeToDelete; swipeToDelete = _getBool(pref, "swipeToDelete") ?? swipeToDelete;
inlineTagPrefixes = inlineTagPrefixes =
pref.getStringList("inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes; _getStringList(pref, "inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes;
// From AppState // From AppState
folderName = pref.getString("remoteGitRepoPath") ?? folderName; folderName = _getString(pref, "remoteGitRepoPath") ?? folderName;
sshPublicKey = pref.getString("sshPublicKey") ?? sshPublicKey; sshPublicKey = _getString(pref, "sshPublicKey") ?? sshPublicKey;
sshPrivateKey = pref.getString("sshPrivateKey") ?? sshPrivateKey; sshPrivateKey = _getString(pref, "sshPrivateKey") ?? sshPrivateKey;
sshPassword = pref.getString("sshPassword") ?? sshPassword; sshPassword = _getString(pref, "sshPassword") ?? sshPassword;
bottomMenuBar = pref.getBool("bottomMenuBar") ?? bottomMenuBar; bottomMenuBar = _getBool(pref, "bottomMenuBar") ?? bottomMenuBar;
storeInternally = pref.getBool("storeInternally") ?? storeInternally; storeInternally = _getBool(pref, "storeInternally") ?? storeInternally;
storageLocation = pref.getString("storageLocation") ?? ""; storageLocation = _getString(pref, "storageLocation") ?? "";
}
String _getString(SharedPreferences pref, String key) {
return pref.getString(id + '_' + key);
}
bool _getBool(SharedPreferences pref, String key) {
return pref.getBool(id + '_' + key);
}
List<String> _getStringList(SharedPreferences pref, String key) {
return pref.getStringList(id + '_' + key);
}
int _getInt(SharedPreferences pref, String key) {
return pref.getInt(id + '_' + key);
} }
Future<void> save() async { Future<void> save() async {
@ -238,6 +257,7 @@ class Settings extends ChangeNotifier {
String value, String value,
String defaultValue, String defaultValue,
) async { ) async {
key = id + '_' + key;
if (value == defaultValue) { if (value == defaultValue) {
await pref.remove(key); await pref.remove(key);
} else { } else {
@ -251,6 +271,7 @@ class Settings extends ChangeNotifier {
bool value, bool value,
bool defaultValue, bool defaultValue,
) async { ) async {
key = id + '_' + key;
if (value == defaultValue) { if (value == defaultValue) {
await pref.remove(key); await pref.remove(key);
} else { } else {
@ -264,6 +285,8 @@ class Settings extends ChangeNotifier {
Set<String> value, Set<String> value,
Set<String> defaultValue, Set<String> defaultValue,
) async { ) async {
key = id + '_' + key;
final eq = const SetEquality().equals; final eq = const SetEquality().equals;
if (eq(value, defaultValue)) { if (eq(value, defaultValue)) {

View File

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:gitjournal/settings.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -9,10 +10,7 @@ Future<void> migrateSettings(
SharedPreferences pref, SharedPreferences pref,
String gitBaseDir, String gitBaseDir,
) async { ) async {
var version = pref.getInt('settingsVersion') ?? '-1'; var version = pref.getInt('settingsVersion') ?? -1;
if (version == -1) {
return;
}
if (version == 0) { if (version == 0) {
Log.i("Migrating settings from v0 -> v1"); Log.i("Migrating settings from v0 -> v1");
@ -103,4 +101,78 @@ Future<void> migrateSettings(
version = 1; version = 1;
await pref.setInt("settingsVersion", version); await pref.setInt("settingsVersion", version);
} }
if (version == 1) {
Log.i("Migrating settings from v1 -> v2");
var prefix = "${DEFAULT_ID}_";
var stringKeys = [
'gitAuthor',
'gitAuthorEmail',
'noteFileNameFormat',
'journalNoteFileNameFormat',
'yamlModifiedKey',
'yamlCreatedKey',
'yamlTagsKey',
'customMetaData',
'defaultNewNoteFolderSpec',
'journalEditordefaultNewNoteFolderSpec',
'remoteSyncFrequency',
'sortingField',
'sortingOrder',
'defaultEditor',
'defaultView',
'markdownDefaultView',
'markdownLastUsedView',
'folderViewHeaderType',
'homeScreen',
'imageLocationSpec',
'remoteGitRepoPath',
'sshPublicKey',
'sshPrivateKey',
'sshPassword',
'storageLocation',
];
for (var key in stringKeys) {
var value = pref.getString(key);
if (value != null) {
await pref.remove(key);
await pref.setString(prefix + key, value);
}
}
var boolKeys = [
'yamlHeaderEnabled',
'journalEditorSingleNote',
'showNoteSummary',
'emojiParser',
'zenMode',
'saveTitleInH1',
'swipeToDelete',
'bottomMenuBar',
'storeInternally',
];
for (var key in boolKeys) {
var value = pref.getBool(key);
if (value != null) {
await pref.remove(key);
await pref.setBool(prefix + key, value);
}
}
var stringListKeys = [
'inlineTagPrefixes',
];
for (var key in stringListKeys) {
var value = pref.getStringList(key);
if (value != null) {
await pref.remove(key);
await pref.setStringList(prefix + key, value);
}
}
version = 2;
await pref.remove("settingsVersion");
await pref.setInt(prefix + "settingsVersion", version);
}
} }