mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-07-15 07:56:11 +08:00

It all just makes far more since when each Note has a fileName. Though we don't save the fileName in the YAML header. It seems quite redundant to do that. Another advantage of this is that if we can read any file ending with a '.md' in a git repo. It doesn't need to be named exactly how we want it, and we will still save the details correctly.
119 lines
2.8 KiB
Dart
119 lines
2.8 KiB
Dart
import 'dart:async';
|
|
import 'dart:io';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:path/path.dart' as p;
|
|
|
|
import 'package:journal/note.dart';
|
|
import 'package:journal/storage/git.dart';
|
|
import 'package:journal/storage/serializers.dart';
|
|
import 'package:journal/storage/file_storage.dart';
|
|
import 'package:journal/storage/notes_repository.dart';
|
|
|
|
class GitNoteRepository implements NoteRepository {
|
|
final FileStorage _fileStorage;
|
|
final String gitCloneUrl;
|
|
final String dirName;
|
|
|
|
bool cloned = false;
|
|
bool checkForCloned = false;
|
|
|
|
final Future<Directory> Function() getDirectory;
|
|
|
|
GitNoteRepository({
|
|
@required this.gitCloneUrl,
|
|
@required this.dirName,
|
|
@required this.getDirectory,
|
|
}) : _fileStorage = FileStorage(
|
|
noteSerializer: new MarkdownYAMLSerializer(),
|
|
getDirectory: getDirectory,
|
|
) {}
|
|
|
|
@override
|
|
Future<NoteRepoResult> addNote(Note note) async {
|
|
return _addNote(note, "Added Journal Entry");
|
|
}
|
|
|
|
Future<NoteRepoResult> _addNote(Note note, String commitMessage) async {
|
|
var result = await _fileStorage.addNote(note);
|
|
if (result.error) {
|
|
return result;
|
|
}
|
|
|
|
var baseDir = await this.getDirectory();
|
|
var filePath = result.noteFilePath.replaceFirst(baseDir.path + "/", "");
|
|
|
|
await gitAdd(this.dirName, filePath);
|
|
await gitCommit(
|
|
gitFolder: this.dirName,
|
|
authorEmail: "app@gitjournal.io",
|
|
authorName: "GitJournal",
|
|
message: commitMessage,
|
|
);
|
|
|
|
return result;
|
|
}
|
|
|
|
@override
|
|
Future<NoteRepoResult> removeNote(Note note) async {
|
|
var result = await _fileStorage.addNote(note);
|
|
if (result.error) {
|
|
return result;
|
|
}
|
|
|
|
var baseDir = await this.getDirectory();
|
|
var filePath = result.noteFilePath.replaceFirst(baseDir.path + "/", "");
|
|
|
|
await gitRm(this.dirName, filePath);
|
|
await gitCommit(
|
|
gitFolder: this.dirName,
|
|
authorEmail: "app@gitjournal.io",
|
|
authorName: "GitJournal",
|
|
message: "Removed Journal entry",
|
|
);
|
|
|
|
return result;
|
|
}
|
|
|
|
@override
|
|
Future<NoteRepoResult> updateNote(Note note) async {
|
|
return _addNote(note, "Edited Journal Entry");
|
|
}
|
|
|
|
@override
|
|
Future<List<Note>> listNotes() {
|
|
return _fileStorage.listNotes();
|
|
}
|
|
|
|
@override
|
|
Future<bool> sync() async {
|
|
print("Starting Sync");
|
|
if (!checkForCloned) {
|
|
var baseDir = await this.getDirectory();
|
|
var dotGitDir = new Directory(p.join(baseDir.path, ".git"));
|
|
cloned = await dotGitDir.exists();
|
|
checkForCloned = true;
|
|
}
|
|
if (!cloned) {
|
|
await gitClone(this.gitCloneUrl, this.dirName);
|
|
cloned = true;
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
await gitPull(this.dirName);
|
|
} on GitException catch (ex) {
|
|
print(ex);
|
|
}
|
|
|
|
try {
|
|
await gitPush(this.dirName);
|
|
} on GitException catch (ex) {
|
|
print(ex);
|
|
throw ex;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|