Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Governance and Change Management Review After Breaking Change in #4870 #4919

Open
ianballard opened this issue Mar 25, 2025 · 71 comments
Open
Labels

Comments

@ianballard
Copy link

ianballard commented Mar 25, 2025

The recent PR #4870, authored by @abravalheri and approved by @jaraco, introduced a breaking change that immediately and broadly disrupted the Python ecosystem by disallowing deprecated dash-separated and uppercase options in setup.cfg. This was merged despite clear acknowledgment that it would break downstream projects:

"if we are feeling brave. But it can break packages that have not addressed the warning."
@abravalheri

"I'm inclined to say we should do it, even though it will cause some disruption."
@jaraco

This change effectively broke builds across the ecosystem with no grace period, runtime fallback, or migration tooling—blocking unrelated emergency patches and releases in critical production systems. The follow-up PR #4909 that removed requests from integration tests—because this change broke internal usage—further illustrates how unprepared the project itself was for the consequences of this decision.

Bug #4910 showed just how widespread the issue was.
After widespread backlash, the change was reluctantly reverted in #4911, but when asked if an opt-out would be provided for a future reintroduction, the author responded:

“The option is to pin setuptools via the PIP_CONSTRAINT environment variable... All things considered this is likely a symptom of something bigger, more problematic, and the package you depend upon has been on borrowed time for a while... Organise among other users contributions (or even a fork) for maintenance. Fund the original developers for maintenance. Find a suitable replacement.”
@abravalheri

This dismissive response shifts responsibility entirely to users and downstream projects without acknowledging the maintainers’ own role in ecosystem stability. It shows a fundamental lack of empathy for maintainers and users who depend on stability and predictable deprecation cycles.

This raises serious questions about:

  • Change management and deprecation enforcement policy: Why was a breaking change merged without community consensus or a proper deprecation window?
  • Contributor and reviewer accountability: How are high-impact decisions vetted, especially those with acknowledged ecosystem-wide fallout?
  • Branch protection and CI governance: How did this change pass review without ecosystem impact validation or internal test failures acting as a safeguard?

We urgently request the following:

  • A postmortem detailing what went wrong and how this will be prevented in the future.
  • Clear documentation of your deprecation and backwards-compatibility policy.
  • Transparency around contributor/reviewer permissions and decision-making authority.
  • A published governance or escalation model for controversial or high-impact changes.

The Python ecosystem relies heavily on setuptools, and changes of this magnitude cannot be driven by personal opinion or experimentation—especially when knowingly disruptive.

This incident has eroded trust. Rebuilding that trust will require serious introspection and reform.

@notatallshaw
Copy link
Member

notatallshaw commented Mar 25, 2025

To clarify, are you offering resources in the form of long term support or funding to setuptools to support your urgent request of these seemingly resource intensive corporate-like governance structures?

Separately, while I do think there are open questions about build backends being able to make backwards compatible changes, I also think this is an opportunity for users to self reflect on:

  1. Why are you building sdists and not installing wheels?
  2. Why do you not have an internal cache (artifactory, docker, etc.) to protect you from external build infrastructure changes?
  3. For your own projects why are you depending on setuptools and not a more modern build system? (e.g. flit, hatchling, PDM, poetry_core, and soon uv_build).

@ianballard
Copy link
Author

To clarify, are you offering resources in the form of long term support or funding to setuptools to support your urgent request of these seemingly resource intensive corporate-like governance structures?

Separately, while I do think there are open questions about build backends being able to make backwards compatible changes, I also think this is an opportunity for users to self reflect on:

  1. Why are you building sdists and not installing wheels?
  2. Why do you not have an internal cache (artifactory, docker, etc.) to protect you from external build infrastructure changes?
  3. For your own projects why are you depending on setuptools and note a more modern build system? (e.g. flit, hatchling, PDM, poetry_core, and soon uv_build).

@notatallshaw

Respectfully, this response misses the point.

Setuptools is a foundational project with deep, transitive integration across the Python ecosystem. The concern raised is not about the technical direction of the project, but about process, governance, and the way this specific breaking change was introduced:

  • No migration tooling or opt-out path was provided.
  • No deprecation period or clear policy was referenced.
  • The change broke the project’s own tests and many others in the ecosystem.
  • The tone of communication from core contributors was dismissive and unprofessional when concerns were raised.

This is about the standard of care expected from maintainers of critical infrastructure.

To your question: if the setuptools team lacks the resources to implement safeguards before merging breaking changes, that is a valid and important discussion to have. But the right response to limited resources is caution, not recklessness.

If you're open to support, I’d be happy to help facilitate discussion with Python community stakeholders who are willing to support long-term stability—because what's at risk here is not just a broken build, but trust in the reliability of Python's core tooling.

Let’s not turn this into a false binary between modernization and accountability. We can and must have both.

@tiran
Copy link
Contributor

tiran commented Mar 25, 2025

More data points:

Why are you building sdists and not installing wheels?
Why do you not have an internal cache (artifactory, docker, etc.) to protect you from external build infrastructure changes?

Linux distributions and some companies do not rely on wheels from PyPI. Instead they are rebuilding all packages from sources and store the sources + wheels in an internal package index. I detected bugs #4892 and #4910 within an hour of the setuptools release, because latest setuptools release broke the test instance of our build pipeline that rebuilds all our wheels from sdists. We perform regular tests to ensure that we can build and rebuilds latest versions.

If you are interested to learn more about our tool chain: https://github.com/python-wheel-build/fromager

@SamuZad
Copy link

SamuZad commented Mar 25, 2025

To clarify, are you offering resources in the form of long term support or funding to setuptools to support your urgent request of these seemingly resource intensive corporate-like governance structures?

Separately, while I do think there are open questions about build backends being able to make backwards compatible changes, I also think this is an opportunity for users to self reflect on:

  1. Why are you building sdists and not installing wheels?
  2. Why do you not have an internal cache (artifactory, docker, etc.) to protect you from external build infrastructure changes?
  3. For your own projects why are you depending on setuptools and note a more modern build system? (flit, hatchling, PDM, and soon uv_build).

Thank you for the opportunity to self-reflect, the whole community is forever grateful! - on a more serious note, I believe this is exactly what the author meant when he said "dismissive attitude". But to take things one at a time:

  1. As others have pointed out, for instance Linux distributions and downstream vendors rebuild wheels from sources. Linux distributions like Debian, Fedora, and Gentoo do not use wheels. They take sdists and rebuild wheels.
  2. While people have an internal cache of versions, this has nothing to do with the fact that a change was introduced that broke everything
  3. Are you essentially telling people to introspect on why we use setuptools at all? This comes across as essentially advocating for people not to use this tool at all. Is that really the intention?

@notatallshaw
Copy link
Member

notatallshaw commented Mar 25, 2025

@ianballard @SamuZad To be clear I am not a setuptools maintainer, so please don't take my replies as such.

@ianballard

Respectfully, this response misses the point.

Setuptools is a foundational project with deep, transitive integration across the Python ecosystem. The concern raised is not about the technical direction of the project, but about process, governance, and the way this specific breaking change was introduced:

  • No migration tooling or opt-out path was provided.

  • No deprecation period or clear policy was referenced.

  • The change broke the project’s own tests and many others in the ecosystem.

  • The tone of communication from core contributors was dismissive and unprofessional when concerns were raised.

