8670 Commits
Author SHA1 Message Date
Stefan Haller 63ab89fff4 Bump github.com/gdamore/tcell/v3 from 3.5.0 to 3.6.0 (#6126)
Bumps [github.com/gdamore/tcell/v3](https://github.com/gdamore/tcell)
from 3.5.0 to 3.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gdamore/tcell/releases">github.com/gdamore/tcell/v3's
releases</a>.</em></p>
<blockquote>
<h2>Version 3.6.0 Feature Release</h2>
<p>The main headline here is that the mouse is supported on the Linux
console with GPM. There are performance improvements and some bug fixes,
plus improved reporting of pixel sizes on window resize events as
well.</p>
<h2>What's Changed</h2>
<ul>
<li>fix(vt): let the segmenter decide clustering, not Go's unicode
tables by <a
href="https://github.com/dylanpulver"><code>@​dylanpulver</code></a> in
<a
href="https://redirect.github.com/gdamore/tcell/pull/1170">gdamore/tcell#1170</a></li>
<li>chore(deps): bump golang.org/x/term from 0.45.0 to 0.46.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/gdamore/tcell/pull/1173">gdamore/tcell#1173</a></li>
<li>chore(deps): bump golang.org/x/text from 0.41.0 to 0.42.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/gdamore/tcell/pull/1174">gdamore/tcell#1174</a></li>
<li>fix: invalidate blank cells after resizing CellBuffer by <a
href="https://github.com/jakezwang"><code>@​jakezwang</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1176">gdamore/tcell#1176</a></li>
<li>fix(st): re-enable SGR mouse (1006) and focus (1004) reporting by <a
href="https://github.com/akashchamp"><code>@​akashchamp</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1179">gdamore/tcell#1179</a></li>
<li>perf(cell): fill areas without an allocation per cell by <a
href="https://github.com/ayn2op"><code>@​ayn2op</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1184">gdamore/tcell#1184</a></li>
<li>fix(resize): report the pixel size in resize events by <a
href="https://github.com/ayn2op"><code>@​ayn2op</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1186">gdamore/tcell#1186</a></li>
<li>fix(input): extend bare Escape timeout on Windows by <a
href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1188">gdamore/tcell#1188</a></li>
<li>feat(gpm): support Linux console mouse by <a
href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1190">gdamore/tcell#1190</a></li>
<li>perf: reuse SetContent strings for Unicode glyphs by <a
href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a
href="https://redirect.github.com/gdamore/tcell/pull/1191">gdamore/tcell#1191</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/dylanpulver"><code>@​dylanpulver</code></a>
made their first contribution in <a
href="https://redirect.github.com/gdamore/tcell/pull/1170">gdamore/tcell#1170</a></li>
<li><a href="https://github.com/jakezwang"><code>@​jakezwang</code></a>
made their first contribution in <a
href="https://redirect.github.com/gdamore/tcell/pull/1176">gdamore/tcell#1176</a></li>
<li><a
href="https://github.com/akashchamp"><code>@​akashchamp</code></a> made
their first contribution in <a
href="https://redirect.github.com/gdamore/tcell/pull/1179">gdamore/tcell#1179</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gdamore/tcell/compare/v3.5.0...v3.6.0">https://github.com/gdamore/tcell/compare/v3.5.0...v3.6.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/gdamore/tcell/commit/4bed18057fce88934c9b9a576b5f83632196de11"><code>4bed180</code></a>
perf: reuse SetContent strings for Unicode glyphs (<a
href="https://redirect.github.com/gdamore/tcell/issues/1191">#1191</a>)</li>
<li><a
href="https://github.com/gdamore/tcell/commit/e0700df7ab5dbc4484ece1a32812f6e2602afd5b"><code>e0700df</code></a>
feat(gpm): support Linux console mouse (fixes <a
href="https://redirect.github.com/gdamore/tcell/issues/297">#297</a>)</li>
<li><a
href="https://github.com/gdamore/tcell/commit/f4c25623e16610b714e698c729535d9815656536"><code>f4c2562</code></a>
fix(input): tune escape delay on Windows (<a
href="https://redirect.github.com/gdamore/tcell/issues/1188">#1188</a>)</li>
<li><a
href="https://github.com/gdamore/tcell/commit/c2d660f0fafb796cc261dcdda8451da67a209b51"><code>c2d660f</code></a>
fix(resize): report the pixel size in resize events</li>
<li><a
href="https://github.com/gdamore/tcell/commit/5a6c8bf183d1fc9605da90128c4e603d41dc44a8"><code>5a6c8bf</code></a>
perf(cell): fill areas without an allocation per cell</li>
<li><a
href="https://github.com/gdamore/tcell/commit/10a2e726de2401764f6f2b5fa696dfa0a7f2357e"><code>10a2e72</code></a>
fix(st): Re-enable SGR mouse (1006) and focus (1004) reporting
(fixes#1178) (...</li>
<li><a
href="https://github.com/gdamore/tcell/commit/f6b0fa8ffcf8a42601efdd8eea9dd48b0ce8af63"><code>f6b0fa8</code></a>
fix: invalidate blank cells after resizing CellBuffer (<a
href="https://redirect.github.com/gdamore/tcell/issues/1176">#1176</a>)</li>
<li><a
href="https://github.com/gdamore/tcell/commit/91f6d4df3f48dcff1a779a64b9d9d7518034d60e"><code>91f6d4d</code></a>
chore(deps): bump golang.org/x/text from 0.41.0 to 0.42.0 (<a
href="https://redirect.github.com/gdamore/tcell/issues/1174">#1174</a>)</li>
<li><a
href="https://github.com/gdamore/tcell/commit/4f108a391b6b8f75a7190b88d27295fa73e343ad"><code>4f108a3</code></a>
chore(deps): bump golang.org/x/term from 0.45.0 to 0.46.0 (<a
href="https://redirect.github.com/gdamore/tcell/issues/1173">#1173</a>)</li>
<li><a
href="https://github.com/gdamore/tcell/commit/8c45e3b4485db63a055f12892adc478af5a6fb3c"><code>8c45e3b</code></a>
fix(vt): let the segmenter decide clustering, not Go's unicode tables
(<a
href="https://redirect.github.com/gdamore/tcell/issues/1170">#1170</a>)</li>
<li>See full diff in <a
href="https://github.com/gdamore/tcell/compare/v3.5.0...v3.6.0">compare
view</a></li>
</ul>
</details>
<br />
v0.66.2
2026-10-16 09:56:51 +02:00
dependabot[bot] 948fbcc1d6 Bump github.com/gdamore/tcell/v3 from 3.5.0 to 3.6.0
Bumps [github.com/gdamore/tcell/v3](https://github.com/gdamore/tcell) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/gdamore/tcell/releases)
- [Changelog](https://github.com/gdamore/tcell/blob/main/CHANGESv3.md)
- [Commits](https://github.com/gdamore/tcell/compare/v3.5.0...v3.6.0)

---
updated-dependencies:
- dependency-name: github.com/gdamore/tcell/v3
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 07:39:11 +00:00
Stefan Haller c0fa952a94 Bump github.com/cli/go-gh/v2 from 2.13.0 to 2.16.2 (#6128)
Bumps [github.com/cli/go-gh/v2](https://github.com/cli/go-gh) from
2.13.0 to 2.16.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/cli/go-gh/releases">github.com/cli/go-gh/v2's
releases</a>.</em></p>
<blockquote>
<h2>v2.16.2</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): Bump the codeql-actions group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/cli/go-gh/pull/299">cli/go-gh#299</a></li>
<li>chore(deps): Bump the codeql-actions group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/cli/go-gh/pull/308">cli/go-gh#308</a></li>
<li>chore(deps): Bump the codeql-actions group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/cli/go-gh/pull/309">cli/go-gh#309</a></li>
<li>Make ssh tests behavioural with a shared fake ssh by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/311">cli/go-gh#311</a></li>
<li>Fix deprecated API lint findings by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/312">cli/go-gh#312</a></li>
<li>fix: refresh repository identity after SSH translation by <a
href="https://github.com/benekuehn"><code>@​benekuehn</code></a> in <a
href="https://redirect.github.com/cli/go-gh/pull/274">cli/go-gh#274</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/benekuehn"><code>@​benekuehn</code></a>
made their first contribution in <a
href="https://redirect.github.com/cli/go-gh/pull/274">cli/go-gh#274</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/cli/go-gh/compare/v2.16.1...v2.16.2">https://github.com/cli/go-gh/compare/v2.16.1...v2.16.2</a></p>
<h2>v2.16.1</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(api): publish HTTP cache entries without in-place writes by <a
href="https://github.com/baiyuxi930826"><code>@​baiyuxi930826</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/263">cli/go-gh#263</a></li>
<li>fix(repository): honor resolved remote by <a
href="https://github.com/ryux1"><code>@​ryux1</code></a> in <a
href="https://redirect.github.com/cli/go-gh/pull/290">cli/go-gh#290</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/baiyuxi930826"><code>@​baiyuxi930826</code></a>
made their first contribution in <a
href="https://redirect.github.com/cli/go-gh/pull/263">cli/go-gh#263</a></li>
<li><a href="https://github.com/ryux1"><code>@​ryux1</code></a> made
their first contribution in <a
href="https://redirect.github.com/cli/go-gh/pull/290">cli/go-gh#290</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/cli/go-gh/compare/v2.16.0...v2.16.1">https://github.com/cli/go-gh/compare/v2.16.0...v2.16.1</a></p>
<h2>v2.16.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): Bump the codeql-actions group across 1 directory with 2
updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/cli/go-gh/pull/287">cli/go-gh#287</a></li>
<li>Trust canonical host alongside API host by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/289">cli/go-gh#289</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/cli/go-gh/compare/v2.15.0...v2.16.0">https://github.com/cli/go-gh/compare/v2.15.0...v2.16.0</a></p>
<h2>v2.15.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Add per-host API endpoint overrides and a configurable redirect
policy by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/275">cli/go-gh#275</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/cli/go-gh/compare/v2.14.0...v2.15.0">https://github.com/cli/go-gh/compare/v2.14.0...v2.15.0</a></p>
<h2>v2.14.0</h2>
<h2>What's Changed</h2>
<h3>🐛 Fixes</h3>
<ul>
<li>Pin REST API version to <code>2022-11-28</code> by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/213">cli/go-gh#213</a></li>
</ul>
<h3>📚 Docs &amp; Chores</h3>
<ul>
<li>Add CODEOWNERS by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/227">cli/go-gh#227</a></li>
<li>Add Dependabot configuration by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/226">cli/go-gh#226</a></li>
<li>Modernize and harden GitHub Actions workflows by <a
href="https://github.com/williammartin"><code>@​williammartin</code></a>
in <a
href="https://redirect.github.com/cli/go-gh/pull/228">cli/go-gh#228</a>,
<a
href="https://redirect.github.com/cli/go-gh/pull/225">cli/go-gh#225</a>,
and <a
href="https://redirect.github.com/cli/go-gh/pull/243">cli/go-gh#243</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/cli/go-gh/commit/aadf36735579aa6ad2343b2e1b0f5387c22c71f0"><code>aadf367</code></a>
Merge pull request <a
href="https://redirect.github.com/cli/go-gh/issues/274">#274</a> from
benekuehn/fix/repository-ssh-alias</li>
<li><a
href="https://github.com/cli/go-gh/commit/92d8a75df55b1f8ee01ce6417ec19e98d3dac758"><code>92d8a75</code></a>
Fix deprecated API lint findings (<a
href="https://redirect.github.com/cli/go-gh/issues/312">#312</a>)</li>
<li><a
href="https://github.com/cli/go-gh/commit/393ceb0de625637679c4cb815f1b9925af43a875"><code>393ceb0</code></a>
Move remote identity resolution onto git.Remote</li>
<li><a
href="https://github.com/cli/go-gh/commit/1117f898975a6920b4eab909a97a2329236da6fa"><code>1117f89</code></a>
Inline remote translation into Current()</li>
<li><a
href="https://github.com/cli/go-gh/commit/125442e6c297158523daad0820549c6eec15604b"><code>125442e</code></a>
Make repository tests behavioural</li>
<li><a
href="https://github.com/cli/go-gh/commit/0a8aabdd0b27731cacd7ce6130b8b02c540fee7d"><code>0a8aabd</code></a>
Align Current() with gh for last push URL</li>
<li><a
href="https://github.com/cli/go-gh/commit/c04dd5fb0883a5727707ff77c20883ed5d0a7da4"><code>c04dd5f</code></a>
fix: refresh repository identity after SSH translation</li>
<li><a
href="https://github.com/cli/go-gh/commit/61532b98c94e992e17c09df350d05c6b09a0136c"><code>61532b9</code></a>
Make ssh tests behavioural with shared fake ssh (<a
href="https://redirect.github.com/cli/go-gh/issues/311">#311</a>)</li>
<li><a
href="https://github.com/cli/go-gh/commit/3adbe017dcecdb9860cc6fa8838e746ca108d048"><code>3adbe01</code></a>
Make ssh tests behavioural with shared fake ssh</li>
<li><a
href="https://github.com/cli/go-gh/commit/68c032df142b15f041b7b53d5fcae8a918140e69"><code>68c032d</code></a>
chore(deps): Bump the codeql-actions group with 2 updates (<a
href="https://redirect.github.com/cli/go-gh/issues/309">#309</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/cli/go-gh/compare/v2.13.0...v2.16.2">compare
view</a></li>
</ul>
</details>
<br />
2026-10-16 09:37:43 +02:00
dependabot[bot] 3925452438 Bump github.com/cli/go-gh/v2 from 2.13.0 to 2.16.2
Bumps [github.com/cli/go-gh/v2](https://github.com/cli/go-gh) from 2.13.0 to 2.16.2.
- [Release notes](https://github.com/cli/go-gh/releases)
- [Commits](https://github.com/cli/go-gh/compare/v2.13.0...v2.16.2)

---
updated-dependencies:
- dependency-name: github.com/cli/go-gh/v2
  dependency-version: 2.16.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 07:32:44 +00:00
Stefan Haller a489101366 Bump golang.org/x/sync from 0.22.0 to 0.24.0 (#6127)
Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.22.0 to
0.24.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/golang/sync/commit/36f2d70ecde9857dc4e363242a1369c7645d6770"><code>36f2d70</code></a>
errgroup: modernize the usage of closures in goroutines</li>
<li><a
href="https://github.com/golang/sync/commit/f75267d8412fc1dfd12b343644a7ea46e4d9c85d"><code>f75267d</code></a>
semaphore: panic on negative capacity</li>
<li><a
href="https://github.com/golang/sync/commit/3ffd83cb522e5ef49bd2fa50f0c0d63dc152ad1f"><code>3ffd83c</code></a>
all: upgrade go directive to at least 1.26.0 [generated]</li>
<li>See full diff in <a
href="https://github.com/golang/sync/compare/v0.22.0...v0.24.0">compare
view</a></li>
</ul>
</details>
<br />
2026-10-16 09:30:44 +02:00
dependabot[bot] 0c4b646557 Bump golang.org/x/sync from 0.22.0 to 0.24.0
Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.22.0 to 0.24.0.
- [Commits](https://github.com/golang/sync/compare/v0.22.0...v0.24.0)

---
updated-dependencies:
- dependency-name: golang.org/x/sync
  dependency-version: 0.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 07:28:01 +00:00
Stefan Haller 04aca68c68 Bump golang.org/x/sys from 0.47.0 to 0.49.0 (#6125)
Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.47.0 to
0.49.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/golang/sys/commit/b6b8557e8e2974925aec7a136ba0e323eedc5f43"><code>b6b8557</code></a>
unix/linux: unify ppc64x syscall wrappers</li>
<li><a
href="https://github.com/golang/sys/commit/aab6988eff65f762ecf6b757c3571b8a45f40618"><code>aab6988</code></a>
unix: add PrctlArg5Ptr</li>
<li><a
href="https://github.com/golang/sys/commit/cdfd9840b35fca673dd1b27ef69a13b9f5be0d04"><code>cdfd984</code></a>
unix: pass fcntl data as unsafe.Pointer in FcntlF{lock,store} on
darwin</li>
<li><a
href="https://github.com/golang/sys/commit/782b836d3ae6ebda757c7b3800818e737c623614"><code>782b836</code></a>
unix/linux: don't warn about closed stderr from child process</li>
<li><a
href="https://github.com/golang/sys/commit/61592fb02e581c922feaf3d9ada8547488b70964"><code>61592fb</code></a>
unix: return syscall error in *listxattrNS on BSD</li>
<li><a
href="https://github.com/golang/sys/commit/c136fdad42c8b16318f29da74e73194c779ba862"><code>c136fda</code></a>
unix/linux/Dockerfile: update to Go 1.26.8</li>
<li><a
href="https://github.com/golang/sys/commit/f1d0d79251083d5d223af16c0d8c5207a355c627"><code>f1d0d79</code></a>
unix: pass xattr data as unsafe.Pointer in BSD xattr syscalls</li>
<li><a
href="https://github.com/golang/sys/commit/67f850b71cbdd0a9bb58e2c45cb487ab5a72f83f"><code>67f850b</code></a>
unix: update linux to v7.2</li>
<li><a
href="https://github.com/golang/sys/commit/eb1f6591861ee38df32e043d27508fd1effa4854"><code>eb1f659</code></a>
unix: add O_EXEC and O_SEARCH on darwin</li>
<li><a
href="https://github.com/golang/sys/commit/51bc73186f49d1a8f85b1fa28d0c14585ac812cd"><code>51bc731</code></a>
unix: add Mmsghdr for linux</li>
<li>Additional commits viewable in <a
href="https://github.com/golang/sys/compare/v0.47.0...v0.49.0">compare
view</a></li>
</ul>
</details>
<br />
2026-10-16 09:26:57 +02:00
dependabot[bot] fb3fb338ef Bump golang.org/x/sys from 0.47.0 to 0.49.0
Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.47.0 to 0.49.0.
- [Commits](https://github.com/golang/sys/compare/v0.47.0...v0.49.0)

---
updated-dependencies:
- dependency-name: golang.org/x/sys
  dependency-version: 0.49.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 06:21:40 +00:00
Stefan Haller cab9e7deca Bump go version to 1.26 (#6137)
Some of our dependencies require 1.26 now, in particular golang.org/x.
2026-10-16 08:20:39 +02:00
Stefan HallerandClaude Opus 5.5 5ef318ef77 Update go to 1.26
Dependabot PRs that update golang.org/x modules fail on CI. These
modules now require go 1.26, but CI runs 1.25. The golang.org/x modules
require the oldest Go release that is still supported, and since Go
1.27 came out, this is 1.26.

Stop at 1.26 rather than going to 1.27. The go version in go.mod is the
minimum for everyone who builds lazygit from source, and Go 1.27 is
only two months old. Also, Go 1.27 requires macOS 13, so release
binaries built with it would no longer run on macOS 12.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 08:05:49 +02:00
Stefan HallerandClaude Opus 5.5 5e3cd6b540 Set the Go version of the CI workflow in one place
Updating Go means editing the go-version of six setup-go steps in
ci.yml. The workflow defines a GO_VERSION variable for this, but no
step has used it since it was added in a34bdf1a04.

Use it in all six steps. Give its value the ".x" suffix so that
setup-go keeps picking the latest patch release. This also keeps YAML
from reading a version like 1.30 as the number 1.3.

release.yml still needs its own update, because env variables don't
carry over to other workflows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 08:05:49 +02:00
Stefan HallerandClaude Opus 5.5 c3a051dcca Use Sprint for text that isn't a format string
Two places pass plain text as the format string of TextStyle.Sprintf
without further arguments: the prefix of a disabled menu item's
tooltip, and the key binding entries of the options bar. If the text
contains a "%", for example in a translation or in a key label, it is
mangled into something like "%!(NOVERB)".

go vet doesn't report these calls yet. It will once go.mod says go
1.26, because vet then also finds printf wrappers through interface
methods. TextStyle.Sprintf forwards to the Sprintf method of the
Sprinter interface.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 07:53:03 +02:00
Stefan Haller 9bb7ac77b2 Bump github.com/xo/terminfo from 1.0.0 to 1.2.0 (#6053)
Bumps [github.com/xo/terminfo](https://github.com/xo/terminfo) from
1.0.0 to 1.2.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xo/terminfo/releases">github.com/xo/terminfo's
releases</a>.</em></p>
<blockquote>
<h2>terminfo v1.2.0</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/xo/terminfo/compare/v1.1.0...v1.2.0">https://github.com/xo/terminfo/compare/v1.1.0...v1.2.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/xo/terminfo/commit/c203b35f1e27854a768ec0e95c1ca692d87da606"><code>c203b35</code></a>
Cleanup code</li>
<li><a
href="https://github.com/xo/terminfo/commit/ce65c9f3caca6edff17e484cace20c14a52e17f0"><code>ce65c9f</code></a>
Fix escaping issue for older ncurses</li>
<li><a
href="https://github.com/xo/terminfo/commit/7ff4e870ecf750b6a7c636e4bf8e8a268b33a909"><code>7ff4e87</code></a>
Fix tests</li>
<li><a
href="https://github.com/xo/terminfo/commit/79cb10a9514e29e8a93daecd07b5a88319373910"><code>79cb10a</code></a>
Read lowercase terminfo variables from local storage</li>
<li><a
href="https://github.com/xo/terminfo/commit/7fb97dc7aeb1f48992954faf8f7dfe7ee9d62bb0"><code>7fb97dc</code></a>
Canonicalize ACS mappings by source character</li>
<li><a
href="https://github.com/xo/terminfo/commit/983082b98a44a0ba9067fbba8d6805513eb40eb3"><code>983082b</code></a>
Finish scanning formatted parameters after the conversion verb</li>
<li>See full diff in <a
href="https://github.com/xo/terminfo/compare/v1.0.0...v1.2.0">compare
view</a></li>
</ul>
</details>
<br />
2026-10-16 07:36:33 +02:00
dependabot[bot] 8d6385e2eb Bump github.com/xo/terminfo from 1.0.0 to 1.2.0
Bumps [github.com/xo/terminfo](https://github.com/xo/terminfo) from 1.0.0 to 1.2.0.
- [Release notes](https://github.com/xo/terminfo/releases)
- [Commits](https://github.com/xo/terminfo/compare/v1.0.0...v1.2.0)

---
updated-dependencies:
- dependency-name: github.com/xo/terminfo
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 05:33:53 +00:00
Stefan Haller 0ea23813f1 README.md: Update Sponsors (#6038)
Automated changes by
[create-pull-request](https://github.com/peter-evans/create-pull-request)
GitHub action
2026-10-16 07:32:45 +02:00
github-actions[bot] 4bedea5a23 README.md: Update Sponsors 2026-10-16 05:30:14 +00:00
Stefan Haller 5e244a9d97 Fix "Jump to File" menu showing only half of the entries, in some rare cases (#6136)
When opening the `<ctrl+g>` files menu exactly at the moment where a
background fetch finishes, it could sometimes only show some of its
entries. The same could happen when pressing `>` to jump to the end of a
long diff at that moment.
2026-10-16 07:29:58 +02:00
Stefan HallerandClaude Opus 5.5 b8b9c8ad2b Leave reads to the end to the task that replaces the one reading
Some actions read the content of the main view to the end before they
act on it: the jump-to-file menu, going to the bottom, searching, and
jumping to a file from the diffstat. If a re-render replaces the task
while it reads, these actions are told that the content has been read
although only a part of it has, so the menu lists only the files in
that part. A background fetch re-renders the main view once a minute,
so now and then the menu is incomplete. The same happens if a read is
asked for after a render has been asked for but before its task has
started.

These actions act on the content of the task asked for last, so leave
the reads waiting for content to that task. Hold them from the moment
the task is asked for, hand over the ones a replaced task hasn't
answered, including the one it was reading for, and answer them once
the task asked for last has given the view all of its content. The
replacing task still reads its own first lines first, so that the reads
it takes over don't delay its first paint.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 07:14:39 +02:00
Stefan HallerandClaude Opus 5.5 ebd53371eb Add a test for a read to the end that a re-render interrupts
Some actions read the content of the main view to the end before they
act on it. For example, the jump-to-file menu lists the files of the
diff. If the task reading the content is replaced by a re-render while
it reads, these actions act on the part that has been read so far, so
the menu shows only some of the files. A background fetch re-renders
the main view, so this happens now and then.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 07:14:39 +02:00
Stefan Haller 4c2ce238a9 Improve display and handling of deleted submodules and nested repos/worktrees (#6134) 2026-10-15 21:29:34 +02:00
Stefan HallerandClaude Opus 5.5 a75b0457c1 Ask before discarding a nested repository if that loses anything
Discarding a nested repository deletes its directory like that of any
untracked file. If the repository keeps its git dir in its directory,
this deletes all of its history, and nothing said so. The directory of
a removed submodule keeps its git dir elsewhere, but it may have
changes that aren't committed.

Check for both before discarding. If anything would be lost, list it
and ask for confirmation.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 9009083f55 Don't stage nested repositories when committing with nothing staged
If nothing is staged, committing offers to stage all files first, or
stages them without asking if gui.skipNoStagedFilesWarning is set. Like
staging all files in the files panel, this adds a nested repository as
an embedded repository.

Show why the nested repository can't be staged instead, as staging all
files in the files panel does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 a2cf915f8d Don't stage nested repositories
If you staged the directory of a removed submodule, a nested repository
or a worktree inside the repo, git added it as an embedded repository: a
gitlink without an entry in .gitmodules. For a removed submodule, this
brings it back in a broken state. git warns about it, but lazygit didn't
show the warning. Staging all files did the same to every such
directory.

Disable staging a selection that contains one of these, and disable
staging all files if that would stage one. The disabled reason tells you
how to get rid of it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 d2675b7dea Extract stageAllScope from toggleStagedAllWithLock
Whether stage-all may be used is going to depend on what it stages.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 35909f65d8 Explain the directories that git status reports as a whole
Selecting one of these in the files panel showed the error "Could not
access 'modules/sub/null'". The main view showed the entry's diff
against /dev/null with --no-index, as for an untracked file. When git
compares a file with a directory that way, it looks for a file of the
same name inside the directory.

Show what the directory is and what to do about it instead. Below that,
show the status of the repository that it is, or the files in it if it
is a plain directory. The status tells you whether discarding the
directory would lose anything.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 d8d11434a4 Extract wrapForReadability from conflictResolutionHint
More messages for the main view are going to need it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 e2a29a6d77 Remove a worktree inside the repo properly when discarding it
If a linked worktree lives inside the repo's working tree, it shows up
in the files panel. Discarding it there deleted its directory like that
of any untracked file. git still had the worktree on record, so the
worktrees panel listed it as missing, and its branch couldn't be checked
out anywhere else until the worktree was pruned.

Show the same menu for removing the worktree as the worktrees panel
does. Like a submodule, a worktree can't be discarded together with
other entries, because it has a menu of its own.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 3ffcc0c7b0 Extract worktreeOfFile from markWorktreeFiles
The files panel is going to need to find the worktree of an entry too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 875641557b Move the menu for removing a worktree to BranchesHelper
The files panel is going to show it too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 0380dd4851 Label the directories that git status reports as a whole
The files panel shows such a directory like an untracked file. Nothing
tells you that it is a directory, or that a submodule left it behind
when a commit that you checked out removed the submodule. This is the
case for the directory of a removed submodule, a nested repository, a
linked worktree inside the repo, and any untracked directory if
status.showUntrackedFiles is "normal".

Tell these apart when loading the files, by looking at the directory's
.git. Label removed submodules, nested repositories and worktrees, as we
already do for submodules, and put a slash after the name of a plain
directory, as git status does. With file icons on, a removed submodule
gets the submodule icon, and a nested repository or a plain directory
gets the directory icon.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 20:51:34 +02:00
Stefan HallerandClaude Opus 5.5 8a2d9758e0 Move gitDirOfRepo to git_commands
The file loader is going to need it too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 09:13:12 +02:00
Stefan HallerandClaude Opus 5.5 8b79e1dc1f Translate the "submodule" label in the files panel
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 09:13:12 +02:00
Stefan HallerandClaude Opus 5.5 2ddeebca72 Show a directory that git status reports as a whole as a single entry
git status doesn't descend into a nested repository, such as the
directory that a removed submodule leaves behind. It reports the
directory as a whole, with a trailing slash. The file tree splits paths
at slashes, so it showed a directory with a file without a name in it.
Discarding the directory removed it, but then the cleanup of emptied
directories took the parent of "modules/sub/" to be "modules/sub"
itself, and failed to read it.

Take the slash off when loading the files. This also covers any
untracked directory if status.showUntrackedFiles is "normal", and linked
worktrees inside the repo. Their slash was taken off when they were
marked as worktrees; this is no longer needed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 09:13:12 +02:00
Stefan HallerandClaude Opus 5.5 165b4bb499 Add a test for discarding the directory of a removed submodule
If a commit that you check out or pull removes a submodule, git leaves
the submodule's directory behind, and git status reports it as an
untracked directory. The files panel shows that directory with a file
below it that has no name. Discarding the directory shows an error,
even though the directory is gone afterwards.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 09:09:49 +02:00
Stefan Haller a0fa1becdb Exit gracefully when a repo or worktree gets deleted from under lazygit (#6129)
If the current worktree (or repo) that lazygit has open gets deleted
externally, lazygit used to crash with a panic. Exit gracefully in that
case, showing an error that the directory git deleted.

Also fix a crash for the more exotic case where a linked worktree's
directory is deleted and another worktree is created in the same
location. Users shouldn't do this, but it's still nicer to handle this
more gracefully.

Fixes #5266.
2026-10-15 09:06:13 +02:00
Stefan HallerandClaude Opus 5.5 4b61c4b650 Quit with an error message when the repo or worktree is deleted
If the repo or linked worktree that lazygit has open is deleted while
lazygit is running, every git command fails. lazygit no longer panics
since the previous commit, but it shows empty lists, and there's
nothing useful left to do in it.

Check at the start of every refresh whether the worktree and its git
dir still exist. If one of them is gone, quit and print its path in
the terminal. The background files refresh does this check too, so
lazygit quits within ten seconds even if nobody is using it. To quit
from a refresh, return an error that wraps gocui.ErrQuit; this keeps
it out of the error popup.

Switching to another worktree or to a recent repo would be an
alternative, but it would be more surprising than quitting. Also,
there isn't always a main worktree to switch to.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan HallerandClaude Opus 5.5 787a309b3a Begin blocking input after capturing the refresh's baseline
The next commit makes performRefresh return early right after the
capture, and it must not leave the input blocked when it does.

This doesn't let any keypress slip through before the block begins.
Only refreshes on the UI thread block input, and there the capture
runs synchronously.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan HallerandClaude Opus 5.5 4d288579ee Don't panic when listing the branches fails
If the repo that lazygit has open is deleted while lazygit is running,
the next full refresh panics. The same happens for a linked worktree
that is deleted. In both cases `git for-each-ref` fails because its
working directory is gone, and BranchLoader panics when that happens.

Return the error instead. The branches refresh logs it, like it does
with the other errors it gets from loading the branches.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan HallerandClaude Opus 5.5 82207df464 Add a test for loading branches when listing them fails
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan HallerandClaude Opus 5.5 ebee95b847 Fix crash when two worktrees have the same path
If a linked worktree's directory is deleted and another worktree is
moved to the same path, `git worktree list` reports both worktrees with
that path. lazygit then crashes at startup with a stack overflow, and
the terminal is left in a broken state.

To tell the paths in a group apart, getUniqueNamesFromPathsAux keeps
looking at one more parent directory, but identical paths never come
apart, so it recurses forever. A stack overflow is a fatal error rather
than a panic. No deferred function runs, so the terminal is not
restored either.

Name identical paths like a single path instead of recursing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan HallerandClaude Opus 5.5 29e8c79ff5 Extract a helper for trimming the slashes around a worktree path
The next commit compares worktree paths with their slashes trimmed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan HallerandClaude Opus 5.5 1c79c830f8 Cleanup: make WorktreeLoader.pathExists return what its name says
It returns true if the path is missing. It started out as
IsWorktreePathMissing, and was renamed without inverting its result
when it moved into the loader in de57cfd6ff.

Invert the result instead of renaming it back, so that the call site
reads `IsPathMissing: !self.pathExists(path)`. If we can't check the
path, it still counts as existing, as it always did.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 08:35:00 +02:00
Stefan Haller 88c339a907 Restore the terminal more reliably after a panic (#6124)
We already have a mechanism in place that takes care of restoring the
terminal if a panic occurs, but it was not consistently used. Use it for
all goroutines, and add a test that guards against forgetting it when we
add new ones.
2026-10-14 20:42:55 +02:00
Stefan HallerandClaude Opus 5.5 cb61dc2432 Add a test that checks that every goroutine is guarded against panics
When starting a new goroutine, it is easy to forget utils.Safe, and
nothing tells us until a panic in it leaves somebody's terminal
broken.

The test parses our source files and reports go statements that don't
run utils.Safe. It also reports functions given to time.AfterFunc or
to a Go method, such as errgroup.Group.Go, that aren't wrapped with
utils.SafeFunc or utils.SafeFuncWithError. It only looks at the
syntax; this is good enough because the names involved are
distinctive.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 20:28:53 +02:00
Stefan HallerandClaude Opus 5.5 7a9e4bee23 Restore the terminal if a timer or errgroup function panics
time.AfterFunc and errgroup.Group.Go run the function they are given
on a goroutine of their own, so a panic in it leaves the terminal in
raw mode, like a panic in any other goroutine that doesn't use
utils.Safe.

Add utils.SafeFunc and utils.SafeFuncWithError, which return a copy
of a function that runs through utils.Safe or utils.SafeWithError, and
use them for the functions given to time.AfterFunc and errgroup.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 20:28:53 +02:00
Stefan HallerandClaude Opus 5.5 73fac4a554 Restore the terminal if a goroutine panics
Most goroutines run their function through utils.Safe, which closes
the screen if the function panics. Without it, the panic is printed to
a terminal that is still in raw mode and on the alternate screen, and
the terminal needs a reset afterwards. Go has no process-wide hook for
panics, so every goroutine has to do this itself.

Use utils.Safe for the goroutines that don't use it yet.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 20:28:53 +02:00
Stefan HallerandClaude Opus 5.5 6042e1c28b Restore the terminal if one of gocui's goroutines panics
A panic in the goroutine that polls the terminal for events leaves the
terminal in raw mode and on the alternate screen. The panic is then
hard to read, and the terminal needs a reset afterwards.

Guard this goroutine the same way as the worker goroutines. Guard the
goroutines that send a resize event too; they are unlikely to panic,
but this way all of gocui's goroutines are guarded, and a check for
unguarded goroutines doesn't need any exceptions.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 20:28:53 +02:00
Stefan HallerandClaude Opus 5.5 d8972194d5 Extract gocui's guard against panics in workers into a helper
The next commit uses it for gocui's other goroutines.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 20:28:53 +02:00
Stefan Haller b616791c70 Make double-click detection more precise (#6123)
Lazygit decided whether two clicks form a double click based on the
times it handled them. This can lead to false results: if the first
click takes the UI thread more then 500ms to handle, then the second
click is not detected as a double click even when it happened quickly
after the first. Conversely, if two clicks happen a second apart while
the main loop is busy, they are handled quickly once the main loop
unblocks, and got detected as a double-click.

I never actually ran into either of these problems in practice, and we
try hard to prevent lazygit from blocking the UI for longer than
necessary. I only noticed this because an integration test that performs
a double click occasionally fails when the CI runner is under heavy
load.

Fix this by recording the times at which the events were received, and
use those for double-click detection.
2026-10-14 16:49:22 +02:00
Stefan HallerandClaude Opus 5.5 94a3070f02 Time double clicks by when the clicks were read
gocui decides whether two clicks form a double click by the time it
handles them. If handling the first click keeps the main loop busy for
more than 500ms, a quick second click doesn't count as a double click.
The other way round, two separate clicks that wait in the event queue
while the main loop is busy count as a double click.

Compare the times at which tcell read the clicks instead. For events
replayed by integration tests, this is the time the test created them.
This way, a DoubleClick in a test no longer depends on how fast lazygit
handles the first click.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 14:17:47 +02:00