mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-08-02 20:17:54 +08:00
Setup: Migrate to null safety
This commit is contained in:
@ -1,5 +1,3 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
@ -18,11 +16,11 @@ import 'loading.dart';
|
|||||||
|
|
||||||
class GitHostSetupAutoConfigure extends StatefulWidget {
|
class GitHostSetupAutoConfigure extends StatefulWidget {
|
||||||
final GitHostType gitHostType;
|
final GitHostType gitHostType;
|
||||||
final Func2<GitHost, UserInfo, void> onDone;
|
final Func2<GitHost?, UserInfo?, void> onDone;
|
||||||
|
|
||||||
GitHostSetupAutoConfigure({
|
GitHostSetupAutoConfigure({
|
||||||
@required this.gitHostType,
|
required this.gitHostType,
|
||||||
@required this.onDone,
|
required this.onDone,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -32,7 +30,7 @@ class GitHostSetupAutoConfigure extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
||||||
GitHost gitHost;
|
GitHost? gitHost;
|
||||||
String errorMessage = "";
|
String errorMessage = "";
|
||||||
|
|
||||||
bool _configuringStarted = false;
|
bool _configuringStarted = false;
|
||||||
@ -46,7 +44,7 @@ class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
|||||||
|
|
||||||
gitHost = createGitHost(widget.gitHostType);
|
gitHost = createGitHost(widget.gitHostType);
|
||||||
try {
|
try {
|
||||||
gitHost.init((Exception error) async {
|
gitHost!.init((Exception? error) async {
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -59,18 +57,18 @@ class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
|||||||
}
|
}
|
||||||
Log.d("GitHost Initalized: " + widget.gitHostType.toString());
|
Log.d("GitHost Initalized: " + widget.gitHostType.toString());
|
||||||
|
|
||||||
UserInfo userInfo;
|
UserInfo? userInfo;
|
||||||
try {
|
try {
|
||||||
setState(() {
|
setState(() {
|
||||||
_message = tr('setup.autoconfigure.readUser');
|
_message = tr('setup.autoconfigure.readUser');
|
||||||
});
|
});
|
||||||
|
|
||||||
userInfo = await gitHost.getUserInfo();
|
userInfo = await gitHost!.getUserInfo();
|
||||||
var settings = Provider.of<Settings>(context, listen: false);
|
var settings = Provider.of<Settings>(context, listen: false);
|
||||||
if (userInfo.name != null && userInfo.name.isNotEmpty) {
|
if (userInfo != null && userInfo.name.isNotEmpty) {
|
||||||
settings.gitAuthor = userInfo.name;
|
settings.gitAuthor = userInfo.name;
|
||||||
}
|
}
|
||||||
if (userInfo.email != null && userInfo.email.isNotEmpty) {
|
if (userInfo != null && userInfo.email.isNotEmpty) {
|
||||||
settings.gitAuthorEmail = userInfo.email;
|
settings.gitAuthorEmail = userInfo.email;
|
||||||
}
|
}
|
||||||
settings.save();
|
settings.save();
|
||||||
@ -82,7 +80,7 @@ class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await gitHost.launchOAuthScreen();
|
await gitHost!.launchOAuthScreen();
|
||||||
} on PlatformException catch (e, stack) {
|
} on PlatformException catch (e, stack) {
|
||||||
Log.d("LaunchOAuthScreen: Caught platform exception:",
|
Log.d("LaunchOAuthScreen: Caught platform exception:",
|
||||||
ex: e, stacktrace: stack);
|
ex: e, stacktrace: stack);
|
||||||
@ -111,11 +109,11 @@ class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (_configuringStarted) {
|
if (_configuringStarted) {
|
||||||
if (errorMessage == null || errorMessage.isEmpty) {
|
if (errorMessage.isNotEmpty) {
|
||||||
return GitHostSetupLoadingPage(_message);
|
return GitHostSetupErrorPage(errorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GitHostSetupErrorPage(errorMessage);
|
return GitHostSetupLoadingPage(_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = Column(
|
var columns = Column(
|
||||||
@ -146,7 +144,7 @@ class GitHostSetupAutoConfigureState extends State<GitHostSetupAutoConfigure> {
|
|||||||
const SizedBox(height: 32.0),
|
const SizedBox(height: 32.0),
|
||||||
Text(
|
Text(
|
||||||
tr('setup.autoconfigure.warning'),
|
tr('setup.autoconfigure.warning'),
|
||||||
style: Theme.of(context).textTheme.bodyText1.copyWith(
|
style: Theme.of(context).textTheme.bodyText1!.copyWith(
|
||||||
fontStyle: FontStyle.italic,
|
fontStyle: FontStyle.italic,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:function_types/function_types.dart';
|
import 'package:function_types/function_types.dart';
|
||||||
@ -10,11 +8,11 @@ import 'package:gitjournal/utils/logger.dart';
|
|||||||
class GitHostSetupButton extends StatelessWidget {
|
class GitHostSetupButton extends StatelessWidget {
|
||||||
final Func0<void> onPressed;
|
final Func0<void> onPressed;
|
||||||
final String text;
|
final String text;
|
||||||
final String iconUrl;
|
final String? iconUrl;
|
||||||
|
|
||||||
GitHostSetupButton({
|
GitHostSetupButton({
|
||||||
@required this.text,
|
required this.text,
|
||||||
@required this.onPressed,
|
required this.onPressed,
|
||||||
this.iconUrl,
|
this.iconUrl,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -42,7 +40,7 @@ class GitHostSetupButton extends StatelessWidget {
|
|||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: Theme.of(context).textTheme.button,
|
style: Theme.of(context).textTheme.button,
|
||||||
),
|
),
|
||||||
icon: Image.asset(iconUrl, width: 32, height: 32),
|
icon: Image.asset(iconUrl!, width: 32, height: 32),
|
||||||
color: Theme.of(context).primaryColor,
|
color: Theme.of(context).primaryColor,
|
||||||
onPressed: _onPressedWithAnalytics,
|
onPressed: _onPressedWithAnalytics,
|
||||||
),
|
),
|
||||||
@ -54,7 +52,7 @@ class GitHostSetupButton extends StatelessWidget {
|
|||||||
Log.d("githostsetup_button_click " + text);
|
Log.d("githostsetup_button_click " + text);
|
||||||
logEvent(Event.GitHostSetupButtonClick, parameters: {
|
logEvent(Event.GitHostSetupButtonClick, parameters: {
|
||||||
'text': text,
|
'text': text,
|
||||||
'icon_url': iconUrl == null ? "" : iconUrl,
|
'icon_url': iconUrl == null ? "" : iconUrl!,
|
||||||
});
|
});
|
||||||
onPressed();
|
onPressed();
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,18 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'package:dart_git/dart_git.dart';
|
import 'package:dart_git/dart_git.dart';
|
||||||
import 'package:git_bindings/git_bindings.dart' as git_bindings;
|
import 'package:git_bindings/git_bindings.dart' as git_bindings;
|
||||||
import 'package:meta/meta.dart';
|
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
|
|
||||||
import 'package:gitjournal/utils/logger.dart';
|
import 'package:gitjournal/utils/logger.dart';
|
||||||
|
|
||||||
Future<void> cloneRemote({
|
Future<void> cloneRemote({
|
||||||
@required String repoPath,
|
required String repoPath,
|
||||||
@required String cloneUrl,
|
required String cloneUrl,
|
||||||
@required String remoteName,
|
required String remoteName,
|
||||||
@required String sshPublicKey,
|
required String sshPublicKey,
|
||||||
@required String sshPrivateKey,
|
required String sshPrivateKey,
|
||||||
@required String sshPassword,
|
required String sshPassword,
|
||||||
@required String authorName,
|
required String authorName,
|
||||||
@required String authorEmail,
|
required String authorEmail,
|
||||||
}) async {
|
}) async {
|
||||||
var repo = await GitRepository.load(repoPath);
|
var repo = await GitRepository.load(repoPath);
|
||||||
|
|
||||||
@ -42,11 +39,11 @@ Future<void> cloneRemote({
|
|||||||
var branches = await repo.branches();
|
var branches = await repo.branches();
|
||||||
if (branches.isEmpty) {
|
if (branches.isEmpty) {
|
||||||
Log.i("Completing - no local branch");
|
Log.i("Completing - no local branch");
|
||||||
var remoteBranch = await repo.remoteBranch(remoteName, remoteBranchName);
|
var remoteBranch = await repo.remoteBranch(remoteName, remoteBranchName!);
|
||||||
|
|
||||||
if (remoteBranchName != null &&
|
// FIXME: This logic doesn't seem right. What if the remoteBranchName is empty
|
||||||
remoteBranchName.isNotEmpty &&
|
if (/*remoteBranchName != null &&*/
|
||||||
remoteBranch != null) {
|
remoteBranchName.isNotEmpty && remoteBranch != null) {
|
||||||
await repo.createBranch(remoteBranchName, hash: remoteBranch.hash);
|
await repo.createBranch(remoteBranchName, hash: remoteBranch.hash);
|
||||||
await repo.checkoutBranch(remoteBranchName);
|
await repo.checkoutBranch(remoteBranchName);
|
||||||
}
|
}
|
||||||
@ -66,7 +63,7 @@ Future<void> cloneRemote({
|
|||||||
await repo.checkoutBranch(branch);
|
await repo.checkoutBranch(branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
await repo.setUpstreamTo(remote, remoteBranchName);
|
await repo.setUpstreamTo(remote, remoteBranchName!);
|
||||||
var remoteBranch = await repo.remoteBranch(remoteName, remoteBranchName);
|
var remoteBranch = await repo.remoteBranch(remoteName, remoteBranchName);
|
||||||
if (remoteBranch != null) {
|
if (remoteBranch != null) {
|
||||||
Log.i("Merging '$remoteName/$remoteBranchName'");
|
Log.i("Merging '$remoteName/$remoteBranchName'");
|
||||||
@ -78,7 +75,7 @@ Future<void> cloneRemote({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.i("Completing - localBranch diff remote: $branch $remoteBranchName");
|
Log.i("Completing - localBranch diff remote: $branch $remoteBranchName");
|
||||||
await repo.createBranch(remoteBranchName);
|
await repo.createBranch(remoteBranchName!);
|
||||||
await repo.checkoutBranch(remoteBranchName);
|
await repo.checkoutBranch(remoteBranchName);
|
||||||
|
|
||||||
await repo.deleteBranch(branch);
|
await repo.deleteBranch(branch);
|
||||||
@ -102,13 +99,13 @@ Future<void> cloneRemote({
|
|||||||
await repo.checkout(".");
|
await repo.checkout(".");
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> _remoteDefaultBranch({
|
Future<String?> _remoteDefaultBranch({
|
||||||
@required GitRepository repo,
|
required GitRepository repo,
|
||||||
@required git_bindings.GitRepo libGit2Repo,
|
required git_bindings.GitRepo libGit2Repo,
|
||||||
@required String remoteName,
|
required String remoteName,
|
||||||
@required String sshPublicKey,
|
required String sshPublicKey,
|
||||||
@required String sshPrivateKey,
|
required String sshPrivateKey,
|
||||||
@required String sshPassword,
|
required String sshPassword,
|
||||||
}) async {
|
}) async {
|
||||||
try {
|
try {
|
||||||
var branch = await libGit2Repo.defaultBranch(
|
var branch = await libGit2Repo.defaultBranch(
|
||||||
@ -129,7 +126,7 @@ Future<String> _remoteDefaultBranch({
|
|||||||
if (remoteBranch == null) {
|
if (remoteBranch == null) {
|
||||||
return 'master';
|
return 'master';
|
||||||
}
|
}
|
||||||
return remoteBranch.target.branchName();
|
return remoteBranch.target!.branchName();
|
||||||
}
|
}
|
||||||
|
|
||||||
String folderNameFromCloneUrl(String cloneUrl) {
|
String folderNameFromCloneUrl(String cloneUrl) {
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
@ -15,8 +13,8 @@ class GitCloneUrlPage extends StatefulWidget {
|
|||||||
final String initialValue;
|
final String initialValue;
|
||||||
|
|
||||||
GitCloneUrlPage({
|
GitCloneUrlPage({
|
||||||
@required this.doneFunction,
|
required this.doneFunction,
|
||||||
@required this.initialValue,
|
required this.initialValue,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -35,10 +33,10 @@ class GitCloneUrlPageState extends State<GitCloneUrlPage> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final formSubmitted = () {
|
final formSubmitted = () {
|
||||||
if (_formKey.currentState.validate()) {
|
if (_formKey.currentState!.validate()) {
|
||||||
_formKey.currentState.save();
|
_formKey.currentState!.save();
|
||||||
|
|
||||||
var url = sshUrlKey.currentState.value;
|
var url = sshUrlKey.currentState!.value!;
|
||||||
widget.doneFunction(url.trim());
|
widget.doneFunction(url.trim());
|
||||||
inputFormFocus.unfocus();
|
inputFormFocus.unfocus();
|
||||||
}
|
}
|
||||||
@ -95,10 +93,10 @@ class GitCloneUrlKnownProviderPage extends StatefulWidget {
|
|||||||
final String initialValue;
|
final String initialValue;
|
||||||
|
|
||||||
GitCloneUrlKnownProviderPage({
|
GitCloneUrlKnownProviderPage({
|
||||||
@required this.doneFunction,
|
required this.doneFunction,
|
||||||
@required this.launchCreateUrlPage,
|
required this.launchCreateUrlPage,
|
||||||
@required this.gitHostType,
|
required this.gitHostType,
|
||||||
@required this.initialValue,
|
required this.initialValue,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -118,10 +116,10 @@ class GitCloneUrlKnownProviderPageState
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final formSubmitted = () {
|
final formSubmitted = () {
|
||||||
if (_formKey.currentState.validate()) {
|
if (_formKey.currentState!.validate()) {
|
||||||
_formKey.currentState.save();
|
_formKey.currentState!.save();
|
||||||
|
|
||||||
var url = sshUrlKey.currentState.value;
|
var url = sshUrlKey.currentState!.value!;
|
||||||
widget.doneFunction(url.trim());
|
widget.doneFunction(url.trim());
|
||||||
inputFormFocus.unfocus();
|
inputFormFocus.unfocus();
|
||||||
}
|
}
|
||||||
@ -185,8 +183,8 @@ class GitCloneUrlKnownProviderPageState
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns null when valid
|
// Returns null when valid
|
||||||
String _isCloneUrlValid(String url) {
|
String? _isCloneUrlValid(String? url) {
|
||||||
url = url.trim();
|
url = url!.trim();
|
||||||
if (url.isEmpty) {
|
if (url.isEmpty) {
|
||||||
return tr("setup.cloneUrl.validator.empty");
|
return tr("setup.cloneUrl.validator.empty");
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -20,7 +18,11 @@ class PublicKeyEditor extends StatelessWidget {
|
|||||||
return KeyEditor(formKey, _controller, _validator);
|
return KeyEditor(formKey, _controller, _validator);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _validator(String val) {
|
String? _validator(String? val) {
|
||||||
|
if (val == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
val = val.trim();
|
val = val.trim();
|
||||||
if (!val.startsWith("ssh-rsa ")) {
|
if (!val.startsWith("ssh-rsa ")) {
|
||||||
return tr("setup.keyEditors.public");
|
return tr("setup.keyEditors.public");
|
||||||
@ -40,7 +42,11 @@ class PrivateKeyEditor extends StatelessWidget {
|
|||||||
return KeyEditor(formKey, _controller, _validator);
|
return KeyEditor(formKey, _controller, _validator);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _validator(String val) {
|
String? _validator(String? val) {
|
||||||
|
if (val == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
val = val.trim();
|
val = val.trim();
|
||||||
if (!val.startsWith("-----BEGIN ")) {
|
if (!val.startsWith("-----BEGIN ")) {
|
||||||
return tr("setup.keyEditors.private");
|
return tr("setup.keyEditors.private");
|
||||||
@ -56,13 +62,9 @@ class PrivateKeyEditor extends StatelessWidget {
|
|||||||
class KeyEditor extends StatelessWidget {
|
class KeyEditor extends StatelessWidget {
|
||||||
final Key formKey;
|
final Key formKey;
|
||||||
final TextEditingController textEditingController;
|
final TextEditingController textEditingController;
|
||||||
final Function validator;
|
final String? Function(String?) validator;
|
||||||
|
|
||||||
KeyEditor(this.formKey, this.textEditingController, this.validator) {
|
KeyEditor(this.formKey, this.textEditingController, this.validator);
|
||||||
assert(formKey != null);
|
|
||||||
assert(textEditingController != null);
|
|
||||||
assert(validator != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -109,7 +111,7 @@ class KeyEditor extends StatelessWidget {
|
|||||||
var result = await FilePicker.platform.pickFiles();
|
var result = await FilePicker.platform.pickFiles();
|
||||||
|
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
var file = File(result.files.single.path);
|
var file = File(result.files.single.path!);
|
||||||
try {
|
try {
|
||||||
var data = await file.readAsString();
|
var data = await file.readAsString();
|
||||||
textEditingController.text = data.trim();
|
textEditingController.text = data.trim();
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
@ -27,9 +25,9 @@ class GitHostSetupRepoSelector extends StatefulWidget {
|
|||||||
final Func1<GitHostRepo, void> onDone;
|
final Func1<GitHostRepo, void> onDone;
|
||||||
|
|
||||||
GitHostSetupRepoSelector({
|
GitHostSetupRepoSelector({
|
||||||
@required this.gitHost,
|
required this.gitHost,
|
||||||
@required this.userInfo,
|
required this.userInfo,
|
||||||
@required this.onDone,
|
required this.onDone,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -44,14 +42,15 @@ class GitHostSetupRepoSelectorState extends State<GitHostSetupRepoSelector> {
|
|||||||
List<GitHostRepo> repos = [];
|
List<GitHostRepo> repos = [];
|
||||||
var fetchedRepos = false;
|
var fetchedRepos = false;
|
||||||
|
|
||||||
GitHostRepo selectedRepo;
|
GitHostRepo? selectedRepo;
|
||||||
var _textController = TextEditingController();
|
late TextEditingController _textController;
|
||||||
bool createRepo = false;
|
bool createRepo = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
|
_textController = TextEditingController();
|
||||||
_textController.addListener(() {
|
_textController.addListener(() {
|
||||||
var q = _textController.text.toLowerCase();
|
var q = _textController.text.toLowerCase();
|
||||||
if (q.isEmpty) {
|
if (q.isEmpty) {
|
||||||
@ -85,7 +84,7 @@ class GitHostSetupRepoSelectorState extends State<GitHostSetupRepoSelector> {
|
|||||||
var allRepos = await widget.gitHost.listRepos();
|
var allRepos = await widget.gitHost.listRepos();
|
||||||
allRepos.sort((GitHostRepo a, GitHostRepo b) {
|
allRepos.sort((GitHostRepo a, GitHostRepo b) {
|
||||||
if (a.updatedAt != null && b.updatedAt != null) {
|
if (a.updatedAt != null && b.updatedAt != null) {
|
||||||
return a.updatedAt.compareTo(b.updatedAt);
|
return a.updatedAt!.compareTo(b.updatedAt!);
|
||||||
}
|
}
|
||||||
if (a.updatedAt == null && b.updatedAt == null) {
|
if (a.updatedAt == null && b.updatedAt == null) {
|
||||||
return a.fullName.compareTo(b.fullName);
|
return a.fullName.compareTo(b.fullName);
|
||||||
@ -138,7 +137,7 @@ class GitHostSetupRepoSelectorState extends State<GitHostSetupRepoSelector> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (errorMessage != null && errorMessage.isNotEmpty) {
|
if (errorMessage.isNotEmpty) {
|
||||||
return GitHostSetupErrorPage(errorMessage);
|
return GitHostSetupErrorPage(errorMessage);
|
||||||
}
|
}
|
||||||
if (!fetchedRepos) {
|
if (!fetchedRepos) {
|
||||||
@ -218,7 +217,7 @@ class GitHostSetupRepoSelectorState extends State<GitHostSetupRepoSelector> {
|
|||||||
text: tr('setup.next'),
|
text: tr('setup.next'),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
if (selectedRepo != null) {
|
if (selectedRepo != null) {
|
||||||
widget.onDone(selectedRepo);
|
widget.onDone(selectedRepo!);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +227,7 @@ class GitHostSetupRepoSelectorState extends State<GitHostSetupRepoSelector> {
|
|||||||
widget.onDone(repo);
|
widget.onDone(repo);
|
||||||
return;
|
return;
|
||||||
} catch (e, stacktrace) {
|
} catch (e, stacktrace) {
|
||||||
_handleGitHostException(e, stacktrace);
|
_handleGitHostException(e as Exception, stacktrace);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -287,14 +286,14 @@ List<GitHostRepo> filterList(List<GitHostRepo> repos, String q) {
|
|||||||
class _RepoTile extends StatelessWidget {
|
class _RepoTile extends StatelessWidget {
|
||||||
final GitHostRepo repo;
|
final GitHostRepo repo;
|
||||||
final String searchText;
|
final String searchText;
|
||||||
final Function onTap;
|
final void Function() onTap;
|
||||||
final bool selected;
|
final bool selected;
|
||||||
|
|
||||||
_RepoTile({
|
_RepoTile({
|
||||||
@required this.repo,
|
required this.repo,
|
||||||
@required this.searchText,
|
required this.searchText,
|
||||||
@required this.onTap,
|
required this.onTap,
|
||||||
@required this.selected,
|
required this.selected,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -350,7 +349,7 @@ class _RepoTile extends StatelessWidget {
|
|||||||
text: repo.name,
|
text: repo.name,
|
||||||
highlightText: searchText,
|
highlightText: searchText,
|
||||||
highlightTextLowerCase: searchText,
|
highlightTextLowerCase: searchText,
|
||||||
style: style,
|
style: style!,
|
||||||
highlightStyle: style.copyWith(fontWeight: FontWeight.bold),
|
highlightStyle: style.copyWith(fontWeight: FontWeight.bold),
|
||||||
).build(context),
|
).build(context),
|
||||||
],
|
],
|
||||||
@ -401,8 +400,8 @@ class _IconText extends StatelessWidget {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
class _SmartDateTime extends StatelessWidget {
|
class _SmartDateTime extends StatelessWidget {
|
||||||
final DateTime dt;
|
final DateTime? dt;
|
||||||
final TextStyle style;
|
final TextStyle? style;
|
||||||
|
|
||||||
_SmartDateTime(this.dt, this.style);
|
_SmartDateTime(this.dt, this.style);
|
||||||
|
|
||||||
@ -412,12 +411,13 @@ class _SmartDateTime extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (dt == null) {
|
if (this.dt == null) {
|
||||||
return Container();
|
return Container();
|
||||||
}
|
}
|
||||||
|
|
||||||
String text;
|
String text;
|
||||||
|
|
||||||
|
var dt = this.dt!;
|
||||||
if (dt.isAfter(thirtyDaysAgo)) {
|
if (dt.isAfter(thirtyDaysAgo)) {
|
||||||
Locale locale = Localizations.localeOf(context);
|
Locale locale = Localizations.localeOf(context);
|
||||||
text = timeago.format(dt, locale: locale.languageCode);
|
text = timeago.format(dt, locale: locale.languageCode);
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
// @dart=2.9
|
|
||||||
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -36,9 +34,9 @@ class GitHostSetupScreen extends StatefulWidget {
|
|||||||
final Func2<String, String, Future<void>> onCompletedFunction;
|
final Func2<String, String, Future<void>> onCompletedFunction;
|
||||||
|
|
||||||
GitHostSetupScreen({
|
GitHostSetupScreen({
|
||||||
@required this.repoFolderName,
|
required this.repoFolderName,
|
||||||
@required this.remoteName,
|
required this.remoteName,
|
||||||
@required this.onCompletedFunction,
|
required this.onCompletedFunction,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -61,21 +59,21 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
var _keyGenerationChoice = KeyGenerationChoice.Unknown;
|
var _keyGenerationChoice = KeyGenerationChoice.Unknown;
|
||||||
|
|
||||||
var _gitHostType = GitHostType.Unknown;
|
var _gitHostType = GitHostType.Unknown;
|
||||||
GitHost _gitHost;
|
GitHost? _gitHost;
|
||||||
GitHostRepo _gitHostRepo;
|
late GitHostRepo _gitHostRepo;
|
||||||
String _autoConfigureMessage = "";
|
String _autoConfigureMessage = "";
|
||||||
String _autoConfigureErrorMessage = "";
|
String _autoConfigureErrorMessage = "";
|
||||||
|
|
||||||
var _gitCloneUrl = "";
|
var _gitCloneUrl = "";
|
||||||
var gitCloneErrorMessage = "";
|
String? gitCloneErrorMessage = "";
|
||||||
var publicKey = "";
|
var publicKey = "";
|
||||||
|
|
||||||
var pageController = PageController();
|
var pageController = PageController();
|
||||||
int _currentPageIndex = 0;
|
int _currentPageIndex = 0;
|
||||||
|
|
||||||
UserInfo _userInfo;
|
UserInfo? _userInfo;
|
||||||
|
|
||||||
Widget _buildPage(BuildContext context, int pos) {
|
Widget? _buildPage(BuildContext context, int pos) {
|
||||||
assert(_pageCount >= 1);
|
assert(_pageCount >= 1);
|
||||||
|
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
@ -179,14 +177,20 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
} else if (_pageChoice[1] == PageChoice1.Auto) {
|
} else if (_pageChoice[1] == PageChoice1.Auto) {
|
||||||
return GitHostSetupAutoConfigure(
|
return GitHostSetupAutoConfigure(
|
||||||
gitHostType: _gitHostType,
|
gitHostType: _gitHostType,
|
||||||
onDone: (GitHost gitHost, UserInfo userInfo) {
|
onDone: (GitHost? gitHost, UserInfo? userInfo) {
|
||||||
setState(() {
|
if (gitHost == null) {
|
||||||
_gitHost = gitHost;
|
setState(() {
|
||||||
_userInfo = userInfo;
|
// FIXME: Set an error when it failed to get the gitHost
|
||||||
_pageCount = pos + 2;
|
});
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
_gitHost = gitHost;
|
||||||
|
_userInfo = userInfo;
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
|
||||||
_nextPage();
|
_nextPage();
|
||||||
});
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -259,8 +263,8 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
);
|
);
|
||||||
} else if (_pageChoice[1] == PageChoice1.Auto) {
|
} else if (_pageChoice[1] == PageChoice1.Auto) {
|
||||||
return GitHostSetupRepoSelector(
|
return GitHostSetupRepoSelector(
|
||||||
gitHost: _gitHost,
|
gitHost: _gitHost!,
|
||||||
userInfo: _userInfo,
|
userInfo: _userInfo!,
|
||||||
onDone: (GitHostRepo repo) {
|
onDone: (GitHostRepo repo) {
|
||||||
// close keyboard
|
// close keyboard
|
||||||
FocusManager.instance.primaryFocus?.unfocus();
|
FocusManager.instance.primaryFocus?.unfocus();
|
||||||
@ -355,7 +359,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var pageView = PageView.builder(
|
var pageView = PageView.builder(
|
||||||
controller: pageController,
|
controller: pageController,
|
||||||
itemBuilder: _buildPage,
|
itemBuilder: _buildPage as Widget Function(BuildContext, int),
|
||||||
itemCount: _pageCount,
|
itemCount: _pageCount,
|
||||||
onPageChanged: (int pageNum) {
|
onPageChanged: (int pageNum) {
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -457,9 +461,9 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
"-" +
|
"-" +
|
||||||
DateTime.now().toIso8601String().substring(0, 10); // only the date
|
DateTime.now().toIso8601String().substring(0, 10); // only the date
|
||||||
|
|
||||||
generateSSHKeys(comment: comment).then((SshKey sshKey) {
|
generateSSHKeys(comment: comment).then((SshKey? sshKey) {
|
||||||
var settings = Provider.of<Settings>(context, listen: false);
|
var settings = Provider.of<Settings>(context, listen: false);
|
||||||
settings.sshPublicKey = sshKey.publicKey;
|
settings.sshPublicKey = sshKey!.publicKey;
|
||||||
settings.sshPrivateKey = sshKey.privateKey;
|
settings.sshPrivateKey = sshKey.privateKey;
|
||||||
settings.sshPassword = sshKey.password;
|
settings.sshPassword = sshKey.password;
|
||||||
settings.save();
|
settings.save();
|
||||||
@ -528,7 +532,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _startGitClone(BuildContext context) async {
|
void _startGitClone(BuildContext context) async {
|
||||||
if (gitCloneErrorMessage.isNotEmpty) {
|
if (gitCloneErrorMessage!.isNotEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,7 +543,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
var repoPath = p.join(basePath, widget.repoFolderName);
|
var repoPath = p.join(basePath, widget.repoFolderName);
|
||||||
Log.i("RepoPath: $repoPath");
|
Log.i("RepoPath: $repoPath");
|
||||||
|
|
||||||
String error;
|
String? error;
|
||||||
try {
|
try {
|
||||||
await cloneRemote(
|
await cloneRemote(
|
||||||
cloneUrl: _gitCloneUrl,
|
cloneUrl: _gitCloneUrl,
|
||||||
@ -560,7 +564,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
Log.i("Not completing gitClone because of error");
|
Log.i("Not completing gitClone because of error");
|
||||||
setState(() {
|
setState(() {
|
||||||
logEvent(Event.GitHostSetupGitCloneError, parameters: {
|
logEvent(Event.GitHostSetupGitCloneError, parameters: {
|
||||||
'error': error,
|
'error': error!,
|
||||||
});
|
});
|
||||||
gitCloneErrorMessage = error;
|
gitCloneErrorMessage = error;
|
||||||
});
|
});
|
||||||
@ -602,6 +606,10 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
_autoConfigureMessage = tr('setup.sshKey.generate');
|
_autoConfigureMessage = tr('setup.sshKey.generate');
|
||||||
});
|
});
|
||||||
var sshKey = await generateSSHKeys(comment: "GitJournal");
|
var sshKey = await generateSSHKeys(comment: "GitJournal");
|
||||||
|
if (sshKey == null) {
|
||||||
|
// FIXME: Handle case when sshKey generation failed
|
||||||
|
return;
|
||||||
|
}
|
||||||
var settings = Provider.of<Settings>(context, listen: false);
|
var settings = Provider.of<Settings>(context, listen: false);
|
||||||
settings.sshPublicKey = sshKey.publicKey;
|
settings.sshPublicKey = sshKey.publicKey;
|
||||||
settings.sshPrivateKey = sshKey.privateKey;
|
settings.sshPrivateKey = sshKey.privateKey;
|
||||||
@ -615,7 +623,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
Log.i("Adding as a deploy key");
|
Log.i("Adding as a deploy key");
|
||||||
_autoConfigureMessage = tr('setup.sshKey.addDeploy');
|
_autoConfigureMessage = tr('setup.sshKey.addDeploy');
|
||||||
|
|
||||||
await _gitHost.addDeployKey(publicKey, _gitHostRepo.fullName);
|
await _gitHost!.addDeployKey(publicKey, _gitHostRepo.fullName);
|
||||||
} on Exception catch (e, stacktrace) {
|
} on Exception catch (e, stacktrace) {
|
||||||
_handleGitHostException(e, stacktrace);
|
_handleGitHostException(e, stacktrace);
|
||||||
return;
|
return;
|
||||||
@ -677,8 +685,8 @@ class GitHostChoicePage extends StatelessWidget {
|
|||||||
final Func0<void> onCustomGitHost;
|
final Func0<void> onCustomGitHost;
|
||||||
|
|
||||||
GitHostChoicePage({
|
GitHostChoicePage({
|
||||||
@required this.onKnownGitHost,
|
required this.onKnownGitHost,
|
||||||
@required this.onCustomGitHost,
|
required this.onCustomGitHost,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -729,7 +737,7 @@ enum GitHostSetupType {
|
|||||||
class GitHostAutoConfigureChoicePage extends StatelessWidget {
|
class GitHostAutoConfigureChoicePage extends StatelessWidget {
|
||||||
final Func1<GitHostSetupType, void> onDone;
|
final Func1<GitHostSetupType, void> onDone;
|
||||||
|
|
||||||
GitHostAutoConfigureChoicePage({@required this.onDone});
|
GitHostAutoConfigureChoicePage({required this.onDone});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
Reference in New Issue
Block a user