Besides the last point, in which I can't speak for setuptools, I do largely discuss the issues of build backends making breaking changes in the post I linked to. Edit: Fixed hyperlink

To your question: if the setuptools team lacks the resources to implement safeguards before merging breaking changes, that is a valid and important discussion to have. But the right response to limited resources is caution, not recklessness.

Yes, most Python packaging foundational projects are severely under resourced, that's why I was asking you to clarify if you are going to provide funding for making these urgent requests.

@SamuZad

As others have pointed out, for instance Linux distributions and downstream vendors rebuild wheels from sources. Linux distributions like Debian, Fedora, and Gentoo do not use wheels. They take sdists and rebuild wheels.

Sure, but the user reports did not sound like Linux distros, who often vendor their own version of setuptools and have custom build scripts, nor typically use a pip or python front end tools to build. Are you a Linunx distro that had this problem yesterday? Why did you have these problems? Are you not vendoring your own version of setuptools?

While people have an internal cache of versions, this has nothing to do with the fact that a change was introduced that broke everything

Wheels weren't broken, which is what most users are expected to use to install Python packages. It is still unclear to me why most users reporting the situation were depending on building sdists, and this should be understood as part of this “post-mortem”, we should be encouraging users to move to wheels.

Are you essentially telling people to introspect on why we use setuptools at all? This comes across as essentially advocating for people not to use this tool at all. Is that really the intention?

Remember, I'm not a setuptools maintainer, but I am invested in Python packaging, so this is "just my opinion", but yes, I would strongly recommend looking at using flit or hatchling instead of setuptools. I have already done so for all my work projects last year.

@inoa-jboliveira
Copy link

inoa-jboliveira commented Mar 25, 2025

I am flabbergasted to why v78.0.1 still have not been yanked from pypi.

https://pypi.org/project/setuptools/#history

For much less impact v75.9.0 was yanked and yet the problematic v78 survives.

There is zero reason they should have kept it during the abrupt event and even more so now the feature was rolled back

@tiran
Copy link
Contributor

tiran commented Mar 25, 2025

Sure, but the user reports did not sound like Linux distros, who often vendor their own version of setuptools and have custom build scripts, nor typically use a pip or python front end tools to build. Are you a Linunx distro that had this problem yesterday? Why did you have these problems? Are you not vendoring your own version of setuptools?

I'm working on a Linux distro. The test instance of our build pipeline was affected by two breaking changes in setuptools in the past 7 days. Our test pipeline builds with the latest version of all our dependencies to detect these kinds of breaking changes. See #4919 (comment)

@notatallshaw
Copy link
Member

I'm working on a Linux distro. The test instance of our build pipeline was affected by two breaking changes in setuptools in the past 7 days. Our test pipeline builds with the latest version of all our dependencies to detect these kinds of breaking changes. See #4919 (comment)

Thanks for the info, I read your earlier comment but I found something a little ambiguous, do you use the latest setuptools in a test pipeline to validate everything works? Or is it part of the real build pipeline and this caused the Linux distro to be unable to publish new packages?

Any post-mortem would need to understand the impact, and understand the state of current practise, to fix things and to advise on new best practises.

@mgorny
Copy link
Contributor

mgorny commented Mar 25, 2025

I understand that people are frustrated, but I don't think this tone is really a good way to start a constructive discussion. If you start with hostility and demands, the discussion is likely to derail into further hostility, counter-hostility and we will be unlikely to reach any solutions, or even focus on the right problems.

Yes, I am often frustrated too. Gentoo Linux is a source-first distribution, so the vast majority of our users are building from source, and are downstream to all Python build systems. Major disruptive changes bring a lot of frustration, because in the end they put the burden of fixing the issues on others.

But I do realize that setuptools wants to go forward, and doesn't want to have to support deprecated functionality forever. However, I feel like it's an ecosystem problem.

Firstly, we do not have a reliable way of reporting deprecations at build system level. The way it is currently done, deprecation warnings are printed in the middle of a very verbose build log produced by setuptools, and are easily missed. On top of that, some tools don't print build log at all. And even if we solved that and made wheel building/installing tools catch deprecation warnings and make them more visible, a lot of packages are only building wheels as part of their CD pipeline, and rarely look at the output. Of course, there's the option of having a -Werror style behavior, but as you can see, we've already gotten quite a few requirements, and we expect every project to implement that.

Secondly, Python packages get abandoned. We're dealing with dozens of packages that are either not maintained at all or barely maintained — and many of them obviously still "work", at least as far as users are concerned, and are dependencies of many projects. They often use setuptools; some of them don't supply wheels for one reason or another. Breaking changes break these packages, and when there's no active maintainer to quickly make a new release, things go very wrong (pipelines get broken, people start independently forking the same package with no intent on future maintenance…).

@ianballard
Copy link
Author

@mgorny
Totally hear you.

This really is an ecosystem problem, and that’s exactly why setuptools is in a great position to lead the way. The pushback isn’t about avoiding progress—it’s about wanting changes to be smoother, more transparent, and less disruptive.

This could be an opportunity to do things better: clearer deprecation paths, better tooling, and more open comms so we move forward without breaking trust along the way.

@jamesliu4c
Copy link

jamesliu4c commented Mar 25, 2025

  1. Why do you not have an internal cache (artifactory, docker, etc.) to protect you from external build infrastructure changes?

We do. Almost all packages just pass through, unless we discover something that causes us to decide otherwise. But every package that lives on the blocked list increases the burden on us (across thousands of end users).

And if a tool doesn't state what versions deprecations will take place, it is impossible to choose what version constraints to choose. <-- Edited to add this

  1. For your own projects why are you depending on setuptools and note a more modern build system? (e.g. flit, hatchling, PDM, poetry_core, and soon uv_build).

Those are all less mature projects than setuptools. We are expecting setuptools to act like a mature project with ecosystem-wide dependents.

@notatallshaw
Copy link
Member

notatallshaw commented Mar 25, 2025

Those are all less mature projects than setuptools. We are expecting setuptools to act like a mature project with ecosystem-wide dependents.

For better or worse setuptools comes with a lot of legacy as it predates "modern" Python packaging standards, so in some cases it is less mature in supporting specific standards as it has taken the maintainers time to migrate.

Flit is now over 10 years old, designed to be simple, and focus on standards: https://github.com/pypa/flit. If you are looking for stability, which is what I assume you are using "mature" as a proxy for, then flit might be a better choice for your own build system.

@herebebeasties
Copy link

For your own projects why are you depending on setuptools and note a more modern build system? (e.g. flit, hatchling, PDM, poetry_core, and soon uv_build).

We're depending on uv, but uv in a CI environment apparently installs the latest setuptools as part of the bootstrap process for its build environment. We depend on pylatex which it seems doesn't supply a wheel on PyPI, which means our builds broke. (uv sync doesn't respect build-dependencies pinning due to a bug, so there was no way to even fix it, well at least not that worked with third-party repos that don't have timestamps on them (e.g. torch).)

