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

Vendor the terminfo database for use with base/terminfo.jl #55411

Merged
merged 3 commits into from
Aug 8, 2024

Conversation

ararslan
Copy link
Member

@ararslan ararslan commented Aug 7, 2024

This adds the terminfo database to deps/, providing a better user experience on systems that don't have terminfo on the system by default. The database is built using BinaryBuilder but is not actually platform-specific (it's built for AnyPlatform) and as such, this fetches the artifact directly rather than adding a new JLL to stdlib, and it requires no compilation.

A build flag, WITH_TERMINFO, is added here and assumed true by default, allowing users to set WITH_TERMINFO=0 in Make.user to avoid bundling terminfo should they want to do so.

The lookup policy for terminfo entries is still compliant with what's described in terminfo(5); the bundled directory is taken to be the first "compiled in" location, i.e. prepended to @TERMINFO_DIRS@. This allows any user settings that exist locally, such as custom entries or locations, to take precedence.

Fixes #55274


I requested reviews from folks for particular subject matter expertise, should they have any input/wisdom to provide:

@ararslan ararslan added the backport 1.11 Change should be backported to release-1.11 label Aug 7, 2024
@ararslan ararslan requested a review from tecosaur August 7, 2024 22:00
This adds the `terminfo` database to `deps/`, providing a better user
experience on systems that don't have `terminfo` on the system by
default. The database is built using BinaryBuilder but is not actually
platform-specific (it's built for `AnyPlatform`) and as such, this
fetches the artifact directly rather than adding a new JLL to stdlib,
and it requires no compilation.

A build flag, `WITH_TERMINFO`, is added here and assumed true by
default, allowing users to set `WITH_TERMINFO=0` in Make.user to avoid
bundling `terminfo` should they want to do so.

The lookup policy for `terminfo` entries is still compliant with what's
described in `terminfo(5)`; the bundled directory is taken to be the
first "compiled in" location, i.e. prepended to `@TERMINFO_DIRS@`. This
allows any user settings that exist locally, such as custom entries or
locations, to take precedence.

Fixes 55274
Copy link
Contributor

@giordano giordano left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't tested it myself and I can't comment on the functionalities related to terminfo (it already works well for me 😅), but the changes related to the build system look good to me.

deps/terminfo.version Show resolved Hide resolved
@KristofferC KristofferC mentioned this pull request Aug 8, 2024
68 tasks
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
@tecosaur
Copy link
Contributor

tecosaur commented Aug 8, 2024

At a glance this looks solid to me 👍. I do wonder though if we should append the bundled directory rather than prepend it to the system paths to search.

My thinking is that if the system has installed a particular version of a terminal and has a terminfo file for it, that terminfo file is more likely to accurately correspond to the terminal than the one we bundle, if there is be any difference.

@@ -245,7 +245,8 @@ end
Locate the terminfo file for `term`, return `nothing` if none could be found.
The lookup policy is described in `terminfo(5)` "Fetching Compiled
Descriptions".
Descriptions". A terminfo database is included by default with Julia and is
taken to be the first entry of `@TERMINFO_DIRS@`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While @TERMINFO_DIRS@ came up while discussing the manpage (and was helpful to distinguish from the environment variable of the same name), I don't think this should actually be included in the docstring like this since it's a template pattern that's replaced when documentation is built: people who run man terminfo(5) on their system won't see @TERMINFO_DIRS@ mentioned 😅.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually do see it mentioned on macOS:

  • Finally, ncurses searches these compiled-in locations:
    • a list of directories (@TERMINFO_DIRS@), and
    • the system terminfo directory, /usr/share/terminfo (the compiled-in default).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that's just a broken docs build 😛 the source text is:

   •   Finally, ncurses searches these compiled-in locations:
       •   a list of directories (@TERMINFO_DIRS@), and
       •   the system terminfo directory, @TERMINFO@ (the compiled-
           in default).

In your example, only @TERMINFO@ is substituted.

On my system, for comparison:

     •   Finally, ncurses searches these compiled‐in locations:
         •   a list of directories (/etc/terminfo:/usr/share/terminfo), and
         •   the system terminfo directory, /usr/share/terminfo

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ha, incredible. Well, the function isn't really user-facing anyway; I'm sure a sufficiently motivated individual could decipher what this docstring means. 😅

@ararslan
Copy link
Member Author

ararslan commented Aug 8, 2024

My thinking is that if the system has installed a particular version of a terminal and has a terminfo file for it, that terminfo file is more likely to accurately correspond to the terminal than the one we bundle, if there is be any difference.

That's an interesting point. Though I'd expect an entry on the system wouldn't differ from what we vendor, any system that ships terminfo—be it by default or via a package manager—could theoretically apply some set of changes to the version they ship. I had been approaching this from the same perspective as our other dependencies, i.e. "you can't trust the system," but this is a situation where that may not be applicable.

@vtjnash
Copy link
Sponsor Member

vtjnash commented Aug 8, 2024

My thinking is that if the system has installed a particular version of a terminal and has a terminfo file for it, that terminfo file is more likely to accurately correspond to the terminal than the one we bundle

In my experience, this is not especially true, if there is a difference. To wit, the default Ubuntu install seemed to be lacking an entry in /usr/share/terminfo/ for many common terminals (e.g. it has screen-256color-s instead of screen-256color). That is also assuming the user doesn't use any terminal emulator except the one bundled with the OS, but that doesn't hold true for many users (emulators such as tmux, remote access such as ssh, and faster terminals such as kitty are all exceptions to the system being more accurate)

@ararslan
Copy link
Member Author

ararslan commented Aug 8, 2024

It's been a bit since the FreeBSD tests were all passing (they're allowed to fail so we keep regressing because nobody notices until later) but now that the CI VM network issues have been "fixed," this PR finally makes it green again. Insert "feels good" meme here.

