Skip to content

Commit 2a14a4b

Browse files
authored
Merge branch 'main' into abi3
2 parents 75fd64c + be3ddff commit 2a14a4b

37 files changed

+3777
-2206
lines changed

.github/workflows/deploy.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
steps:
1515
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
1616

17-
- uses: conda-incubator/setup-miniconda@d2e6a045a86077fb6cad6f5adf368e9076ddaa8d # v3.1.0
17+
- uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3.1.1
1818
with:
1919
python-version: 3.8
2020
channels: conda-forge
@@ -55,6 +55,8 @@ jobs:
5555
--exclude 'https://polys.me/?$'
5656
--exclude 'https://conda-metadata-app.streamlit.app/?$'
5757
--exclude 'https://kb43fqob7u-dsn.algolia.net/'
58+
--exclude 'https://ss64.com/nt/syntax.html'
59+
--exclude 'https://www.mesa3d.org/'
5860
--exclude '.*/404.html/'
5961
--exclude '.*,.*'
6062
--exclude-path './build/community/minutes/'

.pre-commit-config.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,16 @@ repos:
1515
- id: prettier
1616
types_or: [markdown, mdx, json, yaml, css, javascript]
1717
- repo: https://github.com/astral-sh/ruff-pre-commit
18-
rev: v0.9.1
18+
rev: v0.11.5
1919
hooks:
2020
- id: ruff-format
21+
- repo: local
22+
hooks:
23+
- id: sort-csv
24+
name: Sort core and emeritus lists
25+
entry: scripts/sort_csv.py
26+
language: python
27+
types: [text]
28+
files: src/(core|emeritus)\.csv
2129
ci:
2230
autofix_prs: false

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright (c) 2015-2022, conda-forge
1+
Copyright (c) 2015-2025, conda-forge
22
All rights reserved.
33

44
Redistribution and use in source and binary forms, with or without

blog/2024-04-02-xz-backdoor.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ To the best of our knowledge, conda-forge's artifacts for `xz` are _not_ affecte
1616

1717
We immediately checked which `xz` artifacts had been published in our channel:
1818

