Showing preview only (1,622K chars total). Download the full file or copy to clipboard to get everything.
Repository: conda/conda-libmamba-solver
Branch: main
Commit: 6b2d3a41c654
Files: 128
Total size: 1.5 MB
Directory structure:
gitextract_zwz4fenl/
├── .authors.yml
├── .devcontainer/
│ ├── apt-deps.txt
│ ├── conda-forge/
│ │ └── devcontainer.json
│ ├── defaults/
│ │ └── devcontainer.json
│ ├── post_create.sh
│ └── post_start.sh
├── .flake8
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── 0_bug.yml
│ │ ├── 1_feature.yml
│ │ ├── 2_documentation.yml
│ │ └── epic.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── TEST_FAILURE_REPORT_TEMPLATE.md
│ ├── dependabot.yml
│ ├── disclaimer.txt
│ ├── labels.yml
│ ├── template-files/
│ │ ├── config.yml
│ │ └── templates/
│ │ ├── issue_template_details.yml
│ │ └── pull_request_template_details.md
│ └── workflows/
│ ├── builds-review.yaml
│ ├── cla.yml
│ ├── docs.yml
│ ├── issues.yml
│ ├── labels.yml
│ ├── lock.yml
│ ├── performance.yml
│ ├── project.yml
│ ├── stale.yml
│ ├── tests.yml
│ └── update.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── AUTHORS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── HOW_WE_USE_GITHUB.md
├── LICENSE
├── README.md
├── RELEASE.md
├── conda_libmamba_solver/
│ ├── __init__.py
│ ├── conda_build_exceptions.py
│ ├── exceptions.py
│ ├── index.py
│ ├── mamba_utils.py
│ ├── plugin.py
│ ├── repoquery.py
│ ├── shards.py
│ ├── shards_cache.py
│ ├── shards_subset.py
│ ├── shards_typing.py
│ ├── solver.py
│ ├── state.py
│ └── utils.py
├── dev/
│ ├── requirements.txt
│ └── scripts/
│ ├── BenchmarkChart.ipynb
│ ├── httpx-fetch-all-shards.py
│ └── requests-fetch-all-shards.py
├── docs/
│ ├── Makefile
│ ├── _static/
│ │ └── css/
│ │ └── custom.css
│ ├── _templates/
│ │ └── navbar_center.html
│ ├── conf.py
│ ├── dev/
│ │ ├── future-work.md
│ │ ├── implementation.md
│ │ ├── index.md
│ │ ├── performance-testing.md
│ │ ├── setup.md
│ │ ├── sharded.md
│ │ ├── shards_python.mmd
│ │ └── workflows.md
│ ├── environment.yml
│ ├── index.md
│ ├── robots.txt
│ └── user-guide/
│ ├── configuration.md
│ ├── faq.md
│ ├── index.md
│ ├── libmamba-vs-classic.md
│ ├── more-resources.md
│ ├── performance.md
│ └── subcommands.md
├── durations/
│ ├── Linux.json
│ ├── Windows.json
│ └── macOS.json
├── news/
│ └── TEMPLATE
├── pyproject.toml
├── recipe/
│ └── meta.yaml
├── rever.xsh
└── tests/
├── __init__.py
├── channel_testing/
│ ├── helpers.py
│ └── reposerver.py
├── conftest.py
├── data/
│ ├── conda_build_recipes/
│ │ ├── LICENSE
│ │ ├── baddeps/
│ │ │ └── meta.yaml
│ │ ├── jedi/
│ │ │ └── meta.yaml
│ │ ├── multioutput/
│ │ │ └── meta.yaml
│ │ └── stackvana/
│ │ └── meta.yaml
│ ├── lock_this_env.yml
│ └── mamba_repo/
│ ├── LICENSE
│ ├── channeldata.json
│ ├── index.html
│ ├── noarch/
│ │ ├── current_repodata.json
│ │ ├── current_repodata.json.bz2
│ │ ├── index.html
│ │ ├── repodata.json
│ │ ├── repodata.json.bz2
│ │ ├── repodata_from_packages.json
│ │ ├── repodata_from_packages.json.bz2
│ │ └── test-package-0.1-0.tar.bz2
│ └── recipes/
│ └── test-package/
│ └── meta.yaml
├── http_test_server.py
├── repodata_time_machine.py
├── requirements.txt
├── run_in_profiler.py
├── test_channels.py
├── test_downstream.py
├── test_experimental.py
├── test_index.py
├── test_performance.py
├── test_plugin.py
├── test_repoquery.py
├── test_shards.py
├── test_shards_subset.py
├── test_solver.py
├── test_solver_differences.py
├── test_user_agent.py
├── test_workarounds.py
└── utils.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .authors.yml
================================================
- name: Jaime Rodríguez-Guerra
email: jaimergp@users.noreply.github.com
aliases:
- jaimergp
num_commits: 174
first_commit: 2022-01-31 17:24:37
github: jaimergp
- name: Jannis Leidel
email: jannis@leidel.info
num_commits: 43
first_commit: 2022-02-17 14:48:48
github: jezdez
- name: pre-commit-ci[bot]
email: 66853113+pre-commit-ci[bot]@users.noreply.github.com
num_commits: 112
first_commit: 2022-11-22 08:39:31
github: pre-commit-ci[bot]
- name: Christopher Ostrouchov
email: chris.ostrouchov@gmail.com
num_commits: 10
first_commit: 2023-01-24 15:12:29
github: costrouc
- name: Daniel Holth
email: dholth@anaconda.com
num_commits: 32
first_commit: 2022-10-19 21:11:39
github: dholth
- name: Matthew R. Becker
email: beckermr@users.noreply.github.com
num_commits: 1
first_commit: 2022-01-19 18:26:25
github: beckermr
- name: conda-bot
email: 18747875+conda-bot@users.noreply.github.com
aliases:
- Conda Bot
num_commits: 103
first_commit: 2022-11-15 16:45:31
github: conda-bot
- name: Ken Odegard
email: kodegard@anaconda.com
num_commits: 10
first_commit: 2022-03-04 23:25:33
github: kenodegard
- name: Albert DeFusco
email: albert.defusco+gh@me.com
num_commits: 1
first_commit: 2023-03-01 13:29:51
github: AlbertDeFusco
- name: John Kirkham
github: jakirkham
email: jakirkham@gmail.com
num_commits: 1
first_commit: 2023-04-18 12:42:06
- name: Travis Hathaway
email: travis.j.hathaway@gmail.com
num_commits: 8
first_commit: 2023-11-10 15:58:32
github: travishathaway
- name: Klaus Zimmermann
email: klaus.zimmermann@quansight.com
num_commits: 1
first_commit: 2024-06-11 10:52:46
- name: Thomas Lam
email: 79589038+tl-hbk@users.noreply.github.com
num_commits: 1
first_commit: 2024-03-19 14:05:09
github: tl-hbk
- name: dependabot[bot]
email: 49699333+dependabot[bot]@users.noreply.github.com
num_commits: 26
first_commit: 2024-07-22 19:11:59
github: dependabot[bot]
- name: Jonathan J. Helmus
email: jjhelmus@gmail.com
num_commits: 4
first_commit: 2024-09-20 12:11:32
github: jjhelmus
- name: Kevin Markham
email: justmarkham@users.noreply.github.com
num_commits: 1
first_commit: 2024-08-12 11:49:20
github: justmarkham
- name: Julien Jerphanion
email: git@jjerphan.xyz
github: jjerphan
num_commits: 1
first_commit: 2025-03-05 00:42:28
- name: Agriya Khetarpal
email: 74401230+agriyakhetarpal@users.noreply.github.com
github: agriyakhetarpal
num_commits: 1
first_commit: 2025-10-16 17:26:43
- name: Stacy Noland
email: 46572585+stacynoland@users.noreply.github.com
github: stacynoland
num_commits: 1
first_commit: 2025-11-24 12:33:24
- name: Ryan Keith
email: rkeith@anaconda.com
num_commits: 1
first_commit: 2025-12-11 16:50:18
github: ryanskeith
- name: Sophia Castellarin
email: scastellarin@openteams.com
num_commits: 1
first_commit: 2026-01-07 03:17:00
github: soapy1
- name: John Costa
email: costajohnt@gmail.com
github: costajohnt
num_commits: 1
first_commit: 2026-04-27 03:34:42
- name: Dan Yeaw
email: dan@yeaw.me
num_commits: 1
first_commit: 2026-05-01 18:41:55
================================================
FILE: .devcontainer/apt-deps.txt
================================================
git
less
htop
nano
ssh
================================================
FILE: .devcontainer/conda-forge/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
{
"name": "Miniforge (default-channel=conda-forge)",
"image": "condaforge/miniforge3:latest",
// Uncomment to force x64 instead of native (slower!)
// "runArgs": ["--platform=linux/amd64"],
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
"mounts": [
"source=${localWorkspaceFolder}/../conda,target=/workspaces/conda,type=bind,consistency=cached",
"source=${localWorkspaceFolder}/../mamba,target=/workspaces/mamba,type=bind,consistency=cached"
],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh conda-forge",
// Use 'postStartCommand' to run commands after the container is started.
"postStartCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh",
// Configure tool-specific properties.
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "/opt/conda/bin/python",
"python.testing.pytestArgs": [
"tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
},
"extensions": [
"charliermarsh.ruff",
"eamodio.gitlens",
"ms-toolsai.jupyter",
"be5invis.toml"
]
}
}
// Adjust to connect as non-root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root",
}
================================================
FILE: .devcontainer/defaults/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json
{
"name": "Miniconda (default-channel=defaults)",
"image": "continuumio/miniconda3:latest",
// Uncomment to force x64 instead of native (slower!)
// "runArgs": ["--platform=linux/amd64"],
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
"mounts": [
"source=${localWorkspaceFolder}/../conda,target=/workspaces/conda,type=bind,consistency=cached",
"source=${localWorkspaceFolder}/../mamba,target=/workspaces/mamba,type=bind,consistency=cached"
],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh defaults",
// Use 'postStartCommand' to run commands after the container is started.
"postStartCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh defaults",
// Configure tool-specific properties.
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "/opt/conda/bin/python",
"python.testing.pytestArgs": [
"tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
},
"extensions": [
"charliermarsh.ruff",
"eamodio.gitlens",
"ms-toolsai.jupyter",
"be5invis.toml"
]
}
}
// Adjust to connect as non-root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root",
}
================================================
FILE: .devcontainer/post_create.sh
================================================
#!/bin/bash
# This script assumes we are running in a Miniconda container where:
# - /opt/conda is the Miniconda or Miniforge installation directory
# - https://github.com/conda/conda is mounted at /workspaces/conda
# - https://github.com/conda/conda-libmamba-solver is mounted at
# /workspaces/conda-libmamba-solver
# - https://github.com/mamba-org/mamba is (optionally) mounted at
# /workspaces/mamba
set -euo pipefail
HERE=$(dirname $0)
BASE_CONDA=${BASE_CONDA:-/opt/conda}
SRC_CONDA=${SRC_CONDA:-/workspaces/conda}
SRC_CONDA_LIBMAMBA_SOLVER=${SRC_CONDA_LIBMAMBA_SOLVER:-/workspaces/conda-libmamba-solver}
if which apt-get > /dev/null; then
echo "Installing system dependencies"
apt-get update
DEBIAN_FRONTEND=noninteractive xargs -a "$HERE/apt-deps.txt" apt-get install -y
fi
if [ ! -f "$SRC_CONDA/pyproject.toml" ]; then
echo "https://github.com/conda/conda not found! Please clone or mount to $SRC_CONDA"
exit 1
fi
# Clear history to avoid unneeded conflicts
echo "Clearing base history..."
echo '' > "$BASE_CONDA/conda-meta/history"
echo "Setting default channel..."
"$BASE_CONDA/bin/conda" config --append channels $1
echo "Installing dev & test dependencies..."
"$BASE_CONDA/bin/conda" install -n base -c $1 --yes \
--file="$SRC_CONDA/tests/requirements.txt" \
--file="$SRC_CONDA/tests/requirements-ci.txt" \
--file="$SRC_CONDA/tests/requirements-Linux.txt" \
--file="$SRC_CONDA/tests/requirements-s3.txt" \
--file="$SRC_CONDA_LIBMAMBA_SOLVER/dev/requirements.txt" \
--file="$SRC_CONDA_LIBMAMBA_SOLVER/tests/requirements.txt" \
conda-forge::editables \
conda-pypi \
pre-commit
================================================
FILE: .devcontainer/post_start.sh
================================================
#!/bin/bash
# This script assumes we are running in a Miniconda container where:
# - /opt/conda is the Miniconda or Miniforge installation directory
# - https://github.com/conda/conda is mounted at /workspaces/conda
# - https://github.com/conda/conda-libmamba-solver is mounted at
# /workspaces/conda-libmamba-solver
# - https://github.com/mamba-org/mamba is (optionally) mounted at
# /workspaces/mamba
set -euo pipefail
BASE_CONDA=${BASE_CONDA:-/opt/conda}
SRC_CONDA=${SRC_CONDA:-/workspaces/conda}
SRC_CONDA_LIBMAMBA_SOLVER=${SRC_CONDA_LIBMAMBA_SOLVER:-/workspaces/conda-libmamba-solver}
SRC_MAMBA=${SRC_MAMBA:-/workspaces/mamba}
cat >> ~/.bashrc <<EOF
function develop-mamba() (
# Runs in a subshell to avoid polluting the current shell
set -euo pipefail
if ! conda config --show channels | grep -q conda-forge; then
echo "Miniconda not compatible with develop-mamba"
exit 1
fi
if [ ! -f "$SRC_MAMBA/libmamba/CMakeLists.txt" ]; then
echo "Could not find mamba-org/mamba at $SRC_MAMBA"
exit 1
fi
if [ -f "$SRC_MAMBA/mamba/setup.py" ]; then
echo "Mamba 1.x found at $SRC_MAMBA"
mamba_version=1
environment_yaml="$SRC_MAMBA/mamba/environment-dev.yml"
else
echo "Mamba 2.x found at $SRC_MAMBA"
environment_yaml="$SRC_MAMBA/dev/environment-dev.yml"
mamba_version=2
fi
# Install mamba dev dependencies only once:
if [ ! -f ~/.mamba-develop-installed ]; then
# remove "sel(win)" in environment yaml hack since conda does not understand
# libmamba specific specs
sed '/sel(.*)/d' "\$environment_yaml" > /tmp/mamba-environment-dev.yml
# Environment.yml is missing make
echo " - make" >> /tmp/mamba-environment-dev.yml
"$BASE_CONDA/condabin/conda" env update \
--quiet \
--prefix "$BASE_CONDA" \
--file /tmp/mamba-environment-dev.yml
# Clean build directory to avoid issues with stale build files
test -f "$SRC_MAMBA/build/CMakeCache.txt" && rm -rf "$SRC_MAMBA/build"
fi
# Compile
cd "$SRC_MAMBA"
"$BASE_CONDA/bin/cmake" -B build/ \
-DBUILD_LIBMAMBA=ON \
-DBUILD_SHARED=ON \
-DCMAKE_INSTALL_PREFIX="$BASE_CONDA" \
-DCMAKE_PREFIX_PATH="$BASE_CONDA" \
-DBUILD_LIBMAMBAPY=ON
"$BASE_CONDA/bin/cmake" --build build/ -j\${NPROC:-2}
if [ ! -f ~/.mamba-develop-installed ]; then
"$BASE_CONDA/condabin/conda" remove -p "$BASE_CONDA" -yq --force libmambapy libmamba
fi
make install -C build/
cd -
"$BASE_CONDA/bin/pip" install -e "$SRC_MAMBA/libmambapy/" --no-deps
if [ "\$mamba_version" == "1" ]; then
test -f "$BASE_CONDA/conda-meta/mamba-"*".json" && "$BASE_CONDA/bin/pip" install -e "$SRC_MAMBA/mamba/" --no-deps
else
echo "Mamba binary installation not supported yet"
fi
touch ~/.mamba-develop-installed || true
)
EOF
cd "$SRC_CONDA"
echo "Initializing conda in dev mode..."
"$BASE_CONDA/bin/python" -m conda init --dev bash
cd -
echo "Installing conda-libmamba-solver in dev mode..."
"$BASE_CONDA/bin/conda" pypi install -e "$SRC_CONDA_LIBMAMBA_SOLVER"
set -x
conda list -p "$BASE_CONDA"
conda info
conda config --show-sources
set +x
echo "Source ~/.bashrc and run develop-mamba() for dev-install; mamba at $SRC_MAMBA"
================================================
FILE: .flake8
================================================
[flake8]
max-line-length = 99
ignore = E126,E133,E226,E241,E242,E302,E704,E731,E722,W503,E402,W504,F821,E203
exclude = tests/*,conda_libmamba_solver/mamba_utils.py
================================================
FILE: .github/CODEOWNERS
================================================
# Syntax for this file at https://help.github.com/articles/about-codeowners/
* @conda/conda-maintainers
================================================
FILE: .github/ISSUE_TEMPLATE/0_bug.yml
================================================
# edit this in https://github.com/conda/infrastructure
name: Bug Report
description: Create a bug report.
labels:
- type::bug
body:
- type: markdown
attributes:
value: |
Because processing new bug reports is time-consuming, we would like to ask you to fill out the following form to the best of your ability and as completely as possible.
> [!NOTE]
> Bug reports that are incomplete or missing information may be closed as inactionable.
Since there are already a lot of open issues, please also take a moment to search existing ones to see if your bug has already been reported. If you find something related, please upvote that issue and provide additional details as necessary.
💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community!
- type: checkboxes
id: checks
attributes:
label: Checklist
description: Please confirm and check all of the following options.
options:
- label: I added a descriptive title
required: true
- label: I searched open reports and couldn't find a duplicate
required: true
- type: textarea
id: what
attributes:
label: What happened?
description: What should have happened instead? Please provide as many details as possible. The more information provided, the more likely we are able to replicate your problem and offer a solution.
validations:
required: true
- type: textarea
id: info
attributes:
label: Conda Info
description: |
Let's collect some basic information about your conda install.
Please run the following command from your command line and paste the output below.
```bash
conda info
```
render: shell
- type: textarea
id: config
attributes:
label: Conda Config
description: |
Let's collect any customizations you may have for your conda install.
Please run the following command from your command line and paste the output below.
```bash
conda config --show-sources
```
render: shell
- type: textarea
id: list
attributes:
label: Conda list
description: |
The packages installed into your environment can offer clues as to the problem you are facing.
Please activate the environment within which you are encountering this bug, run the following command from your command line, and paste the output below.
```bash
conda list --show-channel-urls
```
render: shell
- type: textarea
id: context
attributes:
label: Additional Context
description: Include any additional information (or screenshots) that you think would be valuable.
================================================
FILE: .github/ISSUE_TEMPLATE/1_feature.yml
================================================
# edit this in https://github.com/conda/infrastructure
name: Feature Request
description: Create a feature request.
labels:
- type::feature
body:
- type: markdown
attributes:
value: |
Because processing new feature requests is time-consuming, we would like to ask you to fill out the following form to the best of your ability and as completely as possible.
> [!NOTE]
> Feature requests that are incomplete or missing information may be closed as inactionable.
Since there are already a lot of open issues, please also take a moment to search existing ones to see if your feature request has already been submitted. If you find something related, please upvote that issue and provide additional details as necessary.
💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community!
- type: checkboxes
id: checks
attributes:
label: Checklist
description: Please confirm and check all of the following options.
options:
- label: I added a descriptive title
required: true
- label: I searched open requests and couldn't find a duplicate
required: true
- type: textarea
id: idea
attributes:
label: What is the idea?
description: Describe what the feature is and the desired state.
validations:
required: true
- type: textarea
id: why
attributes:
label: Why is this needed?
description: Who would benefit from this feature? Why would this add value to them? What problem does this solve?
- type: textarea
id: what
attributes:
label: What should happen?
description: What should be the user experience with the feature? Describe from a user perspective what they would do and see.
- type: textarea
id: context
attributes:
label: Additional Context
description: Include any additional information that you think would be valuable.
================================================
FILE: .github/ISSUE_TEMPLATE/2_documentation.yml
================================================
# edit this in https://github.com/conda/infrastructure
name: Documentation
description: Create a documentation related issue.
labels:
- type::documentation
body:
- type: markdown
attributes:
value: |
> [!NOTE]
> Documentation requests that are incomplete or missing information may be closed as inactionable.
Since there are already a lot of open issues, please also take a moment to search existing ones to see if your bug has already been reported. If you find something related, please upvote that issue and provide additional details as necessary.
💐 Thank you for helping to make conda better. We would be unable to improve conda without our community!
- type: checkboxes
id: checks
attributes:
label: Checklist
description: Please confirm and check all of the following options.
options:
- label: I added a descriptive title
required: true
- label: I searched open reports and couldn't find a duplicate
required: true
- type: textarea
id: what
attributes:
label: What happened?
description: Mention here any typos, broken links, or missing, incomplete, or outdated information, etc. that you have noticed in the conda docs or CLI help.
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional Context
description: Include any additional information (or screenshots) that you think would be valuable.
================================================
FILE: .github/ISSUE_TEMPLATE/epic.yml
================================================
# edit this in https://github.com/conda/infrastructure
name: Epic
description: A collection of related tickets.
labels:
- epic
body:
- type: markdown
attributes:
value: |
This form is intended for grouping and collecting together related tickets to better gauge the scope of a problem/feature.
If you are attempting to report a bug, propose a new feature, or some other code change please use one of the other forms available.
> [!NOTE]
> Epics that are incomplete or missing information may be closed as inactionable.
Since there are already a lot of open issues, please also take a moment to search existing ones to see if a similar epic has already been opened. If you find something related, please upvote that issue and provide additional details as necessary.
💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community!
- type: checkboxes
id: checks
attributes:
label: Checklist
description: Please confirm and check all of the following options.
options:
- label: I added a descriptive title
required: true
- label: I searched open issues and couldn't find a duplicate
required: true
- type: textarea
id: what
attributes:
label: What?
description: >-
What feature or problem will be addressed in this epic?
placeholder: Please describe here.
validations:
required: true
- type: textarea
id: why
attributes:
label: Why?
description: >-
Why is the reported issue(s) a problem, or why is the proposed feature needed?
(Research and spike issues can be linked here.)
value: |
- [ ] <supporting issue from user, research, or spike>
placeholder: Please describe here and/or link to relevant supporting issues.
validations:
required: true
- type: textarea
id: user_impact
attributes:
label: User impact
description: >-
In what specific way(s) will users benefit from this change? (e.g. use cases or performance improvements)
placeholder: Please describe here.
validations:
required: true
- type: textarea
id: goals
attributes:
label: Goals
description: >-
What goal(s) should this epic accomplish?
value: |
- [ ] <goal>
validations:
required: true
- type: textarea
id: tasks
attributes:
label: Tasks
description: >-
What needs to be done to implement this change?
value: |
- [ ] <task or PR>
validations:
required: false
- type: textarea
id: blocked_by
attributes:
label: 'This epic is blocked by:'
description: >-
Epics and issues that block this epic.
value: |
- [ ] <dependency epic or issue>
validations:
required: false
- type: textarea
id: blocks
attributes:
label: 'This epic blocks:'
description: >-
Epics and issues that are blocked by this epic.
value: |
- [ ] <dependency epic or issue>
validations:
required: false
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- Hello! Thanks for submitting a PR! To help make things go a bit more
smoothly, we would appreciate it if you follow this template. -->
### Description
<!-- Good things to put here include:
- reasons for the change (please link any relevant issues!),
- any noteworthy (or hacky) choices to be aware of,
- or what the problem resolved here looked like. -->
### Checklist - did you ...
<!-- If any of the following items aren't relevant to your contribution,
please either tick them or use ~strikethrough~ so we know you've gone
through the checklist. -->
- [ ] Add a file to the `news` directory ([using the template](https://github.com/conda/conda-libmamba-solver/blob/main/news/TEMPLATE)) for the next release's release notes?
<!-- All "significant" changes should get an entry:
- user-facing changes or enhancements
- bug fixes
- deprecations
- documentation updates
- etc -->
- [ ] Add / update necessary tests?
- [ ] Add / update outdated documentation?
<!-- Just as a reminder, everyone in all conda org spaces (including PRs)
must follow the Conda Org Code of Conduct (link below).
Finally, once again, thanks for your time and effort. If you have any
feedback in regards to your experience contributing here, please
let us know!
Helpful links:
- Conda Org COC: https://github.com/conda/conda-libmamba-solver/blob/main/CODE_OF_CONDUCT.md
- Contributing docs: https://github.com/conda/conda-libmamba-solver/blob/main/CONTRIBUTING.md -->
================================================
FILE: .github/TEST_FAILURE_REPORT_TEMPLATE.md
================================================
---
title: "{{ env.TITLE }}"
labels: [type::bug, type::testing]
---
The {{ workflow }} workflow failed on {{ date | date("YYYY-MM-DD HH:mm") }} UTC
Full run: https://github.com/conda/conda-libmamba-solver/actions/runs/{{ env.RUN_ID }}
(This post will be updated if another test fails, as long as this issue remains open.)
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
github-actions:
patterns:
- '*'
================================================
FILE: .github/disclaimer.txt
================================================
Copyright (C) 2022 Anaconda, Inc
Copyright (C) 2023 conda
SPDX-License-Identifier: BSD-3-Clause
================================================
FILE: .github/labels.yml
================================================
# Builds
- name: build::review
description: trigger a build for this PR
color: "7B4052"
================================================
FILE: .github/template-files/config.yml
================================================
conda/governance:
# [required] community files
- CODE_OF_CONDUCT.md
conda/conda:
# issue template details for templates/issues/bug.yml template
- .github/template-files/templates/issue_template_details.yml
conda/infrastructure:
# [required] general workflows
- .github/workflows/cla.yml
- .github/workflows/update.yml
# [optional] to include repo in https://github.com/orgs/conda/projects/2
- .github/workflows/issues.yml
- .github/workflows/labels.yml
- .github/workflows/project.yml
# [optional] stale bot workflows
- .github/workflows/stale.yml
- .github/workflows/lock.yml
# [optional] general processes for the conda org
- src: templates/HOW_WE_USE_GITHUB.md
dst: HOW_WE_USE_GITHUB.md
# [optional] standard issue templates
- src: templates/issues/bug.yml
dst: .github/ISSUE_TEMPLATE/0_bug.yml
- src: templates/issues/feature.yml
dst: .github/ISSUE_TEMPLATE/1_feature.yml
- src: templates/issues/documentation.yml
dst: .github/ISSUE_TEMPLATE/2_documentation.yml
- src: templates/issues/epic.yml
dst: .github/ISSUE_TEMPLATE/epic.yml
# [optional] standard PR template
- src: templates/pull_requests/news_tests_docs.md
dst: .github/template-files/templates/pull_request_template_details.md
- src: templates/pull_requests/base.md
dst: .github/PULL_REQUEST_TEMPLATE.md
# [optional] rever release files
- src: templates/releases/RELEASE.md
dst: RELEASE.md
with:
canary_channel: https://anaconda.org/conda-canary
placeholder: YY.MM.MICRO
placeholder_x: YY.MM.x
- src: templates/releases/rever.xsh
dst: rever.xsh
- src: templates/releases/TEMPLATE
dst: news/TEMPLATE
================================================
FILE: .github/template-files/templates/issue_template_details.yml
================================================
- type: textarea
id: info
attributes:
label: Conda Info
description: |
Let's collect some basic information about your conda install.
Please run the following command from your command line and paste the output below.
```bash
conda info
```
render: shell
- type: textarea
id: config
attributes:
label: Conda Config
description: |
Let's collect any customizations you may have for your conda install.
Please run the following command from your command line and paste the output below.
```bash
conda config --show-sources
```
render: shell
- type: textarea
id: list
attributes:
label: Conda list
description: |
The packages installed into your environment can offer clues as to the problem you are facing.
Please activate the environment within which you are encountering this bug, run the following command from your command line, and paste the output below.
```bash
conda list --show-channel-urls
```
render: shell
================================================
FILE: .github/template-files/templates/pull_request_template_details.md
================================================
### Checklist - did you ...
<!-- If any of the following items aren't relevant to your contribution,
please either tick them or use ~strikethrough~ so we know you've gone
through the checklist. -->
- [ ] Add a file to the `news` directory ([using the template](https://github.com/conda/conda-libmamba-solver/blob/main/news/TEMPLATE)) for the next release's release notes?
<!-- All "significant" changes should get an entry:
- user-facing changes or enhancements
- bug fixes
- deprecations
- documentation updates
- etc -->
- [ ] Add / update necessary tests?
- [ ] Add / update outdated documentation?
================================================
FILE: .github/workflows/builds-review.yaml
================================================
name: Review builds
on:
pull_request:
types:
- labeled
jobs:
build:
if: |
github.event_name == 'pull_request' &&
github.event.label.name == 'build::review'
strategy:
matrix:
include:
- runner: ubuntu-latest
subdir: noarch
runs-on: ${{ matrix.runner }}
steps:
- name: Remove build label
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{ secrets.CANARY_ACTION_TOKEN }}
script: |
const { data: pullRequest } = await github.rest.pulls.get({
...context.repo,
pull_number: context.issue.number,
})
const buildLabel = '${{ github.event.label.name }}'
const labels = pullRequest.labels.map(label => label.name)
const hasBuildLabel = labels.includes(buildLabel)
if (hasBuildLabel) {
await github.rest.issues.removeLabel({
...context.repo,
issue_number: context.issue.number,
name: buildLabel,
})
}
# Clean checkout of specific git ref needed for package metadata version
# which needs env vars GIT_DESCRIBE_TAG and GIT_BUILD_STR:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.ref }}
clean: true
fetch-depth: 0
- name: Create and upload review build
uses: conda/actions/canary-release@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0
with:
package-name: conda-libmamba-solver
subdir: ${{ matrix.subdir }}
anaconda-org-channel: conda-canary
anaconda-org-label: '${{ github.event.repository.name }}-pr-${{ github.event.number }}'
anaconda-org-token: ${{ secrets.ANACONDA_ORG_CONDA_CANARY_TOKEN }}
comment-headline: 'Review build status'
comment-token: ${{ secrets.CANARY_ACTION_TOKEN }}
conda-build-arguments: '--override-channels -c conda-forge/label/mamba_dev -c conda-forge'
================================================
FILE: .github/workflows/cla.yml
================================================
name: CLA
on:
issue_comment:
types:
- created
pull_request_target:
jobs:
check:
if: >-
!github.event.repository.fork
&& (
github.event.issue.pull_request
&& github.event.comment.body == '@conda-bot check'
|| github.event_name == 'pull_request_target'
)
runs-on: ubuntu-slim
steps:
- name: Check CLA
uses: conda/actions/check-cla@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0
with:
# [required]
# A token with ability to comment, label, and modify the commit status
# (`pull_request: write` and `statuses: write` for fine-grained PAT; `repo` for classic PAT)
# (default: secrets.GITHUB_TOKEN)
token: ${{ secrets.CLA_ACTION_TOKEN }}
# [required]
# Label to apply to contributor's PR once CLA is signed
label: cla-signed
# [required]
# Token for opening signee PR in the provided `cla_repo`
# (`pull_request: write` for fine-grained PAT; `repo` and `workflow` for classic PAT)
cla_token: ${{ secrets.CLA_FORK_TOKEN }}
================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs
on:
# Runs on pushes targeting the default branch
push:
branches: ["main"]
pull_request:
paths:
- "docs/**"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Allow one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true
jobs:
docs:
runs-on: ubuntu-latest
defaults:
run:
shell: bash -el {0}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
with:
activate-environment: conda-libmamba-solver
environment-file: docs/environment.yml
python-version: '3.11'
auto-activate-base: false
- name: Build Documentation
run: |
cd docs
make dirhtml
- name: Upload artifact
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
with:
# Upload entire repository
path: 'docs/_build/dirhtml'
pages:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
needs: [docs]
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
================================================
FILE: .github/workflows/issues.yml
================================================
name: Automate Issues
on:
# NOTE: github.event is issue_comment payload:
# https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#issue_comment
issue_comment:
types: [created]
env:
FEEDBACK_LBL: pending::feedback
SUPPORT_LBL: pending::support
jobs:
# NOTE: will update label if anyone responds, not just the author/reporter
# TODO: create conda-issue-sorting team and modify this to toggle label based on
# whether a non-issue-sorting engineer commented
pending_support:
# if [pending::feedback] and anyone responds
if: >-
!github.event.repository.fork
&& !github.event.issue.pull_request
&& contains(github.event.issue.labels.*.name, 'pending::feedback')
runs-on: ubuntu-slim
steps:
# remove [pending::feedback]
- uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0
with:
labels: ${{ env.FEEDBACK_LBL }}
github_token: ${{ secrets.PROJECT_TOKEN }}
# add [pending::support], if still open
- uses: actions-ecosystem/action-add-labels@18f1af5e3544586314bbe15c0273249c770b2daf # v1.1.3
if: github.event.issue.state == 'open'
with:
labels: ${{ env.SUPPORT_LBL }}
github_token: ${{ secrets.PROJECT_TOKEN }}
================================================
FILE: .github/workflows/labels.yml
================================================
name: Sync Labels
on:
# NOTE: github.event is workflow_dispatch payload:
# https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch
workflow_dispatch:
inputs:
delete-unmapped:
description: Delete labels not mapped in either global or local label configurations.
default: false
type: boolean
dry-run:
description: Run label synchronization workflow without making any changes.
default: false
type: boolean
jobs:
sync:
if: '!github.event.repository.fork'
runs-on: ubuntu-slim
env:
GLOBAL: https://raw.githubusercontent.com/conda/infra/main/.github/global.yml
LOCAL: .github/labels.yml
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- id: has_local
uses: andstor/file-existence-action@558493d6c74bf472d87c84eab196434afc2fa029 # v3.1.0
with:
files: ${{ env.LOCAL }}
- name: Global Only
uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3
if: steps.has_local.outputs.files_exists == 'false'
with:
config-file: ${{ env.GLOBAL }}
delete-other-labels: ${{ inputs.delete-unmapped }}
dry-run: ${{ inputs.dry-run }}
- name: Global & Local
uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3
if: steps.has_local.outputs.files_exists == 'true'
with:
config-file: |
${{ env.GLOBAL }}
${{ env.LOCAL }}
delete-other-labels: ${{ inputs.delete-unmapped }}
dry-run: ${{ inputs.dry-run }}
================================================
FILE: .github/workflows/lock.yml
================================================
name: Lock
on:
# NOTE: github.event is workflow_dispatch payload:
# https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch
workflow_dispatch:
schedule:
- cron: 0 6 * * *
permissions:
issues: write
pull-requests: write
jobs:
lock:
if: '!github.event.repository.fork'
runs-on: ubuntu-slim
steps:
- uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0
with:
# Number of days of inactivity before a closed issue is locked
issue-inactive-days: 180
# Do not lock issues created before a given timestamp, value must follow ISO 8601
exclude-issue-created-before: ''
# Do not lock issues with these labels, value must be a comma separated list of labels or ''
exclude-any-issue-labels: ''
# Labels to add before locking an issue, value must be a comma separated list of labels or ''
add-issue-labels: locked
# Reason for locking an issue, value must be one of resolved, off-topic, too heated, spam or ''
issue-lock-reason: resolved
# Number of days of inactivity before a closed pull request is locked
pr-inactive-days: 365
# Do not lock pull requests created before a given timestamp, value must follow ISO 8601
exclude-pr-created-before: ''
# Do not lock pull requests with these labels, value must be a comma separated list of labels or ''
exclude-any-pr-labels: ''
# Labels to add before locking a pull request, value must be a comma separated list of labels or ''
add-pr-labels: locked
# Reason for locking a pull request, value must be one of resolved, off-topic, too heated, spam or ''
pr-lock-reason: resolved
# Limit locking to issues, pull requests or discussions, value must be a comma separated list of issues, prs, discussions or ''
process-only: issues, prs
================================================
FILE: .github/workflows/performance.yml
================================================
name: Performance
on:
pull_request:
types:
- labeled
workflow_run:
workflows:
- CI
branches:
- main
types:
- completed
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CONDA_SOLVER: libmamba
jobs:
linux:
if: |
(github.event_name == 'pull_request' &&
github.event.label.name == 'performance::run') ||
(github.event.workflow_run.conclusion == 'success')
name: Linux, Python ${{ matrix.python-version }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9"]
env:
OS: "linux"
PYTHON: ${{ matrix.python-version }}
steps:
- name: Checkout our source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: conda-libmamba-solver
fetch-depth: 0
- name: Checkout conda
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
repository: conda/conda
path: conda
- name: Run performance tests
run: >
docker run
--rm
-v ${GITHUB_WORKSPACE}/conda:/opt/conda-src
-v ${GITHUB_WORKSPACE}/conda-libmamba-solver:/opt/conda-libmamba-solver-src
-e TEST_SPLITS
-e TEST_GROUP
-e CONDA_SOLVER
ghcr.io/conda/conda-ci:main-linux-python${{ matrix.python-version }}
bash -c "sudo /opt/conda/condabin/conda install -p /opt/conda \
--file /opt/conda-libmamba-solver-src/dev/requirements.txt &&
/opt/conda/bin/python -m pip install /opt/conda-libmamba-solver-src \
--no-deps -vvv &&
source /opt/conda-src/dev/linux/bashrc.sh &&
/opt/conda/bin/python -m pytest /opt/conda-libmamba-solver-src \
-vv --durations=0 --timeout=1800 -m 'slow'"
macos:
if: |
(github.event_name == 'pull_request' &&
github.event.label.name == 'performance::run') ||
(github.event.workflow_run.conclusion == 'success')
name: MacOS, Python ${{ matrix.python-version }}
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9"]
env:
OS: "macos"
PYTHON: ${{ matrix.python-version }}
steps:
- name: Checkout our source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: conda-libmamba-solver
fetch-depth: 0
- name: Checkout conda
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
repository: conda/conda
ref: libmamba
path: conda
- uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
with:
activate-environment: conda-test-env
use-only-tar-bz2: true # IMPORTANT: This needs to be set for caching to work properly!
- name: Setup environment
shell: bash -l {0}
working-directory: conda
run: |
set -euxo pipefail
# restoring the default for changeps1 to have parity with dev
conda config --set changeps1 true
# make sure the caching works correctly
conda config --set use_only_tar_bz2 true
# install all test requirements
conda install --yes \
--file tests/requirements.txt \
--file ../conda-libmamba-solver/dev/requirements.txt \
python=${{ matrix.python-version }}
conda update openssl ca-certificates certifi
conda info
python -c "from mamba import __version__; print('mamba', __version__)"
- name: Install conda-libmamba-solver
shell: bash -l {0}
working-directory: conda-libmamba-solver
run: |
python -m pip install . -vv --no-deps
- name: Run performance tests
shell: bash -l {0}
working-directory: conda
run: |
eval "$(sudo ${CONDA_PREFIX}/bin/python -m conda init bash --dev)"
python -m pytest ${GITHUB_WORKSPACE}/conda-libmamba-solver -vv --durations=0 --timeout=1800 -m "slow"
windows:
if: |
(github.event_name == 'pull_request' &&
github.event.label.name == 'performance::run') ||
(github.event.workflow_run.conclusion == 'success')
name: Windows, Python ${{ matrix.python-version }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9"]
env:
OS: "windows"
PYTHON: ${{ matrix.python-version }}
steps:
- name: Checkout our source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: conda-libmamba-solver
fetch-depth: 0
- name: Checkout conda
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
repository: conda/conda
ref: libmamba
path: conda
- name: Set temp dirs correctly
# https://github.com/actions/virtual-environments/issues/712
run: |
echo "TMPDIR=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV
echo "TEMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV
echo "TMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV
- name: Setup environment
shell: cmd
working-directory: conda
run: |
:: add mamba to requirements
type ..\conda-libmamba-solver\dev\requirements.txt >> .\tests\requirements.txt
if errorlevel 1 exit 1
:: initialize conda dev
call .\dev\windows\setup.bat
if errorlevel 1 exit 1
call .\dev-init.bat
if errorlevel 1 exit 1
python -c "from mamba import __version__; print('mamba', __version__)"
if errorlevel 1 exit 1
conda info -a
if errorlevel 1 exit 1
- name: Install conda-libmamba-solver
shell: cmd
working-directory: conda
run: |
call .\dev-init.bat
if errorlevel 1 exit 1
python -m pip install --no-deps -vv "%GITHUB_WORKSPACE%\conda-libmamba-solver"
if errorlevel 1 exit 1
- name: Run performance tests
shell: cmd
working-directory: conda
run: |
CALL dev-init.bat
if errorlevel 1 exit 1
python -m pytest "%GITHUB_WORKSPACE%\conda-libmamba-solver" -vv --durations=0 --timeout=1800 -m "slow"
if errorlevel 1 exit 1
================================================
FILE: .github/workflows/project.yml
================================================
name: Add to Project
on:
pull_request_target:
types:
- opened
jobs:
add_to_project:
if: '!github.event.repository.fork'
runs-on: ubuntu-slim
steps:
- uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2
with:
# PRs are added to the Review project
project-url: https://github.com/orgs/conda/projects/16
github-token: ${{ secrets.PROJECT_TOKEN }}
================================================
FILE: .github/workflows/stale.yml
================================================
name: Stale
on:
# NOTE: github.event is workflow_dispatch payload:
# https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch
workflow_dispatch:
inputs:
dryrun:
description: 'dryrun: Preview stale issues/prs without marking them (true|false)'
required: true
type: boolean
default: true
schedule:
- cron: 0 4 * * *
permissions:
issues: write
pull-requests: write
jobs:
stale:
if: '!github.event.repository.fork'
runs-on: ubuntu-slim
strategy:
matrix:
include:
- only-issue-labels: ''
days-before-issue-stale: 365
days-before-issue-close: 30
# [type::support] issues have a more aggressive stale/close timeline
- only-issue-labels: type::support
days-before-issue-stale: 90
days-before-issue-close: 21
steps:
- uses: conda/actions/read-yaml@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0
id: read_yaml
with:
path: https://raw.githubusercontent.com/conda/infra/main/.github/messages.yml
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
id: stale
with:
# Only issues with these labels are checked whether they are stale
only-issue-labels: ${{ matrix.only-issue-labels }}
# Idle number of days before marking issues stale
days-before-issue-stale: ${{ matrix.days-before-issue-stale }}
# Idle number of days before closing stale issues/PRs
days-before-issue-close: ${{ matrix.days-before-issue-close }}
# Idle number of days before marking PRs stale
days-before-pr-stale: 365
# Idle number of days before closing stale PRs
days-before-pr-close: 30
# Comment on the staled issues
stale-issue-message: ${{ fromJSON(steps.read_yaml.outputs.value)['stale-issue'] }}
# Label to apply on staled issues
stale-issue-label: stale
# Label to apply on closed issues
close-issue-label: stale::closed
# Reason to use when closing issues
close-issue-reason: not_planned
# Comment on the staled PRs
stale-pr-message: ${{ fromJSON(steps.read_yaml.outputs.value)['stale-pr'] }}
# Label to apply on staled PRs
stale-pr-label: stale
# Label to apply on closed PRs
close-pr-label: stale::closed
# Remove stale label from issues/PRs on updates/comments
remove-stale-when-updated: true
# Add specified labels to issues/PRs when they become unstale
labels-to-add-when-unstale: stale::recovered
# Remove specified labels to issues/PRs when they become unstale
labels-to-remove-when-unstale: stale,stale::closed
# Max number of operations per run
operations-per-run: ${{ secrets.STALE_OPERATIONS_PER_RUN || 100 }}
# Dry-run
debug-only: ${{ github.event.inputs.dryrun || false }}
# Order to get issues/PRs
ascending: true
# Delete branch after closing a stale PR
delete-branch: false
# Issues with these labels will never be considered stale
exempt-issue-labels: stale::recovered,epic
# Issues with these labels will never be considered stale
exempt-pr-labels: stale::recovered,epic
# Exempt all issues/PRs with milestones from stale
exempt-all-milestones: true
# Assignees on issues/PRs exempted from stale
exempt-assignees: mingwandroid
- name: Print outputs
run: echo ${{ join(steps.stale.outputs.*, ',') }}
================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests
on:
# https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#push
push:
branches:
- main
- feature/**
- '[0-9].*.x' # e.g., 4.14.x
- '[0-9][0-9].*.x' # e.g., 23.3.x
# https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request
pull_request:
# https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch
workflow_dispatch:
# CONDA-LIBMAMBA-SOLVER CHANGE
schedule:
- cron: "15 7 * * 1-5" # Mon to Fri, 7:15am
# /CONDA-LIBMAMBA-SOLVER CHANGE
concurrency:
# Concurrency group that uses the workflow name and PR number if available
# or commit SHA as a fallback. If a new build is triggered under that
# concurrency group while a previous build is running it will be canceled.
# Repeated pushes to a PR will cancel all previous builds, while multiple
# merges to main will not cancel.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
# https://conda.github.io/conda-libmamba-solver/user-guide/configuration/#advanced-options
CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED: true
# Reruns on upstream tests
PYTEST_RERUN_FAILURES: 1
# Reruns on our tests
PYTEST_RERUN_FAILURES_CLS: 0
# upstream conda tests that we want to skip
PYTEST_ADDOPTS: "-k \"not test_get_index_lazy and not test_strict_resolve_get_reduced_index and not test_reorder_channel_priority\""
# for conda-libmamba-solver
PYTEST_CLS_ADDOPTS: "-m \"not slow and not benchmark and not trouble\""
# See https://github.com/conda/conda/pull/13694
# we can't break classic from here; no need to test it
# those tests will still be available for local debugging if necessary
CONDA_TEST_SOLVERS: libmamba
CONDA_REF: main # pin conda version to latest for more stable tests
jobs:
# detect whether any code changes are included in this PR
changes:
runs-on: ubuntu-latest
permissions:
# necessary to detect changes
# https://github.com/dorny/paths-filter#supported-workflows
pull-requests: read
outputs:
code: ${{ steps.filter.outputs.code }}
steps:
- name: Checkout Source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# dorny/paths-filter needs git clone for non-PR events
# https://github.com/dorny/paths-filter#supported-workflows
if: github.event_name != 'pull_request'
- name: Filter Changes
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: filter
with:
# CONDA-LIBMAMBA-SOLVER CHANGE
# changed some paths:
filters: |
code:
- 'conda_libmamba_solver/**'
- '*.py'
- '.github/workflows/tests.yml'
- 'tests/**'
- 'dev/requirements.txt'
- 'pyproject.toml'
# /CONDA-LIBMAMBA-SOLVER CHANGE
# windows test suite
windows:
# only run test suite if there are code changes
needs: changes
if: needs.changes.outputs.code == 'true'
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
# test lower version (w/ defaults) and upper version (w/ defaults and conda-forge)
python-version: ['3.10', '3.13']
default-channel: [defaults, conda-forge]
test-type: [conda-libmamba-solver, unit, integration]
test-group: [1, 2, 3]
exclude:
- default-channel: conda-forge
python-version: '3.10'
- test-type: unit
test-group: 3
- test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: 2 # CONDA-LIBMAMBA-SOLVER CHANGE
- test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: 3 # CONDA-LIBMAMBA-SOLVER CHANGE
env:
ErrorActionPreference: Stop # powershell exit immediately on error
PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }}
PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }}
steps:
- name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
repository: conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE
path: conda # CONDA-LIBMAMBA-SOLVER CHANGE
ref: ${{ env.CONDA_REF }}
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Checkout conda-libmamba-solver
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
path: conda-libmamba-solver
# /CONDA-LIBMAMBA-SOLVER CHANGE
- name: Hash + Timestamp
shell: bash # use bash to run date command
run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u "+%Y%m")" >> $GITHUB_ENV
- name: Cache Conda
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/conda_pkgs_dir
key: cache-${{ env.HASH }}
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
with:
# CONDA-LIBMAMBA-SOLVER CHANGE: add conda\
condarc-file: conda\.github\condarc-${{ matrix.default-channel }}
run-post: false # skip post cleanup
- name: Upgrade conda-libmamba-solver (without sharded repodata)
shell: bash -el {0}
run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver
- name: Conda Install
working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE
# CONDA-LIBMAMBA-SOLVER CHANGE: add conda-libmamba-solver requirements.txt
run: >
conda install
--yes
--file tests\requirements.txt
--file tests\requirements-${{ runner.os }}.txt
--file tests\requirements-ci.txt
--file tests\requirements-s3.txt
--file ..\conda-libmamba-solver\dev\requirements.txt
${{ matrix.test-type == 'conda-libmamba-solver' && '--file ..\\conda-libmamba-solver\\tests\\requirements.txt' || '' }}
python=${{ matrix.python-version }}
- name: Conda Remove anaconda-auth
run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Install conda-libmamba-solver
run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation
#/ CONDA-LIBMAMBA-SOLVER CHANGE
- name: Conda Info
run: python -m conda info --verbose
- name: Conda Config
run: conda config --show-sources
- name: Conda List Extra
run: |
conda env list
conda list -n base
conda list --show-channel-urls
- name: Setup PowerShell
# for tests/shell, so only necessary for integration tests
if: matrix.test-type == 'integration'
run: |
Invoke-Expression "& { $(Invoke-RestMethod https://aka.ms/install-powershell.ps1) }"
"PWSHPATH=$env:LOCALAPPDATA\Microsoft\powershell" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: PowerShell Info
# for tests/shell, so only necessary for integration tests
if: matrix.test-type == 'integration'
run: |
Get-Command -All powershell
Get-Command -All "$env:PWSHPATH\pwsh.exe"
- name: Run Upstream Tests
working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE
if: ${{ matrix.test-type != 'conda-libmamba-solver' }} # CONDA-LIBMAMBA-SOLVER CHANGE
run: python -m pytest
--durations-path=durations\${{ runner.os }}.json
--group=${{ matrix.test-group }}
--splits=${{ env.PYTEST_SPLITS }}
--reruns=${{ env.PYTEST_RERUN_FAILURES }}
-m "${{ env.PYTEST_MARKER }}"
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Run conda-libmamba-solver Tests
working-directory: conda-libmamba-solver
if: ${{ matrix.test-type == 'conda-libmamba-solver' }}
shell: bash -el {0}
run: |
python -m pip install -e ../conda/ --no-deps --no-build-isolation
python -m conda init --all
. $CONDA_PREFIX/etc/profile.d/conda.sh
python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16
#/ CONDA-LIBMAMBA-SOLVER CHANGE
- name: Upload Coverage
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
if: false # CONDA-LIBMAMBA-SOLVER CHANGE
with:
flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }}
- name: Upload Test Results
if: '!cancelled()'
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results-${{ env.HASH }}
# CONDA-LIBMAMBA-SOLVER CHANGE: need to prepend conda/ to the paths
path: |
conda\.coverage
conda\durations\${{ runner.os }}.json
conda\test-report.xml
retention-days: 1 # temporary, combined in aggregate below
# linux test suite
linux:
# only run test suite if there are code changes
needs: changes
if: needs.changes.outputs.code == 'true'
runs-on: ${{ matrix.runs-on }}
defaults:
run:
# https://github.com/conda-incubator/setup-miniconda#use-a-default-shell
shell: bash -el {0} # bash exit immediately on error + login shell
strategy:
fail-fast: false
matrix:
# test all lower versions (w/ defaults) and upper version (w/ defaults and conda-forge)
runs-on: [ubuntu-latest, ubuntu-24.04-arm]
python-version: ['3.10', '3.11', '3.12', '3.13']
default-channel: [defaults, conda-forge]
test-type: [conda-libmamba-solver, unit, integration]
test-group: [1, 2, 3]
exclude:
- python-version: '3.10'
default-channel: conda-forge
- python-version: '3.11'
default-channel: conda-forge
- python-version: '3.12'
default-channel: conda-forge
- test-type: unit
test-group: 3
- runs-on: ubuntu-24.04-arm
python-version: '3.10'
- runs-on: ubuntu-24.04-arm
python-version: '3.11'
- runs-on: ubuntu-24.04-arm
python-version: '3.12'
- test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: 2 # CONDA-LIBMAMBA-SOLVER CHANGE
- test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: 3 # CONDA-LIBMAMBA-SOLVER CHANGE
env:
PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }}
PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }}
steps:
- name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
repository: conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE
path: conda # CONDA-LIBMAMBA-SOLVER CHANGE
ref: ${{ env.CONDA_REF }}
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Checkout conda-libmamba-solver
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
path: conda-libmamba-solver
# /CONDA-LIBMAMBA-SOLVER CHANGE
- name: Hash + Timestamp
run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u "+%Y%m")" >> $GITHUB_ENV
- name: Cache Conda
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/conda_pkgs_dir
key: cache-${{ env.HASH }}
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
with:
# CONDA-LIBMAMBA-SOLVER CHANGE: add conda/
condarc-file: conda/.github/condarc-${{ matrix.default-channel }}
run-post: false # skip post cleanup
- name: Upgrade conda-libmamba-solver (without sharded repodata)
run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver
- name: Conda Install
working-directory: conda
run: >
conda install
--yes
--file tests/requirements.txt
--file tests/requirements-${{ runner.os }}.txt
--file tests/requirements-ci.txt
--file tests/requirements-s3.txt
--file ../conda-libmamba-solver/dev/requirements.txt
${{ matrix.test-type == 'conda-libmamba-solver' && '--file ../conda-libmamba-solver/tests/requirements.txt' || '' }}
python=${{ matrix.python-version }}
- name: Conda Remove anaconda-auth
run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Install conda-libmamba-solver
run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation
#/ CONDA-LIBMAMBA-SOLVER CHANGE
- name: Conda Info
run: python -m conda info --verbose
- name: Conda Config
run: conda config --show-sources
- name: Conda List Extra
run: |
conda env list
conda list -n base
conda list --show-channel-urls
- name: Setup Shells
# for tests/shell, so only necessary for integration tests
if: matrix.test-type == 'integration'
run: sudo apt update && sudo apt install ash csh fish tcsh xonsh zsh
- name: Run Tests
working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE
if: ${{ matrix.test-type != 'conda-libmamba-solver' }} # CONDA-LIBMAMBA-SOLVER CHANGE
run: python -m pytest
--durations-path=durations/${{ runner.os }}.json
--group=${{ matrix.test-group }}
--splits=${{ env.PYTEST_SPLITS }}
--reruns=${{ env.PYTEST_RERUN_FAILURES }}
-m "${{ env.PYTEST_MARKER }}"
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Run conda-libmamba-solver Tests
working-directory: conda-libmamba-solver
if: ${{ matrix.test-type == 'conda-libmamba-solver' }}
run: |
python -m pip install -e ../conda/ --no-deps --no-build-isolation
python -m conda init --all
. $CONDA_PREFIX/etc/profile.d/conda.sh
python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16
#/ CONDA-LIBMAMBA-SOLVER CHANGE
- name: Upload Coverage
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
if: false # CONDA-LIBMAMBA-SOLVER CHANGE
with:
flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }}
- name: Upload Test Results
if: '!cancelled()'
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results-${{ env.HASH }}
path: |
conda/.coverage
conda/durations/${{ runner.os }}.json
conda/test-report.xml
retention-days: 1 # temporary, combined in aggregate below
# linux benchmarks
linux-benchmarks:
needs: changes
if: false # needs.changes.outputs.code == 'true' # disable for now.
runs-on: ubuntu-latest
defaults:
run:
# https://github.com/conda-incubator/setup-miniconda#use-a-default-shell
shell: bash -el {0} # bash exit immediately on error + login shell
strategy:
fail-fast: false
matrix:
python-version: ['3.12']
steps:
- name: Checkout Source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Hash + Timestamp
run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-benchmark-$(date -u "+%Y%m")" >> $GITHUB_ENV
- name: Cache Conda
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/conda_pkgs_dir
key: cache-${{ env.HASH }}
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
- name: Conda Install
run: conda install
--yes
--file tests/requirements.txt
python=${{ matrix.python-version }}
- name: Conda Info
run: python -m conda info --verbose
- name: Conda Config
run: conda config --show-sources
- name: Conda List
run: conda list --show-channel-urls
- name: Run Benchmarks
uses: CodSpeedHQ/action@d872884a306dd4853acf0f584f4b706cf0cc72a2 # v4.13.0
with:
token: ${{ secrets.CODSPEED_TOKEN }}
run: $CONDA/envs/test/bin/pytest --codspeed
mode: instrumentation
# linux-qemu test suite
linux-qemu:
# only run test suite if there are code changes
# CONDA-LIBMAMBA-SOLVER CHANGE
# needs: changes
if: false
# needs.changes.outputs.code == 'true'
#/ CONDA-LIBMAMBA-SOLVER CHANGE
# Run one single fast test per docker+qemu emulated linux platform to test that
# test execution is possible there (container+tools+dependencies work). Can be
# changed / extended to run specific tests in case there are platform related
# things to test. Running more tests is time consuming due to emulation
# (factor 2-10x slower).
runs-on: ubuntu-latest
defaults:
run:
# https://github.com/conda-incubator/setup-miniconda#use-a-default-shell
shell: bash -el {0} # bash exit immediately on error + login shell
strategy:
fail-fast: false
matrix:
python-version: ['3.12']
image: ['continuumio/miniconda3:latest', 'condaforge/miniforge3:latest']
platform: [arm64, ppc64le, s390x]
exclude:
- image: 'continuumio/miniconda3:latest'
platform: ppc64le
- image: 'condaforge/miniforge3:latest'
platform: s390x
steps:
- name: Checkout Source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Setup QEMU
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
- name: Run Tests
run: docker run
--rm
--volume ${PWD}:/opt/conda-src
--workdir /opt/conda-src
--platform linux/${{ matrix.platform }}
${{ matrix.image }}
bash -lc
". /opt/conda/etc/profile.d/conda.sh
&& set -x
&& conda create
--name test
--yes
--file tests/requirements.txt
--file tests/requirements-${{ runner.os }}.txt
--file tests/requirements-ci.txt
python=${{ matrix.python-version }}
&& conda activate test
&& python -m conda info --verbose
&& conda config --show-sources
&& conda list --show-channel-urls
&& python -m pytest tests/test_api.py::test_DepsModifier_contract"
# macos test suite
macos:
# only run test suite if there are code changes
needs: changes
if: needs.changes.outputs.code == 'true'
runs-on: ${{ (matrix.arch == 'osx-64' && 'macos-15-intel') || 'macos-latest' }}
defaults:
run:
# https://github.com/conda-incubator/setup-miniconda#use-a-default-shell
shell: bash -el {0} # bash exit immediately on error + login shell
strategy:
fail-fast: false
matrix:
# test lower version (w/ osx-64 & conda-forge & unit tests) and upper version (w/ osx-arm64 & defaults & integration tests)
arch: [osx-64, osx-arm64]
python-version: ['3.10', '3.13']
default-channel: [defaults, conda-forge]
test-type: [conda-libmamba-solver, unit, integration] # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: [1, 2, 3]
exclude:
- arch: osx-64
python-version: '3.13'
- arch: osx-64
default-channel: defaults
- arch: osx-64
test-type: integration
- arch: osx-arm64
python-version: '3.10'
- arch: osx-arm64
default-channel: conda-forge
- arch: osx-arm64
test-type: unit
- arch: osx-arm64 # CONDA-LIBMAMBA-SOLVER CHANGE
test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
- test-type: unit
test-group: 3
- test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: 2 # CONDA-LIBMAMBA-SOLVER CHANGE
- test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE
test-group: 3 # CONDA-LIBMAMBA-SOLVER CHANGE
env:
PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }}
PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }}
steps:
- name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
repository: conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE
path: conda # CONDA-LIBMAMBA-SOLVER CHANGE
ref: ${{ env.CONDA_REF }}
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Checkout conda-libmamba-solver
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
path: conda-libmamba-solver
# /CONDA-LIBMAMBA-SOLVER CHANGE
- name: Hash + Timestamp
run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u "+%Y%m")" >> $GITHUB_ENV
- name: Cache Conda
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/conda_pkgs_dir
key: cache-${{ env.HASH }}
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
with:
# CONDA-LIBMAMBA-SOLVER CHANGE: add conda/
condarc-file: conda/.github/condarc-${{ matrix.default-channel }}
run-post: false # skip post cleanup
# conda not preinstalled in arm64 runners
miniconda-version: ${{ (matrix.default-channel == 'defaults' && matrix.arch == 'osx-arm64') && 'latest' || null }}
miniforge-version: ${{ (matrix.default-channel == 'conda-forge' && matrix.arch == 'osx-64') && 'latest' || null }}
architecture: ${{ runner.arch }}
- name: Upgrade conda-libmamba-solver (without sharded repodata)
run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver
- name: Conda Install
working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE
# CONDA-LIBMAMBA-SOLVER CHANGE: add conda-libmamba-solver requirements.txt
run: >
conda install
--yes
--file tests/requirements.txt
--file tests/requirements-ci.txt
--file tests/requirements-s3.txt
--file ../conda-libmamba-solver/dev/requirements.txt
${{ matrix.test-type == 'conda-libmamba-solver' && '--file ../conda-libmamba-solver/tests/requirements.txt' || '' }}
python=${{ matrix.python-version }}
- name: Conda Remove anaconda-auth
if: matrix.arch != 'osx-64'
run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Install conda-libmamba-solver
run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation
#/ CONDA-LIBMAMBA-SOLVER CHANGE
- name: Conda Info
run: python -m conda info --verbose
- name: Conda Config
run: conda config --show-sources
- name: Conda List
run: conda list --show-channel-urls
- name: Setup Shells
# for tests/shell, so only necessary for integration tests
if: matrix.test-type == 'integration'
run: brew update && brew install fish xonsh
- name: Run Tests
working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE
if: ${{ matrix.test-type != 'conda-libmamba-solver' }} # CONDA-LIBMAMBA-SOLVER CHANGE
run: python -m pytest
--durations-path=durations/${{ runner.os }}.json
--group=${{ matrix.test-group }}
--splits=${{ env.PYTEST_SPLITS }}
--reruns=${{ env.PYTEST_RERUN_FAILURES }}
-m "${{ env.PYTEST_MARKER }}"
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Run conda-libmamba-solver Tests
working-directory: conda-libmamba-solver
if: ${{ matrix.test-type == 'conda-libmamba-solver' }}
run: |
python -m pip install -e ../conda/ --no-deps --no-build-isolation
python -m conda init --all
. $CONDA_PREFIX/etc/profile.d/conda.sh
python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16
#/ CONDA-LIBMAMBA-SOLVER CHANGE
- name: Upload Coverage
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
if: false # CONDA-LIBMAMBA-SOLVER CHANGE
with:
flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }}
- name: Upload Test Results
if: '!cancelled()'
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results-${{ env.HASH }}
# CONDA-LIBMAMBA-SOLVER CHANGE: need to prepend conda/ to the paths
path: |
conda/.coverage
conda/durations/${{ runner.os }}.json
conda/test-report.xml
retention-days: 1 # temporary, combined in aggregate below
# aggregate and upload
aggregate:
# only aggregate test suite if there are code changes
needs: [changes, windows, linux, linux-benchmarks, linux-qemu, macos]
if: >-
!cancelled()
&& needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- name: Download Artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
- name: Upload Combined Test Results
# provides one downloadable archive of all matrix run test results for further analysis
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results-${{ github.sha }}-all
path: test-results-*
retention-days: 7 # for durations.yml workflow
- name: Test Summary
uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4
with:
paths: test-results-*/test-report.xml
# required check
analyze:
needs: [windows, linux, linux-qemu, linux-benchmarks, macos, aggregate]
if: '!cancelled()'
runs-on: ubuntu-latest
steps:
- name: Determine Success
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
id: alls-green # CONDA-LIBMAMBA-SOLVER CHANGE
with:
# permit jobs to be skipped if there are no code changes (see changes job)
allowed-skips: ${{ toJSON(needs) }}
jobs: ${{ toJSON(needs) }}
# CONDA-LIBMAMBA-SOLVER CHANGE
- name: Checkout our source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
if: always() && github.event_name == 'schedule' && steps.alls-green.outputs.result == 'failure'
- name: Report failures
if: always() && github.event_name == 'schedule' && steps.alls-green.outputs.result == 'failure'
uses: JasonEtco/create-an-issue@1b14a70e4d8dc185e5cc76d3bec9eab20257b2c5 # v2.9.2
env:
GITHUB_TOKEN: ${{ secrets.CONDA_LIBMAMBA_SOLVER_ISSUES }}
RUN_ID: ${{ github.run_id }}
TITLE: "Scheduled tests failed"
with:
filename: .github/TEST_FAILURE_REPORT_TEMPLATE.md
update_existing: true
# /CONDA-LIBMAMBA-SOLVER CHANGE
# canary builds
build:
name: Build canary
needs: [analyze]
# only build canary build if
# - prior steps succeeded,
# - this is the main repo, and
# - we are on the main, feature, or release branch
if: >-
!cancelled()
&& !github.event.repository.fork
&& (
github.ref_name == 'main'
|| startsWith(github.ref_name, 'feature/')
|| endsWith(github.ref_name, '.x')
)
runs-on: ubuntu-latest
steps:
# Clean checkout of specific git ref needed for package metadata version
# which needs env vars GIT_DESCRIBE_TAG and GIT_BUILD_STR:
- name: Checkout Source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.ref }}
clean: true
fetch-depth: 0
# Explicitly use Python 3.11 since each of the OSes has a different default Python
- name: Setup Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.11'
- name: Detect Label
shell: python
run: |
from pathlib import Path
from re import match
from os import environ
if "${{ github.ref_name }}" == "main":
# main branch commits are uploaded to the dev label
label = "dev"
elif "${{ github.ref_name }}".startswith("feature/"):
# feature branch commits are uploaded to a custom label
label = "${{ github.ref_name }}"
else:
# release branch commits are added to the rc label
# see https://github.com/conda/infrastructure/issues/760
_, name = "${{ github.repository }}".split("/")
label = f"rc-{name}-${{ github.ref_name }}"
Path(environ["GITHUB_ENV"]).write_text(f"ANACONDA_ORG_LABEL={label}")
- name: Create & Upload
uses: conda/actions/canary-release@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0
env:
# Run conda-build in isolated activation to properly package conda
_CONDA_BUILD_ISOLATED_ACTIVATION: 1
with:
package-name: ${{ github.event.repository.name }}
subdir: noarch
anaconda-org-channel: conda-canary
anaconda-org-label: ${{ env.ANACONDA_ORG_LABEL }}
anaconda-org-token: ${{ secrets.ANACONDA_ORG_CONDA_CANARY_TOKEN }}
conda-build-arguments: --override-channels --channel conda-forge
================================================
FILE: .github/workflows/update.yml
================================================
name: Update Repository
on:
# every Sunday at 00:36 UTC
# https://crontab.guru/#36_2_*_*_0
schedule:
- cron: 36 2 * * 0
workflow_dispatch:
issue_comment:
types:
- created
jobs:
update:
if: >-
!github.event.repository.fork
&& (
github.event_name == 'schedule'
|| github.event_name == 'workflow_dispatch'
|| (
github.event_name == 'issue_comment'
&& github.event.issue.pull_request
&& (
github.event.comment.body == '@conda-bot render'
|| github.event.comment.body == '@conda-bot recreate'
)
)
)
runs-on: ubuntu-slim
steps:
- if: github.event_name == 'issue_comment'
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
with:
comment-id: ${{ github.event.comment.id }}
reactions: eyes
reactions-edit-mode: replace
token: ${{ secrets.SYNC_TOKEN }}
- if: github.event.comment.body == '@conda-bot render'
name: Configure git origin
run: |
echo REPOSITORY=$(curl --silent ${{ github.event.issue.pull_request.url }} | jq --raw-output '.head.repo.full_name') >> $GITHUB_ENV
echo REF=$(curl --silent ${{ github.event.issue.pull_request.url }} | jq --raw-output '.head.ref') >> $GITHUB_ENV
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: ${{ env.REPOSITORY || github.repository }}
ref: ${{ env.REF || '' }}
token: ${{ secrets.SYNC_TOKEN }}
- name: Configure git user
run: |
git config --global user.name 'Conda Bot'
git config --global user.email '18747875+conda-bot@users.noreply.github.com'
- uses: conda/actions/combine-durations@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0
id: durations
continue-on-error: true
- uses: conda/actions/template-files@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0
id: templates
continue-on-error: true
- name: Commit changes
# no-op if there are no updates
continue-on-error: true
run: |
git add .
git commit --message "🤖 updated file(s)"
- if: github.event.comment.body != '@conda-bot render'
name: Create fork
# no-op if the repository is already forked
run: echo FORK=$(gh repo fork --clone=false --default-branch-only 2>&1 | awk '{print $1}') >> $GITHUB_ENV
env:
GH_TOKEN: ${{ secrets.SYNC_TOKEN }}
- if: github.event.comment.body != '@conda-bot render'
id: create
# no-op if no commits were made
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
push-to-fork: ${{ env.FORK }}
token: ${{ secrets.SYNC_TOKEN }}
branch: update
delete-branch: true
title: 🤖 Update infrastructure file(s)
body: |
[update.yml]: ${{ github.server_url }}/${{ github.repository }}/blob/main/.github/workflows/update.yml
Your friendly repository updater.
${{ steps.durations.outputs.summary }}
${{ steps.templates.outputs.summary }}
This PR was triggered by @${{ github.triggering_actor }} via ${{ github.event_name }}.
<details>
<summary>Commands</summary>
Trigger actions by commenting on this PR:
- `@conda-bot render` will run rendering workflows and commit and push any changes to this PR
- `@conda-bot recreate` will recreate this PR, overwriting any edits that have been made to it
</details>
###### Auto-generated by the [`update.yml`][update.yml] workflow, see ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}.
- if: github.event.comment.body == '@conda-bot render'
id: update
name: Push changes
run: git push --force-with-lease
- if: always() && github.event_name == 'issue_comment'
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
with:
comment-id: ${{ github.event.comment.id }}
reactions: ${{ (steps.create.conclusion == 'success' || steps.update.conclusion == 'success') && 'hooray' || 'confused' }}
reactions-edit-mode: replace
token: ${{ secrets.SYNC_TOKEN }}
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
.vscode/
# rever
rever/
# setuptools_scm
_version.py
# codspeed
.codspeed/
================================================
FILE: .mailmap
================================================
# This file was autogenerated by rever: https://regro.github.io/rever-docs/
# This prevent git from showing duplicates with various logging commands.
# See the git documentation for more details. The syntax is:
#
# good-name <good-email> bad-name <bad-email>
#
# You can skip bad-name if it is the same as good-name and is unique in the repo.
#
# This file is up-to-date if the command git log --format="%aN <%aE>" | sort -u
# gives no duplicates.
Agriya Khetarpal <74401230+agriyakhetarpal@users.noreply.github.com>
Albert DeFusco <albert.defusco+gh@me.com>
Christopher Ostrouchov <chris.ostrouchov@gmail.com>
Dan Yeaw <dan@yeaw.me>
Daniel Holth <dholth@anaconda.com>
Jaime Rodríguez-Guerra <jaimergp@users.noreply.github.com> jaimergp <jaimergp@users.noreply.github.com>
Jannis Leidel <jannis@leidel.info>
John Costa <costajohnt@gmail.com>
John Kirkham <jakirkham@gmail.com>
Jonathan J. Helmus <jjhelmus@gmail.com>
Julien Jerphanion <git@jjerphan.xyz>
Ken Odegard <kodegard@anaconda.com>
Kevin Markham <justmarkham@users.noreply.github.com>
Klaus Zimmermann <klaus.zimmermann@quansight.com>
Matthew R. Becker <beckermr@users.noreply.github.com>
Ryan Keith <rkeith@anaconda.com>
Sophia Castellarin <scastellarin@openteams.com>
Stacy Noland <46572585+stacynoland@users.noreply.github.com>
Thomas Lam <79589038+tl-hbk@users.noreply.github.com>
Travis Hathaway <travis.j.hathaway@gmail.com>
conda-bot <18747875+conda-bot@users.noreply.github.com> Conda Bot <18747875+conda-bot@users.noreply.github.com>
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
================================================
FILE: .pre-commit-config.yaml
================================================
# disable autofixing PRs, commenting "pre-commit.ci autofix" on a pull request triggers a autofix
ci:
autofix_prs: false
# generally speaking we ignore all vendored code as well as tests data
exclude: |
(?x)^(
tests/data/.* |
conda_libmamba_solver/mamba_utils\.py
)$
repos:
# generic verification and formatting
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
# standard end of line/end of file cleanup
- id: mixed-line-ending
- id: end-of-file-fixer
- id: trailing-whitespace
# ensure syntaxes are valid
- id: check-toml
- id: check-yaml
exclude: |
(?x)^(
(conda\.)?recipe/meta.yaml
)
# catch git merge/rebase problems
- id: check-merge-conflict
- repo: https://github.com/asottile/blacken-docs
rev: 1.20.0
hooks:
# auto format Python codes within docstrings
- id: blacken-docs
additional_dependencies: [black]
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.12
hooks:
# lint & attempt to correct failures (e.g. pyupgrade)
- id: ruff-check
args: [--fix]
# compatible replacement for black
- id: ruff-format
- repo: meta
# see https://pre-commit.com/#meta-hooks
hooks:
- id: check-hooks-apply
- id: check-useless-excludes
- repo: https://github.com/PyCQA/bandit
rev: 1.9.4
hooks:
- id: bandit
args: [--exit-zero]
exclude: ^(tests/)
- repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.5.6
hooks:
- id: insert-license
files: \.py$
args: [--license-filepath, .github/disclaimer.txt, --no-extra-eol]
exclude: ^(tests/repodata_time_machine.py|mamba_utils\.py|tests/channel_testing/helpers\.py|tests/channel_testing/reposerver\.py) # extend global exclude
================================================
FILE: AUTHORS.md
================================================
All of the people who have made at least one contribution to conda-libmamba-solver.
Authors are sorted alphabetically.
* Agriya Khetarpal
* Albert DeFusco
* Christopher Ostrouchov
* Dan Yeaw
* Daniel Holth
* Jaime Rodríguez-Guerra
* Jannis Leidel
* John Costa
* John Kirkham
* Jonathan J. Helmus
* Julien Jerphanion
* Ken Odegard
* Kevin Markham
* Klaus Zimmermann
* Matthew R. Becker
* Ryan Keith
* Sophia Castellarin
* Stacy Noland
* Thomas Lam
* Travis Hathaway
* conda-bot
* dependabot[bot]
* pre-commit-ci[bot]
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.
> The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
> and this project adheres to [calendar versioning](https://calver.org/) in the `YY.M.MICRO`format.
<!--
Populate these categories as PRs are merged to `main`. When a release is cut,
copy to its corresponding section, deleting empty sections if any.
Remember to update the hyperlinks at the bottom.
--->
[//]: # (current developments)
## 26.4.1 (2026-05-01)
### Bug fixes
* Show the target platform instead of the host platform in the progress
message during cross-platform lockfile export. (#911)
* Open the sharded repodata cache (`repodata_shards.db`) in WAL mode with a
longer SQLite busy timeout, so the pipelined cache reader thread no longer
races with the network writer thread and raises
`sqlite3.OperationalError: database is locked`. Fall back to the default
journal mode on filesystems where WAL is not supported. (#924)
* Fix `add_pip_as_python_dependency` not being honored when sharded repodata
is enabled. (#918 via #929)
### Contributors
* @costajohnt made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/911
* @danyeaw made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/929
* @dholth
* @jezdez
* @conda-bot
* @pre-commit-ci[bot]
## 26.4.0 (2026-04-16)
### Enhancements
* Enable `use_sharded_repodata` by default. The solver will check for
`repodata_shards.msgpack.zst` and use sharded repodata if it is present in at
least one channel. Sharded repodata can be disabled with `conda config --set
plugins.use_sharded_repodata false` or the environment variable
`CONDA_PLUGINS_USE_SHARDED_REPODATA=0`. (#836)
### Bug fixes
* Improve timeout behavior when fetching shards. (#890)
* Fix race condition while reading shards index cache. (#890)
### Contributors
* @dholth
* @conda-bot
* @dependabot[bot]
* @pre-commit-ci[bot]
## 26.3.0 (2026-03-04)
### ✨ Special Announcement ✨
Following the preliminary support for fetching [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata in conda-libmamba-solver 25.11.0, this release marks this feature as ready to be used by a wider audience.
See below's 25.11.0 release for more information on how to enable it.
### Enhancements
* Add offline mode support for sharded repodata. When offline mode is enabled,
the solver will use cached shards even if they are expired, and gracefully
fall back to non-sharded repodata if no cache exists. Missing shards in
offline mode return empty shards rather than failing. (#710)
### Bug fixes
* Remove `.tar.bz2` with matching `.conda`-format packages during shard
traversal if `conda` is not in "use_only_tar_bz2" mode; needed as shards
directly adds individual packages to the solver. (#710)
* Fall back to `repodata.json` path if no channel has
`repodata_shards.msgpack.zst` instead of computing repodata subsets for
monolithic channels. (#716)
* Ensure `track_features` fields are recorded properly in `conda-meta/*.json`. (#804 via #805)
* Remove sqlite3 sharded repodata cache and create another on error. (#823)
* Ensure that channel order is preserved when fetching data from shards. (#824 via #828)
* Explicitly close sqlite3 connections after shard traversal to avoid a Python
3.13+ warning. (#843).
* Fall back to `repodata.json`, but don't mark shards as unavailable, unless we
receive a 4xx error code besides 416. (#844)
* Use relative join on `s3://`-hosted `repodata_shards.msgpack.zst` and shards
`base_url`, instead of truncating to just `base_url`. (#866)
### Docs
* Update documentation to reflect that the cudatoolkit/cpuonly issue has returned. (#815)
### Other
* Use lazy `PrefixData` getter to remove custom workaround for `conda` update checks. (#784 via #817)
* Refactor `LibMambaIndexHelper._channel_urls` to preserve arch/noarch in
`Channel()` objects; simplify sharded channel handling. (#841)
* The `cpuonly` mutex no longer correctly prevents CUDA packages from being
installed. For a time it appeared to work when non-cuda systems showed a
virtual package `__cuda=0=0`, but with no `__cuda` package the mutex appears
to no longer work. Reversing (#131 via #741)
### Contributors
* @dholth
* @jaimergp
* @jezdez
* @ryanskeith
* @soapy1
* @conda-bot
* @dependabot[bot]
* @pre-commit-ci[bot]
## 25.11.0 (2025-11-24)
### ✨ Special Announcement ✨
This release includes preliminary support for fetching [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata, a substantially more efficient way of distributing the necessary metadata to install packages in your environments.
You can try it by:
- Enabling it in your settings with `conda config --set plugins.use_sharded_repodata true`
- Setting this environment variable: `CONDA_PLUGINS_USE_SHARDED_REPODATA=1`
Note that sharded repodata requires that the target channels expose the necessary metadata too, so it will only work with CEP-16-ready deployments. `conda-libmamba-solver` will fallback to traditional (monolithic) repodata if not available, so you can mix sharded and non-sharded channels without problems.
### Enhancements
* Add experimental support for [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata. Enable it with `conda config --set plugins.use_sharded_repodata true` or `CONDA_PLUGINS_USE_SHARDED_REPODATA=1`. (#684, #695, #696, #715 via #722, #730, #748, #736, #756, #762)
* When sharded repodata is enabled, the solver checks every channel for an index,
`repodata_shards.msgpack.zst`, and re-checks every 7 days if not found. It builds a subset of
repodata by recursively traversing the dependencies of all installed and requested packages,
using shards to fetch only the package metadata that could possibly be part of the solution from
each channel. This smaller amount of package metadata is sent to the solver. Sharded repodata can
save a significant amount of bandwith, memory, and parse time when installing packages.
* Cache shards in a sqlite database in `${CONDA_PREFIX}/pkgs/cache/repodata_shards.db`.
* This implementation does not use shards for `conda search` or other repodata uses that do not
include a solve.
* Add support for [CEP 17](https://conda.org/learn/ceps/cep-0017/) `python_site_packages_path`. (#560 via #628)
* Add new messaging for when `conda` is outdated, environment is [frozen](https://conda.org/learn/ceps/cep-0022/), and `conda-self` is installed. (#753 via #766)
* Add a codspeed benchmarking GitHub action and a few benchmarks. (#754 via #755)
### Bug fixes
* Constrain the torchvision version in `test_pytorch_gpu`. (#659 via #661)
* Correctly record channel platform in conda-meta record files. (#662 via #663)
* Import `CondaSolver` from its canonical location in `conda.plugins.types`. (#691)
* The `cpuonly` mutex now correctly prevents CUDA packages from being installed, matching classic solver behavior. (#131 via #741)
### Deprecations
* Replace deprecated `conda.core.index._supplement_index_with_system` with `conda.core.index.Index().system_packages`. (#654 via #655)
* Drop support for Python 3.9. (#747)
### Docs
* Update documentation to reflect that the cudatoolkit/cpuonly issue has been resolved for the libmamba solver. (#131)
* Document the [sharded repodata implementation](https://conda.github.io/conda-libmamba-solver/dev/sharded/). (#756, #745)
### Other
* Improve repository server in test suite. (#700)
* Add Python 3.13 to the CI matrix. (#747)
* Test osx-64 with `conda-forge`, and osx-arm64 with `defaults`, since Anaconda does not build osx-64 dependencies anymore. (#729, #747)
## Contributors
* @agriyakhetarpal made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/741
* @dholth
* @jaimergp
* @jezdez
* @jjhelmus
* @kenodegard
* @stacynoland made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/766
* @travishathaway
## 25.4.0 (2025-04-25)
### Enhancements
* Use `conda.reporters.get_spinner()` to support conda reporter plugins. (#641)
### Bug fixes
* Always percent-encode spaces in `file://` channel URLs. (#640)
* Fix a bug where auto-selection of GPU variants of `pytorch` and `torchvision` didn't work as expected. (#646 via #647)
* Avoid `libmamba` `MatchSpec` parsing errors by skipping nameless channel information in passed specs. (#645 via #648)
### Contributors
* @jaimergp
## 25.3.0 (2025-03-14)
### Bug fixes
* Fix issue with content trust post-solve hooks that prevented signatures from being verified when the solved package records didn't include subdir information in their channel metadata. (#616 via #617)
* Protect against `conda.base.context.context.restore_free_channel` deprecation by using `getattr`. (#629)
* Remove all packages with `--no-deps`, not just the last one to be analyzed. (#632)
### Docs
* Mention conda ecosystem's adaptation of `libsolv`. (#624)
### Contributors
* @jaimergp
* @jjerphan
* @kenodegard
## 25.1.1 (2025-01-24)
### Bug fixes
* Consider whether the full spec matches anything installed (not just name) when `--satisfied-skip-solve` is in use. (#605 via #606)
### Contributors
* @jaimergp
## 25.1.0 (2025-01-21)
### Bug fixes
* Fix dependency handling in `conda env update --prune`. (#595 via #596)
* Accept both `pathlib.Path()` and `str` for `LibMambaSolver()` prefix. (#586)
### Contributors
* @dholth
* @jaimergp
## 24.11.1 (2024-12-04)
### Bug fixes
* Ensure `PackageRecord` URLs are percent-decoded before passing them back to `conda`. (#583)
### Contributors
* @jaimergp
## 24.11.0 (2024-11-27)
🚀 This release ships compatibility for `libmamba 2.x`. It's a major rewrite! Make sure to check the changelog entry for `24.11.0rc` for more details.
### Bug fixes
* Load SOLV repodata cache in offline mode too. (#570)
### Contributors
* @jaimergp
## 24.11.0rc (2024-10-31)
### Enhancements
* Require `libmambapy` v2. This is a big refactor in `libmamba` internals, which also allowed us to remove a lot of code in `conda-libmamba-solver`. (#457)
### Deprecations
* `CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED` has no effect anymore. Channels coming from installed packages are no longer added to the channel list. (#411 via #457)
* Removed `conda_libmamba_solver.state.BaseIndexHelper`. The base class is now `conda_libmamba_solver.index.IndexHelper`. (#457)
* Verbose logging in `libsolv` has a big overhead in `libmamba` v2, so we have disabled it by default (even if the user adds `-vvv` flags to the CLI). To opt-in, please set `CONDA_LIBMAMBA_SOLVER_DEBUG_LIBSOLV` to a truthy value. (#457)
* Python 3.8 is no longer supported. The minimum version is now 3.9. (#457)
### Contributors
* @jaimergp
## 24.9.0 (2024-09-25)
### Bug fixes
* Use `Solver` instance configuration to initialize the `libmamba` context without implicitly relying on the `conda` context settings. (#525)
* Fix conda-build compatibility regression where arch-specific outputs can't be found in the test phase if a `noarch` output was built first. (#531)
### Docs
* Add installation workarounds FAQ with conda-standalone. (#505 via #511)
* Update user guide to reflect conda-libmamba-solver being the default solver in conda. (#516 via #517)
* Include `mamba-org/mamba` as a required cloned repository for setting up a dev environment. (#528)
### Contributors
* @jaimergp
* @jjhelmus made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/528
* @justmarkham made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/510
## 24.7.0 (2024-07-17)
### Bug fixes
* Allow wildcards in package names for `conda remove` (e.g. `conda remove "python-*"`). (#434 via #435)
* Avoid duplicate channel listing when using channel-pinned specs like `channel::package`. (#449)
* Fix a performance regression where `.solv` repodata cache files were not being loaded when available. (#481 via #482)
* Do not ignore virtual packages as input specs. (#480 via #485)
* Pin `libmambapy <2` to defend against upcoming API changes. (#492)
### Docs
* Document development workflows with devcontainers. (#451)
### Other
* Add DevContainer configurations for local development workflows. (#451)
### Contributors
* @jaimergp
* @tl-hbk made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/449
* @zklaus made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/476
## 24.1.0 (2024-01-29)
### Enhancements
* Prioritize explicitly requested specs with stricter constraints over implicit ones or name-only specs (e.g. a CLI-specified `name=version=build` will be sent to the solver before CLI-specified `name=version` and `name`). This happens to fix #391. (#381)
* Load `pkgs_dirs` records when called in offline mode. (#396 via #423)
### Bug fixes
* Fix a regression introduced in #378, where certain solves would hard crash due to the given specs input order. (#391 via #381)
* Properly propagate customized local channels (conda-build workspaces). Requires `libmamba 1.5.6` or above. (#398 via #401)
* Do not raise an error if an unsupported `MatchSpec` field can be safely dropped instead. Currently ignoring `url`, `md5` and `sha256`. (#418 via #421, #427 via #429).
* Do not crash if a stateless repodata cache is accessed with `--offline` or `--use-index-cache`. (#396 via #423).
### Other
* Remove old `SolverOutputState.specs` preparation logic from `state.py`, which was no longer in use since 23.9.0. Instead, enumerate all known specs in a certain order (see Enhancements for details). This list is then consumed by `Solver._specs_to_tasks()` as usual. (#381)
### Contributors
* @isuruf made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/401
* @jaimergp
## 23.12.0 (2023-12-12)
### Enhancements
* Add some boundary checks to `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS`. (#394, #403)
### Bug fixes
* Instantiate `IndexHelper` in offline mode for compatibility with conda-build. Otherwise
the index can get out of sync during long build processes. (#386 via #395)
### Docs
* Use new conda-sphinx-theme for documentation site. (#367 via #370)
* Reorganize the layout of the documentation site. (#370)
### Contributors
* @dholth
* @jaimergp
* @jezdez
* @travishathaway made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/370
## 23.11.1 (2023-11-16)
### Enhancements
* Raise a friendlier `InvalidSpec` error instead of `RuntimeError` when libmamba detects a problem in the configured solver jobs. (#352 via #357)
* Ensure specs, `SolverInputState.installed` and `SolverInputState.virtual` containers are consistently sorted. (#378)
### Bug fixes
* Configure pinned specs just once to avoid solver bugs related with their persistence (i.e. inability to downgrade environments if pinned specs are present and a transient dependency needs to be removed). (#354 via #355)
* Detect whether a channel is part of a multichannel so the latter is used in the `PackageRecord` entries for conda-build. Fixes an issue with conda-build and custom multichannels. (#363 via #365)
* Allow authenticated URLs in `default_channels` and other multichannels. (#364 via #366)
* Preserve authentication while reloading local channels. (#366)
### Contributors
* @jaimergp
## 23.11.0 (2023-11-02)
### Bug fixes
* Do not use `libmamba`'s default signal handler so users can `Ctrl-C` from `conda`. (#337 via #340)
* Defer conda-build-specific exception definition and import until it is needed by the solver. (#342)
* Interpret "excluded by strict priority" solver errors as proper satisfiability conflicts and avoid printing related yet uninformative warnings. (#343)
* Ensure that historic specs are kept in the environment, even if that means raising a conflict. (#341 via #345)
### Docs
* Document environment variables used for advanced configuration. (#349)
### Other
* Require `libmambapy >=1.5.3` for improved signal handling and `MatchSpec` syntax compliance. (#347)
### Contributors
* @dholth
* @jaimergp
## 23.9.3 (2023-10-24)
### Bug fixes
* Massage bracket-containing specs (e.g. `ca-certificates[version='>=2023']`) so they are understood by `libmambapy.Query`, fixing a bug where `conda` would erroneously complain about no package records matching the configured pinned specs. (#327 via #328)
### Contributors
* @jaimergp
## 23.9.2 (2023-10-19)
### Bug fixes
* Use the conda version reported at runtime (instead of the one reported by `conda list`) to figure out whether there are conda updates available. (#316)
* Allow the index to be empty in `--offline` runs with no local cache available for the configured channels. (#323)
### Contributors
* @costrouc
* @jaimergp
## 23.9.1 (2023-09-29)
### Enhancements
* Increase performance of `notify_conda_outdated` logic. (#298)
### Bug fixes
* Prevent solver from bouncing between two compatible solutions when the same command is run twice in a row. (#302)
### Contributors
* @costrouc
* @jaimergp
## 23.9.0 (2023-09-28)
### Enhancements
* Expose libmamba's `repoquery` search features as a conda subcommand plugin. (#258)
* Rewrite how we create tasks for `libsolv`, making use of `libmamba`'s `add_pin` features. Requires `libmambapy >=1.5.1`. (#270, #288)
* Name-only pins will lock the corresponding package if installed. ([conda#13031](https://github.com/conda/conda/pull/13031) via #289)
* Use the `.solv` cache for repodata if available and recent. (#295)
### Bug fixes
* Handle commands with no channels passed gracefully. (#256)
* Workaround for missing `noarch` field in returned `PackageRecord` payload. (#257)
* Port logic from [conda/conda#9614](https://github.com/conda/conda/pull/9614), which fixes
a bug where the `--prune` flag was not working correctly in `conda env update` commands.
(#270)
* Ensure environments are not aggressively updated to higher priority channels under some conditions. (#240 via #270, #285)
* Do not inject those channels from installed packages that do not exist or are unavailable. (#262 via #274)
* Correctly print all configured channels in `PackagesNotFoundError` exceptions. (#284)
* Do not crash if a `MatchSpec` with a build string is specified in the CLI and there's a pinned spec for the same package name. (#286 via #289)
* Only apply `defaults::pkg` workarounds for the default value `default_channels`. (#292)
### Deprecations
* Users won't be able to override pinned specs with incompatible CLI specs anymore. Instead they must modify their pinned specs explicitly. ([conda#9016](https://github.com/conda/conda/issues/9016) via #289, #294)
### Docs
* Document intentional deviations from conda's `classic` solver behavior. (#289)
### Other
* Explain why `defaults::pkg_name` is broken libmamba 1.5.x ([details](https://github.com/mamba-org/mamba/issues/2431)). (#266)
## 23.7.0 (2023-07-31)
### Enhancements
* Add basic integrations for local channels in conda-build. (#194)
### Bug fixes
* Add backwards-compatible support for the new namespaced settings in `libmamba.Context`. (#192 via #193)
* Fixes an error where a user-supplied package in the CLI would get dropped if the argument happened to match a larger string in the argument list. (#221 via #222)
* Fix authentication in package downloads. (#216 via #226)
* Fix unhandled channels coming from injected virtual packages in `conda-lock`. (#230 via #234)
* Handle URL-encoded channels correctly with recent `libmamba` versions. (#247 via #248)
### Docs
* Added notes about development workflows with libmamba from source. (#191)
### Other
* Adding libmamba/libmambapy as development dependencies within docker images. (#191)
### Contributors
* @costrouc
* @jaimergp
* @conda-bot
* @pre-commit-ci[bot]
## 23.5.0 (2023-05-25)
### Enhancements
* Provide a `CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED` environment variable to prevent
channels from being injected from installed packages. This is useful for air-gapped environments
where outside channels are not available. (#108 via #184)
* Simplify `libmambapy.Context` initialization so we only set the bits that we use. (#209)
* Use the new `RepoInterface` and remove the `SubdirData` subclass workarounds, which requires `conda 23.5.0`.
(#210)
### Bug fixes
* Fix an issue where running `conda update <package>` would result in the package being _downgraded_ if no newer versions were available. (#71 via #158)
* Ensure unauthenticated channels are not re-injected in the channel lists from installed packages
if an authenticated equivalent is already present. (#108 via #184)
* Honor `context.repodata_threads`. (#200)
* Do not set `quiet` manually when `context.json` is true. (#187)
### Deprecations
* Remove unneeded user-agent tests. (#183)
### Docs
* Document known solver behavior differences. (#115, #131 via #197)
* Update development docs to reflect changes in build system and other inaccuracies. (#208)
### Other
* Add tests reproducing the known solver differences. (#115, #131 via #197)
* Skip tests on libmamba 1.4.2 temporarily to workaround some test failures. Tracked by #186. (#187)
### Contributors
* @jakirkham made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/189
* @costrouc
* @jaimergp
* @jezdez
* @kenodegard
* @conda-bot
* @pre-commit-ci[bot]
## 23.3.0 (2023-03-31)
### Enhancements
* Simplify exception parsing and enable new (experimental) conflict reports in `libmamba`. (#102 via #103, #160)
* Use `conda`'s `SubdirData` for all repodata fetching and caching. (#59, #68 via #65, #171)
### Bug fixes
* Disable lockfiles within libmambapy to conform with conda's behavior of not using them. (#120)
* Fix JSON serialization errors in some exceptions. (#140 via #142)
* Fix API breakage upstream: `SubdirData.cache_path_json` property changed from `str` to `PrefixPath`. Depend directly on `boltons.setutils.IndexedSet`. (#151)
* Updated bundled conda recipe and corresponding CI workflow. (#166)
* Bumped minimum conda version from 22.11.1 -> 23.3.0 due to change in boltons IndexedSet. (#170)
* Add workaround for `defaults::<pkg_name>` specs. (#173 via #172)
### Deprecations
* Python 3.7 is no longer supported. The minimum version is now 3.8. (#174)
### Other
* Change the build-system to `hatchling` + `hatch-cvs` for a `setuptools-scm`-like versioning setup. (#128 via #127)
* Add conda-forge based CI environments. (#133)
* Fix cache directory in flaky test. (#157)
* CI: Pin `minio` to `2023-03-13T19-46-17Z` to avoid breaking changes. (#159)
* Require `libmamba 1.4.1` or greater and remove unused code paths. (#165)
### Contributors
* @AlbertDeFusco made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/142
* @costrouc
* @jaimergp
* @jezdez
* @conda-bot
* @pre-commit-ci[bot]
## [23.1.0] - 2023-01-31
### Bug fixes
* Fix "Packages Not Found" error messages to be more accurate and informative. (#96 via #101)
* Ensure solves are deterministic and input order independent. (#75 via #111)
* Fix compatibility errors with newer conda versions >=23.1.0 since we are using an internal API SubdirData. (#118 via #119)
### Docs
* Mention expected versions and how to upgrade from experimental builds. (#89 via #93)
### Other
* CI: Add scheduled runs with self-reported issues. (#60 via #106)
* Fix typo in workflow documentation so it is consistent with the setup page. (#110)
### Contributors
* @costrouc made their first contribution in #110
* @jaimergp
* @jezdez
* @conda-bot
* @pre-commit-ci[bot]
## [22.12.0] - 2022-12-01
### Upgrade notice
To upgrade to `conda-libmamba-solver 22.12.0` please update to `conda 22.11.0` using the "classic" solver first:
```
$ CONDA_EXPERIMENTAL_SOLVER=classic conda install -n base conda=22.11.0
```
and then install a new version of conda-libmamba-solver:
```
$ CONDA_EXPERIMENTAL_SOLVER=classic conda install -n base conda-libmamba-solver=22.12.0
```
Afterwards, please use the new `CONDA_SOLVER` environment variable and ``--solver`` as mentioned below.
### Added
* Added a new documentation site: https://conda.github.io/conda-libmamba-solver/ (#58)
* Added [CEP 4](https://github.com/conda-incubator/ceps/blob/main/cep-4.md) compatible plugin for conda's `solvers` plugin hook. (#63)
### Changed
* The `conda-libmamba-solver` package is now generally available, removes the `experimental` label. (#53)
* The index will also load channels only listed as part the installed packages in the active prefix. (#52)
* Updated compatibility to [mamba 1.0.0](https://github.com/mamba-org/mamba/releases/tag/2022.11.01) and [conda 22.11.0](https://github.com/conda/conda/releases/tag/22.11.0). (#78)
### Deprecated
* Deprecate support for Python 3.6.x.
### Fixed
* Fixed a wrong dependency on libmambapy. (#90)
* If missing or empty, package records will have their `subdir` field populated by the channel platform. (#53)
## [22.8.1] - 2022-08-25
### Fixed
* Amend packaging metadata (#51)
## [22.8.0] - 2022-08-24
### Added
* Check if conda is outdated with `libmamba` instead of relying on conda's implementation (#46)
### Changed
* Rely on conda's `SubdirData` as a fallback for channel protocols not supported by `libmamba` (#49)
### Deprecated
* Deprecate `libmamba-draft` solver variant (#45)
### Removed
* Remove legacy debugging code and file-logging based on stream capture (#48)
## [22.6.0] - 2022-06-28
### Added
* Custom user agent (#29)
* Compatibility with conda-build (#30)
### Changed
* Enable support for user-defined `repodata_fn` while ignoring `current_repodata.json` (#34)
* Faster Python version changes (#33)
* Remove base environment protection (#43)
### Fixed
* Fix libmamba 0.23 compatibility (#35)
* Fix handling of `*`-enabled build strings (#36)
* Fix `escape_channel_url` problems (#32)
* Fix error reporting if S3-backed channels are used (#41)
## [22.3.1] - 2022-03-23
### Fixed
* Make sure `noarch` packages get reinstalled if Python version changed (#26)
* Accept star-only version specs (e.g. `libblas=*=*mkl`) and fix support for `channel::package` syntax (#25)
* Enable support for authenticated channels (#23)
## [22.3.0] - 2022-03-09
_First public release_
## [22.2.0] - 2022-02-01
_Internal pre-release as a separate repository._
<!-- Hyperlinks --->
[Unreleased]: https://github.com/conda/conda-libmamba-solver/compare/22.8.1..main
[22.3.1]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.3.1
[22.3.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.3.0
[22.2.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.2.0
[22.6.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.6.0
[22.8.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.8.0
[22.8.1]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.8.1
[22.12.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0
[23.1.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/23.1.0
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Conda Organization Code of Conduct
# The Short Version
Be kind to others. Do not insult or put down others. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are not appropriate for the conda Organization.
All communication should be appropriate for a professional audience including people of many different backgrounds. Sexual language and imagery is not appropriate.
The conda Organization is dedicated to providing a harassment-free community for everyone, regardless of gender, sexual orientation, gender identity and expression, disability, physical appearance, body size, race, or religion. We do not tolerate harassment of community members in any form.
Thank you for helping make this a welcoming, friendly community for all.
## Report an Incident
* Report a code of conduct incident [using a form](https://form.jotform.com/221527028480048).
* Report a code of conduct incident via email: [conduct@conda.org](mailto:conduct@conda.org).
* Contact [an individual committee member](#committee-membership) or [CoC event representative](#coc-representatives) to report an incident in confidence.
And now the longer version...
# Conda Organization Diversity Statement
The conda Organization welcomes and encourages participation in our community by people of all backgrounds and identities. We are committed to promoting and sustaining a culture that values mutual respect, tolerance, and learning, and we work together as a community to help each other live out these values.
We have created this diversity statement because we believe that a diverse community is stronger, more vibrant, and produces better software and better science. A diverse community where people treat each other with respect has more potential contributors, more sources for ideas, and fewer shared assumptions that might hinder development or research.
Although we have phrased the formal diversity statement generically to make it all-inclusive, we recognize that there are specific identities that are impacted by systemic discrimination and marginalization. We welcome all people to participate in the conda Organization community regardless of their identity or background.
# Conda Organization Code of Conduct: Introduction & Scope
This code of conduct should be honored by everyone who participates in the conda Organization community. It should be honored in any conda Organization-related activities, by anyone claiming affiliation with the conda Organization, and especially when someone is representing the conda Organization in any role (including as an event volunteer or speaker).
This code of conduct applies to all spaces managed by the conda Organization, including all public and private mailing lists, issue trackers, wikis, forums, and any other communication channel used by our community. The code of conduct equally applies at conda Organization events and governs standards of behavior for attendees, speakers, volunteers, booth staff, and event sponsors.
This code is not exhaustive or complete. It serves to distill our understanding of a collaborative, inclusive community culture. Please try to follow this code in spirit as much as in letter, to create a friendly and productive environment that enriches the conda Organization community.
The conda Organization Code of Conduct follows below.
# Standards for Behavior
The conda Organization is a worldwide community. All communication should be appropriate for a professional audience including people of many different backgrounds.
**Please always be kind and courteous. There's never a need to be mean or rude or disrespectful.** Thank you for helping make this a welcoming, friendly community for all.
We strive to:
**Be empathetic, welcoming, friendly, and patient.** We remember that the conda Organization is crafted by human beings who deserve to be treated with kindness and empathy. We work together to resolve conflict and assume good intentions. We may all experience some frustration from time to time, but we do not allow frustration to turn into a personal attack. A community where people feel uncomfortable or threatened is not a productive one.
**Be collaborative.** Our work depends on the participation of many people, and in turn others depend on our work. Open source communities depend on effective and friendly collaboration to achieve their goals.
**Be inquisitive.** Nobody knows everything! Asking questions early avoids many problems later, so we encourage questions, although we may direct them to the appropriate forum. We will try hard to be responsive and helpful.
**Be careful in the words that we choose.** We are careful and respectful in our communication and we take responsibility for our own speech. Be kind to others. Do not insult or put down other members of the community.
## Unacceptable Behavior
We are committed to making participation in this community a harassment-free experience.
We will not accept harassment or other exclusionary behaviors, such as:
- The use of sexualized language or imagery
- Excessive profanity (please avoid curse words; people differ greatly in their sensitivity to swearing)
- Posting sexually explicit or violent material
- Violent or intimidating threats or language directed against another person
- Inappropriate physical contact and/or unwelcome sexual attention or sexual comments
- Sexist, racist, or otherwise discriminatory jokes and language
- Trolling or insulting and derogatory comments
- Written or verbal comments which have the effect of excluding people on the basis of membership in a specific group, including level of experience, gender, gender identity and expression, sexual orientation, disability, neurotype, personal appearance, body size, race, ethnicity, age, religion, or nationality
- Public or private harassment
- Sharing private content, such as emails sent privately or non-publicly, or direct message history, without the sender's consent
- Continuing to initiate interaction (such as photography, recording, messaging, or conversation) with someone after being asked to stop
- Sustained disruption of talks, events, or communications, such as heckling of a speaker
- Publishing (or threatening to post) other people's personally identifying information ("doxing"), such as physical or electronic addresses, without explicit permission
- Other unethical or unprofessional conduct
- Advocating for, or encouraging, any of the above behaviors
The conda Organization prioritizes marginalized people’s safety over privileged people’s comfort. The conda CoC Committee reserves the right not to act on complaints including, but not limited to:
* ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’.
* Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you.”
* Communicating in a ‘tone’ you don’t find congenial.
* Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions.
## Behavior Outside of conda Organization Spaces
The CoC Committee does not influence behavior and membership in spaces outside the conda Organization. However, if you are being harassed by a member of the conda community outside our spaces, you may still report it to the CoC Committee. We will take all good-faith reports of harassment by conda community members seriously. This includes harassment outside our spaces and harassment that took place at any point in time.
The CoC Committee reserves the right to exclude people from conda Organization spaces based on their past behavior, including behavior outside conda Organization spaces and behavior towards people who are not in the conda community.
# Confidentiality and Public Statements to the Community
The CoC Committee will keep the identity of the reporter confidential.
Whenever possible, CoC cases will be reported to the community. The level of detail in reports will vary from case to case. Reports will describe at least the type of infraction that was reported, and the Committee's decision and any action taken. In most cases, the report will not include personally identifiable information.
# Live Events
> **If you feel your safety is in jeopardy or the situation is an emergency, we urge you to contact local law enforcement before making a report to the event's Code of Conduct committee members, [representatives](#coc-representatives), or other staff.** (In the U.S., call 911.)
Live events present particular challenges:
**Code of conduct reports, and consequences that stem from them, merit a thoughtful and deliberative process. Decisions and consequences matter for the reporter, the reported, and for the community at large. However, many reports, especially at live events, require rapid action to quickly address the behavior being reported.**
To better support situations where immediate action may be required, these guidelines are used *during* live events:
* All conda Organization events will have specific, named Code of Conduct contacts for the events.
* The names and contact mechanisms for the Code of Conduct representatives will be clearly and frequently communicated to event participants.
## CoC Representatives
Every conda Organization associated event will have named CoC Committee members or *CoC representatives* that are the first point of contact for that event. Who these people are will be clearly and frequently communicated to event participants. CoC approved representatives are used when there are no committee members participating in the event.
## Live Events: Reporting and Actions
At conda Organization events, Code of Conduct committee members or representatives will attempt to gather and write down [information](#what-to-include-in-a-report) from anyone making a verbal report at a live event. Recording the details in writing is exceedingly important in order for us to effectively respond to reports. If event staff write down a report taken verbally, then the person making the report will be asked to review the written report for accuracy.
For reports made during live events, or in any situation where urgent action is needed:
* Any two (or more) event organizers, event staff, CoC Committee members or CoC representatives can decide if immediate action is to be taken and what that action is. In exceptionally dangerous situations, this decision can be made by a single person.
* These rapid decisions can be reconsidered during the event as more information becomes available.
* The scope of any rapid decision is limited to the current event / situation.
* The report, any related information, and any decisions and consequences will be reported to the full Code of Conduct Committee as soon as possible.
The full Code of Conduct Committee will then consider the report using the full timeline and processes defined below. The Committee may decide to apply consequences in other spaces beyond the space where the behavior was reported.
Potential *immediate* consequences for violating the conda Organization Code of Conduct at a live event include, but are not limited to:
- Warning the person to cease their behavior and that any further reports will result in sanctions
- Requiring that the person avoid any interaction with, and physical proximity to, the person they are harassing for the remainder of the event
- Ending a talk that violates the policy early
- Not publishing the video or slides of a talk that violated the policy
- Not allowing a speaker who violated the policy to give (further) talks at the event now or in the future
- Immediately ending any event volunteer responsibilities and privileges the reported person holds
- Expelling the person from the event without a refund
- Requiring that the person immediately leave the event and not return
- Any other response that the CoC members, representatives, or event staff deem necessary and appropriate to the situation
# Reporting Guidelines
If you believe someone is violating the code of conduct, please report this in a timely manner. Code of conduct violations reduce the value of the community for everyone. The conda Code of Conduct (CoC) Committee and the conda Organization take reports of misconduct very seriously and are committed to preserving and maintaining the welcoming nature of our community.
> [!NOTE]
> You are also encouraged to reach out to the conda Code of Conduct (CoC) Committee if you want clarification on something, if you notice some borderline behavior, or just have a concern. Send us a note at [conduct@conda.org](mailto:conduct@conda.org).
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The conda CoC Committee commits to maintaining confidentiality with regard to the reporter of an incident.
For possibly unintentional breaches of the code of conduct, you may want to respond to the person and point out this code of conduct (either in public or in private, whatever is most appropriate). If you would prefer not to do that, please report the issue to the conda CoC Committee directly.
Take care of each other. Alert someone if you notice a dangerous situation, someone in distress, or violations of this code of conduct, even if they seem inconsequential.
## How to Submit a Report
The CoC Committee is committed to promptly addressing any reported issues. If you have experienced or witnessed behavior that violates the conda Organization Code of Conduct, please let us know.
You can report an incident
* via the **[Incident Reporting Form](https://form.jotform.com/221527028480048)**
* via email: [conduct@conda.org](mailto:conduct@conda.org)
* contact [an individual committee member](#committee-membership) or [CoC event representative](#coc-representatives) to report an incident in confidence.
Reports submitted via the form or committee email address are sent to the [full conda Code of Conduct Committee](#committee-membership).
## What to Include in a Report
Our ability to address any code of conduct breaches in a timely and effective manner is impacted by the amount of information you can provide, so, we ask you to include as much of the following information as you can**:
- **Your contact info** (so we can get in touch with you if we need to follow up). This will be kept confidential. You can also file a report [anonymously](#anonymous-reporting).
- The **approximate time and location of the incident** (please be as specific as possible).
- **Identifying information** (e.g. name, nickname, screen name, physical description) of the individual whose behavior is being reported.
- **Description of the behavior** (if reporting harassing language, please be specific about the words used), **your account of what happened**, and any available **supporting records** (e.g. email, GitHub issue, screenshots, etc.).
- **Description of the circumstances/context** surrounding the incident.
- Let us know **if the incident is ongoing**, and/or if this is part of an ongoing pattern of behavior.
- Names and contact info, if possible, of **anyone else who witnessed** or was involved in this incident. (Did anyone else observe the incident?)
- **Any other relevant information** you believe we should have.
## Anonymous Reporting
The reporting form supports anonymous incident reporting. Anonymous reporting works best when the behavior happened in a public space and was witnessed by many. If an incident is reported anonymously and was not witnessed by others, then the committee may be limited in what actions it can take and what it can report to the larger community. Nevertheless, the CoC Committee is still interested in receiving these reports. They are helpful when determining what we need to address as a community, and when looking for evidence of repeated behavior.
## Conflicts of Interest
Committee members are expected to recuse themselves if they have a conflict of interest, and are required to recuse themselves if they are the accused or the target of the reported behavior. In addition, the CoC Committee can [vote](#voting-and-decision-making) to remove a committee member from a case, if the committee feels that the member has a conflict of interest. This [vote](#voting-and-decision-making) requires a simple majority. <!-- codespell:ignore recuse -->
If you are concerned about making a report that will be read by all committee members, you are strongly encouraged to contact [individual committee members](#committee-membership) directly.
# Enforcement: What Happens After a Report is Filed?
## Acknowledgment and Responding to Immediate Needs
CoC Committee members and/or event staff will attempt to ensure your safety and help with any immediate needs. The CoC Committee will make every effort to **acknowledge receipt within 24 hours** (and we'll aim for much more quickly than that).
## Reviewing the Report
The CoC Committee will make all efforts to **review the incident within three days** and determine:
- Whether this is an ongoing situation, or if there is a threat to anyone's physical safety
- What happened
- Whether this event constitutes a code of conduct violation
- Who the bad actor was, if any
## Contacting the Person Reported
After the CoC Committee has had time to review and discuss the report, someone will attempt to contact the person who is the subject of the report to inform them of what has been reported about them. We will then ask that person for their account of what happened.
## Response and Potential Consequences
Once the CoC Committee has completed our investigation of the report, we will make a decision as to how to respond. The person making a report will not normally be consulted as to the proposed resolution of the issue, except insofar as we need to understand how to help them feel safe.
Potential consequences for violating the conda Organization code of conduct include:
- Nothing (if we determine that no violation occurred)
- Private feedback or reprimand from the CoC Committee to the individual(s) involved
- Warning the person to cease their behavior and that any further reports will result in sanctions
- A public announcement that an incident occurred
- Mediation (only if both reporter and reportee agree)
- An imposed vacation (e.g. asking someone to "take a week off" from a mailing list)
- A permanent or temporary ban from some or all the conda Organization spaces (mailing lists, GitHub repos, in-person events, etc.)
- Assistance to the complainant with a report to other bodies, for example, institutional offices or appropriate law enforcement agencies
- Removing a person from the conda Organization membership or other formal affiliation
- Publishing an account of the harassment and calling for the resignation of the alleged harasser from their responsibilities (may be called for if the person is an event leader, or refuses to stand aside from the conflict of interest, or similar)
- Any other response that the CoC Committee deems necessary and appropriate to the situation
No one espousing views or values contrary to the standards of our code of conduct will be permitted to hold any position representing the conda Organization, including volunteer positions. The CoC Committee has the right and responsibility to remove, edit, or reject comments, commits, code, website edits, issues, and other contributions that are not aligned with this code of conduct.
We aim to **respond within one week** to the original reporter with either a resolution or an explanation of why the situation is not yet resolved.
We will contact the person who is the subject of the report to let them know what actions will be taken as a result of the report, if any.
Our policy is to make sure that everyone aware of the initial incident is also made aware that official action has been taken, while still respecting the privacy of individuals. In addition, we will also usually [notify the community](#confidentiality-and-public-statements-to-the-community) that an incident has been reported, what type of incident it was, and what the response was, again respecting the privacy of individuals.
## Appealing a Decision
To appeal a decision of the CoC Committee, contact the [Committee Co-Chairs](#committee-membership), with your appeal. Please include as much detail as possible about why you are appealing the decision. The Co-Chairs will review the appeal, possibly consulting with the full Committee, and then issue a decision.
# Timeline Summary:
| Time | Event | Details |
| ---- | ---- | ---- |
| Within 24 Hours | Acknowledge | The CoC Committee will make every effort to **acknowledge receipt of a report within 24 hours**. |
| Within 3 Days | Review | The CoC Committee aims to **review the incident within three days**. |
| Within 1 Week | Resolve | We will **respond within one week** to the original reporter with either a resolution or an explanation of why the situation is not yet resolved. |
# Voting and Decision Making
Committee votes and decisions require both a minimum quorum size for the vote to be counted, and then a minimum percentage of cast affirmative votes to pass.
Except where otherwise noted, votes require a quorum and a simple majority to pass:
* Minimum Quorum:
* More than 50% of eligible committee members must vote.
* Eligibile members do not include those excluded because of [conflicts of interest](#conflicts-of-interest).
* Affirmative vote threshold:
* More than 50% of the votes cast need to be affirmative to take action.
# Committee Membership
You can reach the entire CoC Committee by emailing [conduct@conda.org](mailto:conduct@conda.org).
| Name | Employer / Funding | Steering Council Member | Current Term Ends |
| ---- | ---- | ---- | --- |
| [Eric Dill](https://github.com/ericdill) | [Anaconda](https://anaconda.com/) | | 2026-07-01 |
| [Dasha Gurova](https://github.com/dashagurova) | [Anaconda](https://anaconda.com/) | | 2026-07-01 |
| [Bianca Henderson](https://github.com/beeankha) | [Red Hat](https://redhat.com/) | | 2026-07-01 |
| [Katherine Kinnaman](https://github.com/kathatherine) | [Anaconda](https://anadonda.com/) | | 2026-07-01 |
| [Mahe Iram Khan](https://github.com/ForgottenProgramme) | [Anaconda](https://anaconda.com/) | | 2025-07-01 |
| [Ken Odegard](https://github.com/kenodegard) | [Anaconda](https://anaconda.com/) | | 2025-07-01 |
| [Crystal Soja](https://github.com/csoja), Co-Chair | [Anaconda](https://anaconda.com/) | | 2025-07-01 |
| [Jaime Rodríguez-Guerra](https://github.com/jaimergp), Co-Chair | [Quansight](https://quansight.com/) | yes | 2025-07-01 |
# Terms and New Members
* Committee members are appointed for two year terms. Committee members can choose to renew their memberships.
* Committee members can resign before their term ends.
* Committee members can also be removed by a [simple majority vote](#voting-and-decision-making) from their fellow committee members.
* New committee members are added by a simple majority vote as well.
# Eligibility
Anyone from the community who is interested and able to do CoC Committee work is eligible to be nominated for the committee. New committee members can be nominated by any community member, including nominating themselves.
## Shared Funding
Unlike the Steering Council, we are not limiting the number of Committee members who share a common source of funding. However, if a report involves someone who shares funding with CoC Committee members, then the remainder of the committee may vote to exclude some or all Committee members with that same funding, even if that excludes a majority of the CoC Committee. This should be done only if the separately funded Committee members feel that the common funding is interfering with decision making.
Note: This requires tracking the funding sources of CoC Committee members.
## Overlap with Steering Council Membership
Committee members can also be on the conda Organization Steering Council. However, Steering Council members have to make up less than 50% of the Code of Conduct Committee.
# Updating this Code of Conduct
The conda Organization's Code of Conduct can be updated by a [simple majority vote](#voting-and-decision-making) of the CoC Committee.
# License
This code of conduct is based on the [NumFOCUS code of conduct template](https://github.com/numfocus/numfocus/blob/8759e21481552f213489e3718979ccecf68e9ead/manual/numfocus-coc.md) as it existed on 2022/03/08 (which is the 2019/11/20 version). Several added sections are based on the [Galaxy Community Code of Conduct](https://galaxyproject.org/community/coc/).
The NumFOCUS code of conduct template was itself adapted from numerous sources, including the [*Geek Feminism wiki, created by the Ada Initiative and other volunteers, which is under a Creative Commons Zero license*](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), the [*Contributor Covenant version 1.2.0*](http://contributor-covenant.org/version/1/2/0/), the [*Bokeh Code of Conduct*](https://github.com/bokeh/bokeh/blob/master/CODE_OF_CONDUCT.md), the [*SciPy Code of Conduct*](https://github.com/jupyter/governance/blob/master/conduct/enforcement.md), the [*Carpentries Code of Conduct*](https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html#enforcement-manual), and the [*NeurIPS Code of Conduct*](https://neurips.cc/public/CodeOfConduct).
**The conda Organization Code of Conduct is licensed under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).**
================================================
FILE: HOW_WE_USE_GITHUB.md
================================================
<!-- edit this in https://github.com/conda/infrastructure -->
# How We Use GitHub
<!-- absolute URLs -->
[conda-org]: https://github.com/conda
[project-refinement]: https://github.com/orgs/conda/projects/22/views/14
[project-backlog]: https://github.com/orgs/conda/projects/22/views/2
[project-current-sprint]: https://github.com/orgs/conda/projects/22/views/10
[project-review]: https://github.com/orgs/conda/projects/16
[docs-toc]: https://github.blog/changelog/2021-04-13-table-of-contents-support-in-markdown-files/
[docs-saved-reply]: https://docs.github.com/en/get-started/writing-on-github/working-with-saved-replies/creating-a-saved-reply
[infrastructure]: https://github.com/conda/infrastructure
[workflow-sync]: https://github.com/conda/infrastructure/blob/main/.github/workflows/sync.yml
[labels-global]: https://github.com/conda/infrastructure/blob/main/.github/global.yml
<!-- relative URLs -->
[workflow-cla]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/cla.yml
[workflow-issues]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/issues.yml
[workflow-labels]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/labels.yml
[workflow-lock]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/lock.yml
[workflow-project]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/project.yml
[workflow-stale]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/stale.yml
[labels-local]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/labels.yml
[labels-page]: https://github.com/conda/conda-libmamba-solver/labels
This document seeks to outline how we as a community use GitHub Issues to track bugs and feature requests while still catering to development practices & project management (_e.g._, release cycles, feature planning, priority sorting, etc.).
<!-- only include high-level topics or particularly noteworthy sections here -->
**Topics:**
- [What is "Issue Sorting"?](#what-is-issue-sorting)
- [Labeling](#labeling)
- [Types of Issues](#types-of-issues)
- [Standard Issue](#standard-issue)
- [Epics](#epics)
- [Spikes](#spikes)
- [Working on Issues](#working-on-issues)
- [Development Processes](#development-processes)
- [Code Review and Merging](#code-review-and-merging)
> [!NOTE]
> This document is written in the style of an FAQ. For easier navigation, use [GitHub's table of contents feature][docs-toc].
## What is "Issue Sorting"?
> [!NOTE]
> "Issue sorting" is similar to that of "triaging", but we've chosen to use different terminology because "triaging" is a word related to very weighty topics (_e.g._, injuries and war) and we would like to be sensitive to those connotations. Additionally, we are taking a more "fuzzy" approach to sorting (_e.g._, severities may not be assigned, etc.).
"Issue Sorting" refers to the process of assessing the priority of incoming issues. Below is a high-level diagram of the flow of issues:
```mermaid
flowchart LR
subgraph flow_sorting [Issue Sorting in Issue Tracker]
state_sorting{{Maintainer sorting}}
end
subgraph flow_roadmap [Roadmap Board]
board_refinement{{Refinement}}
board_backlog{{Backlog}}
board_refinement-->board_backlog
board_backlog-- reprioritize -->board_backlog
board_progress{{Current Sprint - In Progress}}
end
state_new(New Issues)
state_closed(Closed)
state_new-->state_sorting
state_sorting-- accepted for work -->board_refinement
state_sorting-- duplicate, off-topic, support resolved -->state_closed
board_backlog-- pending work -->board_progress
board_refinement-- not actionable -->state_closed
board_backlog-- resolved, irrelevant -->state_closed
board_progress-- resolved -->state_closed
```
### Why sort issues?
At the most basic "bird's eye view" level, sorted issues will fall into the category of four main priority levels:
- Do now
- Do sometime
- Provide user support
- Never do (_i.e._, close)
At its core, sorting enables new issues to be placed into these four categories, which helps to ensure that they will be processed at a velocity similar to or exceeding the rate at which new issues are coming in. One of the benefits of actively sorting issues is to avoid engineer burnout and to make necessary work sustainable; this is done by eliminating a never-ending backlog that has not been reviewed by any maintainers.
There will always be broad-scope design and architecture implementations that the maintainers will be interested in pursuing; by actively organizing issues, they will be able to more easily track and tackle both specific and big-picture goals.
### Who does the sorting?
Core maintainers help with sorting issues, making decisions regarding closing issues and setting feature work priorities, among other sorting-related tasks.
### How does issue sorting and board intake work?
New issues that are opened in any of the repositories in the [conda GitHub organization][conda-org] are reviewed in the repository issue tracker first. During sorting in the issue tracker, issues are reviewed for the following outcomes:
- Mitigation via short-term workarounds and fixes
- Redirection to the correct project
- Determining if support can be provided for errors and questions
- Closing out of any duplicate/off-topic issues
The core maintainers are not seeking to _resolve_ issues that arise. Instead, the goal is to understand the issue and to determine whether it is legitimate, and then to collect as much relevant information as possible so that the maintainers can make an informed decision about the appropriate resolution schedule.
Issues can remain in this investigatory phase (_e.g._, querying the user for more details, asking the user to attempt other workarounds, other debugging efforts, etc.) and are likely to remain in this state the longest, but should still be progressing over the course of 1-2 weeks.
Items are added to the [Refinement tab of the Roadmap Board][project-refinement] once sorting has concluded and the core maintainer has enough information to make a decision about the appropriate resolution schedule for the issue. Newly opened pull requests are automatically added to the [Review board][project-review] by [`.github/workflows/project.yml`][workflow-project].
Issues that are not accepted for planned work are closed instead (_e.g._ duplicates, redirects, user errors, resolved support questions, etc.).
### Where do work issues go after being sorted?
Once issues are accepted for work, they are added to the ["Refinement" tab of the Roadmap Board][project-refinement]. After refinement and prioritization, issues move to ["Backlog"][project-backlog] and then to ["Current Sprint"][project-current-sprint] when actively being worked. Issues are closed once the work is complete.
### What is the purpose of having a "Backlog"?
Issues are "backlogged" when they have been accepted and refined but are not yet planned into the current sprint.
### What automation procedures are currently in place?
Global automation procedures synced out from the [`conda/infrastructure`][infrastructure] repo include:
- [Marking/Closing stale issues and pull requests][workflow-stale]:
- https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport issues are labeled as stale after 21 days of inactivity and are closed after 7 more days of inactivity (that is, closed after 30 inactive days total)
- non https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport issues are labeled as stale after 365 days of inactivity and are closed after 30 more days of inactivity (that is, closed after an approximate total of 1 year and 1 month of inactivity)
- all pull requests are labeled as stale after 365 days of inactivity and are closed after 30 more days of inactivity (that is, closed after an approximate total of 1 year and 1 month of inactivity)
- [Locking of closed issues and pull requests with no further activity][workflow-lock] after 365 days
- [Adding new pull requests to the Review board][workflow-project]
- [Indicating an issue is ready for a maintainer's attention][workflow-issues] by toggling https://github.com/conda/conda-libmamba-solver/labels/pending%3A%3Afeedback with https://github.com/conda/conda-libmamba-solver/labels/pending%3A%3Asupport after a contributor leaves a comment
- [Verifying that contributors have signed the CLA][workflow-cla] before allowing pull requests to be merged; if the contributor hasn't signed the CLA previously, merging is blocked until a manual review can be done
- [Syncing out templates, labels, workflows, and documentation][workflow-sync] from [`conda/infrastructure`][infrastructure] to the other repositories
### Are there any templates to use as responses for commonly-seen issues?
Some of the same types of issues appear regularly (_e.g._, issues that are duplicates of others, issues that should be filed in the Anaconda issue tracker, errors that are due to a user's specific setup/environment, etc.).
Below are some boilerplate responses for the most commonly-seen issues to be sorted:
<details>
<summary><b>Duplicate Issue</b></summary>
<!-- this is a code block, any links need to be embedded -->
<pre>
This is a duplicate of <b>[link to primary issue]</b>; please feel free to continue the discussion there.
</pre>
<!-- nested admonitions do not render -->
<!-- see https://github.com/orgs/community/discussions/16925#discussioncomment-9542248 -->
> **Warning**
> Apply the https://github.com/conda/conda-libmamba-solver/labels/duplicate label to the issue being closed and https://github.com/conda/conda-libmamba-solver/labels/duplicate%3A%3Aprimary to the original issue.
</details>
<details>
<summary><b>Anaconda Products</b></summary>
<!-- this is a code block, any links need to be embedded -->
<pre>
Thank you for filing this issue! Unfortunately, this is off-topic for this repo because it is related to an Anaconda product.
If you are encountering issues with Anaconda products or services, you have several options for receiving community
support:
- [Anaconda community forums](https://community.anaconda.cloud)
- [Anaconda issue tracker on GitHub](https://github.com/ContinuumIO/anaconda-issues/issues)
</pre>
<!-- nested admonitions do not render -->
<!-- see https://github.com/orgs/community/discussions/16925#discussioncomment-9542248 -->
> **Warning**
> Apply the https://github.com/conda/conda-libmamba-solver/labels/off-topic label to these issues before closing them out.
</details>
<details>
<summary><b>General Off Topic</b></summary>
<pre>
Unfortunately, this issue is outside the scope of support we offer via GitHub or is not directly related to this project.
Community support can be found elsewhere, though, and we encourage you to explore the following options:
- [Conda discourse forum](https://conda.discourse.group/)
- [Community chat channels](https://conda.org/community#chat)
- [Stack Overflow posts tagged "conda"](https://stackoverflow.com/questions/tagged/conda)
</pre>
<!-- nested admonitions do not render -->
<!-- see https://github.com/orgs/community/discussions/16925#discussioncomment-9542248 -->
> **Warning**
> Apply the https://github.com/conda/conda-libmamba-solver/labels/off-topic label to these issues before closing them out.
</details>
In order to not have to manually type or copy/paste the above repeatedly, note that it's possible to add text for the most commonly-used responses via [GitHub's "Add Saved Reply" option][docs-saved-reply].
## Labeling
This section covers the labels and conventions used during issue sorting.
### How does labeling work?
Labeling is a very important means for core maintainers to keep track of the current state of an issue with regards to the asynchronous nature of communicating with users. Utilizing the proper labels helps to identify the severity of the issue as well as to quickly understand the current state of a discussion.
Each label has an associated description that clarifies how the label should be used. Hover on the label to see its description. Label colors are used to distinguish labels by category.
Generally speaking, labels with the same category are considered mutually exclusive, but in some cases labels sharing the same category can occur concurrently, as they indicate qualifiers as opposed to types. For example, we may have the following types, https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Abug, https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Afeature, and https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Adocumentation, where for any one issue there would be _at most_ **one** of these to be defined (_i.e._ an issue should not be a bug _and_ a feature request at the same time). Alternatively, with issues involving specific operating systems (_i.e._, https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Alinux, https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Amacos, and https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Awindows), an issue could be labeled with one or more, depending on the system(s) the issue occurs on.
Please note that there are also automation policies in place that are affected by labeling. For example, if an issue is labeled as https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport, that issue will be marked https://github.com/conda/conda-libmamba-solver/labels/stale after 21 days of inactivity and auto-closed after seven more days without activity (30 inactive days total), which is earlier than issues without this label. See [What automation procedures are currently in place?](#what-automation-procedures-are-currently-in-place) for more details.
### What labels are required for each issue?
At minimum, both `type` and `source` labels should be specified on each issue before adding it to the "Refinement" tab of the Roadmap Board. All issues that are bugs should also be tagged with a `severity` label.
The `type` labels are exclusive of each other: each sorted issue should have exactly one `type` label. These labels give high-level information on the issue's classification (_e.g._, bug, feature, tech debt, etc.)
The `source` labels are exclusive of each other: each sorted issue should have exactly one `source` label. These labels give information on the sub-group to which the issue's author belongs (_e.g._, a partner, a frequent contributor, the wider community, etc.). Through these labels, maintainers gain insight into how well we're meeting the needs of various groups.
The `severity` labels are exclusive of each other and, while required for the https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Abug label, they can also be applied to other types to indicate demand or need. These labels help us to prioritize our work. Severity is not the only factor for work prioritization, but it is an important consideration.
Please review the descriptions of the `type`, `source`, and `severity` labels on the [labels page][labels-page] prior to use.
### How are new labels defined?
Labels are defined using a scoped syntax with an optional high-level category (_e.g._, `source`, `tag`, `type`, etc.) and a specific topic, much like the following:
- `[topic]`
- `[category::topic]`
- `[category::topic-phrase]`
This syntax helps with issue sorting enforcement, as it helps to ensure that sorted issues are, at minimum, categorized by type and source.
There are a number of labels that have been defined for the different repositories. In order to create a streamlined sorting process, label terminologies are standardized using similar (if not the same) labels.
### How are new labels added?
New **global** labels (_i.e._, labels that apply equally to all repositories within the conda GitHub organization) are added to [`conda/infrastructure`][infrastructure]'s [`.github/global.yml` file][labels-global]; new **local** labels (_i.e._, labels specific to particular repositories) are added to each repository's [`.github/labels.yml` file][labels-local]. All new labels should follow the labeling syntax described in ["How are new labels defined?"](#how-are-new-labels-defined). Global labels are combined with any local labels and these aggregated labels are used by the [`.github/workflows/labels.yml` workflow][workflow-labels] to synchronize the labels available for the repository.
## Types of Issues
### Standard Issue
Standard issues represent typical bug reports, feature requests, or other work items that have a clear definition and expected outcome.
### Epics
Epics are large work items that can be broken down into smaller, more manageable issues. They typically represent major features or significant changes that span multiple iterations or releases. Relate the smaller issues to the epic using the sub-issues feature in GitHub.
### Spikes
#### What is a spike?
"Spike" is a term that is borrowed from extreme programming and agile development. They are used when the **outcome of an issue is unknown or even optional**. For example, when first coming across a problem that has not been solved before, a project may choose to either research the problem or create a prototype in order to better understand it.
Additionally, spikes represent work that **may or may not actually be completed or implemented**. An example of this are prototypes created to explore possible solutions. Not all prototypes are implemented and the purpose of creating a prototype is often to explore the problem space more. For research-oriented tasks, the end result of this research may be that a feature request simply is not viable at the moment and would result in putting a stop to that work.
Finally, spikes are usually **timeboxed**. However, given the open source/volunteer nature of our contributions, we do not enforce this for our contributors. When a timebox is set, this means that we are limiting how long we want someone to work on said spike. We do this to prevent contributors from falling into a rabbit hole they may never return from. Instead, we set a time limit to perform work on the spike and then have the assignee report back. If the tasks defined in the spike have not yet been completed, a decision is made on whether it makes sense to perform further work on the spike.
#### When do I create a spike?
A spike should be created when we do not have enough information to move forward with solving a problem. That simply means that, whenever we are dealing with unknowns or processes the project team has never encountered before, it may be useful for us to create a spike.
In day-to-day work, this kind of situation may appear when new bug reports or feature requests come in that deal with problems or technologies that the project team is unfamiliar with. All issues that the project team has sufficient knowledge of should instead proceed as regular issues.
#### When do I not create a spike?
Below are some common scenarios where creating a spike is not appropriate:
- Writing a technical specification for a feature we know how to implement
- Design work that would go into drafting how an API is going to look and function
- Any work that must be completed or is not optional
## Working on Issues
### How do I assign myself to an issue I am actively reviewing?
If you do **not** have permissions, please indicate that you are working on an issue by leaving a comment. Someone who has permissions will assign you to the issue. If two weeks have passed without a pull request or an additional comment requesting information, you may be removed from the issue and the issue reassigned.
If you are assigned to an issue but will not be able to continue work on it, please comment to indicate that you will no longer be working on it and press `unassign me` next to your username in the `Assignees` section of the issue page (top right).
If you **do** have permissions, please assign yourself to the issue by pressing `assign myself` under the `Assignees` section of the issue page (top right).
## Development Processes
The following are practices the conda organization encourages for feature
development. While we recommend projects under the conda organization adopt
these practices, they are not strictly required.
### How should we approach feature development?
For new features, first open an issue if one doesn’t exist. Once the feature request
has been accepted (indicated by the issue's status transitioning from "Sorting" to
"Refinement"), create a specification to gather early feedback. This can include
mockups, API/command references, a written plan in the issue, and sample CLI
arguments (without functionality).
### What is our change process?
For larger features, break down the work into smaller, manageable issues
that are added to the backlog. As long as a feature remains on the roadmap
or backlog, do not create long-lived feature branches that span multiple
pull requests. Instead, you should integrate small slices of an overall
feature directly into the main branch to avoid complex integration challenges.
### Should we make unrelated changes at the same time?
When making changes, try to follow the Campsite Rule to leave things better
than when you found them. You should enhance the code you encounter, even if
primary goal is unrelated. This could involve refactoring small sections,
improving readability, or fixing minor bugs.
## Code Review and Merging
### What are the review requirements?
#### Standard Review
Most code changes require one reviewer from someone on the maintainer team for
the repository. Instead of waiting for someone on the team to review it,
directly requesting a review from the person you previously identified to work
with is preferred to optimize teamwork. If you paired with them during
development, continuous review counts as this requirement.
#### Second Review
Required only when the code author or the first reviewer feels like it is
necessary to get another set of eyes on a proposed change. In this case, they
add someone specific through GitHub's Request Review feature with a comment on
what they want the person to look for.
### What are the code review best practices?
If you are conducting a review, adhere to these best practices:
- Provide comprehensive feedback in the first review to minimize review rounds
- Reserve Request Changes for blocking issues (bugs or other major problems) —
Select Comment for suggestions and improvements
- Follow-up reviews should focus on whether requested changes resolve original
comments
- Code should be production-ready and maintainable when merged, but doesn't
need to be perfect
- If providing feedback outside the core review focus (nitpicks, tips,
suggestions), clearly mark these as non-blocking comments that don't need to
be addressed before merging.
### How do we merge code?
If you are the approving reviewer (typically the first reviewer, or the second
reviewer when needed) and you have completed your review and approved the
changes, you should merge the code immediately to maintain development
velocity.
Normally, we use squash and merge to keep a clean git history. If you are
merging a pull request, help ensure that the pull request title is updated.
================================================
FILE: LICENSE
================================================
BSD 3-Clause License
Copyright (c) 2022, Anaconda, Inc.
Copyright (c) 2023, conda
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
This work also includes code borrowed from mamba.utils v0.19, licensed as BSD 3-Clause
================================================
FILE: README.md
================================================
# conda-libmamba-solver
The fast mamba solver, now in conda!
## What is this exactly?
conda-libmamba-solver is a new solver for the
[conda package manager](https://docs.conda.io/) which uses the solver from the
[mamba project](https://mamba.readthedocs.io/) behind the scenes, while
carefully implementing conda's functionality and expected behaviors on top.
The library used by mamba to do the heavy-lifting is called [libsolv](https://github.com/openSUSE/libsolv).
Additional information about the project can be found in the blog post on Anaconda's weblog:
[A Faster Solver for Conda: Libmamba](https://www.anaconda.com/blog/a-faster-conda-for-a-growing-community).
## Documentation
Check the [documentation](https://conda.github.io/conda-libmamba-solver/) for
instructions on how to install, use and make the most out the new conda solver!
## Build status
| [](https://github.com/conda/conda-libmamba-solver/actions/workflows/tests.yml?query=branch%3Amain) [](https://github.com/conda/conda-libmamba-solver/actions/workflows/docs.yml?query=branch%3Amain) [](https://codecov.io/gh/conda/conda-libmamba-solver) [](https://results.pre-commit.ci/latest/github/conda/conda-libmamba-solver/main) [](https://calver.org) | [](https://anaconda.org/conda-canary/conda-libmamba-solver) |
| --- | :-: |
| [`conda install defaults::conda-libmamba-solver`](https://anaconda.org/anaconda/conda-libmamba-solver) | [](https://anaconda.org/anaconda/conda-libmamba-solver) |
| [`conda install conda-forge::conda-libmamba-solver`](https://anaconda.org/conda-forge/conda-libmamba-solver) | [](https://anaconda.org/conda-forge/conda-libmamba-solver) |
| [`conda install conda-canary/label/dev::conda-libmamba-solver`](https://anaconda.org/conda-canary/conda-libmamba-solver) | [](https://anaconda.org/conda-canary/conda-libmamba-solver) |
================================================
FILE: RELEASE.md
================================================
<!-- edit this in https://github.com/conda/infrastructure -->
[epic template]: https://github.com/conda/conda-libmamba-solver/issues/new?assignees=&labels=epic&template=epic.yml
[compare]: https://github.com/conda/conda-libmamba-solver/compare
[new release]: https://github.com/conda/conda-libmamba-solver/releases/new
[infrastructure]: https://github.com/conda/infrastructure
[rever docs]: https://regro.github.io/rever-docs
[release docs]: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes
[merge conflicts]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/about-merge-conflicts
[Anaconda Recipes]: https://github.com/AnacondaRecipes/conda-libmamba-solver-feedstock
[conda-forge]: https://github.com/conda-forge/conda-libmamba-solver-feedstock
# Release Process
> [!NOTE]
> Throughout this document are references to the version number as `YY.MM.MICRO`, this should be replaced with the correct version number. Do **not** prefix the version with a lowercase `v`.
## 1. Open the release issue and cut a release branch. (do this ~1 week prior to release)
> [!NOTE]
> The new release branch should adhere to the naming convention of `YY.MM.x` (note the difference to `YY.MM.MICRO`). In the case of patch/hotfix releases, however, do NOT cut a new release branch; instead, use the previously-cut `YY.MM.x` release branch.
Use the issue template below to create the release issue. After creating the release issue, pin it for easy access.
<details>
<summary><h3>Release Template</h3></summary>
#### Title:
```markdown
Release `YY.MM.x`
```
#### Body:
```markdown
### Summary
Placeholder for `conda-libmamba-solver YY.MM.x` release.
| Pilot | <pilot> |
|---|---|
| Co-pilot | <copilot> |
### Tasks
[milestone]: https://github.com/conda/conda-libmamba-solver/milestone/<milestone>
[process]: https://github.com/conda/conda-libmamba-solver/blob/main/RELEASE.md
[releases]: https://github.com/conda/conda-libmamba-solver/releases
[main]: https://github.com/AnacondaRecipes/conda-libmamba-solver-feedstock
[conda-forge]: https://github.com/conda-forge/conda-libmamba-solver-feedstock
[ReadTheDocs]: https://readthedocs.com/projects/continuumio-conda-libmamba-solver/
[zulip]: https://conda.zulipchat.com/#narrow/channel/480811-releases
<details open> <!-- feel free to remove the open attribute once this section is completed -->
<summary><h4>The week before release week</h4></summary>
- [ ] Create release branch (named `YY.MM.x`)
- [ ] Ensure release candidates are being successfully built (see `conda-canary/label/rc-conda-libmamba-solver-YY.MM.x`)
- [ ] [Complete outstanding PRs][milestone]
- [ ] Check for deprecated features
- [ ] Test release candidates
<!-- indicate here who has signed off on testing -->
</details>
<details open> <!-- feel free to remove the open attribute once this section is completed -->
<summary><h4>Release week</h4></summary>
- [ ] Create release PR (see [release process][process])
- [ ] Create Zulip thread on [#releases][zulip]
- [ ] Announce `YY.MM.MICRO` in-progress
- [ ] [Publish release][releases]
- [ ] Merge `YY.MM.x` back into `main`
- [ ] Activate the `YY.MM.x` branch on [ReadTheDocs][ReadTheDocs]
- [ ] Bump/update feedstocks
- [ ] [Anaconda, Inc.'s feedstock][main]
- [ ] [conda-forge feedstock][conda-forge]
- [ ] Hand off to packaging team(s)
- [ ] Announce release
- [ ] Create & publish conda.org blog post
- [ ] Post on Zulip thread
</details>
```
</details>
If a patch release is necessary, reopen the original release issue and append the following template to the release issue summary.
<details>
<summary><h3>Patch Release Template</h3></summary>
#### Append to existing 'Release `YY.MM.x`' issue:
```markdown
<details open> <!-- feel free to remove the open attribute once this section is completed -->
<summary><h4>Patch YY.MM.MICRO</h4></summary>
- [ ] <!-- list issues & PRs that need to be resolved here -->
- [ ] Create release PR (see [release process][process])
- [ ] Update Zulip thread on [#releases][zulip]
- [ ] Announce `YY.MM.MICRO` in-progress
- [ ] [Publish release][releases]
- [ ] Merge `YY.MM.x` back into `main`
- [ ] Bump/update feedstocks
- [ ] [Anaconda, Inc.'s feedstock][main]
- [ ] [conda-forge feedstock][conda-forge]
- [ ] Hand off to packaging team(s)
- [ ] Announce release
- [ ] Post on Zulip thread
</details>
```
</details>
> [!NOTE]
> The [epic template][epic template] is perfect for this; remember to remove the **`epic`** label.
> [!NOTE]
> A patch release is like a regular, i.e., follow the same steps in the process as you would for a regular release. Most patches are authored by existing contributors (most likely maintainers themselves) so running `rever <VERSION>` may succeed on the first pass.
## 2. Alert various parties of the upcoming release. (do this ~1 week prior to release)
Let various interested parties know about the upcoming release; at minimum, conda-forge maintainers should be informed. For major features, a blog post describing the new features should be prepared and posted once the release is completed (see the announcements section of the release issue).
## 3. Manually test canary build(s).
### Canary Builds for Manual Testing
Once the release PRs are filed, successful canary builds will be available on `https://anaconda.org/conda-canary/conda-libmamba-solver/files?channel=rc-conda-libmamba-solver-YY.MM.x` for manual testing.
> [!NOTE]
> You do not need to apply the `build::review` label for release PRs; every commit to the release branch builds and uploads canary builds to the respective `rc-` label.
## 4. Ensure `rever.xsh` and `news/TEMPLATE` are up to date.
These are synced from [`conda/infrastructure`][infrastructure].
<details>
<summary><h2>5. Run rever. (ideally done on the Monday of release week)</h2></summary>
Currently, there are only 2 activities we use rever for, (1) aggregating the authors and (2) updating the changelog. Aggregating the authors can be an error-prone process and also suffers from a builtin circular dependency (_i.e._, to generate an updated `.authors.yml` we need an updated `.mailmap` but to have an updated `.mailmap` we need an updated `.authors.yml`). This is why the following steps are very heavy-handed (and potentially repetitive) in running rever commands, undoing commits, squashing/reordering commits, etc.
1. Install [`rever`][rever docs] and activate the environment:
```bash
$ conda create -n rever conda-forge::rever
$ conda activate rever
(rever) $
```
2. Clone and `cd` into the repository if you haven't done so already:
```bash
(rever) $ git clone git@github.com:/conda-libmamba-solver.git
(rever) $ cd conda-libmamba-solver
```
2. Fetch the latest changes from the remote and checkout the release branch created a week ago:
```bash
(rever) $ git fetch upstream
(rever) $ git checkout YY.MM.x
```
2. Create a versioned branch, this is where rever will make its changes:
```bash
(rever) $ git checkout -b changelog-YY.MM.MICRO
```
2. Run `rever --activities authors <VERSION>`:
> **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->
> Include `--force` when re-running any rever commands for the same `<VERSION>`, otherwise, rever will skip the activity and no changes will be made (i.e., rever remembers if an activity has been run for a given version).
```bash
(rever) $ rever --activities authors --force <VERSION>
```
- If rever finds that any of the authors are not correctly represented in `.authors.yml` it will produce an error. If the author that the error pertains to is:
- **a new contributor**: the snippet suggested by rever should be added to the `.authors.yml` file.
- **an existing contributor**, a result of using a new name/email combo: find the existing author in `.authors.yml` and add the new name/email combo to that author's `aliases` and `alterative_emails`.
- Once you have successfully run `rever --activities authors` with no errors, review the commit made by rever. This commit will contain updates to one or more of the author files (`.authors.yml`, `.mailmap`, and `AUTHORS.md`). Due to the race condition between `.authors.yml` and `.mailmap`, we want to extract changes made to any of the following keys in `.authors.yml` and commit them separately from the other changes in the rever commit:
- `name`
- `email`
- `github`
- `aliases`
- `alternate_emails`
Other keys (e.g., `num_commits` and `first_commit`) do not need to be included in this separate commit as they will be overwritten by rever.
- Here's a sample run where we undo the commit made by rever in order to commit the changes to `.authors.yml` separately:
```bash
(rever) $ rever --activities authors --force YY.MM.MICRO
# changes were made to .authors.yml as per the prior bullet
(rever) $ git diff --name-only HEAD HEAD~1
.authors.yml
.mailmap
AUTHORS.md
# undo commit
(rever) $ git reset --soft HEAD~1
# undo changes made to everything except .authors.yml
(rever) $ git restore --staged --worktree .mailmap AUTHORS.md
```
- Commit these changes to `.authors.yml`:
```bash
(rever) $ git add .
(rever) $ git commit -m "Update .authors.yml"
```
- Rerun `rever --activities authors --force <VERSION>` and finally check that your `.mailmap` is correct by running:
```bash
git shortlog -se
```
Compare this list with `AUTHORS.md`. If they have any discrepancies, additional modifications to `.authors.yml` is needed, so repeat the above steps as needed.
- Once you are pleased with how the author's file looks, we want to undo the rever commit and commit the `.mailmap` changes separately:
```bash
# undo commit (but preserve changes)
(rever) $ git reset --soft HEAD~1
# undo changes made to everything except .mailmap
(rever) $ git restore --staged --worktree .authors.yml AUTHORS.md
```
- Commit these changes to `.mailmap`:
```bash
(rever) $ git add .
(rever) $ git commit -m "Update .mailmap"
```
- Continue repeating the above processes until the `.authors.yml` and `.mailmap` are corrected to your liking. After completing this, you will have at most two commits on your release branch:
```bash
(rever) $ git cherry -v <release branch>
+ 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml
+ 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap
```
4. Review news snippets (ensure they are all using the correct Markdown format, **not** reStructuredText) and add additional snippets for undocumented PRs/changes as necessary.
> **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->
> We've found it useful to name news snippets with the following format: `<PR #>-<DESCRIPTIVE SLUG>`.
>
> We've also found that we like to include the PR #s inline with the text itself, e.g.:
>
> ```markdown
> ## Enhancements
>
> * Add `win-arm64` as a known platform (subdir). (#11778)
> ```
- You can utilize [GitHub's compare view][compare] to review what changes are to be included in this release. Make sure you compare the current release branch against the previous one
- Add a new news snippet for any PRs of importance that are missing.
- Commit these changes to news snippets:
```bash
(rever) $ git add .
(rever) $ git commit -m "Update news"
```
- After completing this, you will have at most three commits on your release branch:
```bash
(rever) $ git cherry -v <release branch>
+ 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml
+ 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap
+ 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news
```
5. Run `rever --activities changelog`:
> **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->
> This has previously been a notoriously fickle step (likely due to incorrect regex patterns in the `rever.xsh` config file and missing `github` keys in `.authors.yml`) so beware of potential hiccups. If this fails, it's highly likely to be an innocent issue.
```bash
(rever) $ rever --activities changelog --force <VERSION>
```
- Any necessary modifications to `.authors.yml`, `.mailmap`, or the news snippets themselves should be amended to the previous commits.
- Once you have successfully run `rever --activities changelog` with no errors simply revert the last commit (see the next step for why):
```bash
# undo commit (and discard changes)
(rever) $ git reset --hard HEAD~1
```
- After completing this, you will have at most three commits on your release branch:
```bash
(rever) $ git cherry -v <release branch>
+ 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml
+ 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap
+ 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news
```
6. Now that we have successfully run the activities separately, we wish to run both together. This will ensure that the contributor list, a side-effect of the authors activity, is included in the changelog activity.
```bash
(rever) $ rever --force <VERSION>
```
- After completing this, you will have at most five commits on your release branch:
```bash
(rever) $ git cherry -v <release branch>
+ 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml
+ 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap
+ 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news
+ a5c0db938893d2c12cab12a1f7eb3e646ed80373 Update authorship for YY.MM.MICRO
+ 5e95169d0df4bcdc2da9a6ba4a2561d90e49f75d Update CHANGELOG for YY.MM.MICRO
```
7. Since rever does not include stats on first-time contributors, we will need to add this manually.
- Use [GitHub's auto-generated release notes][new release] to get a list of all new contributors (and their first PR) and manually merge this list with the contributor list in `CHANGELOG.md`. See [GitHub docs][release docs] for how to auto-generate the release notes.
- Commit these final changes:
```bash
(rever) $ git add .
(rever) $ git commit -m "Add first-time contributions"
```
- After completing this, you will have at most six commits on your release branch:
```bash
(rever) $ git cherry -v <release branch>
+ 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml
+ 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap
+ 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news
+ a5c0db938893d2c12cab12a1f7eb3e646ed80373 Update authorship for YY.MM.MICRO
+ 5e95169d0df4bcdc2da9a6ba4a2561d90e49f75d Update CHANGELOG for YY.MM.MICRO
+ 93fdf029fd4cf235872c12cab12a1f7e8f95a755 Add first-time contributions
```
8. Push this versioned branch.
```bash
(rever) $ git push -u upstream changelog-YY.MM.MICRO
```
9. Open the Release PR targeting the `YY.MM.x` branch.
<details>
<summary>GitHub PR Template</summary>
```markdown
## Description
✂️ snip snip ✂️ the making of a new release.
Xref #<RELEASE ISSUE>
```
</details>
10. Update release issue to include a link to the release PR.
11. [Create][new release] the release and **SAVE AS A DRAFT** with the following values:
> **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->
> Only publish the release after the release PR is merged, until then always **save as draft**.
| Field | Value |
|---|---|
| Choose a tag | `YY.MM.MICRO` |
| Target | `YY.MM.x` |
| Body | copy/paste blurb from `CHANGELOG.md` |
</details>
## 6. Wait for review and approval of release PR.
## 7. Merge release PR and publish release.
To publish the release, go to the project's release page (e.g., https://github.com/conda/conda-libmamba-solver/releases) and add the release notes from `CHANGELOG.md` to the draft release you created earlier. Then publish the release.
> [!NOTE]
> Release notes can be drafted and saved ahead of time.
## 8. Merge/cherry pick the release branch over to the `main` branch.
<details>
<summary>Internal process</summary>
1. From the main "< > Code" page of the repository, select the drop down menu next to the `main` branch button and then select "View all branches" at the very bottom.
2. Find the applicable `YY.MM.x` branch and click the "New pull request" button.
3. "Base" should point to `main` while "Compare" should point to `YY.MM.x`.
4. Ensure that all of the commits being pulled in look accurate, then select "Create pull request".
> [!NOTE]
> Make sure NOT to push the "Update Branch" button. If there are [merge conflicts][merge conflicts], create a temporary "connector branch" dedicated to fixing merge conflicts separately from the `YY.MM.x` and `main` branches.
5. Review and merge the pull request the same as any code change pull request.
> [!NOTE]
> The commits from the release branch need to be retained in order to be able to compare individual commits; in other words, a "merge commit" is required when merging the resulting pull request vs. a "squash merge". Protected branches will require permissions to be temporarily relaxed in order to enable this action.
</details>
## 9. Open PRs to bump [Anaconda Recipes][Anaconda Recipes] and [conda-forge][conda-forge] feedstocks to use `YY.MM.MICRO`.
> [!NOTE]
> Conda-forge's PRs will be auto-created via the `regro-cf-autotick-bot`. Follow the instructions below if any changes need to be made to the recipe that were not automatically added (these instructions are only necessary for anyone who is _not_ a conda-forge feedstock maintainer, since maintainers can push changes directly to the autotick branch):
> - Create a new branch based off of autotick's branch (autotick's branches usually use the `regro-cf-autotick-bot:XX.YY.[$patch_number]_[short hash]` syntax)
> - Add any changes via commits to that new branch
> - Open a new PR and push it against the `main` branch
>
> Make sure to include a comment on the original `autotick-bot` PR that a new pull request has been created, in order to avoid duplicating work! `regro-cf-autotick-bot` will close the auto-created PR once the new PR is merged.
>
> For more information about this process, please read the ["Pushing to regro-cf-autotick-bot branch" section of the conda-forge documentation](https://conda-forge.org/docs/maintainer/updating_pkgs.html#pushing-to-regro-cf-autotick-bot-branch).
## 10. Hand off to Anaconda's packaging team.
> [!NOTE]
> This step should NOT be done past Thursday morning EST; please start the process on a Monday, Tuesday, or Wednesday instead in order to avoid any potential debugging sessions over evenings or weekends.
<details>
<summary>Internal process</summary>
1. Open packaging request in #package_requests Slack channel, include links to the Release PR and feedstock PRs.
2. Message packaging team/PM to let them know that a release has occurred and that you are the release manager.
</details>
## 11. Continue championing and shepherding.
Remember to make all relevant announcements and continue to update the release issue with the latest details as tasks are completed.
================================================
FILE: conda_libmamba_solver/__init__.py
================================================
# Copyright (C) 2022 Anaconda, Inc
# Copyright (C) 2023 conda
# SPDX-License-Identifier: BSD-3-Clause
try:
from ._version import version as __version__
except ImportError:
try:
from importlib.metadata import version
__version__ = version("conda_libmamba_solver")
del version
except ImportError:
__version__ = "0.0.0.unknown"
def get_solver_class(key: str = "libmamba"):
if key == "libmamba":
from .solver import LibMambaSolver
return LibMambaSolver
raise ValueError("Key must be 'libmamba'")
================================================
FILE: conda_libmamba_solver/conda_build_exceptions.py
================================================
# Copyright (C) 2022 Anaconda, Inc
# Copyright (C) 2023 conda
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2023 conda
# SPDX-License-Identifier: BSD-3-Clause
"""
This exception is only used in conda-build, so we can't import it directly.
conda_build is not a dependency, but we only import this when conda-build is calling the
solver, so it's fine to import it here.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Iterable
from conda.models.match_spec import MatchSpec
from conda_build.exceptions import DependencyNeedsBuildingError
class ExplainedDependencyNeedsBuildingError(DependencyNeedsBuildingError):
"""
We need to subclass this to add the explanation to the error message.
We also add a couple of attributes to make it easier to set up.
"""
def __init__(
self,
matchspecs: Iterable[MatchSpec] | None = None,
explanation: str | None = None,
*args,
**kwargs,
):
super().__init__(*args, **kwargs)
self.matchspecs = self.matchspecs or matchspecs or []
self.explanation = explanation
def __str__(self) -> str:
msg = self.message
if not self.explanation:
# print simple message in log.warning() calls
return msg
return "\n".join([msg, self.explanation])
================================================
FILE: conda_libmamba_solver/exceptions.py
================================================
# Copyright (C) 2022 Anaconda, Inc
# Copyright (C) 2023 conda
# SPDX-License-Identifie
gitextract_zwz4fenl/
├── .authors.yml
├── .devcontainer/
│ ├── apt-deps.txt
│ ├── conda-forge/
│ │ └── devcontainer.json
│ ├── defaults/
│ │ └── devcontainer.json
│ ├── post_create.sh
│ └── post_start.sh
├── .flake8
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── 0_bug.yml
│ │ ├── 1_feature.yml
│ │ ├── 2_documentation.yml
│ │ └── epic.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── TEST_FAILURE_REPORT_TEMPLATE.md
│ ├── dependabot.yml
│ ├── disclaimer.txt
│ ├── labels.yml
│ ├── template-files/
│ │ ├── config.yml
│ │ └── templates/
│ │ ├── issue_template_details.yml
│ │ └── pull_request_template_details.md
│ └── workflows/
│ ├── builds-review.yaml
│ ├── cla.yml
│ ├── docs.yml
│ ├── issues.yml
│ ├── labels.yml
│ ├── lock.yml
│ ├── performance.yml
│ ├── project.yml
│ ├── stale.yml
│ ├── tests.yml
│ └── update.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── AUTHORS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── HOW_WE_USE_GITHUB.md
├── LICENSE
├── README.md
├── RELEASE.md
├── conda_libmamba_solver/
│ ├── __init__.py
│ ├── conda_build_exceptions.py
│ ├── exceptions.py
│ ├── index.py
│ ├── mamba_utils.py
│ ├── plugin.py
│ ├── repoquery.py
│ ├── shards.py
│ ├── shards_cache.py
│ ├── shards_subset.py
│ ├── shards_typing.py
│ ├── solver.py
│ ├── state.py
│ └── utils.py
├── dev/
│ ├── requirements.txt
│ └── scripts/
│ ├── BenchmarkChart.ipynb
│ ├── httpx-fetch-all-shards.py
│ └── requests-fetch-all-shards.py
├── docs/
│ ├── Makefile
│ ├── _static/
│ │ └── css/
│ │ └── custom.css
│ ├── _templates/
│ │ └── navbar_center.html
│ ├── conf.py
│ ├── dev/
│ │ ├── future-work.md
│ │ ├── implementation.md
│ │ ├── index.md
│ │ ├── performance-testing.md
│ │ ├── setup.md
│ │ ├── sharded.md
│ │ ├── shards_python.mmd
│ │ └── workflows.md
│ ├── environment.yml
│ ├── index.md
│ ├── robots.txt
│ └── user-guide/
│ ├── configuration.md
│ ├── faq.md
│ ├── index.md
│ ├── libmamba-vs-classic.md
│ ├── more-resources.md
│ ├── performance.md
│ └── subcommands.md
├── durations/
│ ├── Linux.json
│ ├── Windows.json
│ └── macOS.json
├── news/
│ └── TEMPLATE
├── pyproject.toml
├── recipe/
│ └── meta.yaml
├── rever.xsh
└── tests/
├── __init__.py
├── channel_testing/
│ ├── helpers.py
│ └── reposerver.py
├── conftest.py
├── data/
│ ├── conda_build_recipes/
│ │ ├── LICENSE
│ │ ├── baddeps/
│ │ │ └── meta.yaml
│ │ ├── jedi/
│ │ │ └── meta.yaml
│ │ ├── multioutput/
│ │ │ └── meta.yaml
│ │ └── stackvana/
│ │ └── meta.yaml
│ ├── lock_this_env.yml
│ └── mamba_repo/
│ ├── LICENSE
│ ├── channeldata.json
│ ├── index.html
│ ├── noarch/
│ │ ├── current_repodata.json
│ │ ├── current_repodata.json.bz2
│ │ ├── index.html
│ │ ├── repodata.json
│ │ ├── repodata.json.bz2
│ │ ├── repodata_from_packages.json
│ │ ├── repodata_from_packages.json.bz2
│ │ └── test-package-0.1-0.tar.bz2
│ └── recipes/
│ └── test-package/
│ └── meta.yaml
├── http_test_server.py
├── repodata_time_machine.py
├── requirements.txt
├── run_in_profiler.py
├── test_channels.py
├── test_downstream.py
├── test_experimental.py
├── test_index.py
├── test_performance.py
├── test_plugin.py
├── test_repoquery.py
├── test_shards.py
├── test_shards_subset.py
├── test_solver.py
├── test_solver_differences.py
├── test_user_agent.py
├── test_workarounds.py
└── utils.py
SYMBOL INDEX (391 symbols across 34 files)
FILE: conda_libmamba_solver/__init__.py
function get_solver_class (line 16) | def get_solver_class(key: str = "libmamba"):
FILE: conda_libmamba_solver/conda_build_exceptions.py
class ExplainedDependencyNeedsBuildingError (line 24) | class ExplainedDependencyNeedsBuildingError(DependencyNeedsBuildingError):
method __init__ (line 30) | def __init__(
method __str__ (line 41) | def __str__(self) -> str:
FILE: conda_libmamba_solver/exceptions.py
class LibMambaUnsatisfiableError (line 11) | class LibMambaUnsatisfiableError(UnsatisfiableError):
method __init__ (line 16) | def __init__(self, message: str, **kwargs):
FILE: conda_libmamba_solver/index.py
class _ChannelRepoInfo (line 134) | class _ChannelRepoInfo:
method canonical_name (line 143) | def canonical_name(self) -> str:
function _is_sharded_repodata_enabled (line 152) | def _is_sharded_repodata_enabled():
function _package_info_from_package_dict (line 162) | def _package_info_from_package_dict(
class LibMambaIndexHelper (line 237) | class LibMambaIndexHelper:
method __init__ (line 248) | def __init__(
method from_platform_aware_channel (line 289) | def from_platform_aware_channel(cls, channel: Channel) -> LibMambaInde...
method n_packages (line 296) | def n_packages(
method reload_channel (line 312) | def reload_channel(self, channel: Channel) -> None:
method _init_db (line 326) | def _init_db(self) -> Database:
method _load_channels (line 369) | def _load_channels(
method _load_channel_repo_info_shards (line 391) | def _load_channel_repo_info_shards(
method _load_channel_repo_info_json (line 407) | def _load_channel_repo_info_json(
method _channel_urls (line 436) | def _channel_urls(subdirs: Iterable[str], channels: list[Channel]) -> ...
method _encoded_urls_to_channels (line 470) | def _encoded_urls_to_channels(urls_to_channel: dict[str, Channel]) -> ...
method _fetch_repodata_jsons (line 484) | def _fetch_repodata_jsons(self, urls: Iterable[str]) -> dict[str, tupl...
method _fetch_one_repodata_json (line 496) | def _fetch_one_repodata_json(self, url: str) -> tuple[str, os.PathLike...
method _load_repo_info_from_json_path (line 522) | def _load_repo_info_from_json_path(
method _channel_to_id (line 591) | def _channel_to_id(self, channel: Channel):
method _load_installed (line 601) | def _load_installed(self, records: Iterable[PackageRecord]) -> _Channe...
method _load_pkgs_cache (line 613) | def _load_pkgs_cache(self, pkgs_dirs: PathsType) -> list[RepoInfo]:
method _load_repo_info_from_repodata_dict (line 633) | def _load_repo_info_from_repodata_dict(
method _package_info_from_package_record (line 681) | def _package_info_from_package_record(self, record: PackageRecord) -> ...
method _set_repo_priorities (line 718) | def _set_repo_priorities(self) -> None:
method search (line 759) | def search(
method depends (line 770) | def depends(
method whoneeds (line 780) | def whoneeds(
method explicit_pool (line 790) | def explicit_pool(self, specs: Iterable[MatchSpec]) -> tuple[str, ...]:
method _process_query_result (line 801) | def _process_query_result(
FILE: conda_libmamba_solver/mamba_utils.py
function mamba_version (line 38) | def mamba_version() -> str:
function _get_base_url (line 42) | def _get_base_url(url: str, name: str | None = None) -> str:
function init_libmamba_context (line 50) | def init_libmamba_context(
function logger_callback (line 147) | def logger_callback(level: libmambapy.solver.libsolv.LogLevel, msg: str,...
function palettes_and_formats (line 162) | def palettes_and_formats() -> tuple[libmambapy.solver.ProblemsMessageFor...
FILE: conda_libmamba_solver/plugin.py
function conda_solvers (line 17) | def conda_solvers():
function conda_subcommands (line 28) | def conda_subcommands():
function conda_settings (line 38) | def conda_settings():
FILE: conda_libmamba_solver/repoquery.py
function configure_parser (line 28) | def configure_parser(parser: argparse.ArgumentParser):
function repoquery (line 100) | def repoquery(args: argparse.Namespace) -> int:
FILE: conda_libmamba_solver/shards.py
function _safe_urljoin_with_slash (line 56) | def _safe_urljoin_with_slash(base_url: str, relative_url: str = "") -> str:
function _shards_connections (line 100) | def _shards_connections() -> int:
function ensure_hex_hash (line 118) | def ensure_hex_hash(record: PackageRecordDict):
function spec_to_package_name (line 130) | def spec_to_package_name(spec: str) -> str:
function shard_mentioned_packages (line 141) | def shard_mentioned_packages(shard: ShardDict, extra: Iterable[str] = ()...
class ShardBase (line 158) | class ShardBase(abc.ABC):
method package_names (line 173) | def package_names(self) -> KeysView[str]:
method base_url (line 178) | def base_url(self) -> str:
method __contains__ (line 188) | def __contains__(self, package: str) -> bool:
method shard_url (line 193) | def shard_url(self, package: str) -> str:
method shard_loaded (line 203) | def shard_loaded(self, package: str) -> bool:
method visit_package (line 209) | def visit_package(self, package: str) -> ShardDict:
method visit_shard (line 215) | def visit_shard(self, package: str, shard: ShardDict):
method fetch_shard (line 222) | def fetch_shard(self, package: str) -> ShardDict:
method fetch_shards (line 229) | def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]:
method build_repodata (line 235) | def build_repodata(self) -> RepodataDict:
class ShardLike (line 252) | class ShardLike(ShardBase):
method __init__ (line 257) | def __init__(self, repodata: RepodataDict, url: str = ""):
method __repr__ (line 295) | def __repr__(self):
method package_names (line 300) | def package_names(self) -> KeysView[str]:
method shard_url (line 303) | def shard_url(self, package: str) -> str:
method shard_loaded (line 312) | def shard_loaded(self, package: str) -> bool:
method visit_package (line 318) | def visit_package(self, package: str) -> ShardDict:
method fetch_shard (line 326) | def fetch_shard(self, package: str) -> ShardDict:
method fetch_shards (line 338) | def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]:
function _shards_base_url (line 347) | def _shards_base_url(url, shards_base_url) -> str:
class Shards (line 358) | class Shards(ShardBase):
method __init__ (line 366) | def __init__(
method package_names (line 405) | def package_names(self):
method packages_index (line 409) | def packages_index(self):
method shards_base_url (line 413) | def shards_base_url(self) -> str:
method shard_url (line 420) | def shard_url(self, package: str) -> str:
method shard_loaded (line 430) | def shard_loaded(self, package: str) -> bool:
method visit_package (line 436) | def visit_package(self, package: str) -> ShardDict:
method fetch_shard (line 443) | def fetch_shard(self, package: str) -> ShardDict:
method fetch_shards (line 454) | def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]:
method _process_fetch_result (line 498) | def _process_fetch_result(self, future, url, package, results):
function _repodata_shards (line 518) | def _repodata_shards(url, cache: RepodataCache) -> bytes:
function _is_http_error_most_400_codes (line 592) | def _is_http_error_most_400_codes(status_code: str | int) -> bool:
function fetch_shards_index (line 599) | def fetch_shards_index(sd: SubdirData, cache: shards_cache.ShardCache | ...
function batch_retrieve_from_cache (line 686) | def batch_retrieve_from_cache(sharded: list[Shards], packages: list[str]):
function batch_retrieve_from_network (line 719) | def batch_retrieve_from_network(wanted: list[tuple[Shards, str, str]]):
function fetch_channels (line 736) | def fetch_channels(url_to_channel: dict[str, Channel]) -> dict[str, Shar...
FILE: conda_libmamba_solver/shards_cache.py
class AnnotatedRawShard (line 31) | class AnnotatedRawShard:
method __init__ (line 32) | def __init__(self, url: str, package: str, compressed_shard: bytes):
function connect (line 46) | def connect(dburi="cache.db"):
class ShardCache (line 65) | class ShardCache:
method __init__ (line 70) | def __init__(self, base: Path, create=True):
method __enter__ (line 77) | def __enter__(self):
method __exit__ (line 80) | def __exit__(self, exc_type, exc_val, exec_tb):
method close (line 83) | def close(self):
method copy (line 91) | def copy(self):
method connect (line 97) | def connect(self, create=True, retry=True):
method insert (line 136) | def insert(self, raw_shard: AnnotatedRawShard):
method retrieve (line 151) | def retrieve(self, url) -> ShardDict | None:
method retrieve_multiple (line 162) | def retrieve_multiple(self, urls: list[str]) -> dict[str, ShardDict | ...
method clear_cache (line 187) | def clear_cache(self):
method remove_cache (line 194) | def remove_cache(self):
FILE: conda_libmamba_solver/shards_subset.py
class Node (line 104) | class Node:
method to_id (line 111) | def to_id(self) -> NodeId:
class NodeId (line 116) | class NodeId:
method __hash__ (line 121) | def __hash__(self):
function _nodes_from_packages (line 125) | def _nodes_from_packages(
function filter_redundant_packages (line 139) | def filter_redundant_packages(repodata: ShardDict, use_only_tar_bz2=Fals...
function _install_shards_cache (line 167) | def _install_shards_cache(shardlikes):
class RepodataSubset (line 183) | class RepodataSubset:
method __init__ (line 188) | def __init__(self, shardlikes: Iterable[ShardBase]):
method has_strategy (line 195) | def has_strategy(cls, strategy: str) -> bool:
method neighbors (line 201) | def neighbors(self, node: Node) -> Iterator[Node]:
method outgoing (line 236) | def outgoing(self, node: Node):
method reachable (line 248) | def reachable(self, root_packages, *, strategy=DEFAULT_STRATEGY) -> None:
method reachable_bfs (line 258) | def reachable_bfs(self, root_packages):
method _reachable_bfs (line 269) | def _reachable_bfs(self, root_packages):
method reachable_pipelined (line 297) | def reachable_pipelined(self, root_packages):
method _reachable_pipelined (line 321) | def _reachable_pipelined(
method _pipelined_traversal (line 368) | def _pipelined_traversal(
method visit_node (line 467) | def visit_node(self, parent_node: Node, mentioned_packages: Iterable[s...
method drain_pending (line 488) | def drain_pending(
function build_repodata_subset (line 513) | def build_repodata_subset(
function combine_batches_until_none (line 545) | def combine_batches_until_none(
function exception_to_queue (line 575) | def exception_to_queue(func):
function cache_fetch_thread (line 592) | def cache_fetch_thread(
function network_fetch_thread (line 635) | def network_fetch_thread(
function offline_nofetch_thread (line 713) | def offline_nofetch_thread(
FILE: conda_libmamba_solver/shards_typing.py
class PackageRecordDict (line 20) | class PackageRecordDict(TypedDict):
class RepodataInfoDict (line 46) | class RepodataInfoDict(TypedDict): # noqa: F811
class RepodataDict (line 52) | class RepodataDict(ShardDict):
class ShardsIndexDict (line 61) | class ShardsIndexDict(TypedDict):
FILE: conda_libmamba_solver/solver.py
class LibMambaSolver (line 79) | class LibMambaSolver(Solver):
method user_agent (line 85) | def user_agent() -> str:
method __init__ (line 91) | def __init__(
method solve_final_state (line 134) | def solve_final_state(
method _collect_all_metadata_spinner_message (line 193) | def _collect_all_metadata_spinner_message(
method _collect_channel_list (line 216) | def _collect_channel_list(self, in_state: SolverInputState) -> list[Ch...
method _collect_channels_subdirs_from_conda_build (line 237) | def _collect_channels_subdirs_from_conda_build(
method _collect_all_metadata (line 259) | def _collect_all_metadata(
method _solving_loop_spinner_message (line 286) | def _solving_loop_spinner_message(self) -> str:
method _solving_loop (line 299) | def _solving_loop(
method _solve_attempt (line 346) | def _solve_attempt(
method _solver_flags (line 376) | def _solver_flags(self, in_state: SolverInputState) -> Request.Flags:
method _specs_to_request_jobs (line 395) | def _specs_to_request_jobs(
method _specs_to_request_jobs_add (line 423) | def _specs_to_request_jobs_add(
method _specs_to_request_jobs_remove (line 557) | def _specs_to_request_jobs_remove(
method _specs_to_request_jobs_conda_build (line 583) | def _specs_to_request_jobs_conda_build(
method _export_solution (line 601) | def _export_solution(
method _package_info_to_package_record (line 622) | def _package_info_to_package_record(
method _parse_problems (line 686) | def _parse_problems(cls, unsolvable: UnSolvable, db: Database) -> Mapp...
method _maybe_raise_for_problems (line 763) | def _maybe_raise_for_problems(
method _prepare_problems_message (line 810) | def _prepare_problems_message(
method _maybe_raise_for_conda_build (line 837) | def _maybe_raise_for_conda_build(
method _log_info (line 869) | def _log_info(self) -> None:
method _called_from_conda_build (line 876) | def _called_from_conda_build(self) -> bool:
method _check_spec_compat (line 896) | def _check_spec_compat(self, spec: MatchSpec | None) -> MatchSpec | None:
method _conda_spec_to_libmamba_spec (line 916) | def _conda_spec_to_libmamba_spec(self, spec: MatchSpec) -> LibmambaMat...
method _fix_version_field_for_conda_build (line 920) | def _fix_version_field_for_conda_build(spec: MatchSpec) -> MatchSpec:
method _matchspec_from_error_str (line 935) | def _matchspec_from_error_str(spec: str | Sequence[str]) -> MatchSpec:
method _maybe_ignore_current_repodata (line 953) | def _maybe_ignore_current_repodata(self) -> str:
method _max_attempts (line 968) | def _max_attempts(self, in_state: SolverInputState, default: int = 1) ...
method _notify_conda_outdated (line 1000) | def _notify_conda_outdated(
FILE: conda_libmamba_solver/state.py
class SolverInputState (line 99) | class SolverInputState:
method __init__ (line 161) | def __init__(
method _default_to_context_if_null (line 206) | def _default_to_context_if_null(self, name, value, context=context) ->...
method prefix_data (line 211) | def prefix_data(self) -> PrefixData:
method installed (line 221) | def installed(self) -> dict[str, PackageRecord]:
method history (line 230) | def history(self) -> dict[str, MatchSpec]:
method pinned (line 238) | def pinned(self) -> dict[str, MatchSpec]:
method virtual (line 250) | def virtual(self) -> dict[str, MatchSpec]:
method aggressive_updates (line 259) | def aggressive_updates(self) -> dict[str, MatchSpec]:
method always_update (line 268) | def always_update(self) -> dict[str, MatchSpec]:
method do_not_remove (line 288) | def do_not_remove(self) -> dict[str, MatchSpec]:
method requested (line 296) | def requested(self) -> dict[str, MatchSpec]:
method is_installing (line 305) | def is_installing(self) -> bool:
method is_updating (line 312) | def is_updating(self) -> bool:
method is_creating (line 319) | def is_creating(self) -> bool:
method is_removing (line 326) | def is_removing(self) -> bool:
method update_modifier (line 335) | def update_modifier(self) -> EnumAsBools:
method deps_modifier (line 348) | def deps_modifier(self) -> EnumAsBools:
method ignore_pinned (line 363) | def ignore_pinned(self) -> bool:
method force_remove (line 367) | def force_remove(self) -> bool:
method force_reinstall (line 371) | def force_reinstall(self) -> bool:
method prune (line 375) | def prune(self) -> bool:
method channels_from_specs (line 380) | def channels_from_specs(self) -> Iterable[Channel]:
method maybe_free_channel (line 395) | def maybe_free_channel(self) -> Iterable[Channel]:
class SolverOutputState (line 406) | class SolverOutputState:
method __init__ (line 457) | def __init__(
method current_solution (line 475) | def current_solution(self) -> IndexedSet[PackageRecord]:
method specs (line 483) | def specs(self) -> dict[str, MatchSpec]:
method real_specs (line 509) | def real_specs(self) -> dict[str, MatchSpec]:
method virtual_specs (line 516) | def virtual_specs(self) -> dict[str, MatchSpec]:
method early_exit (line 522) | def early_exit(self) -> IndexedSet[PackageRecord] | None:
method check_for_pin_conflicts (line 563) | def check_for_pin_conflicts(self, index: LibMambaIndexHelper) -> None:
method post_solve (line 600) | def post_solve(self, solver: Solver) -> None:
function sort_by_spec_strictness (line 777) | def sort_by_spec_strictness(key_value_tuple: tuple[str, MatchSpec]) -> t...
FILE: conda_libmamba_solver/utils.py
function escape_channel_url (line 29) | def escape_channel_url(channel: str) -> str:
function compatible_specs (line 52) | def compatible_specs(
class EnumAsBools (line 89) | class EnumAsBools:
method __init__ (line 103) | def __init__(self, enum: Enum):
method __getattr__ (line 107) | def __getattr__(self, name: str) -> bool:
method __eq__ (line 114) | def __eq__(self, obj: object) -> bool:
method _dict (line 117) | def _dict(self) -> dict[str, bool]:
FILE: dev/scripts/httpx-fetch-all-shards.py
function connect (line 20) | def connect(dburi="cache.db"):
function to_url (line 34) | def to_url(shard):
function shard_urls (line 47) | def shard_urls(index):
function get_one (line 52) | async def get_one(sem, client, url, package):
function main (line 61) | async def main():
FILE: dev/scripts/requests-fetch-all-shards.py
function connect (line 20) | def connect(dburi="cache.db"):
function to_url (line 34) | def to_url(shard):
function shard_urls (line 48) | def shard_urls():
function fetch (line 53) | def fetch(s, package, url):
FILE: tests/channel_testing/helpers.py
function _dummy_http_server (line 21) | def _dummy_http_server(
function http_server_auth_none (line 100) | def http_server_auth_none(xprocess):
function http_server_auth_none_debug_repodata (line 105) | def http_server_auth_none_debug_repodata(xprocess):
function http_server_auth_none_debug_packages (line 115) | def http_server_auth_none_debug_packages(xprocess):
function http_server_auth_basic (line 125) | def http_server_auth_basic(xprocess):
function http_server_auth_basic_email (line 137) | def http_server_auth_basic_email(xprocess):
function http_server_auth_token (line 149) | def http_server_auth_token(xprocess):
FILE: tests/channel_testing/reposerver.py
function get_fingerprint (line 82) | def get_fingerprint(gpg_output):
class RepoSigner (line 89) | class RepoSigner:
method normalize_keys (line 106) | def normalize_keys(self, keys):
method create_root (line 124) | def create_root(self, keys):
method create_key_mgr (line 161) | def create_key_mgr(self, keys):
method sign_repodata (line 203) | def sign_repodata(self, repodata_fn, keys):
method __init__ (line 216) | def __init__(self, in_folder=args.directory):
class RepodataHeadersHandler (line 239) | class RepodataHeadersHandler(SimpleHTTPRequestHandler):
method do_GET (line 248) | def do_GET(self) -> None:
class PackagesHeadersHandler (line 262) | class PackagesHeadersHandler(RepodataHeadersHandler):
class BasicAuthHandler (line 268) | class BasicAuthHandler(SimpleHTTPRequestHandler):
method do_HEAD (line 275) | def do_HEAD(self):
method do_AUTHHEAD (line 280) | def do_AUTHHEAD(self):
method do_GET (line 286) | def do_GET(self):
class CondaTokenHandler (line 304) | class CondaTokenHandler(SimpleHTTPRequestHandler):
method do_GET (line 310) | def do_GET(self):
FILE: tests/http_test_server.py
function run_test_server (line 22) | def run_test_server(
FILE: tests/repodata_time_machine.py
function cli (line 31) | def cli():
function download_repodata (line 44) | def download_repodata(channel, subdirs=None):
function trim_to_timestamp (line 63) | def trim_to_timestamp(repodata, timestamp: float):
function download_patches (line 82) | def download_patches(channel, timestamp: float):
function apply_patch (line 108) | def apply_patch(repodata_file, patch):
function repodata_time_machine (line 119) | def repodata_time_machine(channels, timestamp_str, subdirs=None):
function main (line 160) | def main():
FILE: tests/test_channels.py
function test_channel_matchspec (line 43) | def test_channel_matchspec(conda_cli: CondaCLIFixture, path_factory: Pat...
function test_channels_prefixdata (line 63) | def test_channels_prefixdata(tmp_env: TmpEnvFixture) -> None:
function test_channels_installed_unavailable (line 85) | def test_channels_installed_unavailable(
function _setup_conda_forge_as_defaults (line 107) | def _setup_conda_forge_as_defaults(prefix, force=False):
function _setup_channels_alias (line 116) | def _setup_channels_alias(prefix, force=False):
function _setup_channels_custom (line 131) | def _setup_channels_custom(prefix, force=False):
function test_mirrors_do_not_leak_channels (line 149) | def test_mirrors_do_not_leak_channels(config_env, tmp_path, tmp_env):
function test_jax_and_jaxlib (line 203) | def test_jax_and_jaxlib():
function test_encoding_file_paths (line 229) | def test_encoding_file_paths(tmp_path: Path):
function test_conda_build_with_aliased_channels (line 248) | def test_conda_build_with_aliased_channels(tmp_path):
function test_http_server_auth_none (line 274) | def test_http_server_auth_none(
function test_http_server_auth_basic (line 290) | def test_http_server_auth_basic(
function test_http_server_auth_basic_email (line 307) | def test_http_server_auth_basic_email(
function test_http_server_auth_token (line 326) | def test_http_server_auth_token(
function test_http_server_auth_token_in_defaults (line 342) | def test_http_server_auth_token_in_defaults(
function test_local_spec (line 370) | def test_local_spec() -> None:
function test_nameless_channel (line 394) | def test_nameless_channel(
function test_unknown_channels_do_not_crash (line 424) | def test_unknown_channels_do_not_crash(tmp_env: TmpEnvFixture, conda_cli...
function test_use_cache_works_offline_fresh_install_keep (line 440) | def test_use_cache_works_offline_fresh_install_keep(tmp_path):
function test_channels_are_percent_encoded (line 475) | def test_channels_are_percent_encoded(tmp_path):
function test_channel_ordering (line 494) | def test_channel_ordering(
FILE: tests/test_downstream.py
function test_build_recipe (line 22) | def test_build_recipe(recipe):
function test_conda_lock (line 40) | def test_conda_lock(tmp_path):
FILE: tests/test_experimental.py
function print_and_check_output (line 23) | def print_and_check_output(*args, **kwargs):
function test_protection_for_base_env (line 33) | def test_protection_for_base_env(monkeypatch: MonkeyPatch, conda_cli: Co...
function test_cli_flag_in_help (line 45) | def test_cli_flag_in_help():
FILE: tests/test_index.py
function test_given_channels (line 41) | def test_given_channels(monkeypatch: pytest.MonkeyPatch, tmp_path: os.Pa...
function test_defaults_use_only_tar_bz2 (line 62) | def test_defaults_use_only_tar_bz2(monkeypatch: pytest.MonkeyPatch, only...
function test_reload_channels (line 110) | def test_reload_channels(tmp_path: Path):
function test_load_channel_repo_info_shards (line 143) | def test_load_channel_repo_info_shards(
function test_add_pip_as_python_dependency_sharded (line 188) | def test_add_pip_as_python_dependency_sharded(
function test_load_channels_order (line 263) | def test_load_channels_order(shard_factory, mocker: MockerFixture):
function test_package_info_from_package_dict_add_pip_as_python_dependency (line 300) | def test_package_info_from_package_dict_add_pip_as_python_dependency():
function test_package_info_from_package_dict_add_pip_as_python_dependency_false (line 331) | def test_package_info_from_package_dict_add_pip_as_python_dependency_fal...
function test_package_info_from_package_dict_add_pip_python2 (line 359) | def test_package_info_from_package_dict_add_pip_python2():
function test_package_info_from_package_dict_add_pip_non_python_package (line 385) | def test_package_info_from_package_dict_add_pip_non_python_package():
function test_package_info_from_package_dict_add_pip_invalid_version (line 412) | def test_package_info_from_package_dict_add_pip_invalid_version():
FILE: tests/test_performance.py
function _get_channels_from_lockfile (line 33) | def _get_channels_from_lockfile(path: Path) -> tuple[str, ...]:
function _channels_as_args (line 41) | def _channels_as_args(channels: Iterable[str]) -> tuple[str, ...]:
function prefix_and_channels (line 51) | def prefix_and_channels(
function test_update_python (line 68) | def test_update_python(
function test_install_python_update_deps (line 88) | def test_install_python_update_deps(
function test_update_all (line 104) | def test_update_all(
function test_install_vaex_from_conda_forge_and_defaults (line 119) | def test_install_vaex_from_conda_forge_and_defaults(conda_cli: CondaCLIF...
FILE: tests/test_plugin.py
function always_reset_context (line 14) | def always_reset_context():
function test_enabled_sharded_repodata (line 18) | def test_enabled_sharded_repodata():
function test_enabled_sharded_repodata_environment_variable (line 26) | def test_enabled_sharded_repodata_environment_variable(monkeypatch):
function test_enabled_sharded_repodata_condarc (line 36) | def test_enabled_sharded_repodata_condarc(tmp_path):
FILE: tests/test_repoquery.py
function test_repoquery (line 13) | def test_repoquery():
function test_query_search (line 27) | def test_query_search():
function test_query_search_includes_python_site_packages_path (line 53) | def test_query_search_includes_python_site_packages_path():
FILE: tests/test_shards.py
function package_names (line 91) | def package_names(shard: shards_cache.ShardDict):
function expand_channels (line 100) | def expand_channels(channels: list[Channel], subdirs: Iterable[str] | No...
function _timer (line 112) | def _timer(name: str, callback=None):
function prepare_shards_test (line 126) | def prepare_shards_test(monkeypatch: pytest.MonkeyPatch):
function empty_shards_cache (line 142) | def empty_shards_cache(tmp_path):
function ensure_hex_hash (line 216) | def ensure_hex_hash(repodata: dict):
function shard_for_name (line 232) | def shard_for_name(repodata, name):
class ShardFactory (line 243) | class ShardFactory:
method __init__ (line 267) | def __init__(self, root: Path = tempfile.gettempdir()):
method clean_up_http_servers (line 271) | def clean_up_http_servers(self):
method http_server_shards (line 277) | def http_server_shards(
function shard_factory (line 338) | def shard_factory(tmp_path_factory, request: pytest.FixtureRequest) -> S...
function http_server_shards (line 362) | def http_server_shards(tmp_path_factory) -> Iterable[str]:
function test_fetch_shards_index_mark_unavailable (line 373) | def test_fetch_shards_index_mark_unavailable(monkeypatch, tmp_path, erro...
function test_fetch_shards_error (line 424) | def test_fetch_shards_error(http_server_shards, empty_shards_cache):
function test_shards_base_url (line 464) | def test_shards_base_url():
function test_shard_mentioned_packages_2 (line 564) | def test_shard_mentioned_packages_2():
function test_fetch_shards_channels (line 579) | def test_fetch_shards_channels(prepare_shards_test: None):
function test_shards_cache (line 594) | def test_shards_cache(tmp_path: Path):
function test_shards_cache_recovery (line 621) | def test_shards_cache_recovery(tmp_path: Path):
function test_shards_cache_uses_wal (line 637) | def test_shards_cache_uses_wal(tmp_path: Path):
function test_shards_cache_concurrent_read_write (line 644) | def test_shards_cache_concurrent_read_write(tmp_path: Path):
class MockCache (line 692) | class MockCache(NamedTuple):
function mock_cache (line 703) | def mock_cache(tmp_path: Path) -> Iterator[MockCache]:
function shard_cache_with_data (line 726) | def shard_cache_with_data(
function test_shard_cache_multiple (line 735) | def test_shard_cache_multiple(
function test_shard_cache_clear_remove (line 778) | def test_shard_cache_clear_remove(tmp_path):
function test_shardlike (line 797) | def test_shardlike():
function test_shardlike_repr (line 846) | def test_shardlike_repr():
function test_shard_hash_as_array (line 864) | def test_shard_hash_as_array():
function test_shards_coverage (line 892) | def test_shards_coverage():
function test_ensure_hex_hash_in_record (line 918) | def test_ensure_hex_hash_in_record():
function test_batch_retrieve_from_cache (line 943) | def test_batch_retrieve_from_cache(
function test_shard_cache_multiple_profile (line 970) | def test_shard_cache_multiple_profile(retrieval_type, mock_cache: MockCa...
function test_shards_connections (line 989) | def test_shards_connections(monkeypatch):
function test_filter_packages_simple (line 1003) | def test_filter_packages_simple():
function test_filter_packages_repodata (line 1023) | def test_filter_packages_repodata(channel, benchmark):
function test_offline_mode_expired_cache (line 1042) | def test_offline_mode_expired_cache(http_server_shards, monkeypatch, tmp...
function test_offline_mode_no_cache (line 1090) | def test_offline_mode_no_cache(http_server_shards, empty_shards_cache, m...
function test_offline_mode_missing_shard_in_cache (line 1118) | def test_offline_mode_missing_shard_in_cache(
function test_repodata_shards_sends_etag (line 1169) | def test_repodata_shards_sends_etag(monkeypatch, tmp_path):
function test_safe_urljoin_with_slash (line 1259) | def test_safe_urljoin_with_slash(base_url, relative_url, expected):
FILE: tests/test_shards_subset.py
function codspeed_supported (line 116) | def codspeed_supported():
function clean_cache (line 128) | def clean_cache(conda_cli: CondaCLIFixture):
function repodata_subset_size (line 143) | def repodata_subset_size(channel_data):
function test_traversal_algorithm_benchmarks (line 166) | def test_traversal_algorithm_benchmarks(
function test_traversal_algorithms_match (line 220) | def test_traversal_algorithms_match(conda_cli, scenario: dict):
function test_build_repodata_subset_pipelined (line 248) | def test_build_repodata_subset_pipelined(
function test_shards_cache_thread (line 275) | def test_shards_cache_thread(
function test_shards_network_thread (line 328) | def test_shards_network_thread(http_server_shards, shard_cache_with_data):
function test_build_repodata_subset_error_propagation (line 390) | def test_build_repodata_subset_error_propagation(http_server_shards, alg...
function test_build_repodata_subset_package_not_found (line 444) | def test_build_repodata_subset_package_not_found(http_server_shards, alg...
function test_build_repodata_subset_local_server (line 468) | def test_build_repodata_subset_local_server(http_server_shards, algorith...
function test_build_repodata_subset_no_shards (line 500) | def test_build_repodata_subset_no_shards(http_server_shards):
function test_build_repodata_subset (line 509) | def test_build_repodata_subset(prepare_shards_test: None, tmp_path):
function test_only_tar_bz2 (line 566) | def test_only_tar_bz2(http_server_shards, tmp_path, only_tar_bz2, strate...
function test_pipelined_with_slow_queue_operations (line 590) | def test_pipelined_with_slow_queue_operations(http_server_shards, mocker...
function test_pipelined_shutdown_race_condition (line 633) | def test_pipelined_shutdown_race_condition(http_server_shards, mocker, t...
function test_pipelined_timeout (line 671) | def test_pipelined_timeout(http_server_shards, monkeypatch, tmp_path):
function test_combine_batches_blocking_scenario (line 713) | def test_combine_batches_blocking_scenario():
function test_pipelined_extreme_race_conditions (line 759) | def test_pipelined_extreme_race_conditions(
function test_pipelined_concurrent_stress (line 818) | def test_pipelined_concurrent_stress(http_server_shards, mocker, tmp_pat...
function test_worker_thread_exception_propagation (line 858) | def test_worker_thread_exception_propagation():
function test_shutdown_with_pending_work (line 897) | def test_shutdown_with_pending_work(http_server_shards, mocker, tmp_path):
function test_repodata_subset_misc (line 939) | def test_repodata_subset_misc():
FILE: tests/test_solver.py
function test_python_downgrade_reinstalls_noarch_packages (line 38) | def test_python_downgrade_reinstalls_noarch_packages(
function test_defaults_specs_work (line 80) | def test_defaults_specs_work(conda_cli: CondaCLIFixture) -> None:
function test_determinism (line 113) | def test_determinism(tmpdir):
function test_update_from_latest_not_downgrade (line 154) | def test_update_from_latest_not_downgrade(
function test_too_aggressive_update_to_conda_forge_packages (line 190) | def test_too_aggressive_update_to_conda_forge_packages(tmp_env: TmpEnvFi...
function test_pinned_with_cli_build_string (line 231) | def test_pinned_with_cli_build_string(tmp_env: TmpEnvFixture) -> None:
function test_constraining_pin_and_requested (line 305) | def test_constraining_pin_and_requested():
function test_locking_pins (line 345) | def test_locking_pins(
function test_ca_certificates_pins (line 384) | def test_ca_certificates_pins(tmp_env: TmpEnvFixture, conda_cli: CondaCL...
function test_python_update_should_not_uninstall_history (line 422) | def test_python_update_should_not_uninstall_history(
function test_python_downgrade_with_pins_removes_truststore (line 458) | def test_python_downgrade_with_pins_removes_truststore(tmp_env: TmpEnvFi...
function test_install_virtual_packages (line 496) | def test_install_virtual_packages(conda_cli: CondaCLIFixture, spec: str)...
function test_urls_are_percent_decoded (line 517) | def test_urls_are_percent_decoded(tmp_path: Path) -> None:
function test_prune_existing_env (line 532) | def test_prune_existing_env(
function test_prune_existing_env_dependencies_are_solved (line 564) | def test_prune_existing_env_dependencies_are_solved(
function test_satisfied_skip_solve_matchspec (line 604) | def test_satisfied_skip_solve_matchspec(
function test_pytorch_gpu (line 626) | def test_pytorch_gpu(specs):
function test_cross_platform_spinner_message (line 678) | def test_cross_platform_spinner_message(
function test_channel_subdir_set_correctly (line 707) | def test_channel_subdir_set_correctly(tmp_env: TmpEnvFixture) -> None:
function test_python_site_packages_path (line 728) | def test_python_site_packages_path(tmp_env: TmpEnvFixture) -> None:
function test_track_features_recorded_correctly (line 750) | def test_track_features_recorded_correctly(tmp_env, monkeypatch, shards):
FILE: tests/test_solver_differences.py
function test_pydantic_182_not_on_python_311 (line 20) | def test_pydantic_182_not_on_python_311():
function test_gpu_cpu_mutexes (line 89) | def test_gpu_cpu_mutexes():
function test_old_panel (line 170) | def test_old_panel(tmp_path):
FILE: tests/test_user_agent.py
function test_user_agent_conda_info (line 18) | def test_user_agent_conda_info(solver):
FILE: tests/test_workarounds.py
function test_matchspec_star_version (line 15) | def test_matchspec_star_version():
function test_build_string_filters (line 39) | def test_build_string_filters():
function test_ctrl_c (line 70) | def test_ctrl_c(stage, shards):
FILE: tests/utils.py
function conda_subprocess (line 14) | def conda_subprocess(*args, explain=False, capture_output=True, **kwargs...
function write_env_config (line 34) | def write_env_config(prefix, force=False, **kwargs):
Condensed preview — 128 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,664K chars).
[
{
"path": ".authors.yml",
"chars": 3158,
"preview": "- name: Jaime Rodríguez-Guerra\n email: jaimergp@users.noreply.github.com\n aliases:\n - jaimergp\n num_commits: 174\n f"
},
{
"path": ".devcontainer/apt-deps.txt",
"chars": 23,
"preview": "git\nless\nhtop\nnano\nssh\n"
},
{
"path": ".devcontainer/conda-forge/devcontainer.json",
"chars": 1850,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n{\n \"name\": \"Miniforge (defau"
},
{
"path": ".devcontainer/defaults/devcontainer.json",
"chars": 1825,
"preview": "// For format details, see https://aka.ms/devcontainer.json\n{\n \"name\": \"Miniconda (default-channel=defaults)\",\n \"i"
},
{
"path": ".devcontainer/post_create.sh",
"chars": 1655,
"preview": "#!/bin/bash\n\n# This script assumes we are running in a Miniconda container where:\n# - /opt/conda is the Miniconda or Min"
},
{
"path": ".devcontainer/post_start.sh",
"chars": 3202,
"preview": "#!/bin/bash\n\n# This script assumes we are running in a Miniconda container where:\n# - /opt/conda is the Miniconda or Min"
},
{
"path": ".flake8",
"chars": 164,
"preview": "[flake8]\nmax-line-length = 99\nignore = E126,E133,E226,E241,E242,E302,E704,E731,E722,W503,E402,W504,F821,E203\nexclude = t"
},
{
"path": ".github/CODEOWNERS",
"chars": 111,
"preview": "# Syntax for this file at https://help.github.com/articles/about-codeowners/\n\n* @conda/conda-maintainers\n"
},
{
"path": ".github/ISSUE_TEMPLATE/0_bug.yml",
"chars": 2854,
"preview": "# edit this in https://github.com/conda/infrastructure\n\nname: Bug Report\ndescription: Create a bug report.\nlabels:\n - t"
},
{
"path": ".github/ISSUE_TEMPLATE/1_feature.yml",
"chars": 2032,
"preview": "# edit this in https://github.com/conda/infrastructure\n\nname: Feature Request\ndescription: Create a feature request.\nlab"
},
{
"path": ".github/ISSUE_TEMPLATE/2_documentation.yml",
"chars": 1502,
"preview": "# edit this in https://github.com/conda/infrastructure\n\nname: Documentation\ndescription: Create a documentation related "
},
{
"path": ".github/ISSUE_TEMPLATE/epic.yml",
"chars": 3234,
"preview": "# edit this in https://github.com/conda/infrastructure\n\nname: Epic\ndescription: A collection of related tickets.\nlabels:"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1595,
"preview": "<!-- Hello! Thanks for submitting a PR! To help make things go a bit more\n smoothly, we would appreciate it if you f"
},
{
"path": ".github/TEST_FAILURE_REPORT_TEMPLATE.md",
"chars": 325,
"preview": "---\ntitle: \"{{ env.TITLE }}\"\nlabels: [type::bug, type::testing]\n---\n\nThe {{ workflow }} workflow failed on {{ date | dat"
},
{
"path": ".github/dependabot.yml",
"chars": 186,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n "
},
{
"path": ".github/disclaimer.txt",
"chars": 96,
"preview": "Copyright (C) 2022 Anaconda, Inc\nCopyright (C) 2023 conda\nSPDX-License-Identifier: BSD-3-Clause\n"
},
{
"path": ".github/labels.yml",
"chars": 92,
"preview": "# Builds\n- name: build::review\n description: trigger a build for this PR\n color: \"7B4052\"\n"
},
{
"path": ".github/template-files/config.yml",
"chars": 1692,
"preview": "conda/governance:\n # [required] community files\n - CODE_OF_CONDUCT.md\n\nconda/conda:\n # issue template details for tem"
},
{
"path": ".github/template-files/templates/issue_template_details.yml",
"chars": 1125,
"preview": " - type: textarea\n id: info\n attributes:\n label: Conda Info\n description: |\n Let's collect some "
},
{
"path": ".github/template-files/templates/pull_request_template_details.md",
"chars": 679,
"preview": "### Checklist - did you ...\n\n<!-- If any of the following items aren't relevant to your contribution,\n please either"
},
{
"path": ".github/workflows/builds-review.yaml",
"chars": 2151,
"preview": "name: Review builds\n\non:\n pull_request:\n types:\n - labeled\n\njobs:\n build:\n if: |\n github.event_name =="
},
{
"path": ".github/workflows/cla.yml",
"chars": 1135,
"preview": "name: CLA\n\non:\n issue_comment:\n types:\n - created\n pull_request_target:\n\njobs:\n check:\n if: >-\n !gith"
},
{
"path": ".github/workflows/docs.yml",
"chars": 1600,
"preview": "name: Docs\n\non:\n # Runs on pushes targeting the default branch\n push:\n branches: [\"main\"]\n pull_request:\n paths"
},
{
"path": ".github/workflows/issues.yml",
"chars": 1331,
"preview": "name: Automate Issues\n\non:\n # NOTE: github.event is issue_comment payload:\n # https://docs.github.com/en/developers/we"
},
{
"path": ".github/workflows/labels.yml",
"chars": 1692,
"preview": "name: Sync Labels\n\non:\n # NOTE: github.event is workflow_dispatch payload:\n # https://docs.github.com/en/developers/we"
},
{
"path": ".github/workflows/lock.yml",
"chars": 2014,
"preview": "name: Lock\n\non:\n # NOTE: github.event is workflow_dispatch payload:\n # https://docs.github.com/en/developers/webhooks-"
},
{
"path": ".github/workflows/performance.yml",
"chars": 6791,
"preview": "name: Performance\n\non:\n pull_request:\n types:\n - labeled\n workflow_run:\n workflows:\n - CI\n branches"
},
{
"path": ".github/workflows/project.yml",
"chars": 443,
"preview": "name: Add to Project\n\non:\n pull_request_target:\n types:\n - opened\n\njobs:\n add_to_project:\n if: '!github.eve"
},
{
"path": ".github/workflows/stale.yml",
"chars": 3771,
"preview": "name: Stale\n\non:\n # NOTE: github.event is workflow_dispatch payload:\n # https://docs.github.com/en/developers/webhooks"
},
{
"path": ".github/workflows/tests.yml",
"chars": 31689,
"preview": "name: Tests\n\non:\n # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#push\n push:\n "
},
{
"path": ".github/workflows/update.yml",
"chars": 4531,
"preview": "name: Update Repository\n\non:\n # every Sunday at 00:36 UTC\n # https://crontab.guru/#36_2_*_*_0\n schedule:\n - cron: "
},
{
"path": ".gitignore",
"chars": 2841,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
},
{
"path": ".mailmap",
"chars": 1646,
"preview": "# This file was autogenerated by rever: https://regro.github.io/rever-docs/\n# This prevent git from showing duplicates w"
},
{
"path": ".pre-commit-config.yaml",
"chars": 1887,
"preview": "# disable autofixing PRs, commenting \"pre-commit.ci autofix\" on a pull request triggers a autofix\nci:\n autofix_prs: fal"
},
{
"path": "AUTHORS.md",
"chars": 517,
"preview": "All of the people who have made at least one contribution to conda-libmamba-solver.\nAuthors are sorted alphabetically.\n\n"
},
{
"path": "CHANGELOG.md",
"chars": 27188,
"preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n> The format is based on [Keep a Chan"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 25633,
"preview": "# Conda Organization Code of Conduct\n\n# The Short Version\n\nBe kind to others. Do not insult or put down others. Behave p"
},
{
"path": "HOW_WE_USE_GITHUB.md",
"chars": 23403,
"preview": "<!-- edit this in https://github.com/conda/infrastructure -->\n# How We Use GitHub\n\n<!-- absolute URLs -->\n[conda-org]: h"
},
{
"path": "LICENSE",
"chars": 1663,
"preview": "BSD 3-Clause License\n\nCopyright (c) 2022, Anaconda, Inc.\nCopyright (c) 2023, conda\nAll rights reserved.\n\nRedistribution "
},
{
"path": "README.md",
"chars": 2742,
"preview": "# conda-libmamba-solver\n\nThe fast mamba solver, now in conda!\n\n## What is this exactly?\n\nconda-libmamba-solver is a new "
},
{
"path": "RELEASE.md",
"chars": 19993,
"preview": "<!-- edit this in https://github.com/conda/infrastructure -->\n\n[epic template]: https://github.com/conda/conda-libmamba-"
},
{
"path": "conda_libmamba_solver/__init__.py",
"chars": 564,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\ntry:\n from ._ve"
},
{
"path": "conda_libmamba_solver/conda_build_exceptions.py",
"chars": 1396,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n# Copyright (C) 20"
},
{
"path": "conda_libmamba_solver/exceptions.py",
"chars": 485,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nExceptions use"
},
{
"path": "conda_libmamba_solver/index.py",
"chars": 33404,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nThis module pr"
},
{
"path": "conda_libmamba_solver/mamba_utils.py",
"chars": 6869,
"preview": "# Copyright (C) 2019 QuantStack and the Mamba contributors.\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 cond"
},
{
"path": "conda_libmamba_solver/plugin.py",
"chars": 1148,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEntry points f"
},
{
"path": "conda_libmamba_solver/repoquery.py",
"chars": 7610,
"preview": "# Copyright (C) 2019, QuantStack\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier"
},
{
"path": "conda_libmamba_solver/shards.py",
"chars": 28952,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nModels for sha"
},
{
"path": "conda_libmamba_solver/shards_cache.py",
"chars": 6764,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nCache suitable"
},
{
"path": "conda_libmamba_solver/shards_subset.py",
"chars": 27391,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nSharded repoda"
},
{
"path": "conda_libmamba_solver/shards_typing.py",
"chars": 1574,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nTypedDict decl"
},
{
"path": "conda_libmamba_solver/solver.py",
"chars": 47509,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n# Copyright (C) 20"
},
{
"path": "conda_libmamba_solver/state.py",
"chars": 33571,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nSolver-agnosti"
},
{
"path": "conda_libmamba_solver/utils.py",
"chars": 3833,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nMiscellaneous "
},
{
"path": "dev/requirements.txt",
"chars": 220,
"preview": "# build-time\npip\n# run-time\nboltons>=23.0.0\nconda>=26.1\nconda-forge::libmamba>=2.0.0\nconda-forge::libmambapy>=2.0.0\nmsgp"
},
{
"path": "dev/scripts/BenchmarkChart.ipynb",
"chars": 4428,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"e28dc53c-5b9c-453d-a9ef-14dd93b85b46\",\n \"metadata\": {},\n \"so"
},
{
"path": "dev/scripts/httpx-fetch-all-shards.py",
"chars": 2999,
"preview": "#!/usr/bin/env python\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Cla"
},
{
"path": "dev/scripts/requests-fetch-all-shards.py",
"chars": 2362,
"preview": "#!/usr/bin/env python\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Cla"
},
{
"path": "docs/Makefile",
"chars": 634,
"preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
},
{
"path": "docs/_static/css/custom.css",
"chars": 149,
"preview": "/**\n * This rule is here to avoid the scrollbar appearing when this\n * is not hosted on ReadTheDocs\n */\n#rtd-footer-cont"
},
{
"path": "docs/_templates/navbar_center.html",
"chars": 804,
"preview": "<ul id=\"navbar-main-elements\" class=\"navbar-nav\">\n <li class=\"nav-item current active\">\n <a class=\"reference i"
},
{
"path": "docs/conf.py",
"chars": 3396,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n# Configuration fi"
},
{
"path": "docs/dev/future-work.md",
"chars": 670,
"preview": "# Future work\n\n```{warning} WIP\nThese will/should be expanded into issues.\n```\n\n* `MatchSpec` preparation logic contains"
},
{
"path": "docs/dev/implementation.md",
"chars": 7260,
"preview": "# Implementation details\n\nThis document provides an overview on how the `conda-libmamba-solver` integrations are impleme"
},
{
"path": "docs/dev/index.md",
"chars": 560,
"preview": "# Developer Guide\n\nTo get started with developing conda-libmamba-solver, please check out\nthe following pages:\n\n- [How t"
},
{
"path": "docs/dev/performance-testing.md",
"chars": 541,
"preview": "# Performance testing\n\n## Codspeed\n\nPerformance testing for this project can be found on codspeed here:\n\n- https://codsp"
},
{
"path": "docs/dev/setup.md",
"chars": 5802,
"preview": "# How to set up your development environment\n\n## With `devcontainer` in VS Code\n\nThe development workflow is streamlined"
},
{
"path": "docs/dev/sharded.md",
"chars": 6170,
"preview": "# Sharded repodata implementation\n\nThis document provides an overview on how `conda-libmamba-solver` implements\n[CEP-16 "
},
{
"path": "docs/dev/shards_python.mmd",
"chars": 816,
"preview": "flowchart LR\n python --> bzip2\n python --> libffi\n python --> libzlib\n python --> ncurses\n python --> ope"
},
{
"path": "docs/dev/workflows.md",
"chars": 738,
"preview": "# Typical development workflows\n\n```{note}\nCheck out [\"How to set up your development environment\"](setup.md) if you hav"
},
{
"path": "docs/environment.yml",
"chars": 1615,
"preview": "name: conda-libmamba-solver-docs\nchannels:\n - conda-forge\n - defaults\ndependencies:\n - accessible-pygments=0.0.4\n - "
},
{
"path": "docs/index.md",
"chars": 1008,
"preview": "# conda-libmamba-solver\n\nWelcome to the conda-libmamba-solver documentation! The conda-libmamba-solver\nwas written to ma"
},
{
"path": "docs/robots.txt",
"chars": 82,
"preview": "User-agent: *\n\nSitemap: https://conda.github.io/conda-libmamba-solver/sitemap.xml\n"
},
{
"path": "docs/user-guide/configuration.md",
"chars": 1674,
"preview": "# Configuration\n\n## Basic options\n\nconda-libmamba-solver is a _solver plugin_ and can be configured with the same settin"
},
{
"path": "docs/user-guide/faq.md",
"chars": 3581,
"preview": "# Frequently Asked Questions\n\n## What's the difference between the available solvers in `conda`?\n\nPlease refer to the se"
},
{
"path": "docs/user-guide/index.md",
"chars": 2311,
"preview": "# User Guide\n\nThe `conda-libmamba-solver` plugin allows you to use `libmamba`, the same `libsolv`-powered solver used by"
},
{
"path": "docs/user-guide/libmamba-vs-classic.md",
"chars": 18715,
"preview": "# `libmamba` vs `classic`\n\nThe `libmamba` solver attempts to be a drop-in replacement for the `classic` solver; however,"
},
{
"path": "docs/user-guide/more-resources.md",
"chars": 723,
"preview": "# More resources\n\nIf you want to learn more about `conda-libmamba-solver` and `conda`, we have compiled a list of additi"
},
{
"path": "docs/user-guide/performance.md",
"chars": 1489,
"preview": "# Performance tips and tricks\n\n`conda-libmamba-solver` is much faster than classic for [many reasons](./libmamba-vs-clas"
},
{
"path": "docs/user-guide/subcommands.md",
"chars": 587,
"preview": "# Subcommands\n\nThe conda-libmamba-solver package also provides conda subcommand plugins in addition to the solver plugin"
},
{
"path": "durations/Linux.json",
"chars": 310800,
"preview": "{\n \"tests/base/test_constants.py::test_ChannelPriority\": 0.008545328147680534,\n \"tests/base/test_constants.py::tes"
},
{
"path": "durations/Windows.json",
"chars": 311223,
"preview": "{\n \"tests/base/test_constants.py::test_ChannelPriority\": 0.02008503432274582,\n \"tests/base/test_constants.py::test"
},
{
"path": "durations/macOS.json",
"chars": 309719,
"preview": "{\n \"tests/base/test_constants.py::test_ChannelPriority\": 0.004216883589334565,\n \"tests/base/test_constants.py::tes"
},
{
"path": "news/TEMPLATE",
"chars": 146,
"preview": "### Enhancements\n\n* <news item>\n\n### Bug fixes\n\n* <news item>\n\n### Deprecations\n\n* <news item>\n\n### Docs\n\n* <news item>\n"
},
{
"path": "pyproject.toml",
"chars": 4157,
"preview": "[build-system]\nrequires = [\"hatchling\", \"hatch-vcs\"]\nbuild-backend = \"hatchling.build\"\n\n[project]\nname = \"conda-libmamba"
},
{
"path": "recipe/meta.yaml",
"chars": 1486,
"preview": "package:\n name: \"conda-libmamba-solver\"\n version: \"{{ GIT_DESCRIBE_TAG }}.{{ GIT_BUILD_STR }}\"\n\nsource:\n # git_url is"
},
{
"path": "rever.xsh",
"chars": 902,
"preview": "# edit this in https://github.com/conda/infrastructure\n\n$ACTIVITIES = [\"authors\", \"changelog\"]\n\n# Basic settings\n$PROJEC"
},
{
"path": "tests/__init__.py",
"chars": 102,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n"
},
{
"path": "tests/channel_testing/helpers.py",
"chars": 3987,
"preview": "# Copyright (C) 2019 QuantStack and the Mamba contributors.\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 cond"
},
{
"path": "tests/channel_testing/reposerver.py",
"chars": 11941,
"preview": "# Copyright (C) 2019 QuantStack and the Mamba contributors.\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 cond"
},
{
"path": "tests/conftest.py",
"chars": 705,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\npytest_plugins = "
},
{
"path": "tests/data/conda_build_recipes/LICENSE",
"chars": 1596,
"preview": "This directory was taken from mamba-org/boa, commit 3213180564e51b72a27efed5183d21f97f630692, on May 12 2022\n\n---\n\nCopyr"
},
{
"path": "tests/data/conda_build_recipes/baddeps/meta.yaml",
"chars": 592,
"preview": "{% set name = \"stackvana-core\" %}\n{% set version = \"0.2021.43\" %}\n\npackage:\n name: {{ name|lower }}\n version: {{ versi"
},
{
"path": "tests/data/conda_build_recipes/jedi/meta.yaml",
"chars": 842,
"preview": "{% set name = \"jedi\" %}\n{% set version = \"0.19.2\" %}\n\npackage:\n name: {{ name }}\n version: {{ version }}\n\nsource:\n ur"
},
{
"path": "tests/data/conda_build_recipes/multioutput/meta.yaml",
"chars": 679,
"preview": "{% set name = \"ocp\" %}\n{% set version = \"7.5.2beta\" %}\n{% set occt_version = \"=7.5.2\" %}\n\npackage:\n name: {{ name }}-sp"
},
{
"path": "tests/data/conda_build_recipes/stackvana/meta.yaml",
"chars": 1695,
"preview": "{% set name = \"stackvana-split\" %}\n{% set version = \"0.2021.43\" %}\n{% set eups_product = \"lsst_distrib\" %}\n\npackage:\n n"
},
{
"path": "tests/data/lock_this_env.yml",
"chars": 49,
"preview": "channels:\n - conda-forge\ndependencies:\n - zlib\n"
},
{
"path": "tests/data/mamba_repo/LICENSE",
"chars": 1600,
"preview": "This directory was taken from mamba-org/mamba, commit bff16c2bdc4103ba74c23ab4fdbf58849a55981c, on Mar 17 2022\n\n---\n\nCop"
},
{
"path": "tests/data/mamba_repo/channeldata.json",
"chars": 859,
"preview": "{\n \"channeldata_version\": 1,\n \"packages\": {\n \"test-package\": {\n \"activate.d\": false,\n \"binary_prefix\": fa"
},
{
"path": "tests/data/mamba_repo/index.html",
"chars": 2090,
"preview": "<html>\n<head>\n <title>repo</title>\n <style type=\"text/css\">\n a, a:active {\n text-decoration: none; color: blue"
},
{
"path": "tests/data/mamba_repo/noarch/current_repodata.json",
"chars": 586,
"preview": "{\n \"info\": {\n \"subdir\": \"noarch\"\n },\n \"packages\": {\n \"test-package-0.1-0.tar.bz2\": {\n \"build\": \"0\",\n "
},
{
"path": "tests/data/mamba_repo/noarch/index.html",
"chars": 2736,
"preview": "<html>\n<head>\n <title>repo/noarch</title>\n <style type=\"text/css\">\n a, a:active {\n text-decoration: none; colo"
},
{
"path": "tests/data/mamba_repo/noarch/repodata.json",
"chars": 586,
"preview": "{\n \"info\": {\n \"subdir\": \"noarch\"\n },\n \"packages\": {\n \"test-package-0.1-0.tar.bz2\": {\n \"build\": \"0\",\n "
},
{
"path": "tests/data/mamba_repo/noarch/repodata_from_packages.json",
"chars": 586,
"preview": "{\n \"info\": {\n \"subdir\": \"noarch\"\n },\n \"packages\": {\n \"test-package-0.1-0.tar.bz2\": {\n \"build\": \"0\",\n "
},
{
"path": "tests/data/mamba_repo/recipes/test-package/meta.yaml",
"chars": 235,
"preview": "package:\n name: test-package\n version: 0.1\n\nbuild:\n number: 0\n script: echo Hello world\n noarch: generic\n\nabout:\n "
},
{
"path": "tests/http_test_server.py",
"chars": 2380,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nLocal test ser"
},
{
"path": "tests/repodata_time_machine.py",
"chars": 5952,
"preview": "# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nconda repodata time machine\n\nGiven a date and a c"
},
{
"path": "tests/requirements.txt",
"chars": 169,
"preview": "conda-build\nconda-forge::pytest-xprocess\nconda-index\nconda-lock\nconda-forge::pre-commit\npytest-codspeed >=4\nconda-forge:"
},
{
"path": "tests/run_in_profiler.py",
"chars": 895,
"preview": "#!/usr/bin/env python\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Cla"
},
{
"path": "tests/test_channels.py",
"chars": 17229,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ im"
},
{
"path": "tests/test_downstream.py",
"chars": 1463,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport os\nfrom pat"
},
{
"path": "tests/test_experimental.py",
"chars": 2023,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEnsure experim"
},
{
"path": "tests/test_index.py",
"chars": 14809,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ im"
},
{
"path": "tests/test_performance.py",
"chars": 3399,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nMeasure the sp"
},
{
"path": "tests/test_plugin.py",
"chars": 1427,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEnsure configu"
},
{
"path": "tests/test_repoquery.py",
"chars": 2303,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport json\n\nfrom "
},
{
"path": "tests/test_shards.py",
"chars": 42657,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nTest sharded r"
},
{
"path": "tests/test_shards_subset.py",
"chars": 33234,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ im"
},
{
"path": "tests/test_solver.py",
"chars": 25728,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ im"
},
{
"path": "tests/test_solver_differences.py",
"chars": 7078,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nThis module co"
},
{
"path": "tests/test_user_agent.py",
"chars": 967,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEnsure the rig"
},
{
"path": "tests/test_workarounds.py",
"chars": 4556,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport asyncio\nimp"
},
{
"path": "tests/utils.py",
"chars": 1261,
"preview": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport sys\nfrom pa"
}
]
// ... and 4 more files (download for full content)
About this extraction
This page contains the full source code of the conda/conda-libmamba-solver GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 128 files (1.5 MB), approximately 449.8k tokens, and a symbol index with 391 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.