Skip to content
This repository has been archived by the owner on Jul 16, 2023. It is now read-only.

feat: add delete-files flag #632

Merged
merged 9 commits into from
Jan 9, 2022
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
* chore: restrict `analyzer_plugin` version to `>=0.8.0 <0.10.0`.
* feat: support extensions for check-unused-l10n.
* feat: improve `prefer-correct-type-name` rule.
* feat: add `delete-files` flag to `check-unused-files` command.

## 4.8.1

Expand Down
2 changes: 1 addition & 1 deletion lib/src/analyzers/lint_analyzer/lint_analyzer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class LintAnalyzer {

/// Returns a reporter for the given [name]. Use the reporter
/// to convert analysis reports to console, JSON or other supported format.
Reporter<FileReport, Object>? getReporter({
Reporter<FileReport, Object, void>? getReporter({
required String name,
required IOSink output,
required String reportFolder,
Expand Down
10 changes: 7 additions & 3 deletions lib/src/analyzers/lint_analyzer/reporters/reporter_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@ import 'reporters_list/github/lint_github_reporter.dart';
import 'reporters_list/html/lint_html_reporter.dart';
import 'reporters_list/json/lint_json_reporter.dart';

final _implementedReports = <String,
Reporter<FileReport, Object> Function(IOSink output, String reportFolder)>{
final _implementedReports = <
String,
Reporter<FileReport, Object, void> Function(
IOSink output,
String reportFolder,
)>{
ConsoleReporter.id: (output, _) => LintConsoleReporter(output),
ConsoleReporter.verboseId: (output, _) =>
LintConsoleReporter(output, reportAll: true),
Expand All @@ -26,7 +30,7 @@ final _implementedReports = <String,
LintCodeClimateReporter(output, gitlabCompatible: true),
};

Reporter<FileReport, Object>? reporter({
Reporter<FileReport, Object, void>? reporter({
required String name,
required IOSink output,
required String reportFolder,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import 'models/code_climate_issue_severity.dart';
///
/// Use it to create reports in Code Climate format.
class LintCodeClimateReporter extends CodeClimateReporter<LintFileReport,
SummaryLintReportRecord<Object>> {
SummaryLintReportRecord<Object>, void> {
LintCodeClimateReporter(IOSink output, {bool gitlabCompatible = false})
: super(
output,
Expand All @@ -30,6 +30,7 @@ class LintCodeClimateReporter extends CodeClimateReporter<LintFileReport,
Future<void> report(
Iterable<LintFileReport> records, {
Iterable<SummaryLintReportRecord<Object>> summary = const [],
void additionalParams,
}) async {
if (records.isEmpty) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import 'lint_console_reporter_helper.dart';
/// Lint console reporter.
///
/// Use it to create reports in console format.
class LintConsoleReporter
extends ConsoleReporter<LintFileReport, SummaryLintReportRecord<Object>> {
class LintConsoleReporter extends ConsoleReporter<LintFileReport,
SummaryLintReportRecord<Object>, void> {
/// If true will report info about all files even if they're not above warning threshold
final bool reportAll;

Expand All @@ -26,6 +26,7 @@ class LintConsoleReporter
Future<void> report(
Iterable<LintFileReport> records, {
Iterable<SummaryLintReportRecord<Object>> summary = const [],
void additionalParams,
}) async {
var hasReportData = false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@ const _deprecationMessage =
///
/// **Note:** this reporter is deprecated and should not be used.
/// Consider using Dart Code Metrics GitHub Action instead.
class LintGitHubReporter
extends GitHubReporter<LintFileReport, SummaryLintReportRecord<Object>> {
class LintGitHubReporter extends GitHubReporter<LintFileReport,
SummaryLintReportRecord<Object>, void> {
const LintGitHubReporter(IOSink output) : super(output);

@override
Future<void> report(
Iterable<LintFileReport> records, {
Iterable<SummaryLintReportRecord<Object>> summary = const [],
void additionalParams,
}) async {
if (records.isEmpty) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,15 @@ const _designIssues = 'Design issues';
/// Lint HTML reporter.
///
/// Use it to create reports in HTML format.
class LintHtmlReporter
extends HtmlReporter<LintFileReport, SummaryLintReportRecord<Object>> {
class LintHtmlReporter extends HtmlReporter<LintFileReport,
SummaryLintReportRecord<Object>, void> {
LintHtmlReporter(String reportFolder) : super(reportFolder);

@override
Future<void> report(
Iterable<LintFileReport> records, {
Iterable<SummaryLintReportRecord<Object>> summary = const [],
void additionalParams,
}) async {
await super.report(records);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ import '../../../models/summary_lint_report_record.dart';
///
/// Use it to create reports in JSON format.
@immutable
class LintJsonReporter
extends JsonReporter<LintFileReport, SummaryLintReportRecord<Object>> {
class LintJsonReporter extends JsonReporter<LintFileReport,
SummaryLintReportRecord<Object>, void> {
const LintJsonReporter(IOSink output) : super(output, 2);

@override
Future<void> report(
Iterable<LintFileReport> records, {
Iterable<SummaryLintReportRecord<Object>> summary = const [],
void additionalParams,
}) async {
if (records.isEmpty) {
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/// Represents additional reporter params
class ReportParams {
final bool deleteUnusedFiles;

const ReportParams({this.deleteUnusedFiles = false});
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@ import '../../../reporters/models/console_reporter.dart';
import '../../../reporters/models/json_reporter.dart';
import '../../../reporters/models/reporter.dart';
import '../models/unused_files_file_report.dart';
import 'report_params.dart';
import 'reporters_list/console/unused_files_console_reporter.dart';
import 'reporters_list/json/unused_files_json_reporter.dart';

final _implementedReports =
<String, Reporter<UnusedFilesFileReport, void> Function(IOSink output)>{
final _implementedReports = <
String,
Reporter<UnusedFilesFileReport, void, ReportParams> Function(
IOSink output,
)>{
ConsoleReporter.id: (output) => UnusedFilesConsoleReporter(output),
JsonReporter.id: (output) => UnusedFilesJsonReporter(output),
};

Reporter<UnusedFilesFileReport, void>? reporter({
Reporter<UnusedFilesFileReport, void, ReportParams>? reporter({
required String name,
required IOSink output,
}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,20 @@ import 'dart:io';

import '../../../../../reporters/models/console_reporter.dart';
import '../../../models/unused_files_file_report.dart';
import '../../report_params.dart';

/// Unused files console reporter.
///
/// Use it to create reports in console format.
class UnusedFilesConsoleReporter
extends ConsoleReporter<UnusedFilesFileReport, void> {
extends ConsoleReporter<UnusedFilesFileReport, void, ReportParams> {
UnusedFilesConsoleReporter(IOSink output) : super(output);

@override
Future<void> report(
Iterable<UnusedFilesFileReport> records, {
Iterable<void> summary = const [],
ReportParams? additionalParams,
}) async {
if (records.isEmpty) {
output.writeln('${okPen('✔')} no unused files found!');
Expand All @@ -26,14 +28,18 @@ class UnusedFilesConsoleReporter

for (final analysisRecord in sortedRecords) {
output.writeln(
'${warnigPen('⚠')} unused file: ${analysisRecord.relativePath}',
'${warningPen('⚠')} unused file: ${analysisRecord.relativePath}',
);
}

final removeFilesSuffix = additionalParams?.deleteUnusedFiles ?? false
? ', all unused files were successfully deleted'
: '';

output
..writeln('')
..writeln(
'${alarmPen('✖')} total unused files - ${alarmPen(sortedRecords.length)}',
'${alarmPen('✖')} total unused files - ${alarmPen(sortedRecords.length)}$removeFilesSuffix',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@incendial if we remove all unused files, why we in alarm state? I think this is good or info state, our repo not contains unused files.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@ import 'package:meta/meta.dart';

import '../../../../../reporters/models/json_reporter.dart';
import '../../../models/unused_files_file_report.dart';
import '../../report_params.dart';

/// Unused files JSON reporter.
///
/// Use it to create reports in JSON format.
@immutable
class UnusedFilesJsonReporter
extends JsonReporter<UnusedFilesFileReport, void> {
extends JsonReporter<UnusedFilesFileReport, void, ReportParams> {
const UnusedFilesJsonReporter(IOSink output) : super(output, 2);

@override
Future<void> report(
Iterable<UnusedFilesFileReport> records, {
Iterable<void> summary = const [],
ReportParams? additionalParams,
}) async {
if (records.isEmpty) {
return;
Expand All @@ -27,6 +29,7 @@ class UnusedFilesJsonReporter
'formatVersion': formatVersion,
'timestamp': getTimestamp(),
'unusedFiles': records.map(_analysisRecordToJson).toList(),
'automaticallyDeleted': additionalParams?.deleteUnusedFiles ?? false,
});

output.write(encodedReport);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import '../../reporters/models/reporter.dart';
import '../../utils/analyzer_utils.dart';
import '../../utils/file_utils.dart';
import 'models/unused_files_file_report.dart';
import 'reporters/report_params.dart';
import 'reporters/reporter_factory.dart';
import 'unused_files_config.dart';
import 'unused_files_visitor.dart';
Expand All @@ -20,7 +21,7 @@ class UnusedFilesAnalyzer {

/// Returns a reporter for the given [name]. Use the reporter
/// to convert analysis reports to console, JSON or other supported format.
Reporter<UnusedFilesFileReport, void>? getReporter({
Reporter<UnusedFilesFileReport, void, ReportParams>? getReporter({
required String name,
required IOSink output,
}) =>
Expand Down Expand Up @@ -95,6 +96,14 @@ class UnusedFilesAnalyzer {
}).toSet();
}

Future<void> deleteAllUnusedFiles(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@incendial why this is async function? I see only sync methods.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Iterable<UnusedFilesFileReport> reports,
) async {
for (final report in reports) {
File(report.path).deleteSync();
}
}

Iterable<String> _analyzeFile(String filePath, SomeResolvedUnitResult unit) {
if (unit is ResolvedUnitResult) {
final visitor = UnusedFilesVisitor(filePath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import '../models/unused_l10n_file_report.dart';
import 'reporters_list/console/unused_l10n_console_reporter.dart';
import 'reporters_list/json/unused_l10n_json_reporter.dart';

final _implementedReports =
<String, Reporter<UnusedL10nFileReport, void> Function(IOSink output)>{
final _implementedReports = <String,
Reporter<UnusedL10nFileReport, void, void> Function(IOSink output)>{
ConsoleReporter.id: (output) => UnusedL10nConsoleReporter(output),
JsonReporter.id: (output) => UnusedL10nJsonReporter(output),
};

Reporter<UnusedL10nFileReport, void>? reporter({
Reporter<UnusedL10nFileReport, void, void>? reporter({
required String name,
required IOSink output,
}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ import '../../../models/unused_l10n_file_report.dart';
///
/// Use it to create reports in console format.
class UnusedL10nConsoleReporter
extends ConsoleReporter<UnusedL10nFileReport, void> {
extends ConsoleReporter<UnusedL10nFileReport, void, void> {
UnusedL10nConsoleReporter(IOSink output) : super(output);

@override
Future<void> report(
Iterable<UnusedL10nFileReport> records, {
Iterable<void> summary = const [],
void additionalParams,
}) async {
if (records.isEmpty) {
output.writeln('${okPen('✔')} no unused localization found!');
Expand All @@ -38,7 +39,7 @@ class UnusedL10nConsoleReporter
final pathOffset = offset.padRight(5);

output
..writeln('$offset ${warnigPen('⚠')} unused ${issue.memberName}')
..writeln('$offset ${warningPen('⚠')} unused ${issue.memberName}')
..writeln('$pathOffset at $path:$line:$column');
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ import '../../../models/unused_l10n_issue.dart';
///
/// Use it to create reports in JSON format.
@immutable
class UnusedL10nJsonReporter extends JsonReporter<UnusedL10nFileReport, void> {
class UnusedL10nJsonReporter
extends JsonReporter<UnusedL10nFileReport, void, void> {
const UnusedL10nJsonReporter(IOSink output) : super(output, 2);

@override
Future<void> report(
Iterable<UnusedL10nFileReport> records, {
Iterable<void> summary = const [],
void additionalParams,
}) async {
if (records.isEmpty) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class UnusedL10nAnalyzer {

/// Returns a reporter for the given [name]. Use the reporter
/// to convert analysis reports to console, JSON or other supported format.
Reporter<UnusedL10nFileReport, void>? getReporter({
Reporter<UnusedL10nFileReport, void, void>? getReporter({
required String name,
required IOSink output,
}) =>
Expand Down
22 changes: 21 additions & 1 deletion lib/src/cli/commands/check_unused_files_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import 'dart:io';

import '../../analyzers/unused_files_analyzer/reporters/report_params.dart';
import '../../analyzers/unused_files_analyzer/unused_files_analyzer.dart';
import '../../config_builder/config_builder.dart';
import '../models/flag_names.dart';
Expand Down Expand Up @@ -30,6 +31,7 @@ class CheckUnusedFilesCommand extends BaseCommand {
final folders = argResults.rest;
final excludePath = argResults[FlagNames.exclude] as String;
final reporterName = argResults[FlagNames.reporter] as String;
final deleteFiles = argResults[FlagNames.deleteFiles] as bool;

final config = ConfigBuilder.getUnusedFilesConfigFromArgs([excludePath]);

Expand All @@ -40,12 +42,19 @@ class CheckUnusedFilesCommand extends BaseCommand {
sdkPath: findSdkPath(),
);

if (deleteFiles) {
await _analyzer.deleteAllUnusedFiles(unusedFilesResult);
}

await _analyzer
.getReporter(
name: reporterName,
output: stdout,
)
?.report(unusedFilesResult);
?.report(
unusedFilesResult,
additionalParams: ReportParams(deleteUnusedFiles: deleteFiles),
);

if (unusedFilesResult.isNotEmpty &&
(argResults[FlagNames.fatalOnUnused] as bool)) {
Expand All @@ -57,6 +66,7 @@ class CheckUnusedFilesCommand extends BaseCommand {
_usesReporterOption();
addCommonFlags();
_usesExitOption();
_usesDeleteUnusedFiles();
}

void _usesReporterOption() {
Expand Down Expand Up @@ -85,4 +95,14 @@ class CheckUnusedFilesCommand extends BaseCommand {
// defaultsTo: true,
);
}

void _usesDeleteUnusedFiles() {
argParser
..addSeparator('')
..addFlag(
FlagNames.deleteFiles,
abbr: 'd',
help: 'Delete all unused files.',
);
}
}
Loading