Are we seriously suggesting every end-user of Python audits all their third-party deps, figures out how to repackage all of those that don't provide wheels, self-host them, and set up CI processes to automate all that? As a simple end-user of Python, that sounds like a pretty crazy solution. Almost what's even the point of having a package manager and PyPI index/repo at that point?

@notatallshaw
Copy link
Member

notatallshaw commented Mar 25, 2025

We're depending on uv, but uv in a CI environment apparently installs the latest setuptools as part of the bootstrap process for its build environment.

It doesn't, you should outline your scenario to uv and see what that's happening and fix it.

If you create a project with uv the default build backend is currently hatchling (soon uv_build). Otherwise it should take whatever you've specified in your pyproject.toml.

uv sync doesn't respect build-dependencies pinning due to a bug, so there was no way to even fix it

It absolutely respects build dependencies, there's a bug that it doesn't respect --build-constraint, which I believe uv is fixing with high priority.

@herebebeasties
Copy link

We're depending on uv, but uv in a CI environment apparently installs the latest setuptools as part of the bootstrap process for its build environment.

It doesn't, you should outline your scenario to uv and see what that's happening and fix it.

Maybe I don't understand how this stuff works, it's certainly complicated enough. I think what I meant to write is that by default, uv builds all packages in isolated virtual environments, as per PEP 517. For pylatex and seemingly many many other projects that are distributed as sdists, this environment pulls in the latest setuptools as part of what I might incorrectly be labelling the "bootstrap" phase of building the module. This was reproducible locally if you simply blew away your UV cache and ran a uv sync.

uv sync doesn't respect build-dependencies pinning due to a bug, so there was no way to even fix it

It absolutely respects build dependencies, there's a bug that it doesn't respect --build-constraint, which I believe uv is fixing with high priority.

Apologies, I meant to write build-constraint-dependencies - see astral-sh/uv#12441

@notatallshaw
Copy link
Member

notatallshaw commented Mar 25, 2025

Maybe I don't understand how this stuff works, it's certainly complicated enough. I think what I meant to write is that by default, uv builds all packages in isolated virtual environments, as per PEP 517. For pylatex and seemingly many many other projects that are distributed as sdists, this environment pulls in the latest setuptools as part of what I might incorrectly be labelling the "bootstrap" phase of building the module

Ah, the point of confusion is you replied to my point saying for: "For your own projects", so I assumed you were talking about your own project, but it appears you're not.

For installing other projects the build system is out of your control, other than in general it's better to install from wheels rather than sdists where possible, and then the buld system isn't involved.

@webknjaz
Copy link
Member

And if a tool doesn't state what versions deprecations will take place, it is impossible to choose what version constraints to choose. <-- Edited to add this

I feel compelled to link @hynek's brilliant article here: https://hynek.me/articles/semver-will-not-save-you/#taking-responsibility. Using PIP_CONSTRAINT is a great stop-gap that I've been employing for years to make my CIs evergreen and retain control over handling things that break.

P.S. @ianballard since you've created the issue using the blank template, you probably didn't see the CoC link present in other forms. So I'll leave it here for you: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md. I'm sure you didn't mean it, but your OP reads like an attack. Please, make an effort to interact constructively. This is no place for making demands towards maintainers that gifted you their free labor.

@ianballard
Copy link
Author

P.S. @ianballard since you've created the issue using the blank template, you probably didn't see the CoC link present in other forms. So I'll leave it here for you: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md. I'm sure you didn't mean it, but your OP reads like an attack. Please, make an effort to interact constructively. This is no place for making demands towards maintainers that gifted you their free labor.

Thanks for linking Hynek’s article—it makes a strong case for why clarity and predictability around changes matter, especially in a critical part of the ecosystem like this.

I’m deeply grateful to the contributors who maintain and improve setuptools. I recognize the time, care, and effort involved—and that much of it goes unacknowledged. Your work is appreciated.

I want to be clear that nothing in my original post was meant as an attack. The concerns I raised were serious because the impact was serious. Calling for transparency and accountability—especially in light of how dismissive some contributor responses were—is both reasonable and necessary.

This change caused widespread breakage without clear timelines, migration paths, or safeguards. Raising that isn’t hostility—it’s about protecting trust and pushing for processes that match the project’s role in the ecosystem.

Again, I truly appreciate the work that goes into this project. But as a community, we need to address how this was handled so it doesn’t happen again—especially the way concerns were dismissed after the fact.

@sinoroc
Copy link

sinoroc commented Mar 25, 2025

I oppose @ianballard's suggestion. I'd rather volunteers build whatever they feel like building without the burden of feeling that they owe anything to anyone. Without them there would not be any setuptools at all. These people should have good, honest fun and nothing else.

@jamesliu4c
Copy link

@webknjaz

P.S. ianballard since you've created the issue using the blank template, you probably didn't see the CoC link present in other forms. So I'll leave it here for you: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md. I'm sure you didn't mean it, but your OP reads like an attack. Please, make an effort to interact constructively. This is no place for making demands towards maintainers that gifted you their free labor.

Like @ianballard, I appreciate all of the work provided by the PyPA.

Even so, I don't think this issue reads as an attack. It was well-reasoned, constructive, and calm. Especially so given the amount of disruption that was caused yesterday. Yes, there are serious concerns being raised. Those concerns do lead one to wish for changes. But how does one advocate for changes without stating what those changes are?

Nevertheless, all of the questions are in many of our minds. Refusal to engage is one way of addressing them, and if that is what comes of it, then we know where we stand. As for the urgent requests, they are requests, not demands. If the PyPA feels they are unreasonable, or cannot be met with present resources, that is fair, we can have a discussion about it. What can we, as a community, do to help so that we can have the requests met? What can I do? I am willing to contribute.

@notatallshaw
Copy link
Member

notatallshaw commented Mar 25, 2025

This change caused widespread breakage without clear timelines, migration paths, or safeguards. Raising that isn’t hostility—it’s about protecting trust and pushing for processes that match the project’s role in the ecosystem.

One good solution users who can afford to invest the time in it, is to trust updates less, if a faulty update from a volunteer project is going to cause you unacceptable losses, I strongly suggest you design your build system not to trust updates or to minimize the amount it has to trust.

At my work we had no impact, even though several of our dependencies were affected, largely because we avoid sdists, cache built sdists, and use docker layers to cache all dependencies. I appreciate though this is not free, but if the cost of failing CI is high enough, it's probably worth it.

Again, I truly appreciate the work that goes into this project. But as a community, we need to address how this was handled so it doesn’t happen again—especially the way concerns were dismissed after the fact.

As part of the community are you going to organize, or provide, funding or resources to the setuptools maintainers to address these urgent requests and reviews? You haven’t clarified on that, and if not, what expectations do you have for volunteers to work on these urgent requests you've asked for?

Maybe I'm misguided here and setuptools maintainers are happy to work on your urgent requests out of their own time, but when I request others do work for me urgently I come with a proposal on how to fund it.

@ianballard
Copy link
Author

As part of the community are you going to organize, or provide, funding or resources to the setuptools maintainers to address these urgent requests and reviews? You haven’t clarified on that, and if not, what expectations do you have for volunteers to work on these urgent requests you've asked for?

