Add support for getting clone progress from git_bindings

This is hacky, and we're getting it through a file. Right now we aren't
doing anything with the progress, we're just fetching it.
This commit is contained in:
Vishesh Handa
2021-07-21 13:25:55 +02:00
parent e95cc42995
commit 09026fc59e
6 changed files with 93 additions and 6 deletions

View File

@ -217,6 +217,7 @@ bool handleError(FlutterResult result, int err) {
NSString *publicKey = arguments[@"publicKey"];
NSString *privateKey = arguments[@"privateKey"];
NSString *password = arguments[@"password"];
NSString *statusFile = arguments[@"statusFile"];
if (publicKey == nil || [publicKey length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
@ -244,8 +245,13 @@ bool handleError(FlutterResult result, int err) {
message:@"Invalid remote" details:nil]);
return;
}
if (statusFile == nil) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid statusFile" details:nil]);
return;
}
int err = gj_git_fetch([folderPath UTF8String], [remote UTF8String], [publicKey UTF8String], [privateKey UTF8String], [password UTF8String], true);
int err = gj_git_fetch([folderPath UTF8String], [remote UTF8String], [publicKey UTF8String], [privateKey UTF8String], [password UTF8String], true, [statusFile UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
@ -290,6 +296,7 @@ bool handleError(FlutterResult result, int err) {
NSString *publicKey = arguments[@"publicKey"];
NSString *privateKey = arguments[@"privateKey"];
NSString *password = arguments[@"password"];
NSString *statusFile = arguments[@"statusFile"];
if (publicKey == nil || [publicKey length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
@ -317,8 +324,13 @@ bool handleError(FlutterResult result, int err) {
message:@"Invalid remote" details:nil]);
return;
}
if (statusFile == nil) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid statusFile" details:nil]);
return;
}
int err = gj_git_push([folderPath UTF8String], [remote UTF8String], [publicKey UTF8String], [privateKey UTF8String], [password UTF8String], true);
int err = gj_git_push([folderPath UTF8String], [remote UTF8String], [publicKey UTF8String], [privateKey UTF8String], [password UTF8String], true, [statusFile UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;

View File

@ -1,9 +1,10 @@
import 'dart:async';
import 'dart:io' show Platform;
import 'dart:io' show Platform, Directory;
import 'package:dart_git/dart_git.dart';
import 'package:dart_git/utils/result.dart';
import 'package:git_bindings/git_bindings.dart' as gb;
import 'package:path/path.dart' as p;
import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart';
@ -218,6 +219,7 @@ class GitNoteRepository {
publicKey: settings.sshPublicKey,
privateKey: settings.sshPrivateKey,
password: settings.sshPassword,
statusFile: p.join(Directory.systemTemp.path, 'gj'),
);
} on gb.GitException catch (ex, stackTrace) {
Log.e("GitPull Failed", ex: ex, stacktrace: stackTrace);
@ -301,6 +303,7 @@ class GitNoteRepository {
publicKey: settings.sshPublicKey,
privateKey: settings.sshPrivateKey,
password: settings.sshPassword,
statusFile: p.join(Directory.systemTemp.path, 'gj'),
);
} on gb.GitException catch (ex, stackTrace) {
if (ex.cause == 'cannot push non-fastforwardable reference') {

View File

@ -1,13 +1,45 @@
import 'dart:io' show Platform;
import 'dart:async';
import 'dart:io' show Platform, Directory, File;
import 'package:dart_git/dart_git.dart';
import 'package:dart_git/exceptions.dart';
import 'package:function_types/function_types.dart';
import 'package:git_bindings/git_bindings.dart' as git_bindings;
import 'package:path/path.dart' as p;
import 'package:gitjournal/utils/git_desktop.dart';
import 'package:gitjournal/utils/logger.dart';
class GitTransferProgress {
int totalObjects = 0;
int indexedObjects = 0;
int receivedObjects = 0;
int localObjects = 0;
int totalDeltas = 0;
int indexedDeltas = 0;
int receivedBytes = 0;
static Future<GitTransferProgress?> load(String statusFile) async {
if (!File(statusFile).existsSync()) {
return null;
}
var str = await File(statusFile).readAsString();
var parts = str.split(' ');
print('Str #$str#');
print('Parts $parts');
var tp = GitTransferProgress();
tp.totalObjects = int.parse(parts[0]);
tp.indexedObjects = int.parse(parts[1]);
tp.receivedObjects = int.parse(parts[2]);
tp.localObjects = int.parse(parts[3]);
tp.totalDeltas = int.parse(parts[4]);
tp.indexedDeltas = int.parse(parts[5]);
tp.receivedBytes = int.parse(parts[6]);
return tp;
}
}
Future<Result<void>> cloneRemote({
required String repoPath,
required String cloneUrl,
@ -17,6 +49,7 @@ Future<Result<void>> cloneRemote({
required String sshPassword,
required String authorName,
required String authorEmail,
required Func1<GitTransferProgress, void> progressUpdate,
}) async {
var repo = await GitRepository.load(repoPath).getOrThrow();
var remote = await repo.addOrUpdateRemote(remoteName, cloneUrl).getOrThrow();
@ -25,12 +58,22 @@ Future<Result<void>> cloneRemote({
var _gitRepo = git_bindings.GitRepo(folderPath: repoPath);
if (Platform.isAndroid || Platform.isIOS) {
var statusFile = p.join(Directory.systemTemp.path, 'gj');
var duration = const Duration(milliseconds: 10);
var timer = Timer.periodic(duration, (_) async {
var progress = await GitTransferProgress.load(statusFile);
if (progress != null) {
progressUpdate(progress);
}
});
await _gitRepo.fetch(
remote: remoteName,
publicKey: sshPublicKey,
privateKey: sshPrivateKey,
password: sshPassword,
statusFile: statusFile,
);
timer.cancel();
remoteBranchName = await _remoteDefaultBranch(
repo: repo,

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'clone.dart';
import 'error.dart';
import 'loading.dart';
@ -21,3 +22,24 @@ class GitHostSetupLoadingErrorPage extends StatelessWidget {
return GitHostSetupErrorPage(errorMessage!);
}
}
class GitHostCloningPage extends StatelessWidget {
final String? errorMessage;
final String loadingMessage;
final GitTransferProgress cloneProgress;
GitHostCloningPage({
required this.errorMessage,
required this.loadingMessage,
required this.cloneProgress,
});
@override
Widget build(BuildContext context) {
if (errorMessage == null || errorMessage!.isEmpty) {
return GitHostSetupLoadingPage(loadingMessage);
}
return GitHostSetupErrorPage(errorMessage!);
}
}

View File

@ -65,6 +65,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
String _autoConfigureErrorMessage = "";
var _gitCloneUrl = "";
var _cloneProgress = GitTransferProgress();
String? gitCloneErrorMessage = "";
var publicKey = "";
@ -287,9 +288,10 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
if (pos == 4) {
if (_pageChoice[0] == PageChoice0.CustomProvider) {
return GitHostSetupLoadingErrorPage(
return GitHostCloningPage(
loadingMessage: tr('setup.cloning'),
errorMessage: gitCloneErrorMessage,
cloneProgress: _cloneProgress,
);
}
@ -559,6 +561,11 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
sshPublicKey: settings.sshPublicKey,
authorEmail: settings.gitAuthorEmail,
authorName: settings.gitAuthor,
progressUpdate: (GitTransferProgress p) {
setState(() {
_cloneProgress = p;
});
},
);
} on Exception catch (e, stacktrace) {
Log.e("Failed to clone", ex: e, stacktrace: stacktrace);

View File

@ -559,7 +559,7 @@ packages:
description:
path: "."
ref: HEAD
resolved-ref: "693a9266b845bed900f2c076ce2a4096d47d0039"
resolved-ref: "24612004500f388dc94b4670ae6fd39c14311f04"
url: "https://github.com/GitJournal/git_bindings.git"
source: git
version: "0.0.18"