import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; const _platform = const MethodChannel('gitjournal.io/git'); /// /// This gives us the directory where all the git repos will be stored /// Future getGitBaseDirectory() async { final String path = await _platform.invokeMethod('getBaseDirectory'); if (path == null) { return null; } return Directory(path); } class GitRepo { String folderName; String authorName; String authorEmail; GitRepo({ @required this.folderName, @required this.authorName, @required this.authorEmail, }); static Future clone(String folderName, String cloneUrl) async { try { await _platform.invokeMethod('gitClone', { 'cloneUrl': cloneUrl, 'folderName': folderName, }); print("Done"); } on PlatformException catch (e) { print("gitClone Failed: '${e.message}'."); throw createGitException(e.message); } } static Future init(String folderName) async { try { await _platform.invokeMethod('gitInit', { 'folderName': folderName, }); } on PlatformException catch (e) { print("gitInit Failed: '${e.message}'."); throw createGitException(e.message); } } Future pull() async { try { await _platform.invokeMethod('gitPull', { 'folderName': folderName, 'authorName': authorName, 'authorEmail': authorEmail, }); print("Done"); } on PlatformException catch (e) { print("gitPull Failed: '${e.message}'."); throw createGitException(e.message); } } Future add(String filePattern) async { try { await _platform.invokeMethod('gitAdd', { 'folderName': folderName, 'filePattern': filePattern, }); } on PlatformException catch (e) { print("gitAdd Failed: '${e.message}'."); } } Future rm(String filePattern) async { try { await _platform.invokeMethod('gitRm', { 'folderName': folderName, 'filePattern': filePattern, }); } on PlatformException catch (e) { print("gitRm Failed: '${e.message}'."); } } Future push() async { try { await _platform.invokeMethod('gitPush', { 'folderName': folderName, }); } on PlatformException catch (e) { print("gitPush Failed: '${e.message}'."); throw createGitException(e.message); } } // FIXME: Change this method to just resetHard Future resetLast() async { try { await _platform.invokeMethod('gitResetLast', { 'folderName': folderName, }); } on PlatformException catch (e) { print("gitResetLast Failed: '${e.message}'."); throw createGitException(e.message); } } // FIXME: Change the datetime // FIXME: Actually implement the 'when' Future commit({@required String message, String when}) async { try { await _platform.invokeMethod('gitCommit', { 'folderName': folderName, 'authorName': authorName, 'authorEmail': authorEmail, 'message': message, 'when': when, }); } on PlatformException catch (e) { print("gitCommit Failed: '${e.message}'."); } } } Future generateSSHKeys({@required String comment}) async { print("generateSSHKeyss: " + comment); try { String publicKey = await _platform.invokeMethod('generateSSHKeys', { 'comment': comment, }); print("Public Key " + publicKey); return publicKey; } on PlatformException catch (e) { print("Failed to generateSSHKeys: '${e.message}'."); } try { String publicKey = await _platform.invokeMethod('getSSHPublicKey'); print("Public Key " + publicKey); return publicKey; } on PlatformException catch (e) { print("Failed to getSSHPublicKey: '${e.message}'."); } return ""; } Future setSshKeys({ @required String publicKey, @required String privateKey, }) async { print("setSshKeys"); try { await _platform.invokeMethod('setSshKeys', { 'publicKey': publicKey, 'privateKey': privateKey, }); } on PlatformException catch (e) { print("Failed to setSSHKeys: '${e.message}'."); rethrow; } } class GitException implements Exception { final String cause; GitException(this.cause); @override String toString() { return "GitException: " + cause; } } GitException createGitException(String msg) { if (msg.contains("ENETUNREACH")) { return GitException("No Connection"); } if (msg.contains("Remote origin did not advertise Ref for branch master")) { return GitException("No master branch"); } if (msg.contains("Nothing to push")) { return GitException("Nothing to push."); } return GitException(msg); }