From c9673da7218dca36d95ef592cfcd44b06629e1e9 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 23 Oct 2020 14:22:49 +0200 Subject: [PATCH] Move Setting migrations to its own file --- lib/repository.dart | 14 +++--- lib/settings.dart | 89 --------------------------------- lib/settings_migrations.dart | 97 ++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 97 deletions(-) create mode 100644 lib/settings_migrations.dart diff --git a/lib/repository.dart b/lib/repository.dart index df6c4c4e..1ffc2f13 100644 --- a/lib/repository.dart +++ b/lib/repository.dart @@ -18,6 +18,7 @@ import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/features.dart'; import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/settings_migrations.dart'; import 'package:gitjournal/utils/logger.dart'; enum SyncStatus { @@ -34,9 +35,10 @@ class Repository with ChangeNotifier { final _opLock = Lock(); final _loadLock = Lock(); - // FIXME: The gitRepo should never be changed once it has been setup - // We should always just be modifying the 'git remotes' - // With that, the StateContainer can be a StatelessWidget + final String gitBaseDirectory; + final String cacheDir; + final String name; + GitNoteRepository _gitRepo; NotesCache _notesCache; @@ -51,10 +53,6 @@ class Repository with ChangeNotifier { NotesFolderFS notesFolder; - final String gitBaseDirectory; - final String cacheDir; - final String name; - bool remoteGitRepoConfigured = false; static Future load({ @@ -66,7 +64,7 @@ class Repository with ChangeNotifier { var settings = Settings(name); settings.load(pref); - await settings.migrate(pref, gitBaseDir); + await migrateSettings(settings, pref, gitBaseDir); logEvent(Event.Settings, parameters: settings.toLoggableMap()); diff --git a/lib/settings.dart b/lib/settings.dart index a44979f3..e349c754 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; @@ -10,7 +8,6 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:gitjournal/core/sorting_mode.dart'; import 'package:gitjournal/folder_views/common.dart'; import 'package:gitjournal/screens/note_editor.dart'; -import 'package:gitjournal/utils/logger.dart'; class Settings extends ChangeNotifier { Settings(this.folderName); @@ -321,92 +318,6 @@ class Settings extends ChangeNotifier { return m; } - Future migrate(SharedPreferences pref, String gitBaseDir) async { - if (version == 0) { - var cache = p.join(gitBaseDir, "cache.json"); - if (File(cache).existsSync()) { - await File(cache).delete(); - } - - var localGitRepoConfigured = - pref.getBool("localGitRepoConfigured") ?? false; - var remoteGitRepoConfigured = - pref.getBool("remoteGitRepoConfigured") ?? false; - - if (localGitRepoConfigured && !remoteGitRepoConfigured) { - Log.i("Migrating from local and remote repos to a single one"); - var oldName = p.join(gitBaseDir, "journal_local"); - var newName = p.join(gitBaseDir, "journal"); - - await Directory(oldName).rename(newName); - folderName = "journal"; - - pref.setString('remoteGitRepoPath', folderName); - } - - var oldDir = Directory(p.join(gitBaseDir, '../files')); - if (oldDir.existsSync()) { - // Move everything from the old dir - var stream = await (oldDir.list().toList()); - for (var fsEntity in stream) { - var stat = await fsEntity.stat(); - if (stat.type != FileSystemEntityType.directory) { - var fileName = p.basename(fsEntity.path); - if (fileName == 'cache.json') { - await File(fsEntity.path).delete(); - } - continue; - } - - var folderName = p.basename(fsEntity.path); - if (folderName.startsWith('journal') || - folderName.startsWith('ssh')) { - var newPath = p.join(gitBaseDir, folderName); - if (!Directory(newPath).existsSync()) { - await Directory(fsEntity.path).rename(newPath); - } - } - } - } - - // Save the ssh keys - var oldSshDir = Directory(p.join(gitBaseDir, '../files/ssh')); - if (oldSshDir.existsSync()) { - var sshPublicKeyPath = p.join(oldSshDir.path, "id_rsa.pub"); - var sshPrivateKeyPath = p.join(oldSshDir.path, "id_rsa"); - - var publicKeyExists = File(sshPublicKeyPath).existsSync(); - var privateKeyExists = File(sshPrivateKeyPath).existsSync(); - if (publicKeyExists && privateKeyExists) { - sshPublicKey = await File(sshPublicKeyPath).readAsString(); - sshPrivateKey = await File(sshPrivateKeyPath).readAsString(); - sshPassword = ""; - } - - await oldSshDir.delete(recursive: true); - } - - var newSshDir = Directory(p.join(gitBaseDir, 'ssh')); - if (newSshDir.existsSync()) { - var sshPublicKeyPath = p.join(newSshDir.path, "id_rsa.pub"); - var sshPrivateKeyPath = p.join(newSshDir.path, "id_rsa"); - - var publicKeyExists = File(sshPublicKeyPath).existsSync(); - var privateKeyExists = File(sshPrivateKeyPath).existsSync(); - if (publicKeyExists && privateKeyExists) { - sshPublicKey = await File(sshPublicKeyPath).readAsString(); - sshPrivateKey = await File(sshPrivateKeyPath).readAsString(); - sshPassword = ""; - } - - await newSshDir.delete(recursive: true); - } - - version = 1; - pref.setInt("settingsVersion", version); - } - } - String buildRepoPath(String internalDir) { return storeInternally ? p.join(internalDir, folderName) diff --git a/lib/settings_migrations.dart b/lib/settings_migrations.dart new file mode 100644 index 00000000..bac04876 --- /dev/null +++ b/lib/settings_migrations.dart @@ -0,0 +1,97 @@ +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/utils/logger.dart'; + +Future migrateSettings( + Settings settings, + SharedPreferences pref, + String gitBaseDir, +) async { + if (settings.version == 0) { + Log.i("Migrating settings from v0 -> v1"); + var cache = p.join(gitBaseDir, "cache.json"); + if (File(cache).existsSync()) { + await File(cache).delete(); + } + + var localGitRepoConfigured = + pref.getBool("localGitRepoConfigured") ?? false; + var remoteGitRepoConfigured = + pref.getBool("remoteGitRepoConfigured") ?? false; + + if (localGitRepoConfigured && !remoteGitRepoConfigured) { + Log.i("Migrating from local and remote repos to a single one"); + var oldName = p.join(gitBaseDir, "journal_local"); + var newName = p.join(gitBaseDir, "journal"); + + await Directory(oldName).rename(newName); + settings.folderName = "journal"; + + pref.setString('remoteGitRepoPath', settings.folderName); + } + + var oldDir = Directory(p.join(gitBaseDir, '../files')); + if (oldDir.existsSync()) { + // Move everything from the old dir + var stream = await (oldDir.list().toList()); + for (var fsEntity in stream) { + var stat = await fsEntity.stat(); + if (stat.type != FileSystemEntityType.directory) { + var fileName = p.basename(fsEntity.path); + if (fileName == 'cache.json') { + await File(fsEntity.path).delete(); + } + continue; + } + + var folderName = p.basename(fsEntity.path); + if (folderName.startsWith('journal') || folderName.startsWith('ssh')) { + var newPath = p.join(gitBaseDir, folderName); + if (!Directory(newPath).existsSync()) { + await Directory(fsEntity.path).rename(newPath); + } + } + } + } + + // Save the ssh keys + var oldSshDir = Directory(p.join(gitBaseDir, '../files/ssh')); + if (oldSshDir.existsSync()) { + var sshPublicKeyPath = p.join(oldSshDir.path, "id_rsa.pub"); + var sshPrivateKeyPath = p.join(oldSshDir.path, "id_rsa"); + + var publicKeyExists = File(sshPublicKeyPath).existsSync(); + var privateKeyExists = File(sshPrivateKeyPath).existsSync(); + if (publicKeyExists && privateKeyExists) { + settings.sshPublicKey = await File(sshPublicKeyPath).readAsString(); + settings.sshPrivateKey = await File(sshPrivateKeyPath).readAsString(); + settings.sshPassword = ""; + } + + await oldSshDir.delete(recursive: true); + } + + var newSshDir = Directory(p.join(gitBaseDir, 'ssh')); + if (newSshDir.existsSync()) { + var sshPublicKeyPath = p.join(newSshDir.path, "id_rsa.pub"); + var sshPrivateKeyPath = p.join(newSshDir.path, "id_rsa"); + + var publicKeyExists = File(sshPublicKeyPath).existsSync(); + var privateKeyExists = File(sshPrivateKeyPath).existsSync(); + if (publicKeyExists && privateKeyExists) { + settings.sshPublicKey = await File(sshPublicKeyPath).readAsString(); + settings.sshPrivateKey = await File(sshPrivateKeyPath).readAsString(); + settings.sshPassword = ""; + } + + await newSshDir.delete(recursive: true); + } + + settings.version = 1; + pref.setInt("settingsVersion", settings.version); + } +}