@vtjnash vtjnash merged commit e7e8768 into master Aug 8, 2024
7 checks passed
@vtjnash vtjnash deleted the aa/vendored-terminfo branch August 8, 2024 23:44
@vtjnash
Copy link
Sponsor Member

vtjnash commented Aug 8, 2024

We will go ahead and try this then, and hopefully we don't get issue reports back about missing something

lazarusA pushed a commit to lazarusA/julia that referenced this pull request Aug 17, 2024
…#55411)

This adds the `terminfo` database to `deps/`, providing a better user
experience on systems that don't have `terminfo` on the system by
default. The database is built using BinaryBuilder but is not actually
platform-specific (it's built for `AnyPlatform`) and as such, this
fetches the artifact directly rather than adding a new JLL to stdlib,
and it requires no compilation.

A build flag, `WITH_TERMINFO`, is added here and assumed true by
default, allowing users to set `WITH_TERMINFO=0` in Make.user to avoid
bundling `terminfo` should they want to do so.

The lookup policy for `terminfo` entries is still compliant with what's
described in `terminfo(5)`; the bundled directory is taken to be the
first "compiled in" location, i.e. prepended to `@TERMINFO_DIRS@`. This
allows any user settings that exist locally, such as custom entries or
locations, to take precedence.

Fixes JuliaLang#55274

Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
KristofferC pushed a commit that referenced this pull request Aug 19, 2024
This adds the `terminfo` database to `deps/`, providing a better user
experience on systems that don't have `terminfo` on the system by
default. The database is built using BinaryBuilder but is not actually
platform-specific (it's built for `AnyPlatform`) and as such, this
fetches the artifact directly rather than adding a new JLL to stdlib,
and it requires no compilation.

A build flag, `WITH_TERMINFO`, is added here and assumed true by
default, allowing users to set `WITH_TERMINFO=0` in Make.user to avoid
bundling `terminfo` should they want to do so.

The lookup policy for `terminfo` entries is still compliant with what's
described in `terminfo(5)`; the bundled directory is taken to be the
first "compiled in" location, i.e. prepended to `@TERMINFO_DIRS@`. This
allows any user settings that exist locally, such as custom entries or
locations, to take precedence.

Fixes #55274

Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
(cherry picked from commit e7e8768)
KristofferC added a commit that referenced this pull request Aug 26, 2024
Backported PRs:
- [x] #54962 <!-- Add timing to precompile trace compile -->
- [x] #55180 <!-- compress jit debuginfo for easy memory savings -->
- [x] #54919 <!-- Fix annotated join with non-concrete eltype iters -->
- [x] #55013 <!-- [docs] change docstring to match code -->
- [x] #55017 <!-- TOML: Make `Dates` a type parameter -->
- [x] #54033 <!-- Fix a bug in `stack`'s DimensionMismatch error message
-->
- [x] #55242 <!-- fix at-main docstring to not code quote a compat box
-->
- [x] #55261 <!-- Make `jl_*affinity` tests more portable -->
- [x] #54736 <!-- specificity: ensure fast-path in `sub/eq_msp` handle
missing `UnionAll` wrapper correctly. -->
- [x] #55299 <!-- typeintersect: fix bounds merging during inner
`intersect_all`. -->
- [x] #55302 <!-- Add `lbt_forwarded_funcs()` to debug LBT forwarding
issues -->
- [x] #55148 <!-- Random: Mark unexported public symbols as public -->
- [x] #55303 <!-- avoid overflowing show for OffsetArrays around typemax
-->
- [x] #55317 <!-- Restrict argument to `isleapyear(::Integer)` -->
- [x] #55327 <!-- Profile: Fix stdlib paths -->
- [x] #55330 <!-- [libblastrampoline] Bump to v5.11.0 -->
- [x] #55310 <!-- Preserve structure in scaling triangular matrices by
NaN -->
- [x] #55329 <!-- mapreduce: don't inbounds unknown functions -->
- [x] #55356 <!-- Profile: close files when assembling heap snapshot -->
- [x] #55371 <!-- Fix tr for block SymTridiagonal -->
- [x] #55307 <!-- Make REPL.TerminalMenus public -->
- [x] #55362 <!-- inference: fix missing LimitedAccuracy markers -->
- [x] #55306 <!-- AllocOpt: Fix stack lowering where alloca continas
boxed and unboxed data -->
- [x] #55395 <!-- fix #55389: type-unstable `join` -->
- [x] #55226 <!-- re-add `unsafe_convert` for Reinterpret and Reshaped
array -->
- [x] #55405 <!-- handle unbound vars in NTuple fields -->
- [x] #55365 <!-- ml-matches: ensure all methods are included -->
- [x] #55428 <!-- codegen: move undef freeze before promotion point -->
- [x] #55419 <!-- `stale_cachefile`: handle if the expected cache file
is missing -->
- [x] #55470 <!-- Add push! implementation for AbstractArray depending
only on resize! -->
- [x] #55483 <!-- fix hierarchy level of "API reference" in `Dates`
documentation -->
- [x] #55268 <!-- simplify complex atanh and remove singularity
perturbation -->
- [x] #55441 <!-- fix Event to use normal Condition variable -->
- [x] #55413 <!-- subtyping: fast path for lhs union and rhs typevar -->
- [x] #55492 <!-- build: add missing dependencies for expmap -->
- [x] #55507 <!-- Fix fast getptls ccall lowering. -->
- [x] #55424 <!-- add missing clamp function for IOBuffer -->
- [x] #55504 <!-- Update symmetric docstring to reflect the type of uplo
-->
- [x] #55107 <!-- Make the memory GEP an inbounds GEP since the bounds
check has happened somewhere else -->
- [x] #55411 <!-- Vendor the terminfo database for use with
base/terminfo.jl -->
- [x] #55452 <!-- Do not load `ScopedValues` with `using` -->
- [x] #55407 <!-- Remove deprecated non string API for LLVM pass
pipeline and parse all options -->
- [x] #55461 <!-- 🤖 [master] Bump the StyledStrings stdlib from d7496d2
to f6035eb -->
- [x] #55433 <!-- Backport #55407
to 1.11 -->
- [x] #55225 <!-- [1.11 backport] trace-compile: don't generate
`precompile` statements for OpaqueClosure methods (#55072) -->
- [x] #55212 <!-- Make `Base.depwarn()` public -->
- [x] #552
- [x] #55052 <!-- Fix `(l/r)mul!` with `Diagonal`/`Bidiagonal` -->
- [x] #55251 <!-- Restrict binary ops for Diagonal and Symmetric to
Number eltypes -->95 <!-- LAPACK: Aggressive constprop to concretely
infer syev!/syevd! -->
- [x] #55522 <!-- Fix tr for Symmetric/Hermitian block matrices -->

Need manual backport:
- [x] #55342 <!-- Ensure bidiagonal setindex! does not read indices in
error message -->

Contains multiple commits, manual intervention needed:

- [ ] #55336 <!-- codegen: take gc roots (and alloca alignment) more
seriously -->


Non-merged PRs with backport label:
- [ ] #55506 <!-- Fix indexing in _mapreducedim for OffsetArrays -->
- [ ] #55500 <!-- make jl_thread_suspend_and_get_state safe -->
- [ ] #55499 <!-- propagate the terminal's `displaysize` to the
`IOContext` used by the REPL -->
- [ ] #55458 <!-- Allow for generically extracting unannotated string
-->
- [ ] #55457 <!-- Make AnnotateChar equality consider annotations -->
- [ ] #55453 <!-- Privatise the annotations API, for StyledStrings -->
- [ ] #55443 <!-- Add test for upper/lower/titlecase and fix call -->
- [ ] #55355 <!-- relocation: account for trailing path separator in
depot paths -->
- [ ] #55220 <!-- `isfile_casesensitive` fixes on Windows -->
- [ ] #55169 <!-- `propertynames` for SVD respects private argument -->
- [ ] #54457 <!-- Make `String(::Memory)` copy -->
- [ ] #53957 <!-- tweak how filtering is done for what packages should
be precompiled -->
- [ ] #51479 <!-- prevent code loading from lookin in the versioned
environment when building Julia -->
- [ ] #50813 <!-- More doctests for Sockets and capitalization fix -->
- [ ] #50157 <!-- improve docs for `@inbounds` and
`Base.@propagate_inbounds` -->
- [ ] #41244 <!-- Fix shell `cd` error when working dir has been deleted
-->
@KristofferC KristofferC removed the backport 1.11 Change should be backported to release-1.11 label Aug 26, 2024
NEWS.md Show resolved Hide resolved
nalimilan added a commit that referenced this pull request Sep 27, 2024
Just like all other libraries, we don't want internal Julia files to
mess with system files.

Introduced by #55411.
KristofferC pushed a commit that referenced this pull request Sep 30, 2024
Just like all other libraries, we don't want internal Julia files to
mess with system files.

Introduced by #55411.

(cherry picked from commit 0dbb6eb)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

terminfo parser is ineffective on FreeBSD
6 participants