run method
Implementation
Future<int> run() async {
final allFilesResult = await this.allFiles;
if (allFilesResult case (_, final int code)) {
return code;
}
final (allFiles, _) = allFilesResult;
logger.detail('Found ${allFiles.length} files');
for (final file in allFiles) {
logger.detail(' - $file');
}
if (debug) await _wait(durations.short);
logger.detail('Resolving files');
final pendingHook = PendingHook(
hook.resolve(allFiles),
logger: logger,
);
if (!pendingHook.topLevelTasks.any((e) => e.shouldAlwaysRun)) {
if (pendingHook.topLevelTasks.every((e) => e.files.isEmpty)) {
logger.info(
darkGray.wrap('Skipping $hookName hook, no files match any tasks'),
);
return 0;
}
}
final context = await gitService.prepareFiles();
final labelMaker = LabelMaker(
stdout: stdout,
pendingHook: pendingHook,
nameOfHook: hookName,
debug: debug,
);
logger.detail('Starting tasks');
if (debug) await _wait(durations.short);
final progress = MultiLineProgress(createLabel: labelMaker.create)..start();
pendingHook.start();
await pendingHook.wait();
if (pendingHook.wasKilled) {
progress
..dispose()
..print();
logger.detail('Hook was killed');
if (logger.level.index == Level.verbose.index) {
logger.flush();
}
} else {
await progress.closeNextFrame();
logger
..detail('Tasks finished')
..flush()
..write('\n');
}
var failed = false;
for (final task in pendingHook.topLevelTasks) {
if (task.code case final int code when code != 0) {
failed = true;
logger.detail(
'Task failed: ${task.resolvedTask.original.resolvedName}',
);
}
if (failed) {
logger
..detail('stopping hook tasks')
..flush();
return 1;
}
}
if (hook is PreCommitHook) {
logger.detail('Applying modifications');
for (final file in context.nonStagedFiles) {
logger.detail(' - $file');
}
if (debug) await _wait(durations.short);
await gitService.applyModifications(
[...context.nonStagedFiles, ...context.deletedFiles],
);
if (debug) await _wait(durations.long);
} else {
logger.detail('Skipped applying modifications for $hookName');
}
if (hook case PreCommitHook(allowEmpty: true)) {
logger.detail('--FINISHED--');
return 0;
}
final files = await gitService.diffFiles(
diffArgs: hook.diffArgs,
diffFilters: hook.diffFilters,
);
if (files.isEmpty) {
logger
..info('No changes to commit')
..detail('--FINISHED--');
return 1;
}
logger.detail('--FINISHED--');
return 0;
}