| #!/usr/bin/env python3 | |
| # Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file | |
| # for details. All rights reserved. Use of this source code is governed by a | |
| # BSD-style license that can be found in the LICENSE file. | |
| """Analysis server specific presubmit script. | |
| See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts | |
| for more details about the presubmit API built into gcl. | |
| """ | |
| import importlib.util | |
| import importlib.machinery | |
| import os.path | |
| import subprocess | |
| USE_PYTHON3 = True | |
| PRESUBMIT_VERSION = '2.0.0' | |
| def load_source(modname, filename): | |
| loader = importlib.machinery.SourceFileLoader(modname, filename) | |
| spec = importlib.util.spec_from_file_location(modname, | |
| filename, | |
| loader=loader) | |
| module = importlib.util.module_from_spec(spec) | |
| # The module is always executed and not cached in sys.modules. | |
| # Uncomment the following line to cache the module. | |
| # sys.modules[module.__name__] = module | |
| loader.exec_module(module) | |
| return module | |
| def CheckSorted(input_api, output_api): | |
| local_root = input_api.change.RepositoryRoot() | |
| utils = load_source('utils', os.path.join(local_root, 'tools', 'utils.py')) | |
| dart = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dart') | |
| windows = utils.GuessOS() == 'win32' | |
| if windows: | |
| dart += '.exe' | |
| sourceArgs = [ | |
| arg for git_file in input_api.AffectedTestableFiles() | |
| for arg in ('-s', git_file.AbsoluteLocalPath()) | |
| ] | |
| verify_sorted = os.path.join(local_root, 'pkg', 'analysis_server', 'test', | |
| 'verify_sorted_test.dart') | |
| result = subprocess.run([dart, 'run', '-r', verify_sorted] + sourceArgs, | |
| capture_output=True) | |
| if result.returncode != 0: | |
| unsorted_file_details = [ | |
| line for line in result.stdout.decode('utf-8').splitlines() | |
| if 'Unsorted file' in line | |
| ] | |
| if len(unsorted_file_details) == 0: | |
| return [ | |
| output_api.PresubmitError('\n'.join([ | |
| 'CheckSorted: could not parse output of verify_sorted_test.dart', | |
| 'Stdout:', | |
| result.stdout.decode('utf-8'), | |
| '', | |
| 'Stderr:', | |
| result.stderr.decode('utf-8') | |
| ])) | |
| ] | |
| unsorted_files = [] | |
| for line in unsorted_file_details: | |
| path = line.split('Unsorted file ', 1)[1].strip() | |
| if path not in unsorted_files: | |
| unsorted_files.append(path) | |
| lineSep = ' \\\n' | |
| if windows: | |
| lineSep = ' ^\n' | |
| fix_args = ['-s %s' % path for path in unsorted_files] | |
| return [ | |
| output_api.PresubmitError( | |
| '\n'.join(unsorted_file_details) + '\n' | |
| 'Fix these issues with:\n' | |
| '%s run -r %s --update%s%s' % | |
| (dart, verify_sorted, lineSep, lineSep.join(fix_args))) | |
| ] | |
| return [] |