-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Migrate development workflow to Pixi #10888
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
VeckoTheGecko
wants to merge
100
commits into
pydata:main
Choose a base branch
from
VeckoTheGecko:pixi-dust
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+687
−835
Open
Changes from 66 commits
Commits
Show all changes
100 commits
Select commit
Hold shift + click to select a range
406c047
Move xarray badge to top
VeckoTheGecko f16d02c
DOC: Add Pixi badge
VeckoTheGecko c4573df
Add pixi environment
VeckoTheGecko 577cf18
Split dependencies into features and define environments
VeckoTheGecko 33d4a14
Copy requriements file to new folder for requirement linting
VeckoTheGecko 2bd8605
Remove testing, 'pip', and 'packaging' dependencies from requirements…
VeckoTheGecko 40f78bc
Remove numpy from environment files
VeckoTheGecko e59d27d
Add typing task and environment
VeckoTheGecko 618870b
Remove pandas from environment files
VeckoTheGecko 1d8a93c
Remove pre-commit from environment files
VeckoTheGecko 1bbfbe0
Remove typing related packages from environment files
VeckoTheGecko 71f1ce9
Remove 'pacakaging' package from environment files
VeckoTheGecko b3c3a2a
Remove backend related packages from environment files
VeckoTheGecko e3781e6
Remove performance related packages from environment files
VeckoTheGecko 47cc4d8
Remove s3 related package from environment files
VeckoTheGecko c3df274
Remove various packages from environment files and migrate to pixi
VeckoTheGecko 5b20177
Remove 'typing_extensions' package from environment files
VeckoTheGecko fdaa381
Remove 'rasterio' package from environment files
VeckoTheGecko 1062701
Remove 'distributed' and 'lxml' package from environment files
VeckoTheGecko 72b65da
Remove plotting related packages from environment files
VeckoTheGecko 56f84f1
Remove 'iris' and 'pooch' package from environment files
VeckoTheGecko e3eaaa8
Remove 'jax' package from environment files
VeckoTheGecko 3d75cbe
Delete bodies of empty environment files
VeckoTheGecko 9f39ee6
Port doc dependencies to pixi.toml
VeckoTheGecko 833c647
Add xarray as source dependency to pixi
VeckoTheGecko baee394
Add new environments and tasks
VeckoTheGecko 04e667a
Move `test` task to `test` feature
VeckoTheGecko 4a0e692
Move pydap-server to linux dependency
VeckoTheGecko 5048c40
Move cfgrib to pypi dep
VeckoTheGecko fccd392
Add workflow for caching-pixi-lock
VeckoTheGecko 677c114
Add pixi task: doc
VeckoTheGecko 868f573
Update RTD to use Pixi
VeckoTheGecko a8d067b
Remove 'run --all-files' from pre-commit task
VeckoTheGecko 10ea078
Add all-but-dask and all-but-numba envs
VeckoTheGecko 066219a
Update cache-pixi-lock
VeckoTheGecko 73875c6
ci.yaml : update set env vars to remove windows section
VeckoTheGecko 33f5eb0
ci.yaml : update set env vars to remove py314 section
VeckoTheGecko a9c85fc
Update environment name
VeckoTheGecko 5ba5637
Remove solve groups for now
VeckoTheGecko 8141da4
Add testing environments with mypy
VeckoTheGecko 2cb81b9
ci.yaml : Rename strategy 'env' var to 'pixi-env'
VeckoTheGecko 60be388
Add pixi environment for bare-min-and-scipy
VeckoTheGecko d049e33
Fix pixi environment names in CI
VeckoTheGecko 38379dd
Create `test-all-deps-py313` and `test-all-deps-py311` pixi envs
VeckoTheGecko 04899d7
Fix CI pixi env names
VeckoTheGecko 428c33c
Remove python-version matrix var
VeckoTheGecko b5b5ab4
Move pixi package section
VeckoTheGecko 4c75594
Add packages to run-dependencies section
VeckoTheGecko b753cfa
Fix install of pytest-github-actions-annotate-failures
VeckoTheGecko 93215f0
Update pixi-build-python==0.4.0
VeckoTheGecko 31f9537
Enable cross os pixi lockfile fetch
VeckoTheGecko 57dedbe
Remove setup micromamba workflow
VeckoTheGecko 27c4dbb
Remove CONDA_ENV_FILE variable
VeckoTheGecko 388fd1d
Enter pixi shell
VeckoTheGecko 334a9df
setup pixi with needed env
VeckoTheGecko c93faf6
Update workflow name
VeckoTheGecko 86bcd41
project -> workspace
VeckoTheGecko ba012ba
Remove annotate pixi feature
VeckoTheGecko f6b5464
Use "pixi run" instead of "pixi shell"
VeckoTheGecko 28daf62
Add pip to typing feature
VeckoTheGecko ebdc125
Pin pixi versions
VeckoTheGecko b07bcae
Update RTD for pixi
VeckoTheGecko 0f3a618
Specify pixi env explicitly
VeckoTheGecko 4764b3d
Add pixi version in cache-pixi-lock cache id
VeckoTheGecko 5f74f12
Fix artifact name
VeckoTheGecko 5c14760
Review - fix pixi env name in CI
VeckoTheGecko 7ef5ace
Add cftime as test dep
VeckoTheGecko ee72978
Review feedback
VeckoTheGecko 257d77c
Migrate CI additional to use Pixi
VeckoTheGecko c4e1c0d
review feedback
VeckoTheGecko 98e7499
Add pyright to typing feature
VeckoTheGecko d93b2a4
Add typing to unit_registry
VeckoTheGecko 8634699
Fix command
VeckoTheGecko acc528e
Rename plotting feature to viz
VeckoTheGecko 52cec4d
Update confusing env name
VeckoTheGecko 4d0f952
Disable test environment
VeckoTheGecko ad02e6a
Add doc-clean task
VeckoTheGecko 8d52c20
Remove bare-minimum.yml
VeckoTheGecko 7df8676
Make pixi env for min versions
VeckoTheGecko a50cf33
Relax pydap min version
VeckoTheGecko f79f5e6
Enable test-min-versions CI testing
VeckoTheGecko 435e9bc
Delete `min-all-deps.yml`
VeckoTheGecko b05765a
Disable `min-version-policy` workflow in CI
VeckoTheGecko f038fde
Revert regression - save PYTHON_VERSION to codecov
VeckoTheGecko 81454f4
Migrate Hypothesis testing CI to Pixi
VeckoTheGecko cbd0bd0
Revert changes to `benchmarks.yml`
VeckoTheGecko 3146b8b
Self review
VeckoTheGecko f19ca43
Fix RTD for pixi
VeckoTheGecko 435b124
Update contributing instructions for Pixi
VeckoTheGecko 8516595
Migrate nightly testing to pixi
VeckoTheGecko 5127e11
Ignore mypy errors found during nightly testing
VeckoTheGecko f41cf0f
Remove conda call in Sphinx build process
VeckoTheGecko 38456e3
Fix build dir
VeckoTheGecko 2f28dfd
Update links
VeckoTheGecko 7b1ce83
Fix rtd attempt x
VeckoTheGecko 1cef1b6
Add back `environment.yml` - needed for benchmarks
VeckoTheGecko af0f85b
Fix environments for pyright CI
VeckoTheGecko 1b2869c
Merge pyright jobs into matrix
VeckoTheGecko f779b8a
Merge branch 'main' into pixi-dust
VeckoTheGecko 8abc993
Override dask version in nightly
VeckoTheGecko File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,7 +9,10 @@ env: | |
| PR_HEAD_LABEL: ${{ github.event.pull_request.head.label }} | ||
|
|
||
| jobs: | ||
| cache-pixi-lock: | ||
| uses: ./.github/workflows/cache-pixi-lock.yml | ||
| benchmark: | ||
| needs: cache-pixi-lock | ||
| if: ${{ contains( github.event.pull_request.labels.*.name, 'run-benchmark') && github.event_name == 'pull_request' || contains( github.event.pull_request.labels.*.name, 'topic-performance') && github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} | ||
| name: Linux | ||
| runs-on: ubuntu-latest | ||
|
|
@@ -24,6 +27,18 @@ jobs: | |
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: Restore cached pixi lockfile | ||
| uses: actions/cache/restore@v4 | ||
| id: restore-pixi-lock | ||
| with: | ||
| path: | | ||
| pixi.lock | ||
| key: ${{ needs.cache-pixi-lock.outputs.cache-id }} | ||
| - uses: prefix-dev/[email protected] | ||
| with: | ||
| cache: true | ||
| cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} | ||
|
|
||
| - name: Set up conda environment | ||
| uses: mamba-org/setup-micromamba@v2 | ||
| with: | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,52 @@ | ||
| name: Generate and cache Pixi lockfile | ||
|
|
||
| on: | ||
| workflow_call: | ||
| inputs: | ||
| pixi-version: | ||
| type: string | ||
| outputs: | ||
| cache-id: | ||
| description: "The lock file contents" | ||
| value: ${{ jobs.cache-pixi-lock.outputs.cache-id }} | ||
|
|
||
| jobs: | ||
| cache-pixi-lock: | ||
| name: Generate output | ||
| runs-on: ubuntu-latest | ||
| outputs: | ||
| cache-id: ${{ steps.restore.outputs.cache-primary-key }} | ||
| steps: | ||
| - uses: actions/checkout@v5 | ||
| with: | ||
| fetch-depth: 0 | ||
| submodules: recursive | ||
| - name: Get current date | ||
| id: date | ||
| run: echo "date=$(date +'%Y-%m-%d')" >> "$GITHUB_OUTPUT" | ||
| - uses: actions/cache/restore@v4 | ||
| id: restore | ||
| with: | ||
| path: | | ||
| pixi.lock | ||
| key: ${{ steps.date.outputs.date }}_${{ inputs.pixi-version }}_${{hashFiles('pixi.toml')}} | ||
| - uses: prefix-dev/[email protected] | ||
| if: ${{ !steps.restore.outputs.cache-hit }} | ||
| with: | ||
| pixi-version: ${{ inputs.pixi-version }} | ||
| run-install: false | ||
| - name: Run pixi lock | ||
| if: ${{ !steps.restore.outputs.cache-hit }} | ||
| run: pixi lock | ||
| - uses: actions/cache/save@v4 | ||
| if: ${{ !steps.restore.outputs.cache-hit }} | ||
| id: cache | ||
| with: | ||
| path: | | ||
| pixi.lock | ||
| key: ${{ steps.restore.outputs.cache-primary-key }} | ||
| - name: Upload pixi.lock | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: pixi-lock | ||
| path: pixi.lock |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -32,10 +32,15 @@ jobs: | |
| id: detect-trigger | ||
| with: | ||
| keyword: "[skip-ci]" | ||
|
|
||
| cache-pixi-lock: | ||
| uses: ./.github/workflows/cache-pixi-lock.yml | ||
| with: | ||
| pixi-version: "v0.58.0" # keep in sync with jobs | ||
| test: | ||
| name: ${{ matrix.os }} py${{ matrix.python-version }} ${{ matrix.env }} | ||
| name: "${{ matrix.os }} | pixi shell -e ${{ matrix.pixi-env }}" | ||
| runs-on: ${{ matrix.os }} | ||
| needs: detect-ci-trigger | ||
| needs: [detect-ci-trigger, cache-pixi-lock] | ||
| if: needs.detect-ci-trigger.outputs.triggered == 'false' | ||
| defaults: | ||
| run: | ||
|
|
@@ -45,110 +50,87 @@ jobs: | |
| matrix: | ||
| os: ["ubuntu-latest", "macos-latest", "windows-latest"] | ||
| # Bookend python versions | ||
| python-version: ["3.11", "3.13"] | ||
| env: [""] | ||
| pixi-env: ["test-all-deps-py311", "test-all-deps-py313"] | ||
| pytest-adopts: [""] | ||
VeckoTheGecko marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| include: | ||
| # Minimum python version: | ||
| - env: "bare-minimum" | ||
| python-version: "3.11" | ||
| os: ubuntu-latest | ||
| - env: "bare-min-and-scipy" | ||
| python-version: "3.11" | ||
| - pixi-env: "test-bare-minimum" | ||
| os: ubuntu-latest | ||
| - env: "min-all-deps" | ||
| python-version: "3.11" | ||
| - pixi-env: "test-bare-min-and-scipy" | ||
| os: ubuntu-latest | ||
| # - pixi-env: "min-all-deps" # TODO: include later by duplicating old workflow and using conda. Not using Pixi for now. | ||
VeckoTheGecko marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| # python-version: "3.11" | ||
| # os: ubuntu-latest | ||
| # Latest python version: | ||
| - env: "all-but-numba" | ||
| python-version: "3.13" | ||
| - pixi-env: "test-all-but-numba" | ||
| os: ubuntu-latest | ||
| - env: "all-but-dask" | ||
| python-version: "3.12" | ||
| - pixi-env: "test-all-but-dask" | ||
| os: ubuntu-latest | ||
| - env: "flaky" | ||
| python-version: "3.13" | ||
| - pixi-env: "test-all-deps-py313" | ||
| pytest-adopts: "flaky" | ||
| os: ubuntu-latest | ||
| # The mypy tests must be executed using only 1 process in order to guarantee | ||
| # predictable mypy output messages for comparison to expectations. | ||
| - env: "mypy" | ||
| python-version: "3.11" | ||
| - pixi-env: "test-all-mypy-py311" | ||
| pytest-adopts: "mypy" | ||
| numprocesses: 1 | ||
| os: ubuntu-latest | ||
| - env: "mypy" | ||
| python-version: "3.13" | ||
| - pixi-env: "test-all-mypy-py313" | ||
| numprocesses: 1 | ||
| os: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v5 | ||
| with: | ||
| fetch-depth: 0 # Fetch all history for all branches and tags. | ||
| - name: Restore cached pixi lockfile | ||
| uses: actions/cache/restore@v4 | ||
| id: restore-pixi-lock | ||
| with: | ||
| enableCrossOsArchive: true | ||
| path: | | ||
| pixi.lock | ||
| key: ${{ needs.cache-pixi-lock.outputs.cache-id }} | ||
| - uses: prefix-dev/[email protected] | ||
| with: | ||
| pixi-version: "v0.58.0" # keep in sync with cache-pixi-lock | ||
| cache: true | ||
| environments: ${{ matrix.pixi-env }} | ||
| cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} | ||
|
|
||
| - name: Set environment variables | ||
| run: | | ||
| echo "TODAY=$(date +'%Y-%m-%d')" >> $GITHUB_ENV | ||
|
|
||
| if [[ ${{ matrix.os }} == windows* ]] ; | ||
| then | ||
| if [[ ${{ matrix.python-version }} != "3.14" ]]; then | ||
| echo "CONDA_ENV_FILE=ci/requirements/environment-windows.yml" >> $GITHUB_ENV | ||
| else | ||
| echo "CONDA_ENV_FILE=ci/requirements/environment-windows-3.14.yml" >> $GITHUB_ENV | ||
| fi | ||
| elif [[ "${{ matrix.env }}" != "" ]] ; | ||
| if [[ "${{ matrix.pytest-adopts }}" != "" ]] ; | ||
| then | ||
| if [[ "${{ matrix.env }}" == "flaky" ]] ; | ||
| if [[ "${{ matrix.pytest-adopts }}" == "flaky" ]] ; | ||
| then | ||
| echo "CONDA_ENV_FILE=ci/requirements/environment.yml" >> $GITHUB_ENV | ||
| echo "PYTEST_ADDOPTS=-m 'flaky or network' --run-flaky --run-network-tests -W default" >> $GITHUB_ENV | ||
| elif [[ "${{ matrix.env }}" == "mypy" ]] ; | ||
| elif [[ "${{ matrix.pytest-adopts }}" == "mypy" ]] ; | ||
| then | ||
| echo "CONDA_ENV_FILE=ci/requirements/environment.yml" >> $GITHUB_ENV | ||
| echo "PYTEST_ADDOPTS=-n 1 -m 'mypy' --run-mypy -W default" >> $GITHUB_ENV | ||
| else | ||
| echo "CONDA_ENV_FILE=ci/requirements/${{ matrix.env }}.yml" >> $GITHUB_ENV | ||
| fi | ||
| if [[ "${{ matrix.env }}" == "min-all-deps" ]] ; | ||
| if [[ "${{ matrix.pixi-env }}" == "min-all-deps" ]] ; | ||
| then | ||
| # Don't raise on warnings | ||
| echo "PYTEST_ADDOPTS=-W default" >> $GITHUB_ENV | ||
| fi | ||
| else | ||
| if [[ ${{ matrix.python-version }} != "3.14" ]]; then | ||
| echo "CONDA_ENV_FILE=ci/requirements/environment.yml" >> $GITHUB_ENV | ||
| else | ||
| echo "CONDA_ENV_FILE=ci/requirements/environment-3.14.yml" >> $GITHUB_ENV | ||
| fi | ||
| fi | ||
|
|
||
| echo "PYTHON_VERSION=${{ matrix.python-version }}" >> $GITHUB_ENV | ||
|
|
||
| - name: Setup micromamba | ||
| uses: mamba-org/setup-micromamba@v2 | ||
| with: | ||
| environment-file: ${{ env.CONDA_ENV_FILE }} | ||
| environment-name: xarray-tests | ||
| cache-environment: true | ||
| cache-environment-key: "${{runner.os}}-${{runner.arch}}-py${{matrix.python-version}}-${{env.TODAY}}-${{hashFiles(env.CONDA_ENV_FILE)}}" | ||
| create-args: >- | ||
| python=${{matrix.python-version}} | ||
|
|
||
| # We only want to install this on one run, because otherwise we'll have | ||
| # duplicate annotations. | ||
| - name: Install error reporter | ||
| if: ${{ matrix.os }} == 'ubuntu-latest' and ${{ matrix.python-version }} == '3.12' | ||
| run: | | ||
| python -m pip install pytest-github-actions-annotate-failures | ||
|
|
||
| - name: Install xarray | ||
| if: ${{ matrix.os }} == 'ubuntu-latest' and ${{ matrix.pixi-env}} == 'test-all-deps-py313' | ||
| run: | | ||
| python -m pip install --no-deps -e . | ||
| pixi add --pypi pytest-github-actions-annotate-failures | ||
|
|
||
| - name: Version info | ||
| run: | | ||
| python xarray/util/print_versions.py | ||
| pixi run -e ${{ matrix.pixi-env }} python xarray/util/print_versions.py | ||
|
|
||
| - name: Import xarray | ||
| run: | | ||
| python -c "import xarray" | ||
| pixi run -e ${{ matrix.pixi-env }} python -c "import xarray" | ||
|
|
||
| - name: Restore cached hypothesis directory | ||
| uses: actions/cache@v4 | ||
|
|
@@ -159,7 +141,8 @@ jobs: | |
| save-always: true | ||
|
|
||
| - name: Run tests | ||
| run: python -m pytest -n ${{ matrix.numprocesses || 4 }} | ||
| run: | ||
VeckoTheGecko marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| pixi run -e ${{ matrix.pixi-env }} python -m pytest -n ${{ matrix.numprocesses || 4 }} | ||
| --timeout 180 | ||
| --cov=xarray | ||
| --cov-report=xml | ||
|
|
@@ -169,7 +152,7 @@ jobs: | |
| if: always() | ||
| uses: actions/upload-artifact@v5 | ||
| with: | ||
| name: Test results for ${{ runner.os }}-${{ matrix.python-version }} ${{ matrix.env }} | ||
| name: Test results for OS ${{ runner.os }} pixi-env -${{ matrix.pixi-env }} | ||
| path: pytest.xml | ||
|
|
||
| - name: Upload code coverage to Codecov | ||
|
|
@@ -179,7 +162,7 @@ jobs: | |
| with: | ||
| file: ./coverage.xml | ||
| flags: unittests | ||
| env_vars: RUNNER_OS,PYTHON_VERSION | ||
| env_vars: RUNNER_OS | ||
| name: codecov-umbrella | ||
| fail_ci_if_error: false | ||
|
|
||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -91,3 +91,7 @@ doc/videos-gallery.txt | |
| uv.lock | ||
| mypy_report/ | ||
| xarray-docs/ | ||
|
|
||
| # pixi environments | ||
| .pixi | ||
| pixi.lock | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| name: xarray-tests #! keep this file in sync with pixi.toml | ||
| channels: | ||
| - conda-forge | ||
| - nodefaults | ||
| dependencies: | ||
| - python=3.11 | ||
| - coveralls | ||
| - pip | ||
| - pytest | ||
| - pytest-asyncio | ||
| - pytest-cov | ||
| - pytest-env | ||
| - pytest-mypy-plugins | ||
| - pytest-timeout | ||
| - pytest-xdist | ||
| - numpy=1.26 | ||
| - packaging=24.1 | ||
| - pandas=2.2 |
2 changes: 1 addition & 1 deletion
2
ci/requirements/min-all-deps.yml → ci/requirement-linting/min-all-deps.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.