diff --git a/lib/utils/changelog/changelog.dart b/lib/utils/changelog/changelog.dart index d15b012c..3adfa665 100644 --- a/lib/utils/changelog/changelog.dart +++ b/lib/utils/changelog/changelog.dart @@ -9,19 +9,19 @@ class Changelog { String? motd; @JsonKey(name: 'feat') - List? feat; + Map>? feat; @JsonKey(name: 'refactor') - List? tweaks; + Map>? tweaks; @JsonKey(name: 'fix') - List? fixes; + Map>? fixes; @JsonKey(name: 'docs') - List? docs; + Map>? docs; @JsonKey(name: 'chore') - List? chores; + Map>? chores; Changelog({ this.motd, diff --git a/lib/utils/changelog/sheet.dart b/lib/utils/changelog/sheet.dart index 02a5014f..4074d7e2 100644 --- a/lib/utils/changelog/sheet.dart +++ b/lib/utils/changelog/sheet.dart @@ -5,10 +5,10 @@ import 'package:lunasea/system/build.dart'; import 'package:lunasea/system/environment.dart'; import 'package:lunasea/system/flavor.dart'; import 'package:lunasea/system/logger.dart'; -import 'package:lunasea/utils/links.dart'; -import 'package:lunasea/vendor.dart'; import 'package:lunasea/utils/changelog/change.dart'; import 'package:lunasea/utils/changelog/changelog.dart'; +import 'package:lunasea/utils/links.dart'; +import 'package:lunasea/vendor.dart'; import 'package:lunasea/widgets/ui.dart'; class ChangelogSheet extends LunaBottomModalSheet { @@ -88,18 +88,21 @@ class ChangelogSheet extends LunaBottomModalSheet { ); } - List _buildChangeBlock(String header, List? changes) { + List _buildChangeBlock( + String header, + Map>? changes, + ) { if (changes == null || changes.isEmpty) return []; + final keys = changes.keys.toList()..sort(); return [ LunaHeader(text: header), LunaTableCard( - content: List.generate( - changes.length, - (i) => LunaTableContent( - body: changes[i].message.bulleted(), - url: LunaBuild().getCommitUrl(changes[i].commit), - ), - ), + content: keys.map((feature) { + final combined = changes[feature]!.map((i) { + return i.message.bulleted(); + }).join('\n'); + return LunaTableContent(title: feature, body: combined); + }).toList(), ), ]; } diff --git a/package.json b/package.json index 31acf904..a79ecc09 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "fastlane:update:macos": "cd macos && bundle update", "generate": "npm run generate:environment && npm run generate:assets && npm run generate:build_runner && npm run generate:localization", "generate:assets": "dart pub global activate spider && spider build", - "generate:build_runner": "flutter packages pub run build_runner build", + "generate:build_runner": "flutter packages pub run build_runner build --delete-conflicting-outputs", "generate:environment": "flutter pub run environment_config:generate", "generate:localization": "dart ./scripts/generate_localization.dart", "git:ignore": "npm run git:ignore:firebase && npm run git:ignore:changelog", diff --git a/scripts/generate_changelog.dart b/scripts/generate_changelog.dart index 8407d072..45f43e5a 100644 --- a/scripts/generate_changelog.dart +++ b/scripts/generate_changelog.dart @@ -19,12 +19,29 @@ Future main(List args) async { if (type.isNotEmpty && results[type] != null) { results[type]!.add({ "commit": commit, - "message": parsed, + "feature": parsed[0], + "message": parsed[1], }); } } - export(args[0], results); + final output = results.map((k, v) => MapEntry(k, groupContent(v))); + export(args[0], output); +} + +Map> groupContent(List items) { + Map> results = {}; + for (final item in items) { + results[item['feature']] ??= []; + results[item['feature']]!.add({ + 'commit': item['commit'], + 'message': item['message'], + }); + } + results.values.forEach((items) { + items.sort((a, b) => a['message'].compareTo(b['message'])); + }); + return results; } void export(String flavor, Map results) { @@ -40,7 +57,6 @@ void loadCommitTypes(Map results) { final file = File('.czrc'); final config = json.decode(file.readAsStringSync()); - results['motd'] = ''; for (final key in (config['types'] as Map).keys) { results[key] = []; } @@ -51,16 +67,14 @@ String parseCommitType(String commit) { return type.split('(')[0]; } -String parseCommitMessage(String commit, String type) { +List parseCommitMessage(String commit, String type) { final index = type.length; final endIndex = commit.indexOf(':'); - - if (commit[index] == '(') { - final feature = commit.substring(index + 1, endIndex - 1); - final message = commit.substring(endIndex + 2); - return '$feature: $message'; - } - return commit.substring(endIndex + 2); + final message = commit.substring(endIndex + 2); + final feature = commit[index] == '(' + ? commit.substring(index + 1, endIndex - 1) + : 'other'; + return [feature, message]; } Future> getChanges(String flavor) async { @@ -85,5 +99,6 @@ Future> getChanges(String flavor) async { '-n ${(currentVersion - lastVersion).toString()}', ]); + if ((messages.stdout as String).isEmpty) return []; return (messages.stdout as String).trim().split('\n'); }