Add a lock between all git operations

This way in between a git add + git commit, no other git operation will
run. This rarely occurs but it was a posibility depending on the speed
of the users actions.
This commit is contained in:
Vishesh Handa
2020-03-21 00:44:14 +01:00
parent 86ae88bae0
commit eb7d7dc2e7

View File

@ -14,10 +14,13 @@ import 'package:gitjournal/settings.dart';
import 'package:path/path.dart' as p;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_crashlytics/flutter_crashlytics.dart';
import 'package:synchronized/synchronized.dart';
class StateContainer with ChangeNotifier {
final AppState appState;
final _opLock = 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
@ -118,93 +121,111 @@ class StateContainer with ChangeNotifier {
}
void createFolder(NotesFolderFS parent, String folderName) async {
var newFolderPath = p.join(parent.folderPath, folderName);
var newFolder = NotesFolderFS(parent, newFolderPath);
newFolder.create();
return _opLock.synchronized(() async {
var newFolderPath = p.join(parent.folderPath, folderName);
var newFolder = NotesFolderFS(parent, newFolderPath);
newFolder.create();
Fimber.d("Created New Folder: " + newFolderPath);
parent.addFolder(newFolder);
Fimber.d("Created New Folder: " + newFolderPath);
parent.addFolder(newFolder);
_gitRepo.addFolder(newFolder).then((NoteRepoResult _) {
_syncNotes();
_gitRepo.addFolder(newFolder).then((NoteRepoResult _) {
_syncNotes();
});
});
}
void removeFolder(NotesFolderFS folder) {
Fimber.d("Removing Folder: " + folder.folderPath);
void removeFolder(NotesFolderFS folder) async {
return _opLock.synchronized(() async {
Fimber.d("Removing Folder: " + folder.folderPath);
folder.parentFS.removeFolder(folder);
_gitRepo.removeFolder(folder.folderPath).then((NoteRepoResult _) {
_syncNotes();
folder.parentFS.removeFolder(folder);
_gitRepo.removeFolder(folder.folderPath).then((NoteRepoResult _) {
_syncNotes();
});
});
}
void renameFolder(NotesFolderFS folder, String newFolderName) {
var oldFolderPath = folder.folderPath;
folder.rename(newFolderName);
void renameFolder(NotesFolderFS folder, String newFolderName) async {
return _opLock.synchronized(() async {
var oldFolderPath = folder.folderPath;
folder.rename(newFolderName);
_gitRepo
.renameFolder(oldFolderPath, folder.folderPath)
.then((NoteRepoResult _) {
_syncNotes();
_gitRepo
.renameFolder(oldFolderPath, folder.folderPath)
.then((NoteRepoResult _) {
_syncNotes();
});
});
}
void renameNote(Note note, String newFileName) {
var oldNotePath = note.filePath;
note.rename(newFileName);
void renameNote(Note note, String newFileName) async {
return _opLock.synchronized(() async {
var oldNotePath = note.filePath;
note.rename(newFileName);
_gitRepo.renameNote(oldNotePath, note.filePath).then((NoteRepoResult _) {
_syncNotes();
_gitRepo.renameNote(oldNotePath, note.filePath).then((NoteRepoResult _) {
_syncNotes();
});
});
}
void moveNote(Note note, NotesFolderFS destFolder) {
void moveNote(Note note, NotesFolderFS destFolder) async {
if (destFolder.folderPath == note.parent.folderPath) {
return;
}
var oldNotePath = note.filePath;
note.move(destFolder);
return _opLock.synchronized(() async {
var oldNotePath = note.filePath;
note.move(destFolder);
_gitRepo.moveNote(oldNotePath, note.filePath).then((NoteRepoResult _) {
_syncNotes();
_gitRepo.moveNote(oldNotePath, note.filePath).then((NoteRepoResult _) {
_syncNotes();
});
});
}
void addNote(Note note) {
Fimber.d("State Container addNote");
note.parent.insert(0, note);
note.updateModified();
_gitRepo.addNote(note).then((NoteRepoResult _) {
_syncNotes();
void addNote(Note note) async {
return _opLock.synchronized(() async {
Fimber.d("State Container addNote");
note.parent.insert(0, note);
note.updateModified();
_gitRepo.addNote(note).then((NoteRepoResult _) {
_syncNotes();
});
});
}
void removeNote(Note note) {
// FIXME: What if the Note hasn't yet been saved?
note.parent.remove(note);
_gitRepo.removeNote(note.filePath).then((NoteRepoResult _) async {
// FIXME: Is there a way of figuring this amount dynamically?
// The '4 seconds' is taken from snack_bar.dart -> _kSnackBarDisplayDuration
// We wait an aritfical amount of time, so that the user has a change to undo
// their delete operation, and that commit is not synced with the server, till then.
await Future.delayed(const Duration(seconds: 4));
_syncNotes();
void removeNote(Note note) async {
return _opLock.synchronized(() async {
// FIXME: What if the Note hasn't yet been saved?
note.parent.remove(note);
_gitRepo.removeNote(note.filePath).then((NoteRepoResult _) async {
// FIXME: Is there a way of figuring this amount dynamically?
// The '4 seconds' is taken from snack_bar.dart -> _kSnackBarDisplayDuration
// We wait an aritfical amount of time, so that the user has a change to undo
// their delete operation, and that commit is not synced with the server, till then.
await Future.delayed(const Duration(seconds: 4));
_syncNotes();
});
});
}
void undoRemoveNote(Note note) {
note.parent.insert(0, note);
_gitRepo.resetLastCommit().then((NoteRepoResult _) {
_syncNotes();
void undoRemoveNote(Note note) async {
return _opLock.synchronized(() async {
note.parent.insert(0, note);
_gitRepo.resetLastCommit().then((NoteRepoResult _) {
_syncNotes();
});
});
}
void updateNote(Note note) {
Fimber.d("State Container updateNote");
note.updateModified();
_gitRepo.updateNote(note).then((NoteRepoResult _) {
_syncNotes();
void updateNote(Note note) async {
return _opLock.synchronized(() async {
Fimber.d("State Container updateNote");
note.updateModified();
_gitRepo.updateNote(note).then((NoteRepoResult _) {
_syncNotes();
});
});
}