mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-26 16:46:51 +08:00
GitRepo: Minor refactor
Start using the Result class, and use the git_bindings with a prefix. The git bindings are being phased out for dart-git.
This commit is contained in:
@ -1,8 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io' show Platform;
|
import 'dart:io' show Platform;
|
||||||
|
|
||||||
import 'package:dart_git/dart_git.dart' as git;
|
import 'package:dart_git/dart_git.dart';
|
||||||
import 'package:git_bindings/git_bindings.dart';
|
import 'package:dart_git/utils/result.dart';
|
||||||
|
import 'package:git_bindings/git_bindings.dart' as gb;
|
||||||
|
|
||||||
import 'package:gitjournal/core/note.dart';
|
import 'package:gitjournal/core/note.dart';
|
||||||
import 'package:gitjournal/core/notes_folder.dart';
|
import 'package:gitjournal/core/notes_folder.dart';
|
||||||
@ -25,44 +26,57 @@ class NoteRepoResult {
|
|||||||
|
|
||||||
class GitNoteRepository {
|
class GitNoteRepository {
|
||||||
final String gitDirPath;
|
final String gitDirPath;
|
||||||
final GitRepo _gitRepo;
|
final gb.GitRepo _gitRepo;
|
||||||
final Settings settings;
|
final Settings settings;
|
||||||
|
|
||||||
GitNoteRepository({
|
GitNoteRepository({
|
||||||
required this.gitDirPath,
|
required this.gitDirPath,
|
||||||
required this.settings,
|
required this.settings,
|
||||||
}) : _gitRepo = GitRepo(folderPath: gitDirPath) {
|
}) : _gitRepo = gb.GitRepo(folderPath: gitDirPath) {
|
||||||
// git-bindings aren't properly implemented in these platforms
|
// git-bindings aren't properly implemented in these platforms
|
||||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||||
useDartGit = true;
|
useDartGit = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _add(String pathSpec) async {
|
Future<Result<void>> _add(String pathSpec) async {
|
||||||
if (useDartGit) {
|
if (useDartGit) {
|
||||||
var repo = await git.GitRepository.load(gitDirPath).getOrThrow();
|
var repo = await GitRepository.load(gitDirPath).getOrThrow();
|
||||||
await repo.add(pathSpec).throwOnError();
|
return await repo.add(pathSpec);
|
||||||
} else {
|
} else {
|
||||||
await _gitRepo.add(pathSpec);
|
try {
|
||||||
|
await _gitRepo.add(pathSpec);
|
||||||
|
} on Exception catch (ex, st) {
|
||||||
|
return Result.fail(ex, st);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return Result(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _rm(String pathSpec) async {
|
Future<Result<void>> _rm(String pathSpec) async {
|
||||||
if (useDartGit) {
|
if (useDartGit) {
|
||||||
var repo = await git.GitRepository.load(gitDirPath).getOrThrow();
|
var repo = await GitRepository.load(gitDirPath).getOrThrow();
|
||||||
await repo.rm(pathSpec).throwOnError();
|
return await repo.rm(pathSpec);
|
||||||
} else {
|
} else {
|
||||||
await _gitRepo.rm(pathSpec);
|
try {
|
||||||
|
await _gitRepo.rm(pathSpec);
|
||||||
|
} on Exception catch (ex, st) {
|
||||||
|
return Result.fail(ex, st);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return Result(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _commit(
|
Future<void> _commit({
|
||||||
{required String /*!*/ message,
|
required String message,
|
||||||
required String authorEmail,
|
required String authorEmail,
|
||||||
required String authorName}) async {
|
required String authorName,
|
||||||
|
}) async {
|
||||||
if (useDartGit) {
|
if (useDartGit) {
|
||||||
var repo = await git.GitRepository.load(gitDirPath).getOrThrow();
|
var repo = await GitRepository.load(gitDirPath).getOrThrow();
|
||||||
var author = git.GitAuthor(name: authorName, email: authorEmail);
|
var author = GitAuthor(name: authorName, email: authorEmail);
|
||||||
await repo.commit(message: message, author: author).throwOnError();
|
await repo.commit(message: message, author: author).throwOnError();
|
||||||
} else {
|
} else {
|
||||||
await _gitRepo.commit(
|
await _gitRepo.commit(
|
||||||
@ -216,13 +230,13 @@ class GitNoteRepository {
|
|||||||
privateKey: settings.sshPrivateKey,
|
privateKey: settings.sshPrivateKey,
|
||||||
password: settings.sshPassword,
|
password: settings.sshPassword,
|
||||||
);
|
);
|
||||||
} on GitException catch (ex, stackTrace) {
|
} on gb.GitException catch (ex, stackTrace) {
|
||||||
Log.e("GitPull Failed", ex: ex, stacktrace: stackTrace);
|
Log.e("GitPull Failed", ex: ex, stacktrace: stackTrace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> merge() async {
|
Future<void> merge() async {
|
||||||
var repo = await git.GitRepository.load(gitDirPath).getOrThrow();
|
var repo = await GitRepository.load(gitDirPath).getOrThrow();
|
||||||
var branch = await repo.currentBranch().getOrThrow();
|
var branch = await repo.currentBranch().getOrThrow();
|
||||||
|
|
||||||
var branchConfig = repo.config.branch(branch);
|
var branchConfig = repo.config.branch(branch);
|
||||||
@ -247,7 +261,7 @@ class GitNoteRepository {
|
|||||||
authorEmail: settings.gitAuthorEmail,
|
authorEmail: settings.gitAuthorEmail,
|
||||||
authorName: settings.gitAuthor,
|
authorName: settings.gitAuthor,
|
||||||
);
|
);
|
||||||
} on GitException catch (ex, stackTrace) {
|
} on gb.GitException catch (ex, stackTrace) {
|
||||||
Log.e("Git Merge Failed", ex: ex, stacktrace: stackTrace);
|
Log.e("Git Merge Failed", ex: ex, stacktrace: stackTrace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -255,7 +269,7 @@ class GitNoteRepository {
|
|||||||
Future<void> push() async {
|
Future<void> push() async {
|
||||||
// Only push if we have something we need to push
|
// Only push if we have something we need to push
|
||||||
try {
|
try {
|
||||||
var repo = await git.GitRepository.load(gitDirPath).getOrThrow();
|
var repo = await GitRepository.load(gitDirPath).getOrThrow();
|
||||||
var canPush = await repo.canPush().getOrThrow();
|
var canPush = await repo.canPush().getOrThrow();
|
||||||
if (!canPush) {
|
if (!canPush) {
|
||||||
return;
|
return;
|
||||||
@ -271,7 +285,7 @@ class GitNoteRepository {
|
|||||||
privateKey: settings.sshPrivateKey,
|
privateKey: settings.sshPrivateKey,
|
||||||
password: settings.sshPassword,
|
password: settings.sshPassword,
|
||||||
);
|
);
|
||||||
} on GitException catch (ex, stackTrace) {
|
} on gb.GitException catch (ex, stackTrace) {
|
||||||
if (ex.cause == 'cannot push non-fastforwardable reference') {
|
if (ex.cause == 'cannot push non-fastforwardable reference') {
|
||||||
await fetch();
|
await fetch();
|
||||||
await merge();
|
await merge();
|
||||||
@ -284,7 +298,7 @@ class GitNoteRepository {
|
|||||||
|
|
||||||
Future<int?> numChanges() async {
|
Future<int?> numChanges() async {
|
||||||
try {
|
try {
|
||||||
var repo = await git.GitRepository.load(gitDirPath).getOrThrow();
|
var repo = await GitRepository.load(gitDirPath).getOrThrow();
|
||||||
var n = await repo.numChangesToPush().getOrThrow();
|
var n = await repo.numChangesToPush().getOrThrow();
|
||||||
return n;
|
return n;
|
||||||
} catch (ex, st) {
|
} catch (ex, st) {
|
||||||
@ -314,7 +328,7 @@ const ignoredMessages = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
bool shouldLogGitException(Exception ex) {
|
bool shouldLogGitException(Exception ex) {
|
||||||
if (ex is! GitException) {
|
if (ex is! gb.GitException) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var msg = ex.cause.toLowerCase();
|
var msg = ex.cause.toLowerCase();
|
||||||
|
Reference in New Issue
Block a user