Skip to content

Commit e93297c

Browse files
committed
feat: use SpinnerProgerss to replace logUpdate
1 parent 17bac7a commit e93297c

File tree

5 files changed

+100
-120
lines changed

5 files changed

+100
-120
lines changed

lib/src/log_update.dart

Lines changed: 0 additions & 85 deletions
This file was deleted.

lib/src/logger.dart

Lines changed: 70 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,88 @@ import 'dart:async';
22
import 'dart:io' as io;
33

44
import 'package:ansi/ansi.dart';
5-
import 'package:lint_staged/src/figures.dart';
5+
import 'package:ansi_escapes/ansi_escapes.dart';
6+
import 'package:verbose/verbose.dart';
67

7-
import 'log_update.dart';
8-
9-
const _kFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
8+
import 'figures.dart';
9+
import 'spinner.dart';
1010

1111
class Logger {
12-
int _index = 0;
13-
Timer? _timer;
12+
SpinnerProgress? _progress;
13+
1414
Logger();
1515

1616
void error(String message) {
17+
_cancelProgress();
1718
io.stderr.writeln(ansi.red('${Figures.error} $message'));
1819
}
1920

20-
void progress(String message) {
21-
_index = 0;
22-
_timer?.cancel();
23-
logUpdate.clear();
24-
_timer = Timer.periodic(const Duration(milliseconds: 80), (timer) {
25-
final frame = _kFrames[_index = ++_index % _kFrames.length];
26-
logUpdate('${ansi.yellow(frame)} $message\n');
27-
});
21+
SpinnerProgress progress(String message) {
22+
_cancelProgress();
23+
return _progress = SpinnerProgress(message);
24+
}
25+
26+
void _cancelProgress() {
27+
_progress?.cancel();
28+
_progress = null;
2829
}
2930

3031
void success(String message) {
31-
logUpdate.clear();
32-
_timer?.cancel();
32+
_cancelProgress();
3333
io.stdout.writeln('${ansi.green(Figures.success)} $message');
3434
}
3535
}
36+
37+
class SpinnerProgress {
38+
final String message;
39+
final Stopwatch _stopwatch;
40+
final bool showTiming;
41+
late final Timer _timer;
42+
late final Spinner _spinner;
43+
late final int _lineCount;
44+
45+
SpinnerProgress(this.message, {this.showTiming = false})
46+
: _stopwatch = Stopwatch()..start() {
47+
_spinner = Spinner();
48+
_lineCount = Verbose.enabled ? 0 : message.split('\n').length;
49+
_timer = Timer.periodic(const Duration(milliseconds: 80), (t) {
50+
_updateDisplay();
51+
});
52+
io.stdout.write('${ansi.yellow(_spinner.toString())} $message');
53+
_updateDisplay();
54+
}
55+
56+
Duration get elapsed => _stopwatch.elapsed;
57+
58+
void cancel() {
59+
if (_timer.isActive) {
60+
_timer.cancel();
61+
_updateDisplay(cancelled: true);
62+
}
63+
}
64+
65+
void finish() {
66+
if (_timer.isActive) {
67+
_timer.cancel();
68+
_updateDisplay(finished: true);
69+
}
70+
}
71+
72+
void _updateDisplay({bool finished = false, bool cancelled = false}) {
73+
var char = ansi.yellow(_spinner.toString());
74+
if (finished) {
75+
char = ansi.green(Figures.success);
76+
} else if (cancelled) {
77+
char = ' ';
78+
}
79+
io.stdout.write(
80+
'${ansiEscapes.eraseLines(_lineCount)}$char ${message.padRight(40)}');
81+
if (showTiming) {
82+
final time = (elapsed.inMilliseconds / 1000.0).toStringAsFixed(1);
83+
io.stdout.write('${time}s');
84+
}
85+
if (finished || cancelled || Verbose.enabled) {
86+
io.stdout.writeln();
87+
}
88+
}
89+
}

lib/src/run.dart

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,40 +105,46 @@ Future<LintStagedContext> runAll({
105105
matchedFileChunks: matchedFileChunks,
106106
workingDirectory: workingDirectory,
107107
);
108-
logger.progress('Preparing lint_staged...');
108+
SpinnerProgress progress = logger.progress('Preparing lint_staged...');
109109
await git.prepare(ctx);
110-
logger.success('Preparing lint_staged...');
110+
progress.finish();
111111
if (ctx.hasPartiallyStagedFiles) {
112-
logger.progress('Hiding unstaged changes to partially staged files...');
112+
progress =
113+
logger.progress('Hiding unstaged changes to partially staged files...');
113114
await git.hideUnstagedChanges(ctx);
114-
logger.success('Hiding unstaged changes to partially staged files...');
115+
progress.finish();
115116
}
116117
if (matchedFiles.isNotEmpty) {
117-
logger.progress('Running tasks for staged files...');
118+
progress = logger.progress('Running tasks for staged files...');
118119
await Future.wait(tasks.map((task) => task()));
119-
logger.success('Running tasks for staged files...');
120+
progress.finish();
121+
// logger.success('Running tasks for staged files...');
120122
}
121123
if (!applyModifationsSkipped(ctx)) {
122-
logger.progress('Applying modifications from tasks...');
124+
progress = logger.progress('Applying modifications from tasks...');
123125
await git.applyModifications(ctx);
124-
logger.success('Applying modifications from tasks...');
126+
progress.finish();
127+
// logger.success('Applying modifications from tasks...');
125128
}
126129
if (ctx.hasPartiallyStagedFiles && !restoreUnstagedChangesSkipped(ctx)) {
127-
logger.progress('Restoring unstaged changes to partially staged files...');
130+
progress = logger
131+
.progress('Restoring unstaged changes to partially staged files...');
128132
await git.resotreUnstagedChanges(ctx);
129-
logger.success('Restoring unstaged changes to partially staged files...');
133+
progress.finish();
134+
// logger.success('Restoring unstaged changes to partially staged files...');
130135
}
131-
verbose(
132-
'should restore origin state: ${restoreOriginalStateEnabled(ctx) && !restoreOriginalStateSkipped(ctx)}');
133136
if (restoreOriginalStateEnabled(ctx) && !restoreOriginalStateSkipped(ctx)) {
134-
logger.progress('Reverting to original state because of errors...');
137+
progress =
138+
logger.progress('Reverting to original state because of errors...');
135139
await git.restoreOriginState(ctx);
136-
logger.success('Reverting to original state because of errors...');
140+
progress.finish();
141+
// logger.success('Reverting to original state because of errors...');
137142
}
138143
if (cleanupEnabled(ctx) && !cleanupSkipped(ctx)) {
139-
logger.progress('Cleaning up temporary files...');
144+
progress = logger.progress('Cleaning up temporary files...');
140145
await git.cleanup(ctx);
141-
logger.success('Cleaning up temporary files...');
146+
progress.finish();
147+
// logger.success('Cleaning up temporary files...');
142148
}
143149
if (ctx.errors.isNotEmpty) {
144150
throw createError(ctx);

lib/src/spinner.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const _kFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
2+
3+
class Spinner {
4+
int _index = 0;
5+
6+
@override
7+
String toString() => _kFrames[_index++ % _kFrames.length];
8+
}

pubspec.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ environment:
1111
dependencies:
1212
ansi: ^0.2.2
1313
ansi_escapes: ^1.1.0
14-
ansi_slice: ^0.1.1
15-
ansi_strip: ^0.1.1+1
16-
ansi_wrap: ^0.1.2+1
1714
args: ^2.3.1
1815
glob: ^2.0.1
1916
path: ^1.8.0

0 commit comments

Comments
 (0)