|  | # Copyright 2023 The Fuchsia Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | load("./common.star", "FORMATTER_MSG", "cipd_platform_name", "get_fuchsia_dir", "os_exec") | 
|  |  | 
|  | def _dart_format(ctx): | 
|  | """Runs `dart format`. | 
|  |  | 
|  | Args: | 
|  | ctx: A ctx instance. | 
|  | """ | 
|  | dart_files = [f for f in ctx.scm.affected_files() if f.endswith(".dart")] | 
|  | if not dart_files: | 
|  | return | 
|  |  | 
|  | dart_exe = "%s/prebuilt/third_party/dart/%s/bin/dart" % ( | 
|  | get_fuchsia_dir(ctx), | 
|  | cipd_platform_name(ctx), | 
|  | ) | 
|  |  | 
|  | procs = [ | 
|  | ( | 
|  | f, | 
|  | os_exec(ctx, [dart_exe, "format", "--output=json", f]), | 
|  | ) | 
|  | for f in dart_files | 
|  | ] | 
|  | for (f, proc) in procs: | 
|  | new_contents = json.decode(proc.wait().stdout)["source"] | 
|  | old_contents = str(ctx.io.read_file(f)) | 
|  | if new_contents != old_contents: | 
|  | ctx.emit.finding( | 
|  | level = "error", | 
|  | message = FORMATTER_MSG, | 
|  | filepath = f, | 
|  | replacements = [new_contents], | 
|  | ) | 
|  |  | 
|  | def register_dart_checks(): | 
|  | shac.register_check(shac.check(_dart_format, formatter = True)) |