This commit represents the majority of the work necessary to upgrade
Ghostty to use Zig 0.16.0.
Key parts:
* In addition to its previous responsibilities, the global state now
houses state for global I/O implementations and the process
environment. It is now also utilized in the main application along
with the C library. Where necessary, global state is isolated from key
parts of the implementation (e.g., in libghostty subsystems), and it's
expected that this list will grow.
* We currently manage our own C translation layer where necessary. In
these cases, cImport has been removed in favor of the new external
translate-c package. Due to fixes that have needed be made to properly
translate the dependencies that were swapped out, as mentioned, we
have had to backport fixes from the current translate-c package (and
the upstream Arocc dependency). We will host this ourselves until Zig
0.17.0 is released with these fixes.
* Where necessary (only a small number of cases), some stdlib code from
0.15.2 (and even from 0.17.0) has been taken, adopted, and vendored in
lib/compat.
Co-authored-by: Leah Amelia Chen <hi@pluie.me>
Re: #13160 (related but not that issue)
PageList eraseRow and eraseRowBounded have the same issue previously
fixed for cursorScrollAbove: when shifting rows up across a page
boundary, the top row of the next page is cloned into the last row of
the previous page, and that clone can fail if the destination page lacks
capacity for the row's managed memory.
Handle the errors the same way the other cross-page copies do: increase
the destination page capacity for the dimension that ran out and retry
the row copy.
This type of logic was repeated EVERYWHERE so I extracted this into a
helper in PageList and Screen. They're slightly different due to the
extra accounting that Screen has to do for the cursor.
Don't know of any scenario this actually happened in the real world but
it was trivially reproducible with tests.
Re: #13160 (related but not that issue)
PageList eraseRow and eraseRowBounded have the same issue previously
fixed for cursorScrollAbove: when shifting rows up across a page boundary,
the top row of the next page is cloned into the last row of the
previous page, and that clone can fail if the destination page lacks
capacity for the row's managed memory.
Handle the errors the same way the other cross-page copies do:
increase the destination page capacity for the dimension that ran
out and retry the row copy.
This type of logic was repeated EVERYWHERE so I extracted this into a
helper in PageList and Screen. They're slightly different due to the extra
accounting that Screen has to do for the cursor.
Don't know of any scenario this actually happened in the real world but
it was trivially reproducible with tests.
Fixes https://github.com/ghostty-org/ghostty/issues/13390
Technically it would be safe to remove `#available(macOS 27, *)` check,
but I haven't tested all the os versions, so I kept it there.
### AI Disclosure
No AI is used for this one.
Kitty 0.48 added support for usage hints in the image protocol,
specifically for marking images as "transient", meaning that they should
be prioritized for eviction if there is memory pressure.
https://sw.kovidgoyal.net/kitty/graphics-protocol/#image-usage-hints
Also changed the eviction algorithm to use an allocated array for
organizing the images to be evicted rather than using an ArrayList to
minimize the number of allocations made (no real memory savings though).
Re: #13160
When cursorScrollAbove rotates rows across a page boundary, the last row
of the previous page is cloned into the destination page. That can cause
capacity failures we didn't previously handle.
The error propagated out of the operation after rows had already been
rotated, leaving the page list half-mutated. Subsequent operations on
the corrupted state can cause crashes since the state was incoherent.
Handle these errors the same way insertLines and deleteLines already do
for their cross-page copies: increase the destination page capacity for
the dimension that ran out and retry the row copy.
Re: #13160
When cursorScrollAbove rotates rows across a page boundary, the last
row of the previous page is cloned into the destination page. That can
cause capacity failures we didn't previously handle.
The error propagated out of the operation after rows had already been rotated,
leaving the page list half-mutated. Subsequent operations on the corrupted state
can cause crashes since the state was incoherent.
Handle these errors the same way insertLines and deleteLines already
do for their cross-page copies: increase the destination page capacity
for the dimension that ran out and retry the row copy.
Kitty 0.48 added support for usage hints in the image protocol,
specifically for marking images as "transient", meaning that they
should be prioritized for eviction if there is memory pressure.
https://sw.kovidgoyal.net/kitty/graphics-protocol/#image-usage-hints
Also changed the eviction algorithm to use an allocated array for
organizing the images to be evicted rather than using an ArrayList to
minimize the number of allocations made (no real memory savings though).
`ext-background-effect-v1` is finally seeing major adoption throughout
KWin, Mutter, cosmic-comp, Niri, etc. and we should update our comments
on that.
`ext-background-effect-v1` is finally seeing major adoption throughout
KWin, Mutter, cosmic-comp, Niri, etc. and we should update our comments
on that.
Cursor defaults were duplicated across stream handlers and it was a
pretty significant amount of simple and yet non-trivial logic to
understand.
Store these on Terminal itself and have methods to route things like
DECSCUSR through for consistent behaviors.
No AI usage here.
Cursor defaults were duplicated across stream handlers and it was a
pretty significant amount of simple and yet non-trivial logic to
understand.
Store these on Terminal itself and have methods to route things like
DECSCUSR through for consistent behaviors.
The libghostty-vt stream is made to be infallible: in the case of any
error it just logs and moves on. That's because a terminal can't
really... stop, under normal operations. But, under special operations
(fuzzing, replays, etc.) it can and should stop!
Rather than make the operation fallible, its simply enough for me at
least to know that something went wrong. This is a simple change that
adds a simple flag that is flagged to true when such a scenario happens.
For normal Ghostty GUI operations, this isn't used at all. For
libghostty consumers they can choose to read it if they want, but don't
have to.
This also adds a C API to read it.
The libghostty-vt stream is made to be infallible: in the case of any error
it just logs and moves on. That's because a terminal can't really... stop,
under normal operations. But, under special operations (fuzzing, replays,
etc.) it can and should stop!
Rather than make the operation fallible, its simply enough for me at least
to know that something went wrong. This is a simple change that adds a simple
flag that is flagged to true when such a scenario happens.
For normal Ghostty GUI operations, this isn't used at all. For libghostty
consumers they can choose to read it if they want, but don't have to.
This also adds a C API to read it.
This makes error returns in `Screen.resize` and `Terminal.resize` safe:
they leave the terminal/screen in its prior state (with one exception,
noted below). Previously, both were documented as leaving the terminal
in a garbage stage on error.
Unit tests with tripwire added to verify errdefer behaviors.
This also includes a refactor: the common behaviors that resize needs
such as updating cell size in pixels, disabling synchronized output,
handling mode 2048, are now pulled into libghostty-vt. This will make it
easier for downstream libghostty users to make proper terminals.
**The one perfect undo exception:** If the primary screen can resize but
the alt screen cannot, then we try our best to do something reasonable,
in order:
1. If we're on the primary screen, we just deallocate the alt screen.
It'll be reallocated lazily (and may fail) in the future. Worst case
here is we lose screen data if the future TUI doesn't expect a clear on
enter/exit.
2. If we're on the alt screen, we deallocate to try recover memory, then
reinitialize eagerly at the new size hoping to at least have a blank alt
screen. Similar to 1, we lose screen data here, but its likely screen
data that mattered since we were actively on the alt screen.
3. If the eager reinit fails, we switch to the primary screen. This is
the biggest issue, cause the TUI program won't know this happened and
probably do some crazy stuff on the primary screen. But, its also a
super exceptional situation.
In every case though, the terminal is consistent and safe to use.
**LLM notes:** Only used as a judge and to assist with test writing, not
used at all for commit messages, PR, or non-test logic.
Terminal resize could leave tab stops, pixel geometry, synchronized output,
or screen dimensions partially updated when a later allocation failed. This
is now safe. There is one exception, see the code comments.
This makes the Terminal.resize handle more of the common elements that
a core terminal emulator should: cell geoemtry handling (if exists),
updates synchronized output modes.
This adds a new TerminalStream.resize that also handles the side effects
for more easy integration into downstream libghostty-vt consumers, namely
mode 2048 in-band signaling handling.
Bumps
[mitchellh/vouch/action/manage-by-issue](https://github.com/mitchellh/vouch)
from 1.4.2 to 1.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mitchellh/vouch/releases">mitchellh/vouch/action/manage-by-issue's
releases</a>.</em></p>
<blockquote>
<h2>v1.5.0</h2>
<h2>What's New</h2>
<h3>Improvements</h3>
<p>-<strong><code>action/check-issue</code></strong> has a new option
<code>auto-lock</code> to automatically lock closed issues. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/90">#90</a>)</p>
<ul>
<li><strong><code>gh-manage-by-discussion</code></strong> supports
numerical IDs. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/77">#77</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d66fa29a64"><code>d66fa29</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/93">#93</a>
from mitchellh/dependabot/github_actions/actions/check...</li>
<li><a
href="c22b93d0e8"><code>c22b93d</code></a>
Bump actions/checkout from 6.0.2 to 7.0.0</li>
<li><a
href="baeb3bf7c7"><code>baeb3bf</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/90">#90</a>
from trag1c/lock-issues</li>
<li><a
href="52aec3d646"><code>52aec3d</code></a>
add an option to lock closed issues</li>
<li><a
href="3dbc69c691"><code>3dbc69c</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/87">#87</a>
from freepicheep/example-attribute</li>
<li><a
href="a6933466b4"><code>a693346</code></a>
Update VOUCHED list</li>
<li><a
href="21177c0fec"><code>21177c0</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/74">#74</a>
from pavelzw/vouch-cli</li>
<li><a
href="527cdc3488"><code>527cdc3</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/81">#81</a>
from mitchellh/dependabot/github_actions/hustcer/setup...</li>
<li><a
href="1895e9c54f"><code>1895e9c</code></a>
feat: use <a
href="https://github.com/example"><code>@example</code></a> attribute
for command examples</li>
<li><a
href="8c80ada45b"><code>8c80ada</code></a>
Update README</li>
<li>Additional commits viewable in <a
href="c6d80ead49...d66fa29a64">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps
[mitchellh/vouch/action/check-pr](https://github.com/mitchellh/vouch)
from 1.4.2 to 1.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mitchellh/vouch/releases">mitchellh/vouch/action/check-pr's
releases</a>.</em></p>
<blockquote>
<h2>v1.5.0</h2>
<h2>What's New</h2>
<h3>Improvements</h3>
<p>-<strong><code>action/check-issue</code></strong> has a new option
<code>auto-lock</code> to automatically lock closed issues. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/90">#90</a>)</p>
<ul>
<li><strong><code>gh-manage-by-discussion</code></strong> supports
numerical IDs. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/77">#77</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d66fa29a64"><code>d66fa29</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/93">#93</a>
from mitchellh/dependabot/github_actions/actions/check...</li>
<li><a
href="c22b93d0e8"><code>c22b93d</code></a>
Bump actions/checkout from 6.0.2 to 7.0.0</li>
<li><a
href="baeb3bf7c7"><code>baeb3bf</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/90">#90</a>
from trag1c/lock-issues</li>
<li><a
href="52aec3d646"><code>52aec3d</code></a>
add an option to lock closed issues</li>
<li><a
href="3dbc69c691"><code>3dbc69c</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/87">#87</a>
from freepicheep/example-attribute</li>
<li><a
href="a6933466b4"><code>a693346</code></a>
Update VOUCHED list</li>
<li><a
href="21177c0fec"><code>21177c0</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/74">#74</a>
from pavelzw/vouch-cli</li>
<li><a
href="527cdc3488"><code>527cdc3</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/81">#81</a>
from mitchellh/dependabot/github_actions/hustcer/setup...</li>
<li><a
href="1895e9c54f"><code>1895e9c</code></a>
feat: use <a
href="https://github.com/example"><code>@example</code></a> attribute
for command examples</li>
<li><a
href="8c80ada45b"><code>8c80ada</code></a>
Update README</li>
<li>Additional commits viewable in <a
href="c6d80ead49...d66fa29a64">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps
[mitchellh/vouch/action/check-issue](https://github.com/mitchellh/vouch)
from baeb3bf7c7e6c12d6e33bab3870b7e936580a934 to
d66fa29a64600490892131ad87597c30c91fcac4.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d66fa29a64"><code>d66fa29</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/93">#93</a>
from mitchellh/dependabot/github_actions/actions/check...</li>
<li><a
href="c22b93d0e8"><code>c22b93d</code></a>
Bump actions/checkout from 6.0.2 to 7.0.0</li>
<li>See full diff in <a
href="baeb3bf7c7...d66fa29a64">compare
view</a></li>
</ul>
</details>
<br />
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps
[mitchellh/vouch/action/manage-by-discussion](https://github.com/mitchellh/vouch)
from 1.4.2 to 1.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mitchellh/vouch/releases">mitchellh/vouch/action/manage-by-discussion's
releases</a>.</em></p>
<blockquote>
<h2>v1.5.0</h2>
<h2>What's New</h2>
<h3>Improvements</h3>
<p>-<strong><code>action/check-issue</code></strong> has a new option
<code>auto-lock</code> to automatically lock closed issues. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/90">#90</a>)</p>
<ul>
<li><strong><code>gh-manage-by-discussion</code></strong> supports
numerical IDs. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/77">#77</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d66fa29a64"><code>d66fa29</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/93">#93</a>
from mitchellh/dependabot/github_actions/actions/check...</li>
<li><a
href="c22b93d0e8"><code>c22b93d</code></a>
Bump actions/checkout from 6.0.2 to 7.0.0</li>
<li><a
href="baeb3bf7c7"><code>baeb3bf</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/90">#90</a>
from trag1c/lock-issues</li>
<li><a
href="52aec3d646"><code>52aec3d</code></a>
add an option to lock closed issues</li>
<li><a
href="3dbc69c691"><code>3dbc69c</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/87">#87</a>
from freepicheep/example-attribute</li>
<li><a
href="a6933466b4"><code>a693346</code></a>
Update VOUCHED list</li>
<li><a
href="21177c0fec"><code>21177c0</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/74">#74</a>
from pavelzw/vouch-cli</li>
<li><a
href="527cdc3488"><code>527cdc3</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/81">#81</a>
from mitchellh/dependabot/github_actions/hustcer/setup...</li>
<li><a
href="1895e9c54f"><code>1895e9c</code></a>
feat: use <a
href="https://github.com/example"><code>@example</code></a> attribute
for command examples</li>
<li><a
href="8c80ada45b"><code>8c80ada</code></a>
Update README</li>
<li>Additional commits viewable in <a
href="c6d80ead49...d66fa29a64">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps
[mitchellh/vouch/action/sync-codeowners](https://github.com/mitchellh/vouch)
from 1.4.2 to 1.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mitchellh/vouch/releases">mitchellh/vouch/action/sync-codeowners's
releases</a>.</em></p>
<blockquote>
<h2>v1.5.0</h2>
<h2>What's New</h2>
<h3>Improvements</h3>
<p>-<strong><code>action/check-issue</code></strong> has a new option
<code>auto-lock</code> to automatically lock closed issues. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/90">#90</a>)</p>
<ul>
<li><strong><code>gh-manage-by-discussion</code></strong> supports
numerical IDs. (<a
href="https://redirect.github.com/mitchellh/vouch/pull/77">#77</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d66fa29a64"><code>d66fa29</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/93">#93</a>
from mitchellh/dependabot/github_actions/actions/check...</li>
<li><a
href="c22b93d0e8"><code>c22b93d</code></a>
Bump actions/checkout from 6.0.2 to 7.0.0</li>
<li><a
href="baeb3bf7c7"><code>baeb3bf</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/90">#90</a>
from trag1c/lock-issues</li>
<li><a
href="52aec3d646"><code>52aec3d</code></a>
add an option to lock closed issues</li>
<li><a
href="3dbc69c691"><code>3dbc69c</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/87">#87</a>
from freepicheep/example-attribute</li>
<li><a
href="a6933466b4"><code>a693346</code></a>
Update VOUCHED list</li>
<li><a
href="21177c0fec"><code>21177c0</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/74">#74</a>
from pavelzw/vouch-cli</li>
<li><a
href="527cdc3488"><code>527cdc3</code></a>
Merge pull request <a
href="https://redirect.github.com/mitchellh/vouch/issues/81">#81</a>
from mitchellh/dependabot/github_actions/hustcer/setup...</li>
<li><a
href="1895e9c54f"><code>1895e9c</code></a>
feat: use <a
href="https://github.com/example"><code>@example</code></a> attribute
for command examples</li>
<li><a
href="8c80ada45b"><code>8c80ada</code></a>
Update README</li>
<li>Additional commits viewable in <a
href="c6d80ead49...d66fa29a64">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Using `clearRetainingCapacity` as it was being used in
Fingerprint.update produces undefined behavior; both the old "copy" and
current version of the fingerprint would still be using the same
storage.
This commit changes the function so that the storage is more clearly
re-used, and shrunk at the end if need be.
Using `clearRetainingCapacity` as it was being used in
Fingerprint.update produces undefined behavior; both the old "copy" and
current version of the fingerprint would still be using the same
storage.
This commit changes the function so that the storage is more clearly
re-used, and shrunk at the end if need be.
Retain the existing fingerprint's storage instead of allocating a fresh
owned slice on every update. The previous approach built a replacement
fingerprint before it knew whether the viewport changed, discarding it
for unchanged viewports.
The fingerprint now rebuilds in place after reserving viewport-sized
capacity and reports whether its contents changed. Unchanged viewport
updates skip the allocation, while changed viewports will usually reuse
the existing buffer for the lifetime of the active search.