
The import-check action now presents problematic import statements introduced by the PR better. The idea is roughly: * Let (V₁, E₁) be the graph of modules as vertices and import statements as edges before the change * Let (V₂, E₂) be the graph after the code change, which is typically a small perturbation of (V₁, E₁). * X₁ = FAS(V₁, E₁) is the feedback arc set before (a minimal set of edges to delete to make it acyclic) * X₂ = FAS(V₂, E₂ ∖ X₁) is the feedback arc set after deletion of the minimal set of edges that made the old graph acyclic. * X₃ = FAS(V₂, E₂) is the feedback arc set after Previously I displayed X₁ and X₃ and users had to diff themselves. Now, I'm showing X₂, which is a small set, typically directly related to code changes. However, it can be that a small code change adding say 2 problematic imports creates a completely different solution X₃ that only requires deletion of just 1 different import. In that case the user is informed that they can potentially do less work. So for PR #48784 the output is now: > The overall number of problematic import statements increased by 1 from 31 to 32. > This is likely a direct consequence of the following import statements: > > ``` > spack/config imports: spack.spec, spack.util.path, spack.util.remote_file_cache > ``` > > However, instead of removing 3 import statements, it is sufficient to remove only 1 > import statement from the following list: > > ``` > spack/concretize imports: spack.bootstrap, spack.solver.asp > spack/environment imports: spack.bootstrap, spack.environment > spack/fetch_strategy imports: spack.version.git_ref_lookup > spack/install_test imports: spack.build_environment, spack.package_base > spack/modules imports: spack.modules > spack/platforms imports: spack.config > spack/relocate imports: spack.bootstrap > spack/repo imports: spack.package_base, spack.patch, spack.tag > spack/spec imports: spack.binary_distribution, spack.compiler, spack.compilers, spack.concretize, spack.environment, spack.hash_types, spack.provider_index, spack.repo, spack.spec_parser, spack.store, spack.traverse, spack.variant, spack.version.git_ref_lookup > spack/subprocess_context imports: spack.environment > spack/util/gpg imports: spack.bootstrap > spack/util/package_hash imports: spack.package_base > spack/util/path imports: spack.config, spack.environment > spack/util/remote_file_cache imports: spack.util.web > ``` from which the user can figure out that `spack/util/remote_file_cache imports: spack.util.web` is the "bottleneck" now.
150 lines
5.1 KiB
YAML
150 lines
5.1 KiB
YAML
name: style
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
with_coverage:
|
|
required: true
|
|
type: string
|
|
|
|
concurrency:
|
|
group: style-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
cancel-in-progress: true
|
|
|
|
|
|
jobs:
|
|
# Validate that the code can be run on all the Python versions supported by Spack
|
|
validate:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
with:
|
|
python-version: '3.13'
|
|
cache: 'pip'
|
|
- name: Install Python Packages
|
|
run: |
|
|
pip install --upgrade pip setuptools
|
|
pip install -r .github/workflows/requirements/style/requirements.txt
|
|
- name: vermin (Spack's Core)
|
|
run: vermin --backport importlib --backport argparse --violations --backport typing -t=3.6- -vvv lib/spack/spack/ lib/spack/llnl/ bin/
|
|
- name: vermin (Repositories)
|
|
run: vermin --backport importlib --backport argparse --violations --backport typing -t=3.6- -vvv var/spack/repos
|
|
# Run style checks on the files that have been changed
|
|
style:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
with:
|
|
fetch-depth: 0
|
|
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
with:
|
|
python-version: '3.13'
|
|
cache: 'pip'
|
|
- name: Install Python packages
|
|
run: |
|
|
pip install --upgrade pip setuptools
|
|
pip install -r .github/workflows/requirements/style/requirements.txt
|
|
- name: Setup git configuration
|
|
run: |
|
|
# Need this for the git tests to succeed.
|
|
git --version
|
|
. .github/workflows/bin/setup_git.sh
|
|
- name: Run style tests
|
|
run: |
|
|
share/spack/qa/run-style-tests
|
|
audit:
|
|
uses: ./.github/workflows/audit.yaml
|
|
secrets: inherit
|
|
with:
|
|
with_coverage: ${{ inputs.with_coverage }}
|
|
python_version: '3.13'
|
|
# Check that spack can bootstrap the development environment on Python 3.6 - RHEL8
|
|
bootstrap-dev-rhel8:
|
|
runs-on: ubuntu-latest
|
|
container: registry.access.redhat.com/ubi8/ubi
|
|
steps:
|
|
- name: Install dependencies
|
|
run: |
|
|
dnf install -y \
|
|
bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
|
make patch tcl unzip which xz
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
- name: Setup repo and non-root user
|
|
run: |
|
|
git --version
|
|
git config --global --add safe.directory '*'
|
|
git fetch --unshallow
|
|
. .github/workflows/bin/setup_git.sh
|
|
useradd spack-test
|
|
chown -R spack-test .
|
|
- name: Bootstrap Spack development environment
|
|
shell: runuser -u spack-test -- bash {0}
|
|
run: |
|
|
source share/spack/setup-env.sh
|
|
spack debug report
|
|
spack -d bootstrap now --dev
|
|
spack -d style -t black
|
|
spack unit-test -V
|
|
# Check we don't make the situation with circular imports worse
|
|
import-check:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: julia-actions/setup-julia@v2
|
|
with:
|
|
version: '1.10'
|
|
- uses: julia-actions/cache@v2
|
|
|
|
# PR: use the base of the PR as the old commit
|
|
- name: Checkout PR base commit
|
|
if: github.event_name == 'pull_request'
|
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
with:
|
|
ref: ${{ github.event.pull_request.base.sha }}
|
|
path: old
|
|
# not a PR: use the previous commit as the old commit
|
|
- name: Checkout previous commit
|
|
if: github.event_name != 'pull_request'
|
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
with:
|
|
fetch-depth: 2
|
|
path: old
|
|
- name: Checkout previous commit
|
|
if: github.event_name != 'pull_request'
|
|
run: git -C old reset --hard HEAD^
|
|
|
|
- name: Checkout new commit
|
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
with:
|
|
path: new
|
|
- name: Install circular import checker
|
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
with:
|
|
repository: haampie/circular-import-fighter
|
|
ref: 9a2c728c97f594dec0210e7f85cb7167eaf29176
|
|
path: circular-import-fighter
|
|
- name: Install dependencies
|
|
working-directory: circular-import-fighter
|
|
run: make -j dependencies
|
|
- name: Circular import check
|
|
working-directory: circular-import-fighter
|
|
run: make -j compare "SPACK_ROOT=../old ../new"
|
|
|
|
# Further style checks from pylint
|
|
pylint:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
|
with:
|
|
fetch-depth: 0
|
|
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
|
|
with:
|
|
python-version: '3.13'
|
|
cache: 'pip'
|
|
- name: Install Python packages
|
|
run: |
|
|
pip install --upgrade pip setuptools pylint
|
|
- name: Pylint (Spack Core)
|
|
run: |
|
|
pylint -j 4 --disable=all --enable=unspecified-encoding --ignore-paths=lib/spack/external lib
|