19-
- Our latest build for `xz` (recipe source available in the [`xz-feedstock`](https://github.com/conda-forge/xz-feedstock/blob/main/recipe/meta.yaml)) is for version `5.2.9` and was uploaded on 2022-12-08. See artifacts in [anaconda.org](https://anaconda.org/conda-forge/xz/files).
19+
- Our latest build for `xz` (recipe source available in the [`xz-feedstock`](https://github.com/conda-forge/xz-feedstock/blob/8b8001268eb4eb7f9dcab4166ba88926e5ed6e91/recipe/meta.yaml)) is for version `5.2.9` and was uploaded on 2022-12-08. See artifacts in [anaconda.org](https://anaconda.org/conda-forge/xz/files).
2020
- The backdoored versions of `xz` belong to the `5.6.x` series.
2121

2222
We are monitoring the situation develop and will update this announcement accordingly if needed.

blog/2024-09-26-python-313.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,31 @@ authors:
44
tags: [infrastructure]
55
---
66

7-
# Python 3.13 Release candidate builds on conda-forge
7+
# Python 3.13 builds on conda-forge
88

9-
conda-forge now supports Python 3.13 release candidates on conda.
9+
conda-forge now supports Python 3.13 on conda.
1010
You can create a new environment with Python 3.13 by running the
1111
command:
1212

13-
conda create -n py313 python=3.13 -c conda-forge/label/python_rc -c conda-forge
13+
conda create -n py313 python=3.13 -c conda-forge
1414

1515
<!-- truncate -->
1616

1717
This will create a new environment with Python 3.13 with the global
1818
interpreter lock (GIL) enabled. A migration is underway that builds
1919
Python extensions like those included in `numpy` and `scipy` as conda packages. The migration
20-
is [55% complete](/status/migration/?name=python313) at the time of writing. Once the first final release of
21-
`python` 3.13 is available the `python_rc` label will not be needed
22-
anymore.
20+
is [55% complete](/status/migration/?name=python313) at the time of writing.
2321

2422
New in this Python release is the `python-freethreading` build which
2523
removes the GIL and enables free threading. To install a `freethreading`
2624
build, you can do:
2725

28-
conda create -n py313 python=3.13 python-freethreading -c conda-forge/label/python_rc -c conda-forge
26+
conda create -n py313 python=3.13 python-freethreading -c conda-forge
2927

3028
Analogous to this package we also have a metapackage to explicitly
3129
install the GIL variant:
3230

33-
conda create -n py313 python=3.13 python-gil -c conda-forge/label/python_rc -c conda-forge
31+
conda create -n py313 python=3.13 python-gil -c conda-forge
3432

3533
Note that there are no conda packages for freethreading Python extensions yet and
3634
we hope to start a migration for freethreading extensions in the
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
---
2+
authors:
3+
- isuruf
4+
tags: [infrastructure]
5+
---
6+
7+
# Noarch variant packages for Python packages on conda-forge
8+
9+
We introduce noarch variants for python packages on conda-forge
10+
that have compiled extensions but with pure python reference
11+
implementations to make life easier for early adopters of
12+
new python variants.
13+
14+
<!-- truncate -->
15+
16+
conda-forge packages have always been batteries included. When
17+
a package has some build options turned off by default to reduce
18+
dependencies, we have enabled these options to give the most
19+
functionality and performance to our users.
20+
21+
In the Python world, some packages are written in C/C++/Cython
22+
to get the most performance out of a package. However these packages
23+
sometimes have a reference implementation written in Python. The Python
24+
reference implementation is a good way to check the C/C++/Cython
25+
code against a much simpler python implementation and is also
26+
useful for platforms like PyPy where the C/C++/Cython implementation
27+
can be slower than the Python reference implementation due to the
28+
emulation of the Python C/C++ API by PyPy. For example for the Cython
29+
package, setting the `CYTHON_NO_COMPILE` environment variable
30+
when building the Cython wheel itself, it will use the Python reference
31+
implementation. The only way to figure out if a package has a Python
32+
reference implementation is to look at the library's source code
33+
to see if `extensions` are optional.
34+
35+
To support platforms like PyPy, some packages build wheels with
36+
compiled extensions for the platforms that are
37+
known to be more performant with the compiled extension, but also
38+
provide a universal pure Python wheel for the other platforms.
39+
This also provides a way for new Python versions and variants
40+
like the free-threading Python build to use these packages by the
41+
early adopters of these Python versions.
42+
43+
On conda-forge we usually have compiled Python packages, but provide
44+
no reference implementation. This means early adopters of new Python
45+
versions need to wait for the conda-forge bot managed by @conda-forge/bot
46+
team to start the migration and rebuild the packages. For example the
47+
free-threading Python 3.13 build is still paused as
48+
conda-forge has decided to focus on the default (GIL enabled)
49+
Python 3.13 build first while upstream packages work on
50+
supporting free-threading.
51+
Another issue is that some packages have cyclic dependencies at build
52+
or test time and this requires some manual handling.
53+
54+
We have been adding `noarch: python` variants for some feedstocks
55+
so that the compiled extension has higher priority and the pure
56+
Python extension has lower priority, which makes the conda solver
57+
use the `noarch: python` variant if no suitable compiled variant
58+
is available. One issue is that the linter might not like selectors
59+
on noarch recipes. We added an option
60+
61+
```yaml
62+
linter:
63+
skip:
64+
- lint_noarch_selectors
65+
```
66+
67+
to `conda-forge.yml` that will make the linter skip this warning/error.
68+
69+
We build the two variants using a `recipe/conda_build_config.yaml`
70+
with the contents,
71+
72+
```yaml
73+
use_noarch:
74+
- true # [linux64]
75+
- false
76+
```
77+
78+
Then in `recipe/meta.yaml` we make the following changes
79+
80+
```yaml
81+
build:
82+
noarch: python # [use_noarch]
83+
track_features: # [use_noarch]
84+
- pyyaml_no_compile # [use_noarch]
85+
86+
requirements:
87+
build:
88+
- {{ compiler('c') }}
89+
- {{ stdlib("c") }}
90+
host:
91+
- python # [not use_noarch]
92+
- python {{ python_min }}.* # [use_noarch]
93+
- setuptools
94+
- pip
95+
run:
96+
- python # [not use_noarch]
97+
- python >={{ python_min }}.* # [use_noarch]
98+
- yaml
99+
100+
test:
101+
requires:
102+
- pip
103+
- python {{ python_min }}.* # [use_noarch]
104+
```
105+
106+
Finally in the build script, we use the env variable `use_noarch`
107+
to set an option to force the extension to be pure python.
108+
In the case of pyyaml, we can force that by setting the env variable
109+
`PYYAML_NO_LIBYAML`. A `recipe/build.sh` might look like,
110+
111+
```bash
112+
if [[ "$use_noarch" == "true" ]]; then
113+
export PYYAML_NO_LIBYAML=1
114+
fi
115+
$PYTHON -m pip install .
116+
```
117+
118+
We list some PRs here as a reference for conda-forge maintainers who
119+
want to experiment.
120+
121+
- [pyyaml](https://github.com/conda-forge/pyyaml-feedstock/pull/55)
122+
- [coverage](https://github.com/conda-forge/coverage-feedstock/pull/123)
123+
- [cython](https://github.com/conda-forge/cython-feedstock/pull/147)
124+
- [aiohttp](https://github.com/conda-forge/aiohttp-feedstock/pull/99)
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
---
2+
authors:
3+
- wolfv
4+
tags: [infrastructure]
5+
---
6+
7+
# Announcing the new recipe format on conda-forge
8+
9+
The conda-forge team is excited to announce that the v1 recipe format is available on conda-forge. The v1 recipe format is a community initiative dating back over 3 years to improve the recipe format for conda packages. If you are a maintainer of a feedstock on conda-forge, you have probably dealt with `meta.yaml` files that conda-build utilizes. The file format has some limitations which is why the community has come together to come up with an improved version of the format: the v1 format.
10+
11+
<!--truncate-->
12+
13+
## rattler-build and the v1 spec
14+
15+
The v1 recipe format has a number of benefits:
16+
17+
- It always parses as valid YAML which makes it much easier to modify it with the bot infrastructure of conda-forge. While meta.yaml looks like YAML, it can contain Jinja logic that is incompatible with the YAML specification, which significantly complicates parsing and automated manipulation. Additionally, the new recipe format has [a published JSON schema](https://github.com/prefix-dev/recipe-format/blob/main/schema.json) which means that the editing experience in VS Code is greatly improved with contextual help.
18+
- The new recipe format enables much faster builds due to design decisions that eliminate the need for recursive parsing.
19+
- Some features of conda-build, such as multiple outputs, had a lot of implicit behavior. We are fixing that in the v1 recipe.
20+
21+
conda-forge uses rattler-build as its default build tool for the v1 recipe format. rattler-build currently has some significant benefits:
22+
23+
- rattler-build is built on top of rattler, a modern re-implementation of the conda standards in Rust, enabling extremely fast recipe builds.
24+
- The log output of rattler-build is greatly improved, always showing the user what the final files in the package are and the final metadata.
25+
26+
You can read much more about the v1 recipe format in the [https://rattler.build](https://rattler.build) docs and the two CEPs [CEP-0013](https://github.com/conda/ceps/blob/main/cep-0013.md) and [CEP-0014](https://github.com/conda/ceps/blob/main/cep-0014.md). With the new format comes also a new build tool called [`rattler-build`](https://github.com/prefix-dev/rattler-build) which is developed by [`prefix.dev`](https://prefix.dev). It is a reimplementation of conda-build in Rust, on top of the [`rattler`](https://github.com/conda/rattler) libraries.
27+
28+
A simple v1 recipe looks something like the following:
29+
30+
```yaml
31+
context:
32+
# we define named variables in the context instead of `{$ set ... %}` directives
33+
version: "23.0.0"
34+
35+
package:
36+
name: "boltons"
37+
# note that we use "GitHub" inspired syntax to access context / Jinja variables
38+
version: ${{ version }}
39+
40+
source:
41+
url: https://github.com/mahmoud/boltons/archive/refs/tags/${{ version }}.tar.gz
42+
sha256: 9b2998cd9525ed472079c7dd90fbd216a887202e8729d5969d4f33878f0ff668
43+
44+
build:
45+
noarch: python
46+
script:
47+
- python -m pip install . --no-deps -vv
48+
49+
requirements:
50+
host:
51+
- python
52+
- pip
53+
- setuptools
54+
run:
55+
- pip
56+
57+
about:
58+
license: BSD-3-Clause
59+
license_file: LICENSE
60+
```
61+
62+
## How to use the v1 recipe format on conda-forge
63+
64+
If you are adding a new recipe on staged-recipes, then it's easy: just submit a `recipe.yaml` file instead of a `meta.yaml` file.
65+
In case you already maintain a feedstock, then the conversion can be semi-automated with a tool created by [Hadrien Mary](https://github.com/hadim) called [`feedrattler`](https://github.com/hadim/feedrattler). The tool will take care of the basic conversions steps and uses [`conda-recipe-manager`](https://github.com/conda-incubator/conda-recipe-manager) by Anaconda / [Schuyler Martin](https://github.com/schuylermartin45) under the hood to parse the recipe and convert it to the new format.
66+
67+
```shell
68+
# One liner with Pixi
69+
pixi exec feedrattler my-awesome-package-feedstock gh_user
70+
# With conda or mamba (as $CONDA)
71+
$CONDA create -n feedrattler feedrattler
72+
$CONDA activate feedrattler
73+
feedrattler my-awesome-package-feedstock gh_user
74+
```
75+
76+
To do the conversion by hand, you need to do the following things:
77+
78+
- In the feedstock's `conda-forge.yml`, add `conda_build_tool: rattler-build`
79+
- Remove the `meta.yaml` file and add a `recipe.yaml` file following the v1 spec
80+
- Rerender the feedstock using `conda-smithy rerender`
81+
- Push your changes to your fork and open a PR to see the CI build your package
82+
83+
## Transition plans
84+
85+
For the foreseeable future, conda-forge is going to support both formats, v1 and v0. We envision a gradual transition over at least one year to the new spec. There are a couple of places where the v1 spec also needs to finalize / stabilize. One notable place is the `cache`-based multi-output feature, where CEP discussions are ongoing. This stabilization in the format should happen within Q1 of 2025.
86+
87+
Since the beginning of 2025, the bot has gained more capabilities for the v1 format, such as automatically bumping versions (the "autotick-bot"). There are a number of other migrators and mini-migrators that need to be fully ported to the v1 spec before we can claim 100% compatibility with the conda-forge infrastructure.
88+
89+
As of today, over 700 of the 25000 recipes on conda-forge have been converted.
90+
91+
For now, the recommendation on staged-recipes is: if it's a simple `noarch: python` recipe, it should probably be a `v1` recipe. The same goes for `Rust` or `Go` projects that have a simple structure.
92+
93+
### Where to learn more
94+
95+
There are very helpful docs located at [https://rattler.build](https://rattler.build) that explain the differences of the new recipe format pretty well. You are also very welcome to chat with us on the [conda-forge Zulip](https://conda-forge.zulipchat.com/), or chat with the rattler-build developers on [their Discord](https://discord.gg/kKV8ZxyzY4).
96+
97+
You can also read more about rattler-build and the v1 format in the following blog posts:
98+
99+
- https://prefix.dev/blog/rattler_build_on_conda_forge
100+
- https://prefix.dev/blog/the_love_of_building_conda_packages
101+
- https://prefix.dev/blog/rattler_build_a_new_parser
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
authors:
3+
- core
4+
tags: [security]
5+
---
6+
7+
# Security Incident with Package Uploads (CVE-2025-31484)
8+
9+
In the past few months, `conda-forge` has been engaging with an external security audit in collaboration with
10+
the [Open Source Technology Improvement Fund](https://ostif.org/) (OSTIF). The full results of this audit will be
11+
made public once it is complete per OSTIF responsible disclosure policies.
12+
13+
During this process, OSTIF and their contractor uncovered misconfigured infrastructure which exposed the `anaconda.org`
14+
token for the `conda-forge` channel to all feedstock maintainers. The token was exposed from on or about 2025-02-10 through
15+
2025-04-01. See our [GitHub Security Advisory](https://github.com/conda-forge/infrastructure/security/advisories/GHSA-m4h2-49xf-vq72)
16+
for more details.
17+
18+
<!-- truncate -->
19+
20+
We have requested a CVE from GitHub and will amend this announcement once it is issued. Our response to this
21+
incident is detailed below, but TL;DR, as best as can reasonably be determined, **no packages were compromised
22+
during this time**.
23+
24+
Thank you for using `conda-forge`, please [contact us](https://conda-forge.org/community/getting-in-touch/) if you
25+
have further questions, and please follow our [security process](https://github.com/conda-forge/conda-forge.github.io/blob/main/SECURITY.md)
26+
for responsible reporting of vulnerabilities.
27+
28+
**Finally, as a reminder, `conda-forge` packages are built by strangers on the internet (our wonderful feedstock
29+
maintainers!) and are not suitable for use cases that require secure software provenance.**
30+
31+
## Response timeline
32+
33+
The timeline and details of our response to this security incident are as follows:
34+
35+
- 2025-04-01 13:35 UTC: OSTIF and their contractor notified `conda-forge` of the leaked token.
36+
- 2025-04-01 14:00 UTC: The `conda-forge/core` team acknowledged receipt of the report and
37+
started conducting the investigation.
38+
- 2025-04-01 14:15 UTC: The `conda-forge/core` team disabled the token and stopped uploads to `anaconda.org`.
39+
- 2025-04-01 14:20 UTC: We posted an [incident](https://github.com/conda-forge/status/issues/194)
40+
to our status page reporting that uploads were temporarily paused.
41+
- 2025-04-01 15:19 UTC: We audited all uploads to the `conda-forge` channel, looking for uploads that
42+
bypassed our upload staging process. We did not find any. This check is not completely robust, but it
43+
does indicate that nothing was obviously compromised.
44+
- 2025-04-01 15:53 UTC: We decided to delay disclosure by one day to 2025-04-02 in order to not generate
45+
confusion (2025-04-01 is [April Fools' Day](https://en.wikipedia.org/wiki/April_Fools%27_Day) in some countries
46+
when people commonly engage in practical jokes).
47+
- 2025-04-01 21:39 UTC: We deployed a fix to our infrastructure.
48+
- 2025-04-01 22:20 UTC: We then deployed a new token to our infrastructure and restarted uploads.
49+
- 2025-04-01 23:02 UTC: The status page [incident](https://github.com/conda-forge/status/issues/194) was marked as resolved.
50+
- 2025-04-02: We published this announcement and the advisory. GitHub produced CVE-2025-31484 for us based on our security advisory.

0 commit comments

Comments
 (0)