mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-27 09:06:43 +08:00
Move Setting migrations to its own file
This commit is contained in:
@ -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<Repository> 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());
|
||||
|
||||
|
@ -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<void> 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)
|
||||
|
97
lib/settings_migrations.dart
Normal file
97
lib/settings_migrations.dart
Normal file
@ -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<void> 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user