I did touch on this earlier, but to clarify: yes, I understand that maintainers are volunteers, and I deeply appreciate the work that goes into sustaining this project. I’m advocating for stronger processes around high-impact changes—especially when those changes break downstream projects, including setuptools’ own tests, as seen in PR #4909. Based on this, it seems like some of these processes are already in place so no extra work needed, but they were missed in this case. To move forward, we need to be honest about what happened so we can learn from it and make sure it doesn’t happen again.

This isn’t about blaming individuals or holding volunteer maintainers to unrealistic standards. It’s about recognizing that critical infrastructure needs extra care, and that trust depends on how change is introduced and communicated.

If resources are a blocker to improving those processes, I’d be happy to help facilitate that conversation. But we can’t just ignore the problem.

@jamesliu4c
Copy link

jamesliu4c commented Mar 25, 2025

Maybe I can clarify a little bit by saying what kind of governance changes I would like to see. I opened a new issue with a specific change I would like made about the deprecation in question.

Can we get some open and honest discussion of that issue?

@zahlman
Copy link

zahlman commented Mar 26, 2025

Setuptools is a foundational project with deep, transitive integration across the Python ecosystem. The concern raised is not about the technical direction of the project, but about process, governance, and the way this specific breaking change was introduced:

Sure, let's talk about that.

No migration tooling or opt-out path was provided.

It's hard to imagine "migration tooling" for the task of replacing a hyphen with an underscore in setup.cfg. Maybe there's a generic config-file normalizer out there.

An "opt-out path" was indeed provided: not using a new major version of Setuptools. That's why Setuptools follows semver: to advertise breaking changes.

Without the ability to make breaking changes, there is no hope of ever cleaning up legacy cruft in projects. I would wager that for the overwhelming majority of projects using Setuptools, only a small fraction of Setuptools code paths are relevant, or ought to be relevant. Setuptools is freshly downloaded ~20 million times a day for all these isolated build environments (it seems like local caches aren't doing their job a lot of the time, which is a separate issue) so being able to cut down the wheel size would save quite a bit of resources. Removing unnecessary code also tends to speed up Python projects, because importing it also has a cost. (If you don't believe me, try timing how much overhead the --python option causes in Pip, versus a direct subprocess invocation of a new Python process.)

Many users struggled to fix broken builds because their transitive dependencies didn't specify a Setuptools version cap and they either couldn't restrict the Setuptools version their tools used for isolated build environments, didn't know how to set up a non-isolated build environment, etc. It's hard to say that this is Setuptools' fault.

But that's for users who actually have to build those packages locally. And, as @notatallshaw pointed out, at least part of that problem is caused by package maintainers not pre-building trivial projects (e.g. ones that are completely in Python aside from dependencies) when they should. Which would also flag the issue for those maintainers. (They're the ones the deprecation notices are intended for in the first place!)

(By the way, Damian: you say correctly that your local caching isn't free, but I can imagine it being less expensive in the long run than repeatedly downloading things and building them fresh - including new downloads for build dependencies. Not to mention the costs borne by others. Bandwidth isn't free either, and PyPI operates at petabyte scale - as I'm sure you're aware. Let me take this opportunity to say: thank you, Fastly!)

No deprecation period or clear policy was referenced.

The underlying deprecation occurred four years (twice as long as was recently deemed appropriate for the Python standard library) and 24 major versions ago. How long is enough?

The change broke the project’s own tests and many others in the ecosystem.

Yes. That's why it was explicitly labelled as a breaking change, and published following accepted standard practices for breaking changes (i.e., a bump of the major version number, in a project that advertises that it uses semver).

The tone of communication from core contributors was dismissive and unprofessional when concerns were raised.

The response was initially dismissive because the scope of the problem wasn't immediately obvious. But the change (again: following up on a deprecation from four years ago) was reverted within less than six hours. In my book, actions speak louder than words - I find it hard to call that "dismissive".

I didn't see anything from the developers that I'd consider unprofessional. I did see a ton of noise from third parties, typically in forms like "this also affects XYZ package", "this is outrageous", etc. None of that helps. (What does help is e.g. the comment that included search results for the now-broken key in setup.cfgs on GitHub.)

This is about the standard of care expected from maintainers of critical infrastructure.

Organizations that would be severely disrupted by a bleeding-edge version of a package being unusable for their purposes for a few hours, ought to already know how to avoid having their tooling automatically pull in bleeding-edge versions. It could just as easily happen to their install-time dependencies, after all. (And in that case, they could spend considerable time on a build only to discover a problem in testing.)

The same sort of thing happened with Setuptools 72. (It took a bit over 13 hours to revert that change, but it was overnight in North America.)

And very little of the outrage seems to be getting directed at that tooling. Instead, the Setuptools issue filled with comments from people trying to help each other with workarounds for that tooling.


I actually agree that the specific change in Setuptools 78 shouldn't have been made - at all, without a compelling case that not breaking it would get in the way of something useful. It's pretty trivial to leave in a few lines of code to normalize case, hyphens vs underscores, etc. Going forward, I'd like to see Setuptools batch together planned breaking changes and announce them. (Not that I'm particularly hopeful that the right people would pay attention to the announcements.) It seems a little ridiculous to me that we're on major version 78 of Setuptools, and trying to make changes like this only to be forced into reverting them is certainly a contributing factor to that.

But the response I've seen so far looks like a pitchfork mob, and a largely misdirected one at that.


@tiran :

I'm working on a Linux distro. The test instance of our build pipeline was affected by two breaking changes in setuptools in the past 7 days. Our test pipeline builds with the latest version of all our dependencies to detect these kinds of breaking changes.

