From d38c6eee6131716d06699337933b02f7b6fd7af8 Mon Sep 17 00:00:00 2001 From: GT610 Date: Tue, 21 Apr 2026 12:02:07 +0800 Subject: [PATCH 1/2] Add CI analysis and fix built-in settings logging --- .gitattributes | 3 ++ .github/workflows/analysis.yml | 33 +++++++++++++++++++ lib/pages/builtin_instance_settings_page.dart | 6 ++-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/workflows/analysis.yml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..54fc305 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.dart text eol=lf +*.yaml text eol=lf +*.yml text eol=lf diff --git a/.github/workflows/analysis.yml b/.github/workflows/analysis.yml new file mode 100644 index 0000000..0ef35c9 --- /dev/null +++ b/.github/workflows/analysis.yml @@ -0,0 +1,33 @@ +name: flutter analysis + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 1 + submodules: recursive + + - uses: subosito/flutter-action@v2 + with: + channel: stable + + - name: Install dependencies + run: flutter pub get + + - name: Check formatting + run: dart format --output=none --set-exit-if-changed lib test + + - name: Analyze project source + run: flutter analyze lib test + + - name: Run tests + run: flutter test diff --git a/lib/pages/builtin_instance_settings_page.dart b/lib/pages/builtin_instance_settings_page.dart index 023bde3..44ac747 100644 --- a/lib/pages/builtin_instance_settings_page.dart +++ b/lib/pages/builtin_instance_settings_page.dart @@ -9,6 +9,7 @@ import '../services/builtin_instance_service.dart'; import '../services/instance_manager.dart'; import '../services/settings_service.dart'; import '../services/tracker_sync_service.dart'; +import '../utils/logging.dart'; import 'components/builtin_settings_apply_hint_card.dart'; import 'download_page/components/directory_picker.dart'; @@ -22,6 +23,7 @@ class BuiltinInstanceSettingsPage extends StatefulWidget { class _BuiltinInstanceSettingsPageState extends State { + final _logger = taggedLogger('BuiltinInstanceSettingsPage'); bool _hasChanges = false; bool _isSaving = false; bool _isResettingSession = false; @@ -1062,7 +1064,7 @@ class _BuiltinInstanceSettingsPageState _showSettingsSnackBar(l10n.settingsSaved); } catch (e, stackTrace) { - this.e( + _logger.e( 'Failed to save built-in instance settings', error: e, stackTrace: stackTrace, @@ -1092,7 +1094,7 @@ class _BuiltinInstanceSettingsPageState _syncNormalizedDraft(settings); await _refreshBuiltinInstanceSnapshot(); } catch (e, stackTrace) { - this.e( + _logger.e( 'Failed to persist built-in instance settings before applying', error: e, stackTrace: stackTrace, From 66c638048cce8124813bdb1369c0d06af025fdce Mon Sep 17 00:00:00 2001 From: GT610 Date: Tue, 21 Apr 2026 12:06:26 +0800 Subject: [PATCH 2/2] Format --- lib/models/global_stat.dart | 2 +- .../download_page/models/download_task.dart | 12 ++++++--- .../components/instance_dialog.dart | 27 +++++++++---------- lib/pages/settings_page/settings_page.dart | 4 +-- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/models/global_stat.dart b/lib/models/global_stat.dart index 3b0d6a0..52cb5a5 100644 --- a/lib/models/global_stat.dart +++ b/lib/models/global_stat.dart @@ -6,4 +6,4 @@ class GlobalStat { int uploadSpeed = 0; int totalCompletedLength = 0; int totalLength = 0; -} \ No newline at end of file +} diff --git a/lib/pages/download_page/models/download_task.dart b/lib/pages/download_page/models/download_task.dart index 631faad..22a787b 100644 --- a/lib/pages/download_page/models/download_task.dart +++ b/lib/pages/download_page/models/download_task.dart @@ -86,12 +86,18 @@ class DownloadTask { uploadLengthBytes: json['uploadLengthBytes'] ?? 0, downloadSpeedBytes: json['downloadSpeedBytes'] ?? 0, uploadSpeedBytes: json['uploadSpeedBytes'] ?? 0, - files: json['files'] != null ? List>.from(json['files']) : null, + files: json['files'] != null + ? List>.from(json['files']) + : null, bittorrentInfo: json['bittorrentInfo'], - trackers: json['trackers'] != null ? List.from(json['trackers']) : null, + trackers: json['trackers'] != null + ? List.from(json['trackers']) + : null, uris: json['uris'] != null ? List.from(json['uris']) : null, errorMessage: json['errorMessage'], - startTime: json['startTime'] != null ? DateTime.tryParse(json['startTime']) : null, + startTime: json['startTime'] != null + ? DateTime.tryParse(json['startTime']) + : null, bitfield: json['bitfield'], infoHash: json['infoHash'], pieceLength: json['pieceLength'], diff --git a/lib/pages/instance_page/components/instance_dialog.dart b/lib/pages/instance_page/components/instance_dialog.dart index fc7ef72..835c4a0 100644 --- a/lib/pages/instance_page/components/instance_dialog.dart +++ b/lib/pages/instance_page/components/instance_dialog.dart @@ -90,8 +90,7 @@ class _InstanceDialogState extends State { super.dispose(); } - bool get _usesHttpTransport => - _protocol == 'http' || _protocol == 'https'; + bool get _usesHttpTransport => _protocol == 'http' || _protocol == 'https'; String _nameHint(AppLocalizations l10n) { return l10n.instanceNameAutoHint(_fallbackInstanceName()); @@ -176,7 +175,9 @@ class _InstanceDialogState extends State { : _name.trim(); return Aria2Instance( - id: widget.instance?.id ?? DateTime.now().millisecondsSinceEpoch.toString(), + id: + widget.instance?.id ?? + DateTime.now().millisecondsSinceEpoch.toString(), name: resolvedName, type: InstanceType.remote, protocol: _protocol, @@ -253,10 +254,7 @@ class _InstanceDialogState extends State { } } - Widget _buildSecretField( - BuildContext context, - AppLocalizations l10n, - ) { + Widget _buildSecretField(BuildContext context, AppLocalizations l10n) { return TextField( controller: _secretController, obscureText: !_showSecret, @@ -300,9 +298,9 @@ class _InstanceDialogState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Padding( - padding: const EdgeInsets.all(_dialogPadding).copyWith( - bottom: _fieldSpacing, - ), + padding: const EdgeInsets.all( + _dialogPadding, + ).copyWith(bottom: _fieldSpacing), child: Text( widget.instance == null ? l10n.addInstance : l10n.editInstance, style: theme.textTheme.headlineMedium, @@ -357,10 +355,7 @@ class _InstanceDialogState extends State { const SizedBox(height: 12), SegmentedButton( segments: const [ - ButtonSegment( - value: 'http', - label: Text('HTTP'), - ), + ButtonSegment(value: 'http', label: Text('HTTP')), ButtonSegment( value: 'https', label: Text('HTTPS'), @@ -490,7 +485,9 @@ class _InstanceDialogState extends State { mainAxisSize: MainAxisSize.min, children: [ OutlinedButton.icon( - onPressed: _isTestingConnection ? null : _testConnection, + onPressed: _isTestingConnection + ? null + : _testConnection, style: OutlinedButton.styleFrom( minimumSize: const Size(0, 40), padding: const EdgeInsets.symmetric(horizontal: 16), diff --git a/lib/pages/settings_page/settings_page.dart b/lib/pages/settings_page/settings_page.dart index ae0e79f..22bbdbf 100644 --- a/lib/pages/settings_page/settings_page.dart +++ b/lib/pages/settings_page/settings_page.dart @@ -524,9 +524,7 @@ class _SettingsPageState extends State fl.CardX( child: Padding( padding: const EdgeInsets.all(13), - child: fl.SimpleMarkdown( - data: _buildAboutMarkdown(l10n), - ), + child: fl.SimpleMarkdown(data: _buildAboutMarkdown(l10n)), ), ), ],