From fb202e0f1fc97db2e713edae950623936348e656 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 25 Jan 2019 14:52:56 +0100 Subject: [PATCH] GitHost AutoConfigure: Handle errors a bit better --- lib/apis/githost.dart | 13 ++++ lib/apis/github.dart | 4 +- lib/apis/gitlab.dart | 16 +++-- lib/screens/githostsetup_autoconfigure.dart | 76 +++++++++++++++------ 4 files changed, 79 insertions(+), 30 deletions(-) diff --git a/lib/apis/githost.dart b/lib/apis/githost.dart index d4c12621..b3a58fb0 100644 --- a/lib/apis/githost.dart +++ b/lib/apis/githost.dart @@ -20,3 +20,16 @@ class GitRepo { return 'GitRepo{fulleName: $fullName, cloneUrl: $cloneUrl}'; } } + +class GitHostException implements Exception { + static const OAuthFailed = const GitHostException("OAuthFailed"); + static const RepoExists = const GitHostException("RepoExists"); + + final String cause; + const GitHostException(this.cause); + + @override + String toString() { + return "GitHostException: " + cause; + } +} diff --git a/lib/apis/github.dart b/lib/apis/github.dart index 785819a0..2efa61fd 100644 --- a/lib/apis/github.dart +++ b/lib/apis/github.dart @@ -30,7 +30,7 @@ class GitHub implements GitHost { var authCode = uri.queryParameters['code']; if (authCode == null) { print("GitHub: Missing auth code. Now what?"); - callback(); + throw GitHostException.OAuthFailed; } this._accessCode = await _getAccessCode(authCode); @@ -51,7 +51,7 @@ class GitHub implements GitHost { response.statusCode.toString() + ": " + response.body); - return null; + throw GitHostException.OAuthFailed; } print("GithubResponse: " + response.body); diff --git a/lib/apis/gitlab.dart b/lib/apis/gitlab.dart index 2fea1cad..6fff6d5f 100644 --- a/lib/apis/gitlab.dart +++ b/lib/apis/gitlab.dart @@ -27,19 +27,21 @@ class GitLab implements GitHost { print("GitLab: Called onUrl with " + call.arguments.toString()); - var url = call.arguments["URL"]; - var uri = Uri.parse(url); + String url = call.arguments["URL"]; + var queryParamters = url.substring(url.indexOf('#') + 1); + var map = Uri.splitQueryString(queryParamters); - var state = uri.queryParameters['state']; + var state = map['state']; if (state != _stateOAuth) { print("GitLab: OAuth State incorrect"); - callback(); + print("Required State: " + _stateOAuth); + print("Actual State: " + state); + throw GitHostException.OAuthFailed; } - _accessCode = uri.queryParameters['access_token']; + _accessCode = map['access_token']; if (_accessCode == null) { - print("GitLab: Missing access code. Now what?"); - callback(); + throw GitHostException.OAuthFailed; } callback(); diff --git a/lib/screens/githostsetup_autoconfigure.dart b/lib/screens/githostsetup_autoconfigure.dart index cdc33b58..088d5d24 100644 --- a/lib/screens/githostsetup_autoconfigure.dart +++ b/lib/screens/githostsetup_autoconfigure.dart @@ -19,40 +19,74 @@ class GitHostSetupAutoConfigure extends StatefulWidget { class GitHostSetupAutoConfigureState extends State { GitHost gitHost; + String errorMessage = ""; @override void initState() { super.initState(); + print("Starting autoconfigure"); gitHost = createGitHost(widget.gitHostType); - gitHost.init(() async { - print("GitHub Initalized"); + try { + gitHost.init(() async { + print("GitHost Initalized: " + widget.gitHostType.toString()); - var repo = await gitHost.createRepo("journal"); - var publicKey = await generateSSHKeys(comment: "GitJournal"); - await gitHost.addDeployKey(publicKey, repo.fullName); + var repo = await gitHost.createRepo("journal"); + var publicKey = await generateSSHKeys(comment: "GitJournal"); + await gitHost.addDeployKey(publicKey, repo.fullName); - widget.onDone(repo.cloneUrl); - }); - gitHost.launchOAuthScreen(); + widget.onDone(repo.cloneUrl); + }); + gitHost.launchOAuthScreen(); + } on GitHostException catch (e) { + print("GitHostSetupAutoConfigur: " + e.toString()); + setState(() { + errorMessage = widget.gitHostType.toString() + ": " + e.toString(); + }); + } } @override Widget build(BuildContext context) { - var children = [ - Text( - 'Configuring ...', - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.display1, - ), - SizedBox(height: 8.0), - Padding( - padding: const EdgeInsets.all(8.0), - child: CircularProgressIndicator( - value: null, + var children = []; + if (this.errorMessage == null || this.errorMessage.isEmpty) { + children = [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Configuring ...', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.display1, + ), ), - ), - ]; + SizedBox(height: 8.0), + Padding( + padding: const EdgeInsets.all(8.0), + child: CircularProgressIndicator( + value: null, + ), + ), + ]; + } else { + children = [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Failed', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.display1, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + this.errorMessage, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.display1, + ), + ), + ]; + } return Column( mainAxisAlignment: MainAxisAlignment.center,