Did this cause a significant problem? Having discovered in the test pipeline that the latest version of a build-time dependency fails to build a given package, is there not any system in place to roll back the build-time dependency? (I assume you are not reliant on Pip etc.'s build isolation.) Is there an organizational reason the package can't be built and released with the prior, known-working dependencies? After all: the package can't really be expected to know which (if any) future version of Setuptools will break on its current configuration data. The maintainers don't have a crystal ball. They can be conservative, but some people think that's a bad idea, even for build-time dependencies.


@herebebeasties :

Are we seriously suggesting every end-user of Python audits all their third-party deps, figures out how to repackage all of those that don't provide wheels, self-host them, and set up CI processes to automate all that?

I assume you're talking about the person who runs pip install. Known emergency workarounds include:

  • Specifying an upper-version cap for Setuptools in a constraints.txt file, and then telling Pip to use that via the PIP_CONSTRAINT environment variable

  • Manually setting up a build environment with e.g. setuptools<78, and then pass --no-build-isolation to pip install

Once Pip succeeds in building a wheel, it's cached - so I can't fathom why people would be concerned with self-hosting wheels or setting up CI processes unless they already have those things. In the hypothetical world where, say, Requests doesn't ship a wheel, end users can obtain a wheel this way and install it in arbitrarily many virtual environments.

@eli-schwartz
Copy link
Contributor

Did this cause a significant problem? Having discovered in the test pipeline that the latest version of a build-time dependency fails to build a given package, is there not any system in place to roll back the build-time dependency? (I assume you are not reliant on Pip etc.'s build isolation.) Is there an organizational reason the package can't be built and released with the prior, known-working dependencies? After all: the package can't really be expected to know which (if any) future version of Setuptools will break on its current configuration data. The maintainers don't have a crystal ball. They can be conservative, but some people think that's a bad idea, even for build-time dependencies.

At least for Gentoo, it is certainly possible to roll back the dependency. Actually it's a generalization of the appropriate caution to take with new versions of a foundational package which has an above-average tendency to have major versions with breaking changes that do, as it happens, break things.

Simply put: have a globally consistent ecosystem of thousands of packages where every package is expected to work with the latest versions of all its dependencies, and when packages are not compatible:

  • the common case is to patch them (and submit patches upstream to enable support for newer versions so that upstream can decline the patch by saying only pip install is supported)
  • the setuptools case is to hard-mask newer setuptools versions so that nobody can install updates to setuptools (hopefully until a new setuptools fixes the regression)

This is necessary mostly not because of deliberate breaking changes, but because setuptools historically used the Monkeypatch Oriented Programming (MOP) model and now making changes tends to affect other components at a distance (plus literally all of its code is a public API for people writing setuptools plugins, and any package using setup.py counts as writing a setuptools plugin). So it's become relatively clear that any new setuptools version, whether it's a semver major or not, should be treated with caution and the default approach should be to deny it until it's been proven.

(A distro can get away with this because a distro can do repodata patching. For example, Conda is a distro, and can do it as described at https://prefix.dev/blog/repodata_patching and https://bioconda.github.io/developer/repodata_patching.html. Some Linux distros use incremental patch updates to an entire package including the metadata, or simply rebuild that one package with the same version but fully fixed metadata. However, with PyPI it is not possible to patch metadata at all, only upload new versions, since every uploaded asset is immutable.)

...

But, figuring out that there is a breaking change is still annoying to deal with.

  • Manually setting up a build environment with e.g. setuptools<78, and then pass --no-build-isolation to pip install

The suggestion that build isolation is a problem that needs to be solved by ceasing its use, is humorous to me for a variety of reasons.

@eli-schwartz
Copy link
Contributor

This issue just highlighted how fragile the Python ecosystem is, and how hard it is to actually have a reproducible hermetic build system in this setting.

You have alternatives! You could use Linux distributions to provide your dependencies! We did not make the setuptools version with the breaking change available at all, period, end of story.

We went from 77.0.3 to 78.0.2, skipping the ones that broke the world. Our motivations are different from upstream: we need to keep all packages working together, so we delay upgrades until the ecosystem is ready, even if those upgrades are good ones. All the more so if the upgrades are bad upgrades.

@inoa-jboliveira
Copy link

inoa-jboliveira commented Mar 26, 2025

No, it's not abundantly clear to me, in the top 1000 PyPI packages almost every single one provides wheels, this has been a multi year effort from many parties to make common packages available by wheels.

Have you ever heard of the concept of long tail? I think you are just trying to force your view without actually having the data to back it up.

Google big query gives you that: https://console.cloud.google.com/marketplace/product/gcp-public-data-pypi/pypi

I checked that from versions published today March 26th 2025 (110K) 5800 are sdist only. That is ~5%

That is not even considering all the packages from the past that stopped updating.

@eli-schwartz
Copy link
Contributor

eli-schwartz commented Mar 26, 2025

Have you ever heard of the concept of long tail? I think you are just trying to force your view without actually having the data to back it up.

I don't think this is about the long tail at all. It seems to me that this is actually about "only consider the common use case". If we focus on only the top downloaded packages then we can optimize for the the packages that bill the most CI hours (which is indeed where wheels are the most important, due to reducing duplication of effort i.e. energy and time consumption from repetitively performing the same computations).

The framing is pretty clearly not about whether packages are still in use today, that's the whole point of limiting to a subset such as "top one thousand".

Note: I make no claims of my own about whether the association between CI hours spent, and willingness to make breaking changes, is a useful association. I'm just trying to analyze the claims made.

@pradyunsg pradyunsg changed the title Urgent: Governance and Change Management Review After Breaking Change in #4870 Governance and Change Management Review After Breaking Change in #4870 Mar 26, 2025
@pradyunsg
Copy link
Member

I've taken the liberty of retitling this issue to not say urgent.

@dwink
Copy link

dwink commented Mar 28, 2025

With respect, @ianballard, if there are measures that you think would help to protect the ecosystem from a mistake like this, then a contribution of an implementation of one or more of those measures would likely be very welcome.

Over in Rust land, there’s “crater” which builds a ton of packages to check the impacts of changes. Perhaps you could contribute a similar tool or infrastructure to run such a thing? Sounds like several folks in this thread already have building blocks in their CI.

Or, you could organize a postmortem: collect feedback from the affected folks, analyze it, and provide guidance on the most valuable dependency chains to address.

You could also proactively monitor the changes going into setuptools, looking for potential issues and verifying assumptions. Humans are human, after all. They don’t always get it right.

If you truly think setuptools needs to provide stronger guarantees to the ecosystem, then the next step is to start to work on providing those guarantees.

After all, setuptools was created because at one point someone tried to come up with a way to make it easier to package up Python software…

@eli-schwartz
Copy link
Contributor

@dwink that's been discussed a bit at #4920 in both senses.

With specific regard to proactively monitoring the changes going into setuptools, this works out well for rust and is something I advocated there based on experience with Meson as well, but won't work at all for setuptools without actual process changes... because it assumes that people have time to monitor and react to those changes.

Given a specific release schedule that spans a month and a half (or three months!) and incorporates beta or release candidate channels, it's possible to watch changes and do downstream testing and report results in time to, well, do something about it.

Your options are extremely limited and amount to approximately very slightly better than "nothing", if the time from merging a new change to the time of sending that change out into production as a stable release ranges from "about a minute, because that's approximately how long it takes to switch to the tags page after clicking the merge button" to "sometime today, after I merge this other pending change I'd like to make as well".

It's unworkable and untenable. If you want to monitor changes you can't do it like this. As a fallback plan you can monitor ALL submitted PRs, just in case some of them get merged. There will be a lot of noise if you do that, because you'll be spending most of your time reviewing changes that the project maintainers don't want to make or want to see major changes to, as well as discovering all the typos that were going to get fixed before merging anyway.

@dwink
Copy link

dwink commented Mar 28, 2025

@dwink that's been discussed a bit at #4920 in both senses.

Given a specific release schedule that spans a month and a half (or three months!) and incorporates beta or release candidate channels, it's possible to watch changes and do downstream testing and report results in time to, well, do something about it.

I see the challenge but I suspect that IF such a tool existed, then a process change to use such a tool would be something to consider. It’s a bit chicken-vs-egg, but IME processes form out of what is available and what maintainers are willing to do. If they could take some clear actions and get a clear response to regular calls for testing, etc, then I doubt there would be a problem with adjusting the process.

What I see is that the process currently expects the community to test new major versions before blindly adopting them (hence semver), but the community doesn’t and/or won’t do that — there’s an unwritten expectation that before major versions are released, broad validation is done and the results are communicated, more like a commercial product release.

If you’re among those who want to have that work done, then step up and offer it, or provide software automating it, or something.

@saboya
Copy link

saboya commented Mar 28, 2025

What I see is that the process currently expects the community to test new major versions before blindly adopting them (hence semver), but the community doesn’t and/or won’t do that — there’s an unwritten expectation that before major versions are released, broad validation is done and the results are communicated, more like a commercial product release.

There's no ask about any work being done. This strawman argument that users are demanding some perfect unbreakable software is just not what the issue is about.

This issue is about having clear guidelines about what is and what isn't considered acceptable. Users use software because it's reliable, it's basically why Linus is so adamant about the "we do not break userspace" mantra, because that's what users want out of their software.

Sometimes breakage is inevitable and justifiable, if there's something positive that comes out of it. However, in this case, it was just disrupting the entire ecosystem for nothing. There's absolutely no benefit that came from that change itself. The benefit that might come now is that build tools out there will hopefully realize they cannot rely on setuptools, and will provide mechanisms to specify the version used when building packages.

@jamesliu4c
Copy link

I proposed an annual cadence for breaking changes in this issue. I think it is a small, viable change that can come of the discussion so far.

@dwink
Copy link

dwink commented Mar 28, 2025

What I see is that the process currently expects the community to test new major versions before blindly adopting them (hence semver), but the community doesn’t and/or won’t do that — there’s an unwritten expectation that before major versions are released, broad validation is done and the results are communicated, more like a commercial product release.

There's no ask about any work being done.

The OP clearly demanded a list of things to be done.

This strawman argument that users are demanding some perfect unbreakable software is just not what the issue is about.

Hold up, please reread what I wrote and reconsider what it says. The ask is to change how this software is released to fit different expectations from what the project has historically supported. I’m not arguing for or against any of that, but I am asserting that if you want to change something, you should expect to do and/or coordinate the work you want done.

This issue is about having clear guidelines about what is and what isn't considered acceptable. Users use software because it's reliable, it's basically why Linus is so adamant about the "we do not break userspace" mantra, because that's what users want out of their software.

Here is the what the project states:

Some have asked why Setuptools is released so frequently. Because Setuptools uses a mechanical release process, it’s very easy to make releases whenever the code is stable (tests are passing). As a result, the philosophy is to release early and often.

While some find the frequent releases somewhat surprising, they only empower the user. Although releases are made frequently, users can choose the frequency at which they use those releases. If instead Setuptools contributions were only released in batches, the user would be constrained to only use Setuptools when those official releases were made. With frequent releases, the user can govern exactly how often he wishes to update.

Frequent releases also then obviate the need for dev or beta releases in most cases. Because releases are made early and often, bugs are discovered and corrected quickly, in many cases before other users have yet to encounter them.

I think it’s pretty clear what the policy is (Adopt new releases at your own risk), and stand by my assertion that if you want that to change, then you should work on establishing the improved approach by demonstrating it. Contribute what you want to see!

@eli-schwartz
Copy link
Contributor

eli-schwartz commented Mar 28, 2025

I think it’s pretty clear what the policy is (Adopt new releases at your own risk), and stand by my assertion that if you want that to change, then you should work on establishing the improved approach by demonstrating it. Contribute what you want to see!

I counter-assert that your stance is bizarre from beginning to end, and your own proofs are what prove you wrong.

Your quotes clearly and unambiguously, in the strongest possible terms, demonstrate that it is categorically impossible to contribute what one wishes to see.

There's nothing to change outside of a policy. The policy is what people want to see changed. One does not change a policy by "putting in the work", one changes a policy by persuading the policymaker to change it.

@dwink
Copy link

dwink commented Mar 28, 2025

There's nothing to change outside of a policy. The policy is what people want to see changed. One does not change a policy by "putting in the work", one changes a policy by persuading the policymaker to change it.

Ah, okay. So once the new policy is decided, then maintainers can tackle adjusting how they choose what gets released, how to track changes that they aren’t releasing separately from the ones they are, handling the bitrot in those changes when the official time for changes comes around, handling the complaints from folks who really need/want this breaking change sooner because reasons

I’m sure it’ll be no work at all. Zero.

@jamesliu4c
Copy link

I suggested a different policy here.

One way to apply that policy without a great deal of extra changes is to release everything as beta except for the annual release.

Obviously, it goes against this sentiment,

Frequent releases also then obviate the need for dev or beta releases in most cases. Because releases are made early and often, bugs are discovered and corrected quickly, in many cases before other users have yet to encounter them.

But after the impact on Monday, I don't think this is true.

Instead, we should have beta releases. That allows consumers of setuptools better visibility about choosing their major versions. Don't want breaking changes? Pin to an earlier version somehow. Want to test out the changes before allowing the next GA? That's possible too. But it also makes it so that teams can do this at a slower cadence. Want the latest stuff in setuptools? Adopt the beta release.

@eli-schwartz
Copy link
Contributor

eli-schwartz commented Mar 28, 2025

None of that is work that can be "demonstrated" as part of a pitch to change things. So I'm baffled what you think your point is when you say

Contribute what you want to see!

Am I saying that the setuptools maintainers must be persuaded by arguments that they should do those things? If so, I don't see where. Can you show me where I've said that?

It may very well be that the things you point out are reasons why the setuptools maintainers don't want to change. There's nothing anyone else can do to influence that one way or another, aside for saying "I totally promise I'll stay around and be available to expend time on answering those questions and figuring out those changes, and you should believe my promise".

What I don't understand is how you think you're helping the discussion by proudly lecturing people about how they should "simply" contribute the changes they wish to see and demonstrate that it works, as though it's just... a PR someone can submit.

Do you really think that if someone could submit a PR to setuptools to

handling the complaints from folks who really need/want this breaking change sooner because reasons

that the reason they haven't submitted such a PR is because they're unwilling to contribute and are simply complainers?

Please, tell me where I submit such a PR. Is there a repository called I dunno, https://github.com/world-history/setuptools-users where I can submit PRs to the behavior/submit_complaints.py module? Is that how I demonstrate the change I want to see with regard to helping setuptools handle future complaints that haven't happened yet?

Or maybe I can just borrow Guido's Time Machine. :)

@dwink
Copy link

dwink commented Mar 28, 2025

What I don't understand is how you think you're helping the discussion by proudly lecturing people about how they should "simply" contribute the changes they wish to see and demonstrate that it works, as though it's just... a PR someone can submit.

That’s precisely my point. The “change” you’re asking for will require more thought and effort than just what shows up in the code. It takes ongoing effort, as time goes on and this particular incident fades in memory.

If consumers of this package won’t pin versions and adopt updates incrementally in their own projects/pipelines as advised by the project, then I’m skeptical they will adjust to whatever annual/quarterly/whatever new process is defined. The breakage will just happen whenever that release comes out.

So I’m suggesting that passionate folks invest in this project and contribute on an ongoing basis, helping the maintainers to avoid ecosystem breakage. Maybe that leads to release process changes, maybe new announcements, who knows? It depends what you end up doing.

@webknjaz
Copy link
Member

I tend to think that submitting a pull request is often helpful to compliment a discussion. It can demonstrate the discussion points in a more visual way. But OTOH, its acceptance would still be blocked on review/discussions.

In general, I don't think that setuptools is in a position to dramatically change their release process, since it's a huge paradigm change. And the underlying technical problem isn't necessarily with setuptools itself, but with the lack of ways to pin versions in ephemeral build envs that aren't hacks. I'd call for a more organized effort on standardizing mechanisms for pinning build dependencies on the user side.

There's also a separate discussion on checking important downstreams in the ecosystem: #4920. I think, it may be a valuable tool to let the maintainers know of some bits of impact automatically. This is something that the maintainers seem to be open to considering, but somebody has to put together a comprehensive demonstration. And I believe this one could be a PR, but it should start small until the initial review happens.

On a related note, I recently read https://alexgaynor.net/2021/oct/07/whats-in-a-version-number/ and like how it puts the problem being faced here:

the reality that users are upset by things that break for them, and not upset when they don’t, regardless of whether they are consistent with SemVer.

And so I don't believe that making maintainers to jump between versioning schemas is sustainable in any way. Such changes are inevitably connected with additional maintenance burden. And that's exactly why there's frequent releases. Giving the users tools to manage pinning better would be far more useful and reach beyond just a single build backend.

@dwink
Copy link

dwink commented Mar 29, 2025

I suggested a different policy here.

One way to apply that policy without a great deal of extra changes is to release everything as beta except for the annual release.

Obviously, it goes against this sentiment,

Frequent releases also then obviate the need for dev or beta releases in most cases. Because releases are made early and often, bugs are discovered and corrected quickly, in many cases before other users have yet to encounter them.

But after the impact on Monday, I don't think this is true.

Instead, we should have beta releases. That allows consumers of setuptools better visibility about choosing their major versions. Don't want breaking changes? Pin to an earlier version somehow. Want to test out the changes before allowing the next GA? That's possible too. But it also makes it so that teams can do this at a slower cadence. Want the latest stuff in setuptools? Adopt the beta release.

That’s a distinction without a difference. Simply treat all new major versions (X.0.0) of setuptools as “beta”, and it is identical to what you’re describing.

@jaraco
Copy link
Member

jaraco commented Mar 29, 2025

Hi everyone. Just thought I'd check in. I read some of the thread earlier this week, but didn't have the energy to provide a response. I have limited bandwidth, and I still haven't read the full thread. I appreciate the spirited and civil conversation.

Let me say first, I hear you. This kind of disruption isn't acceptable and we'll work to avoid it. We have a particularly difficult landscape to manage, with a codebase that dates to 1998 and users that span packagers, consumers, and integrators. We do our best to limit disruption while also aiming to pay down some of the tech debt and reduce the interface surface to improve quality.

I personally was under the impression that this change was likely to be low impact and limited scope for disruption, based on our work over the years to develop a more sophisticated deprecation methodology. I expected that projects that were likely to be impacted would have been flagged previously, so worst-case only old packages would be affected. Obviously, this missed the mark, so I'm adjusting my understanding of how much confidence we can put behind the current deprecation process.

There may also have been some judgment calls that should be revisited. For example, when I cut the release, I was primarily looking to release a different, stabilizing change and this other change came along for the ride. In the future when cutting such a release, I'll take more care to monitor closely such a potentially destabilizing change (as I often do for other such changes) or ensure someone else is. I'll plan to coordinate with abravalheri for other possible improvements as well as to attempt to ingest the suggestions above and associated issues.

Thanks for your patience on this matter.

@eli-schwartz
Copy link
Contributor

That’s a distinction without a difference. Simply treat all new major versions (X.0.0) of setuptools as “beta”, and it is identical to what you’re describing.

This is entirely false. Betas have a strictly defined meaning. They mean that tooling will not install them unless you do something such as pass the --pre flag.

Or in distro land, betas may be packaged but they get packaged to the experimental stream, not the testing stream (Debian terminology) or unkeyworded rather than ~arch (Gentoo terminology). Again, those will only be installed to environments that opted in to beta testing.

The science ecosystem has a dedicated extra index url you can use to get access to "scientific-python-nightly-wheels". Similar notion. It's fully compatible with any pip workflow even, but requires using an index other than PyPI.

Of course, beta releases are typically used by projects that release relatively infrequently, where releases are a big deal to downstream consumers, where projects are developed by whole teams, or some combination thereof. I suppose some people would like to argue that pip releases are a big deal...

@dwink
Copy link

dwink commented Mar 30, 2025

This is entirely false. Betas have a strictly defined meaning. They mean that tooling will not install them unless you do something such as pass the --pre flag.

There is no such definition in the relevant PEPs. See here. The tooling supporting --pre is for "development" releases, which I suppose you're suggesting is synonymous with "beta"?

Meanwhile Debian experimental isn't called "beta", (it's sid, the nasty neighbor kid, or experimental) and Debian testing isn't "beta" either. Ubuntu PPAs aren't necessarily "beta" and "nightly" versions aren't called "beta" either.

All that said, let's go back to the idea of development releases, which folks opt-in to in order to get the latest and greatest setuptools, and everyone else just waits for the "fully-tested" versions. What happens is that the most sensitive end users only use the "fully-tested" versions. Thus, their issues still get hit when the change makes it to the "official" release, because getting a critical mass of testers for low-level 'plumbing' code like setuptools is...unlikely to happen in practice. So everyone just waited longer to find out who was impacted, and...can the fixes go in to the new release, or do those go through the "beta" too? Oh, well since that fix is going to the main one and skipping beta, can we get this one other thing in there too...?

I get it, lots of folks have CI that uses pip, lots of abandoned packages have old setuptools setups and the story around pinning setuptools for transitive dependencies is less than ideal, and no one likes CI just breaking.

Still, the maintainers clearly care and respond quickly -- and are able to do so in no small part because of, and not despite, their model. Ideal or not, maybe it's the best we can realistically get? Or maybe folks can help, with or without a policy change, by researching and doing legwork to better protect the ecosystem. Isn't that the whole point?

@eli-schwartz
Copy link
Contributor

This is entirely false. Betas have a strictly defined meaning. They mean that tooling will not install them unless you do something such as pass the --pre flag.

There is no such definition in the relevant PEPs. See here. The tooling supporting --pre is for "development" releases, which I suppose you're suggesting is synonymous with "beta"?

I suspect you will find that the concept of beta software being synonymous with development releases, predates the invention of the python programming language.

I don't see what PEPs have to do with it, except that the PEP you quoted specifically states that the term "developmental release" is a specific variant of non-python development release, and is different from the separate group of "alphas, betas, and release candidates", which are denoted as "pre-releases".

In a separate part of the document it then violates this distinction, by stating:

Pre-releases of any kind, including developmental releases, are implicitly excluded from all version specifiers, unless they are already present on the system, explicitly requested by the user, or if the only available version that satisfies the version specifier is a pre-release.

That's the "--pre" handling which you claim is specific to "development releases", but unlike your claim, the PEP specifically says that it applies to the word tag "beta".

So yeah, you're wrong. The PEP specifically reinforces the software development paradigm of beta releases, just like I said... :)

Meanwhile Debian experimental isn't called "beta", (it's sid, the nasty neighbor kid, or experimental) and Debian testing isn't "beta" either. Ubuntu PPAs aren't necessarily "beta" and "nightly" versions aren't called "beta" either.

No idea what PPAs have to do with anything.You're the only one mentioning them.

And nowhere did I say that Debian experimental is called "beta", please don't put words in my mouth. I said that betas can be packaged in Debian experimental and that people who opt in to Debian experimental are also thereby opting into betas.

I know this is the case because we (Meson) do exactly this. Part of the Meson development team includes the Debian maintainer for the Debian meson package, and part of the release process of Meson is to package pre releases in Debian Experimental. Note that I'm specifically not talking about sid, which isn't experimental, it's "unstable". I mean genuine honest to goodness "experimental".

Given we actually do it, I think that counts as pretty solid evidence. Don't see how much better evidence you could ask for.

All that said, let's go back to the idea of development releases, which folks opt-in to in order to get the latest and greatest setuptools, and everyone else just waits for the "fully-tested" versions. What happens is that the most sensitive end users only use the "fully-tested" versions. Thus, their issues still get hit when the change makes it to the "official" release, because getting a critical mass of testers for low-level 'plumbing' code like setuptools is...unlikely to happen in practice. So everyone just waited longer to find out who was impacted, and...can the fixes go in to the new release, or do those go through the "beta" too? Oh, well since that fix is going to the main one and skipping beta, can we get this one other thing in there too...?

I already explained this quite clearly. Given a beta release and a couple weeks of lead time I can personally arrange to have thousands of popular as well as unpopular packages tested against setuptools beta releases. This testing will be done without regard to what the developers of ${package_that_uses_setuptools} feels comfortable doing. It will be done using Linux distribution resources, by people who have spent decades being quite willing to do their own testing, bug reporting, and bug triaging, and then come to upstream projects with patches in a significant percentage of cases, and can also do things like report to the setuptools project "this change breaks XXX number of packages in our testing, which seems quite high, so maybe it would be worth reverting? What do you think?"

As I'm both a distro person and a developer of upstream software I'm quite familiar with the possibilities and I know the right strings to pull, even with distros that I'm not associated with.

It's genuinely mind-blowing the kind of help and support you can get if you just... go out and... ask. And are willing to consider the possibility that people whose whole organizational existence is centered around large scale integration, might be willing to work with you to ensure your own integration issues can be worked out.

I'll go one step further and say that when I reached out as an upstream developer of software to distros I'm not affiliated with and asked them if they could run mass testing for me, they were profusely grateful to me and thanked me for helping them.

@notatallshaw
Copy link
Member

notatallshaw commented Mar 30, 2025

FYI, currently pip (and I don't think any other installer tool) passes --pre to select build backend prerelease, which does mean alpha, beta, rc, and developmental release (although the last one isn't clearly defined by the spec but I'm working on updating the spec there).

So you would need to set the environmental variable PIP_PRE=1 for the build backend to select prereleases, but this would select prerelease for install release as well if they are available and the latest version.

I'm working on a feature to support selecting individual packages to enable or disable prerelease: pypa/pip#13221. But again I hadn't planned this to affect build backends unless you use it as environmental variables.

There is a workaround now, if you include the requirements or constraint foo>=0.0dev0 this will imply prerelease should be included for foo. For a build backend you would need include this in the build requirements or set it in a constraint file, e.g. setuptools>=0.0dev0 in build-constraints.txt and point the env var PIP_CONSTRAINT to that file.

@dwink
Copy link

dwink commented Mar 30, 2025

a beta release

I went in and looked at how it's currently done.

The finalize action in tox.ini calls a script:

setuptools/tox.ini

Lines 61 to 70 in 6ead555

[testenv:finalize]
description = assemble changelog and tag a release
skip_install = True
deps =
towncrier
bump2version
jaraco.develop >= 7.23
pass_env = *
commands =
python tools/finalize.py

That script uses jaraco.towncrier, which, reviews the changelog fragments in newsfragments for the kinds of changes which are pending release:

https://github.com/jaraco/jaraco.develop/blob/86c934076a4c717bfdf9382b8db7032757937c7d/jaraco/develop/towncrier.py#L21-L27

This is used to determine which semver level to change and ultimately produce a new version number:

https://github.com/jaraco/jaraco.develop/blob/86c934076a4c717bfdf9382b8db7032757937c7d/jaraco/develop/towncrier.py#L59-L64

Then, this version number is applied by running bumpversion:

def bump_version():
cmd = bump_version_command + ['--allow-dirty']
subprocess.check_call(cmd)

So, to implement the "prerelease" idea, you'd need to find a spot to apply your prerelease version suffix (maybe a finalize-prerelease?) and then a way to go from a prerelease to a release (since the current process does expect to commit/tag the bumped version to the repo). Then maintainers would finalize a prerelease at particular times...maybe only for majors? Or maybe for everything. You can work it out in the PR.

Or, to implement the "separate index" idea, you'd need to adjust the release tox target to push elsewhere for an "experimental" release.

I'll go back to what I said earlier about contributing what you want to see, because a PR or two with the above changes and a description of the adjusted workflow you're describing would make it perfectly clear what you're asking for_and_ make it easy for maintainers to adopt. It could likely all be done in a way that could be tried out -- even publishing one prerelease version and then you getting folks to run run their tests on it -- before it has to impact anyone else at all.

@webknjaz
Copy link
Member

@dwink note that most automation changes would have to go through jaraco/skeleton.

@eli-schwartz
Copy link
Contributor

Cool, so I I can try to legislate away a social issue with code changes and have my PR closed because it's not even in the right repository.

I'll go back to what I said about needing to discuss large workflow changes in issues before doing the trivial bit twiddling to enable them. If even the trivial config changes needed to switch to a drastically different social model are no longer trivial due to requiring social organization "across projects* then I can't fathom how "just submit a PR, bro" can be a valid criticism of people submitting issues.

@dwink
Copy link

dwink commented Mar 30, 2025

Cool, so I I can try to legislate away a social issue with code changes and have my PR closed because it's not even in the right repository.

Is that what would happen? Have you tried? If that did happen, you’d know where you stand, right?

I'll go back to what I said about needing to discuss large workflow changes in issues before doing the trivial bit twiddling to enable them. If even the trivial config changes needed to switch to a drastically different social model are no longer trivial due to requiring social organization "across projects* then I can't fathom how "just submit a PR, bro" can be a valid criticism of people submitting issues.

Okay, okay, you win, I give up. You’ve got some idea of how whatever-this-is must happen, I don’t understand it, and I no longer have any interest in understanding it.

Best of luck.

@potiuk
Copy link

potiuk commented Mar 30, 2025

Very long and pretty useless discussion with a lot of opinions and no actionability.

What I suggest everyone is to take active part in this PEP https://peps.python.org/pep-0772/ including discourse thread. Randoom issue created because a problem happened is not going to solve long term problems better than deliberate discussion and decision based on PEP how oversight and decisions (but also funding and getting involvement of community) should happen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests