Skip to content

Conversation

@edmorley
Copy link
Member

@edmorley edmorley commented Apr 24, 2025

In Honeycomb metrics for the classic buildpack, there are a number of failures due to stray ASCII control codes or invisible Unicode characters being present before/after the version in .python-version.

For example, usage of the ASCII ESC control code (U+001B) and the Unicode zero width no-break space (U+FEFF) as leading/trailing characters alongside the Python version number.

Being invisible, these don't show up in the error message to users, which makes understanding and resolving the issue harder.

Now, such characters are replaced by the symbol.

(I also checked the pyenv and uv .python-version parsing implementations, and they don't support these stray characters either.)

See also:

GUS-W-18225365.

…cters

In Honeycomb metrics for the classic buildpack, there are a number of
failures due to stray ASCII control codes or invisible Unicode
characters being present before/after the version in `.python-version`.

For example, I've seen the ASCII `ESC` control code (`U+001B`) and the
Unicode zero width no-break space (`U+FEFF`).

(I also checked the pyenv and uv `.python-version` parsing
implementations, and they don't support these stray characters
either.)

Being invisible, these don't show up in the error message to users,
which makes understanding and resolving the issue harder.

Now, such characters are replaced by the `�` symbol.

See also:
- https://ui.honeycomb.io/heroku/datasets/builds/board-query/DwMoerdz3jj/result/ovg8DxtftcC?vs=hideCompare
- https://www.ascii-code.com/
- https://invisible-characters.com/
- https://doc.rust-lang.org/std/primitive.str.html#method.replace
- https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii
- https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii_control
- https://github.com/pyenv/pyenv/blob/master/libexec/pyenv-version-file-read
- https://github.com/astral-sh/uv/blob/0.6.16/crates/uv-python/src/version_files.rs#L155-L180

GUS-W-18225365.
@edmorley edmorley added the enhancement New feature or request label Apr 24, 2025
@edmorley edmorley self-assigned this Apr 24, 2025
@edmorley edmorley marked this pull request as ready for review April 24, 2025 11:03
@edmorley edmorley requested a review from a team as a code owner April 24, 2025 11:03
@edmorley edmorley enabled auto-merge (squash) April 24, 2025 11:03
@edmorley edmorley merged commit 833e7a7 into main Apr 24, 2025
8 checks passed
@edmorley edmorley deleted the control-codes-error-message branch April 24, 2025 14:16
heroku-linguist bot added a commit that referenced this pull request May 2, 2025
## heroku/python

### Removed

- Removed support for the deprecated `runtime.txt` file. Python versions must now be specified using a `.python-version` file instead. ([#352](#352))
- Removed support for Ubuntu 20.04 (and thus Heroku-20 / `heroku/builder:20`). ([#358](#358))

### Changed

- Improved the error messages shown when `.python-version` contains an invalid Python version or stray invisible characters (such as ASCII control codes). ([#353](#353) and [#354](#354))
- Improved the error messages shown if I/O errors occur. ([#355](#355) and [#356](#356))
@heroku-linguist heroku-linguist bot mentioned this pull request May 2, 2025
heroku-linguist bot added a commit to heroku/cnb-builder-images that referenced this pull request May 2, 2025
## heroku/python

### Removed

- Removed support for the deprecated `runtime.txt` file. Python versions must now be specified using a `.python-version` file instead. ([#352](heroku/buildpacks-python#352))
- Removed support for Ubuntu 20.04 (and thus Heroku-20 / `heroku/builder:20`). ([#358](heroku/buildpacks-python#358))

### Changed

- Improved the error messages shown when `.python-version` contains an invalid Python version or stray invisible characters (such as ASCII control codes). ([#353](heroku/buildpacks-python#353) and [#354](heroku/buildpacks-python#354))
- Improved the error messages shown if I/O errors occur. ([#355](heroku/buildpacks-python#355) and [#356](heroku/buildpacks-python#356))
edmorley added a commit to heroku/heroku-buildpack-python that referenced this pull request May 2, 2025
Backports the improvements made as part of:
- heroku/buildpacks-python#352
- heroku/buildpacks-python#353
- heroku/buildpacks-python#354
- heroku/buildpacks-python#355

Plus:
- applies similar changes to equivalent error messages that
  only exist in the classic buildpack (eg the Pipenv errors)
- switches to use of contractions as per the CX team's
  style guidelines

GUS-W-18225347.
GUS-W-18421778.
edmorley added a commit to heroku/heroku-buildpack-python that referenced this pull request May 2, 2025
Backports the error message/build output improvements made as part of:
- heroku/buildpacks-python#352
- heroku/buildpacks-python#353
- heroku/buildpacks-python#354
- heroku/buildpacks-python#355

Plus:
- applies similar changes to equivalent error messages that
  only exist in the classic buildpack (eg the Pipenv errors)
- switches to use of contractions as per the CX team's
  style guidelines

GUS-W-18225347.
GUS-W-18421778.
edmorley added a commit to heroku/heroku-buildpack-python that referenced this pull request May 2, 2025
Backports the error message/build output improvements made as part of:
- heroku/buildpacks-python#352
- heroku/buildpacks-python#353
- heroku/buildpacks-python#354
- heroku/buildpacks-python#355

Plus:
- applies similar changes to equivalent error messages that
  only exist in the classic buildpack (eg the Pipenv errors)
- switches to use of contractions as per the CX team's
  style guidelines

GUS-W-18225347.
GUS-W-18421778.
edmorley added a commit to heroku/heroku-buildpack-python that referenced this pull request May 2, 2025
Backports the error message/build output improvements made as part of:
- heroku/buildpacks-python#352
- heroku/buildpacks-python#353
- heroku/buildpacks-python#354
- heroku/buildpacks-python#355

Plus:
- applies similar changes to equivalent error messages that
  only exist in the classic buildpack (eg the Pipenv errors)
- switches to use of contractions as per the CX team's
  style guidelines

GUS-W-18225347.
GUS-W-18421778.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants