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

Add a copy-to-clipboard menu to the file view (with diff copy options) #3104

Merged
merged 3 commits into from
Dec 7, 2023

Conversation

AzraelSec
Copy link
Contributor

PR Description
This PR introduces a new menu available in the file view, which allows the user to copy to the clipboard:

  • the file/directory name
  • the selected file/directory diff
  • the staged files diff
  • the currently changed files diff

This PR closes #3079.

  • Please check if the PR fulfills these requirements
  • Cheatsheets are up-to-date (run go generate ./...)
  • Code has been formatted (see here)
  • Tests have been added/updated (see here for the integration test guide)
  • Text is internationalised (see here)
  • Docs (specifically docs/Config.md) have been updated if necessary
  • You've read through your own file changes for silly mistakes etc

@mark2185 mark2185 added the enhancement New feature or request label Nov 4, 2023
@mark2185
Copy link
Collaborator

mark2185 commented Nov 4, 2023

Regarding the failing tests, we need to emulate the clipboard, take a look at this test.

@AzraelSec AzraelSec force-pushed the file-copy-menu branch 2 times, most recently from cdf6717 to f49fd75 Compare November 5, 2023 10:19
@AzraelSec
Copy link
Contributor Author

Regarding the failing tests, we need to emulate the clipboard, take a look at this test.

Thank you for the suggestion, @mark2185! 🙏🏻

if path == "" {
return self.c.ErrorMsg(copyFileDiffNoItemSelectionErr)
}
diff, err := self.c.Git().Diff.GetPathDiff(path)
Copy link
Collaborator

Choose a reason for hiding this comment

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

This will copy only the unstaged changes?

I tried staging something and then using y and Copy diff from selected path to clipboard, but it copied only the unstaged changes which was not what I expected. (I don't know what exactly I expected, but definitely not only unstaged changes :) )

And if the entire file is staged, this will clear the clipboard which is not really desired. Either the menu option text could be clarified, or the code is faulty. What would people want to copy most often, staged changes maybe?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Mh, good catch @mark2185! I think there's no way to copy both staged and unstaged changes using a specific path (now I get what Jesse was referring to when we discussed this on the issue). Would it make sense to substitute that option with two more specific Copy unstaged diff from selected path to clipboard + Copy staged diff from selected path to clipboard? Or is it better to just choose one of those? 🤔

Also, I can check if the resulting buffer is empty, and in that case, avoid copying it into the clipboard. Maybe we should notify the user in that case, right?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think there's no way to copy both staged and unstaged changes using a specific path (now I get what Jesse was referring to when we discussed this on the issue)

git diff HEAD <file> gives you both staged and unstaged changes.

Or is it better to just choose one of those? 🤔

I'm pretty sure the Copy staged diff will be enough, I doubt anyone would want to stage some hunks and then copy everything else.

Also, I can check if the resulting buffer is empty, and in that case, avoid copying it into the clipboard. Maybe we should notify the user in that case, right?

Yep, an alert with "Nothing to copy" would suffice.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think it would make sense to copy the staged changes if the selected path has any, or the unstaged changes if not.

Same for all files: copy the staged changes of all (staged) files if there are any, or the unstaged changes if not.

Also, I don't think it needs to differentiate these in the text of the menu entries: "diff of selected file" and "diff of all files" seems intuitive enough to cover all cases.

BTW, for consistency with the y command in the commits panel I would leave out all the redundant "Copy xxx to clipboard" in the menu entries; I'd just make it

Title: Copy to clipboard
---
n File name
s Diff of selected file
a Diff of all files

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thanks, @mark2185 @stefanhaller, for the feedback! The solution described by @stefanhaller keeps everything clean and reasonably straightforward: the new implementation should follow your indications. I'm still not 100% sure that the staged vs unstaged behaviour is intuitive enough not to justify a tooltip, but I'd like to avoid making that UI heavier, either. I think it can be as is.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Ah, I didn't consider tooltips. I think it would make sense to add one here. My only question would be if it should be dynamic, i.e. describing what happens in this particular situation based on whether something is staged, or describe in a more general way what the logic is. Maybe the latter is actually better, so that people can learn how it works.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I actually agree with keeping it fixed so that the users get use to that pattern. We could end up applying a similar logic elsewhere in the future. I'll add a tooltip with a static content.

@peppy
Copy link
Sponsor

peppy commented Nov 6, 2023

I'll just add here that I use a custom key bind setup to do something roughly similar to this:

    - key: 'D'
      prompts:
        - type: 'menu'
          title: 'Clipboard diff'
          options:
            - name: 'apply'
              value: 'pbpaste | git apply -'
            - name: 'copy'
              value: 'git diff | pbcopy'

The ability to also apply a diff from the clipboard is really helpful to me, so I think it may be worth considering!

@mark2185
Copy link
Collaborator

mark2185 commented Nov 6, 2023

The ability to also apply a diff from the clipboard is really helpful to me, so I think it may be worth considering!

Sounds useful, just to add that that could be a better fit for the Custom patch feature, where if it is empty and the user presses <C-P>, we could prompt with "Do you want to build a custom patch from your clipboard?"

@stefanhaller
Copy link
Collaborator

The ability to also apply a diff from the clipboard is really helpful to me, so I think it may be worth considering!

@peppy I'd be curious in what scenarios you are using this, and whether this can't be done better with either copy/pasting commits or custom patches. Where are you getting those diffs from?

Sounds useful, just to add that that could be a better fit for the Custom patch feature, where if it is empty and the user presses <C-P>, we could prompt with "Do you want to build a custom patch from your clipboard?"

This wouldn't fit well with lazygit's custom patch concept. A custom patch needs to reference a commit, so that you can do operations like "move into new commit" or "move into index". With your suggestion, we'd have to disable those commands if the patch came from a clipboard, which doesn't feel right.

@peppy
Copy link
Sponsor

peppy commented Nov 6, 2023

@peppy I'd be curious in what scenarios you are using this, and whether this can't be done better with either copy/pasting commits or custom patches. Where are you getting those diffs from?

It's a very common flow for us to share patches via github (example PR):

CleanShot.2023-11-06.at.07.57.55.mp4

Copy link
Collaborator

@mark2185 mark2185 left a comment

Choose a reason for hiding this comment

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

Just a few comments.


return self.c.Menu(types.CreateMenuOptions{
Title: self.c.Tr.CopyToClipboardMenu,
Items: []*types.MenuItem{
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why not a check for this as well?

If there are no staged nor unstaged changes, why even give the user the option?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I remember a discussion we had on a previous PR, where we decided it was better to avoid hiding elements in favor of disabling/explicitly throwing errors to make the UI cleaner. I may be wrong, but I think it's better to give some feedback instead of disabling the shortcut/hiding the feature. I'd prefer to keep this as is if you're happy with it.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I agree here. We should have all commands visible, and disable the ones that are not applicable. In the case of a menu like this, it can result in all menu items being disabled, which I think is fine. It helps new users learn what commands exist.

})
}

func (self *FilesController) hasStagedChanges() bool {
Copy link
Collaborator

Choose a reason for hiding this comment

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

We already have this functionality here, just use self.c.Helpers().WorkingTree.AnyStagedFiles() on line 808.

{
Label: self.c.Tr.CopyAllFilesDiff,
OnPress: func() error {
diff, err := self.c.Git().Diff.GetAllDiff(self.hasStagedChanges())
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why not just use self.getSelectedFile().HasStagedChanges ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'll use the self.c.Helpers().WorkingTree.AnyStagedFiles() method here, as you suggested. Did you mean to use the self.getSelectedFile().HasStagedChanges on line 786 instead?

Skip: false,
SetupConfig: func(config *config.AppConfig) {
config.UserConfig.OS.CopyToClipboardCmd = "echo {{text}} > clipboard"
}, SetupRepo: func(shell *Shell) {}, Run: func(t *TestDriver, keys config.KeybindingConfig) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Please put the Run member on a newline, it's easier to parse.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, totally. I probably messed this up while changing the test. Thanks.

@stefanhaller
Copy link
Collaborator

It's a very common flow for us to share patches via github (example PR):

I see, makes sense. My feeling is that applying a patch from the clipboard should be a separate command (if we can find a free key binding for it), so I'd keep that out of this PR.

return false
}

func (self *FilesController) hasPathStagedChanges() bool {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@mark2185, I tried substituting this function for self.getSelectedFile().HasStagedChanges, but this only works for files. If you select a directory, getSelectedFile() returns nil. Are you happy to stick with this helper method?

Copy link
Collaborator

@stefanhaller stefanhaller left a comment

Choose a reason for hiding this comment

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

I finally had some time to have a closer look, and found a few things that could be improved.

Comment on lines 17 to 20
NewGitCmd("diff").
Arg("--submodule", "--no-ext-diff", "--color").
Arg(diffArgs...).
ToArgv(),
Copy link
Collaborator

Choose a reason for hiding this comment

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

It took me a while of staring at this hunk to figure out that there's no change here other than formatting. I'd drop this to make future readers' lives easier.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, I should have put that in a different commit, sorry for the confusion. I'll drop it.

Comment on lines 759 to 762
copyNameNoItemSelectionErr := utils.ResolvePlaceholderString(
self.c.Tr.FileCopyNoItemSelectedError,
map[string]string{"target": "name"},
)
Copy link
Collaborator

Choose a reason for hiding this comment

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

This doesn't work; you are putting a non-translated string into a placeholder of a translated string.

If you are thinking about solving this by making "name" a translated string too, please don't. Stitching together translated strings like this is not good practice; in other languages the grammar might be sufficiently different to make this hard to translate. Also, it's not obvious to translators how the strings are used. If you must have different texts for the different cases, you should duplicate the whole strings. However, in this case I don't think it's worth it, I'd just try to come up with a generic wording that works for all cases.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

You're right; I was focusing on the code and didn't think about this. I'll put in there a generic string - I think it's not worth duplicating the strings. Thanks for pointing that out.

Label: self.c.Tr.CopyFileName,
OnPress: func() error {
name := self.context().GetSelectedItemId()
if name == "" {
Copy link
Collaborator

Choose a reason for hiding this comment

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

This shouldn't be possible. We should set disabledReasons for all commands in all cases where a command isn't applicable, so that we never have to return errors from handlers.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I was honestly unsure if it was worth it adding this check (that yes, should be not necessary given the disabledReason), so I've added it as an "extra check". It's fine for me to remove it (and the others).

Tooltip: self.c.Tr.CopyFileDiffTooltip,
OnPress: func() error {
path := self.context().GetSelectedPath()
if path == "" {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Same here, this shouldn't be possible.

}

func (self *FilesController) copyToClipboard(content string) error {
if content == "" {
Copy link
Collaborator

Choose a reason for hiding this comment

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

I would be happier if we could check this in advance too, and disable the commands with an appropriate disabledReason, instead of having to check afterwards.

As far as I can tell, this can only happen when you copy the diff for a file, and the file is untracked (or for a directory which has only untracked children), or when you copy the diff for all files, and there aren't any (or only untracked ones). It should be possible to check for all of this up front. Or am I missing some other case?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No, you're not missing any case (as far as I know). I thought it would have been safer/simpler to implement this as is, but it should be reasonably simple to check for all the cases that return an empty string and turn off the action in advance. If we're missing some cases, we'll see them showing in the issue section, and it'll be straightforward to patch them.

Copy link
Collaborator

@stefanhaller stefanhaller left a comment

Choose a reason for hiding this comment

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

Next round of reviews; sorry that it took so long again. Found a few more things...

})
}

func (self *FilesController) anyPathTrackedFile(node *filetree.FileNode) bool {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Would it make sense to make this a method of FileNode (i.e. move it to file_node.go)? It could be called GetHasStagedOrUnstagedChanges (see below).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, it makes sense. Moved.

Comment on lines 832 to 837
for _, file := range stagedFiles {
if file.Tracked {
return true
}
}
return false
Copy link
Collaborator

Choose a reason for hiding this comment

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

This is not quite the logic we need here. For an untracked file, staging it is good enough to get a diff from it, so this block can just be replaced by return true. The function name is then not quite accurate any more, so maybe use StagedOrTracked instead of just Tracked, or maybe StagedOrUnstagedChanges (if we move it to FileNode, see above).

Also, you don't need GetStagedFiles any more, GetHasStagedChanges is enough.

Comment on lines 846 to 851
for _, stagedFile := range stagedFiles {
if stagedFile.Tracked {
return true
}
}
return false
Copy link
Collaborator

Choose a reason for hiding this comment

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

Same here, so maybe call this anyStagedOrTrackedFile.

if err := self.c.OS().CopyToClipboard(content); err != nil {
return self.c.Error(err)
}
self.c.Toast(self.c.Tr.FileContentCopiedToast)
Copy link
Collaborator

Choose a reason for hiding this comment

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

OK, I know I argued for a generic text for all items, but that was for the disabled reasons, where I think it's ok. For the toast I find it important to say which item was copied, as a confirmation that you copied the right thing. We also do this for the y menu for commits, see here.

pkg/gui/filetree/file_node.go Outdated Show resolved Hide resolved
Comment on lines 307 to 309
if self.IsFile() {
return path.Base(self.Path)
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why do this only for files? I would expect to be able to copy the name of a directory too, and get just the name. In other words, I'd just always return path.Base(self.Path), unconditionally.

Copy link
Collaborator

@stefanhaller stefanhaller left a comment

Choose a reason for hiding this comment

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

Excellent work, this is looking really good now. I have a few last nitpicks below. (I missed these in the first reviews, so that's totally my fault. Sorry for that!)

Also, when you rebase on master you'll get a CI failure because we now have a json schema for the config file which needs to be updated any time we touch user_config.go. To fix that, call make generate and commit the changed schema file.

Label: self.c.Tr.CopySelectedDiff,
Tooltip: self.c.Tr.CopyFileDiffTooltip,
OnPress: func() error {
path, hasStaged := self.context().GetSelectedPath(), self.hasPathStagedChanges(node)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Style nitpick: I'd make this two lines, one for each variable.

Label: self.c.Tr.CopyAllFilesDiff,
Tooltip: self.c.Tr.CopyFileDiffTooltip,
OnPress: func() error {
diff, err := self.c.Git().Diff.GetAllDiff(self.c.Helpers().WorkingTree.AnyStagedFiles())
Copy link
Collaborator

Choose a reason for hiding this comment

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

Nitpick: I'd extract a hasStaged := self.c.Helpers().WorkingTree.AnyStagedFiles() variable, it makes this block more analogous to the one before.

Comment on lines 872 to 873
NoContentToCopyError: "Nothing to copy",
FileCopyNoItemSelectedError: "You need to select a file/directory",
Copy link
Collaborator

Choose a reason for hiding this comment

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

I'm not sure it's worth distinguishing between the two cases. The second one is actually a bit misleading when you select an untracked file, or a directory with only untracked files, because the user did select a file, just not a tracked or staged one. Personally I feel it's good enough to show "Nothing to copy" in all cases.

@AzraelSec
Copy link
Contributor Author

Excellent work, this is looking really good now. I have a few last nitpicks below. (I missed these in the first reviews, so that's totally my fault. Sorry for that!)

Thank you, @stefanhaller. And no worries - there's nothing to apologize for! I have also been quite busy in the last weeks, sorry for the delay on the fixes. It should now ready to go, but I'm happy to work again on this if you catch something else we could improve.

Also, when you rebase on master you'll get a CI failure because we now have a json schema for the config file which needs to be updated any time we touch user_config.go. To fix that, call make generate and commit the changed schema file.

I updated the json schema file in 921c4e5, but the action failed again. Also, reading the error it seems to me that we're passing an empty string to the runner - may it be a missing secret or something similar?

@stefanhaller
Copy link
Collaborator

Thanks for addressing all my nitpicking. Again, great work!

I updated the json schema file in 921c4e5, but the action failed again.

That's a different action, it's unrelated to the json schema. We had this in other PRs, Jesse said he'd look into it. I have no idea what it's about, and I'll just ignore it here again.

@stefanhaller stefanhaller merged commit a8a4211 into jesseduffield:master Dec 7, 2023
13 of 14 checks passed
@AzraelSec
Copy link
Contributor Author

Thanks @stefanhaller! 🤟🏻 See you on the next PR!

renovate bot added a commit to scottames/dots that referenced this pull request Mar 26, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [aquaproj/aqua-registry](https://github.com/aquaproj/aqua-registry)
| minor | `v4.154.0` -> `v4.155.1` |
| [cli/cli](https://github.com/cli/cli) | minor | `v2.45.0` ->
`v2.46.0` |
| [derailed/k9s](https://github.com/derailed/k9s) | patch | `v0.32.3`
-> `v0.32.4` |
| [eza-community/eza](https://github.com/eza-community/eza) | patch |
`v0.18.7` -> `v0.18.8` |
| [golangci/golangci-lint](https://github.com/golangci/golangci-lint)
| minor | `v1.56.2` -> `v1.57.1` |
|
[gruntwork-io/terragrunt](https://github.com/gruntwork-io/terragrunt)
| patch | `v0.55.16` -> `v0.55.20` |
| [jesseduffield/lazygit](https://github.com/jesseduffield/lazygit) |
minor | `v0.40.2` -> `v0.41.0` |
| [junegunn/fzf](https://github.com/junegunn/fzf) | patch | `0.48.0`
-> `0.48.1` |
| [lsd-rs/lsd](https://github.com/lsd-rs/lsd) | minor | `v1.0.0` ->
`v1.1.2` |
| [mikefarah/yq](https://github.com/mikefarah/yq) | minor | `v4.42.1`
-> `v4.43.1` |
| [simulot/immich-go](https://github.com/simulot/immich-go) | minor |
`0.12.0` -> `0.13.0` |
| [snyk/cli](https://github.com/snyk/cli) | minor | `v1.1284.0` ->
`v1.1286.0` |
| [starship/starship](https://github.com/starship/starship) | minor |
`v1.17.1` -> `v1.18.1` |
| [twpayne/chezmoi](https://github.com/twpayne/chezmoi) | patch |
`v2.47.1` -> `v2.47.2` |
| [weaveworks/eksctl](https://github.com/weaveworks/eksctl) | minor |
`v0.174.0` -> `v0.175.0` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>aquaproj/aqua-registry (aquaproj/aqua-registry)</summary>

###
[`v4.155.1`](https://github.com/aquaproj/aqua-registry/releases/tag/v4.155.1)

[Compare
Source](https://github.com/aquaproj/aqua-registry/compare/v4.155.0...v4.155.1)


[Issues](https://github.com/aquaproj/aqua-registry/issues?q=is%3Aissue+milestone%3Av4.155.0)
| [Pull
Requests](https://github.com/aquaproj/aqua-registry/pulls?q=is%3Apr+milestone%3Av4.155.0)
| https://github.com/aquaproj/aqua-registry/compare/v4.155.0...v4.155.1

##### Others


[#&#8203;21239](https://github.com/aquaproj/aqua-registry/issues/21239)
Rename the package crates.io/shellharden to anordal/shellharden
[@&#8203;hituzi-no-sippo](https://github.com/hituzi-no-sippo)

shellharden started releasing pre-built binaries, so we changed the
package type from `cargo` to `github_release` from shellharden v4.3.1.


[https://github.com/anordal/shellharden/pull/57](https://github.com/anordal/shellharden/pull/57)
https://github.com/anordal/shellharden/releases/tag/v4.3.1

> \[!WARNING]
> Please rename the package `crates.io/shellharden` to
`anordal/shellharden`
>
> ```yaml
> packages:
> - name: anordal/[email protected]
> ```
>
> Note that Renovate will update crates.io/shellharden to
crates.io/[email protected], but it wouldn't work.
> You have to change the version to `v4.3.1`.

###
[`v4.155.0`](https://github.com/aquaproj/aqua-registry/releases/tag/v4.155.0)

[Compare
Source](https://github.com/aquaproj/aqua-registry/compare/v4.154.0...v4.155.0)


[Issues](https://github.com/aquaproj/aqua-registry/issues?q=is%3Aissue+milestone%3Av4.154.0)
| [Pull
Requests](https://github.com/aquaproj/aqua-registry/pulls?q=is%3Apr+milestone%3Av4.154.0)
| https://github.com/aquaproj/aqua-registry/compare/v4.154.0...v4.155.0

#### 🎉 New Packages


[#&#8203;21127](https://github.com/aquaproj/aqua-registry/issues/21127)
[ynqa/jnv](https://github.com/ynqa/jnv): interactive JSON filter using
jq [@&#8203;ponkio-o](https://github.com/ponkio-o)

[#&#8203;21079](https://github.com/aquaproj/aqua-registry/issues/21079)
[zaghaghi/openapi-tui](https://github.com/zaghaghi/openapi-tui):
Terminal UI to list, browse and run APIs defined with openapi spec
[@&#8203;wancup](https://github.com/wancup)

#### Fixes


[#&#8203;21122](https://github.com/aquaproj/aqua-registry/issues/21122)
Update some packages to support Cosign v2

⚠️ To install the following packages, aqua v2.25.1 or later is required.

-   aquaproj/aqua-registry-updater
-   aquaproj/registry-tool
-   argoproj/argo-workflows
-   chainguard-dev/apko
-   chainguard-dev/melange
-   charmbracelet/gum
-   goreleaser/nfpm
-   kubernetes-sigs/zeitgeist
-   lintnet/lintnet
-   suzuki-shunsuke/ci-info
-   suzuki-shunsuke/circleci-config-merge
-   suzuki-shunsuke/cmdx
-   suzuki-shunsuke/ghalint
-   suzuki-shunsuke/ghcp
-   suzuki-shunsuke/github-comment
-   suzuki-shunsuke/mkghtag
-   suzuki-shunsuke/nllint
-   suzuki-shunsuke/pinact
-   suzuki-shunsuke/renovate-issue-action
-   suzuki-shunsuke/tfcmt
-   suzuki-shunsuke/tfprovidercheck
-   terraform-linters/tflint
-   tfmigrator/cli
-   updatecli/updatecli
-   yuyaban/gitlab-comment


[#&#8203;21062](https://github.com/aquaproj/aqua-registry/issues/21062)
[#&#8203;21063](https://github.com/aquaproj/aqua-registry/issues/21063)
[#&#8203;21064](https://github.com/aquaproj/aqua-registry/issues/21064)
[#&#8203;21065](https://github.com/aquaproj/aqua-registry/issues/21065)
[#&#8203;21066](https://github.com/aquaproj/aqua-registry/issues/21066)
Transfer [k0kubun/xremap/\*](https://github.com/k0kubun/xremap) to
[xremap/xremap/\*](https://github.com/xremap/xremap)

The GitHub Repository of the package "k0kubun/xremap/hypr" was
transferred from [k0kubun/xremap](https://github.com/k0kubun/xremap)
to [xremap/xremap](https://github.com/xremap/xremap)

</details>

<details>
<summary>cli/cli (cli/cli)</summary>

### [`v2.46.0`](https://github.com/cli/cli/releases/tag/v2.46.0):
GitHub CLI 2.46.0

[Compare Source](https://github.com/cli/cli/compare/v2.45.0...v2.46.0)

#### What's Changed

- Draft issue IDs are included in `project item-list` output by
[@&#8203;yasunori0418](https://github.com/yasunori0418) in
[https://github.com/cli/cli/pull/8754](https://github.com/cli/cli/pull/8754)
- New `--dry-run` option for `pr create` by
[@&#8203;v1v](https://github.com/v1v) in
[https://github.com/cli/cli/pull/8376](https://github.com/cli/cli/pull/8376)
- Bump go-keyring to fix race condition by
[@&#8203;williammartin](https://github.com/williammartin) in
[https://github.com/cli/cli/pull/8833](https://github.com/cli/cli/pull/8833)
- PR numbers are prefixed with owner/repo for context by
[@&#8203;nobe4](https://github.com/nobe4) in
[https://github.com/cli/cli/pull/8778](https://github.com/cli/cli/pull/8778)
- Extra word removed in `codespaces` code comments by
[@&#8203;cuinix](https://github.com/cuinix) in
[https://github.com/cli/cli/pull/8795](https://github.com/cli/cli/pull/8795)
- Clarified description of the `-u`, `--user` option for `gh auth token`
by [@&#8203;gregsmi](https://github.com/gregsmi) in
[https://github.com/cli/cli/pull/8797](https://github.com/cli/cli/pull/8797)
- Fixed formatting for the description of `release upload` by
[@&#8203;malor](https://github.com/malor) in
[https://github.com/cli/cli/pull/8834](https://github.com/cli/cli/pull/8834)
- Clarified the usage of `auth status` to list all authenticated
accounts by [@&#8203;jsoref](https://github.com/jsoref) in
[https://github.com/cli/cli/pull/8838](https://github.com/cli/cli/pull/8838)
- Document auth switch behavior for two or more accounts by
[@&#8203;williammartin](https://github.com/williammartin) in
[https://github.com/cli/cli/pull/8839](https://github.com/cli/cli/pull/8839)
- Document run watch and view not supporting fine grained PATs by
[@&#8203;williammartin](https://github.com/williammartin) in
[https://github.com/cli/cli/pull/8843](https://github.com/cli/cli/pull/8843)
- build(deps): bump google.golang.org/protobuf from 1.30.0 to 1.33.0 by
[@&#8203;dependabot](https://github.com/dependabot) in
[https://github.com/cli/cli/pull/8811](https://github.com/cli/cli/pull/8811)
- build(deps): bump github.com/cpuguy83/go-md2man/v2 from 2.0.3 to 2.0.4
by [@&#8203;dependabot](https://github.com/dependabot) in
[https://github.com/cli/cli/pull/8844](https://github.com/cli/cli/pull/8844)

#### New Contributors

- [@&#8203;cuinix](https://github.com/cuinix) made their first
contribution in
[https://github.com/cli/cli/pull/8795](https://github.com/cli/cli/pull/8795)
- [@&#8203;gregsmi](https://github.com/gregsmi) made their first
contribution in
[https://github.com/cli/cli/pull/8797](https://github.com/cli/cli/pull/8797)
- [@&#8203;nobe4](https://github.com/nobe4) made their first
contribution in
[https://github.com/cli/cli/pull/8778](https://github.com/cli/cli/pull/8778)
- [@&#8203;malor](https://github.com/malor) made their first
contribution in
[https://github.com/cli/cli/pull/8834](https://github.com/cli/cli/pull/8834)
- [@&#8203;yasunori0418](https://github.com/yasunori0418) made their
first contribution in
[https://github.com/cli/cli/pull/8754](https://github.com/cli/cli/pull/8754)

**Full Changelog**: https://github.com/cli/cli/compare/v2.45.0...v2.46.0

</details>

<details>
<summary>derailed/k9s (derailed/k9s)</summary>

### [`v0.32.4`](https://github.com/derailed/k9s/releases/tag/v0.32.4)

[Compare
Source](https://github.com/derailed/k9s/compare/v0.32.3...v0.32.4)

<img
src="https://raw.githubusercontent.com/derailed/k9s/master/assets/k9s.png"
align="center" width="800" height="auto"/>

### Release v0.32.4
#### Notes

Thank you to all that contributed with flushing out issues and
enhancements for K9s!
I'll try to mark some of these issues as fixed. But if you don't mind
grab the latest rev
and see if we're happier with some of the fixes!
If you've filed an issue please help me verify and close.

Your support, kindness and awesome suggestions to make K9s better are,
as ever, very much noted and appreciated!
Also big thanks to all that have allocated their own time to help others
on both slack and on this repo!!

As you may know, K9s is not pimped out by corps with deep pockets, thus
if you feel K9s is helping your Kubernetes journey,
please consider joining our [sponsorship
program](https://github.com/sponsors/derailed) and/or make some noise
on social! [@&#8203;kitesurfer](https://twitter.com/kitesurfer)

On Slack? Please join us
[K9slackers](https://join.slack.com/t/k9sers/shared_invite/enQtOTA5MDEyNzI5MTU0LWQ1ZGI3MzliYzZhZWEyNzYxYzA3NjE0YTk1YmFmNzViZjIyNzhkZGI0MmJjYzhlNjdlMGJhYzE2ZGU1NjkyNTM)

#### Maintenance Release!

***

#### ♫ Sounds Behind The Release ♭

Thinking of all you at KubeCon Paris!!
May I suggest a nice glass of `cold Merlote` or other fine grape juices
from my country?

- [Le Gorille - George
Brassens](https://www.youtube.com/watch?v=KVfwvk_yVyA)
- [Les Funerailles D'antan (Love this guy!) - George
Brassens](https://www.youtube.com/watch?v=bwb5k4k2EMc)
- [Poinconneur Des Lilas - Serge
Gainsbourg](https://www.youtube.com/watch?v=eWkWCFzkOvU)
- [Mon Legionaire (Yup! same guy??) - Serge
Gainsbourg](https://www.youtube.com/watch?v=gl8gopryqWI)
- [Les Cornichons - Nino
Ferrer](https://www.youtube.com/watch?v=N7JSW4NhM8I)
- [Paris s'eveille - Jacques
Dutronc](https://www.youtube.com/watch?v=3WcCg6rm3uM)

***

#### Videos Are In The Can!

Please dial [K9s
Channel](https://www.youtube.com/channel/UC897uwPygni4QIjkPCpgjmw) for
up coming content...

-   [K9s v0.31.0 Configs+Sneak peek](https://youtu.be/X3444KfjguE)
-   [K9s v0.30.0 Sneak peek](https://youtu.be/mVBc1XneRJ4)
-   [Vulnerability Scans](https://youtu.be/ULkl0MsaidU)

***

#### Resolved Issues

- [#&#8203;2608](https://github.com/derailed/k9s/issues/2608) Make the
sanitize feature easier to use
- [#&#8203;2605](https://github.com/derailed/k9s/issues/2605) Built-in
shortcuts being overridden by plugins result in excessive logging
- [#&#8203;2604](https://github.com/derailed/k9s/issues/2604) Ability
to mark a plugin as Dangerous/destructive
- [#&#8203;2592](https://github.com/derailed/k9s/issues/2592) "list
access denied" when switching contexts within k9s since 0.32.0

***

#### Contributed PRs

Please be sure to give `Big Thanks!` and `ATTA Girls/Boys!` to all the
fine contributors for making K9s better for all of us!!

- [#&#8203;2621](https://github.com/derailed/k9s/pull/2621) Fix snap
build

***

<img
src="https://raw.githubusercontent.com/derailed/k9s/master/assets/imhotep_logo.png"
width="32" height="auto"/> © 2024 Imhotep Software LLC. All materials
licensed under [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0)

</details>

<details>
<summary>eza-community/eza (eza-community/eza)</summary>

###
[`v0.18.8`](https://github.com/eza-community/eza/releases/tag/v0.18.8):
eza v0.18.8

[Compare
Source](https://github.com/eza-community/eza/compare/v0.18.7...v0.18.8)

### Changelog

#### \[0.18.8] - 2024-03-21

##### Bug Fixes

-   Avoid deprecation warnings
-   Rustfmt issues

##### Features

-   Add fennel lang icon and associations

##### Miscellaneous Tasks

-   Release eza v0.18.8

### Checksums

#### sha256sum

80565916de55b23c3cabb363ba1cb7f323f99b158e75b6c029a64108de7bdad9
./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.tar.gz
d3532278f5eae1c1dd57bcc9373f05b49f40ffac880d5c4efb67ac5d93cdf0ea
./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.zip
2c1722afbb0f90e40047cfffa93f04fb9b89633402236fb75119c9105265271f
./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.tar.gz
a832c4694228780f43f467e2f0536bd4a8969a455edbb872eb8b4614ebd157e0
./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.zip
39cc743e9293a5e269b2b2baf167f4f868f682143dc8b1f87efd64848bb3bca4
./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.tar.gz
9b331b2eee259a9afbffd39e5018735651f8053c5429714cdc46a02f571463e7
./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.zip
2e12d0b714aa011d23abb72459a2478eb9e369ac564a9a7e39ba6ec7ef775ad4
./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.tar.gz
e3c9c3535732cecad5eb9d786e1f7a7c66aa28d42a3516046e5b1cf7f3799920
./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.zip
2fc6c3ead5c8bc596643597737ba596aee2f61772792927e4e9e602525a6ae81
./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.tar.gz
543f69f52165f654c5ab869319663d7f4ebdc95b7fc9c23be003ca551aec5dc3
./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.zip

#### md5sum

f3dece765bb95c732bce9406c1eb825a
./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.tar.gz
b655997af2b0df307abd3a126e48fc3d
./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.zip
9cd1ae35fd90e4341cf8ed1b4a3d6cd9
./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.tar.gz
e9cd1a917b39827fc159c100faaf28b9
./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.zip
9f02446483003c219eecc1dc15273956
./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.tar.gz
db239fa66fde9800770384831e3a86fa
./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.zip
5722d3f4e4f2848d770713341c7c4bfd
./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.tar.gz
c9f5ece20dc527fd4ecf4f77bbf70b56
./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.zip
0826369c7f0ab3b17c4275f98ff1ab70
./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.tar.gz
3c3633a6c54d32ee9f04277f4b103edc
./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.zip

#### blake3sum

0c7fc89dd1cf514e62e644e8ff8dab8759d6bd42f364f2768c41df92ec9e9dfc
./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.tar.gz
540def87f4f455fcd6067648f05498db775c6c03f291088d03f1dc4cc8cf68e7
./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.zip
1980d8004ad1f9b0291381c4d57db64fc8ebcf1c0961a8ac3c05c3697d7dfaf3
./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.tar.gz
9a80d9f0cfc83521d119778b52b55dce4b33f28b02624297c712efd3ade53f19
./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.zip
5d97ba1a2eaccc814aec982922f89ee218521b343b5f3ad6900596ad9574bfa3
./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.tar.gz
2d274f097297ff222dc7756903dfb73fdc744051c75b815d2eea2e08ee0f4418
./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.zip
04ca09128611f9719ac0a7c387282049489243bbe74be8de797d845ec380b9ee
./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.tar.gz
3e58bf50b39c1b20801f5282b612103b07b12089d2a24f3dcec9882ac8482c8c
./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.zip
1df711c44e08cc08fc26753f5c50f9de244fdbd7e2f8cc3961d82f101d775154
./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.tar.gz
9d71a5afbc797ca63eecf254fc4971c2a1dd188ce28c8cb4a10cf1a273d747d5
./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.zip

</details>

<details>
<summary>golangci/golangci-lint (golangci/golangci-lint)</summary>

###
[`v1.57.1`](https://github.com/golangci/golangci-lint/releases/tag/v1.57.1)

[Compare
Source](https://github.com/golangci/golangci-lint/compare/v1.57.0...v1.57.1)

#### Changelog

-
[`87b6bf1`](https://github.com/golangci/golangci-lint/commit/87b6bf17)
build(deps): bump github.com/golangci/plugin-module-register from 0.1.0
to 0.1.1
([#&#8203;4549](https://github.com/golangci/golangci-lint/issues/4549))
-
[`921d535`](https://github.com/golangci/golangci-lint/commit/921d5357)
build(deps): bump github.com/pelletier/go-toml/v2 from 2.1.1 to 2.2.0
([#&#8203;4548](https://github.com/golangci/golangci-lint/issues/4548))
-
[`cd890db`](https://github.com/golangci/golangci-lint/commit/cd890db2)
fix: filter invalid issues before other processors
([#&#8203;4552](https://github.com/golangci/golangci-lint/issues/4552))

###
[`v1.57.0`](https://github.com/golangci/golangci-lint/compare/v1.56.2...v1.57.0)

[Compare
Source](https://github.com/golangci/golangci-lint/compare/v1.56.2...v1.57.0)

</details>

<details>
<summary>gruntwork-io/terragrunt (gruntwork-io/terragrunt)</summary>

###
[`v0.55.20`](https://github.com/gruntwork-io/terragrunt/compare/v0.55.19...v0.55.20)

[Compare
Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.19...v0.55.20)

###
[`v0.55.19`](https://github.com/gruntwork-io/terragrunt/releases/tag/v0.55.19)

[Compare
Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.18...v0.55.19)

#### Updated CLI args, config attributes and blocks

-   `scaffold`

#### Description

-   Fix grammar in feature text
-   Fix URL handling in the `scaffold` command
-   Updated gon version to 0.2.5

#### Related links

-
[https://github.com/gruntwork-io/terragrunt/pull/3010](https://github.com/gruntwork-io/terragrunt/pull/3010)
-
[https://github.com/gruntwork-io/terragrunt/pull/3005](https://github.com/gruntwork-io/terragrunt/pull/3005)

**Full Changelog**:
https://github.com/gruntwork-io/terragrunt/compare/v0.55.18...v0.55.19

###
[`v0.55.18`](https://github.com/gruntwork-io/terragrunt/releases/tag/v0.55.18)

[Compare
Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.17...v0.55.18)

#### Description

-   Updated github.com/cloudflare/circl from 1.3.3 to 1.3.7
-   Updated github.com/go-jose/go-jose/v3 from 3.0.0 to 3.0.3
-   Updated google.golang.org/protobuf from 1.32.0 to 1.33.0
-   Updated nokogiri to 1.16.3
-   Updates mini_portile2 from 2.4.0 to 2.8.5

#### Related links

-
[https://github.com/gruntwork-io/terragrunt/pull/2995](https://github.com/gruntwork-io/terragrunt/pull/2995)
-
[https://github.com/gruntwork-io/terragrunt/pull/2996](https://github.com/gruntwork-io/terragrunt/pull/2996)
-
[https://github.com/gruntwork-io/terragrunt/pull/2929](https://github.com/gruntwork-io/terragrunt/pull/2929)
-
[https://github.com/gruntwork-io/terragrunt/pull/3000](https://github.com/gruntwork-io/terragrunt/pull/3000)
-
[https://github.com/gruntwork-io/terragrunt/pull/3009](https://github.com/gruntwork-io/terragrunt/pull/3009)

###
[`v0.55.17`](https://github.com/gruntwork-io/terragrunt/releases/tag/v0.55.17)

[Compare
Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.16...v0.55.17)

#### Updated CLI args, config attributes and blocks

-   `terraform`

#### Description

-   Added support for OpenTofu registry for shorthand TFR modules.

#### Related links

-
[https://github.com/gruntwork-io/terragrunt/pull/2961](https://github.com/gruntwork-io/terragrunt/pull/2961)

</details>

<details>
<summary>jesseduffield/lazygit (jesseduffield/lazygit)</summary>

###
[`v0.41.0`](https://github.com/jesseduffield/lazygit/releases/tag/v0.41.0)

[Compare
Source](https://github.com/jesseduffield/lazygit/compare/v0.40.2...pre-0.41)

Hold on tight because this is a HUGE release! This release includes a
whopping 595 commits from a period of over 7 months, from 40 different
contributors. Thanks to everybody who made this possible, and apologies
for taking so long to actually release it: we'll be more frequent in
future!

Special thanks to Stefan Haller who is behind many of this release's
changes and who has been critical in getting this release across the
line.

I've made a video running through the big changes here:

[<img
src="https://github.com/jesseduffield/lazygit/assets/8456633/f9b47c5e-f8b2-4b41-8f51-bf06b01046e2">](https://youtu.be/\_REmkoIyPW0)

#### What's Changed

Here's some highlighted features:

##### Range select


![range-select](https://github.com/jesseduffield/lazygit/blob/assets/demo/interactive_rebase-compressed.gif?raw=true)

You can now press 'v' to toggle range select in any list view, just like
you already could in the staging view. You can also press shift+up/down
to select a range. You can use range select to:

-   stage/discard a range of files
- select multiple commits to fixup/squash/move outside an interactive
rebase
- select multiple commits to mark as fixup/squash/etc within an
interactive rebase
- select multiple commit files to discard or add to a custom patch
(courtesy of [@&#8203;afhoffman](https://github.com/afhoffman))
-   select multiple commits to cherry-pick

I have been waiting for this feature for a very long time and it's
already made me way more productive. If I need to squash a range of
commits I can now easily do it directly rather than needing to squash
them one-by-one, or needing to manually start an interactive rebase
first. Likewise, it's much easier to select a range of files and stage
them than stage them one-by-one.

This is a **Breaking change**: Unfortunately, the 'v' key clashes with
the existing key for pasting commits (cherry-pick), so we've replaced
that with shift+V and changed the commit copy key to shift+C. If you
want the old keybindings back, you can do that like so:

```yml
keybinding:
  universal:
      toggleRangeSelect: <something other than v>
    commits:
      cherryPickCopy: 'c'
      pasteCommits: 'v'
```

##### Auto-wrap in commit editor

The commit editor now automatically hard-wraps your content by default,
so you no longer need to hit the enter key yourself when you approach
the margin. You can disable/configure this in your config:

```yml
git:
  commit:
    autoWrapCommitMessage: true
    autoWrapWidth: 72
```

Thanks to [@&#8203;stefanhaller](https://github.com/stefanhaller) for
this feature.

##### Easier remote branch checkout

Now when you go to checkout a remote branch, either via the `c`
keybinding in the branches view or by pressing `space` on a remote
branch, you'll be given the choice to checkout as a local branch or as a
detached head (previously it would just check it out as a detached head
which typically isn't what you want). This is a **Breaking change** in
terms of muscle memory.

Thanks to [@&#8203;stefanhaller](https://github.com/stefanhaller) for
this feature.

##### Easier start interactive rebase

Previously, to start an interactive rebase, you would need to navigate
to a base commit and press `e` on it. Now you can simply press `i` and
regardless of which commit is selected, an interactive rebase will begin
that includes all the commits on your branch (or if there are merge
commits: all the commits up to first merge commit).

The above demo for range select showcases this.

##### Easier squashing of `fixup!` commits

In a similar vein to the above section, now when you press `shift+S`,
you're given the choice of squashing all commits above the selected
commit and squashing all commits on the branch, which is what you
typically want. This is a **Breaking change** in terms of muscle memory.

Thanks to [@&#8203;stefanhaller](https://github.com/stefanhaller) for
this feature.

##### View divergence from upstream branch

If you press `u` on a local branch a menu appears which shows options
relating to the branch's upstream. Now, the first option in that menu
allows you to view the divergence from the upstream which shows commits
to pull and commits to push

Thanks to [@&#8203;stefanhaller](https://github.com/stefanhaller) for
this feature.

##### Find appropriate commit for fixup/amend

This one is some serious voodoo: if somebody suggests changes in a PR
review, you'll often apply the changes, then go hunting for the
appropriate commit to fixup/amend. Now, from the files view you can
press `ctrl+f` and if Lazygit can identify an appropriate commit with
certainty, it will select that commit for you. Pretty cool!

We've made the algorithm very strict so that you can always trust the
result, but this means in circumstances where we can't know for sure
which commit is appropriate (such as when your changes only include
added lines), it's left to you to manually find the commit. We're keen
to get lots of feedback on this feature to see where the sweet spot is.

For more info see [the
docs](https://github.com/jesseduffield/lazygit/blob/master/docs/Fixup_Commits.md#finding-the-commit-to-create-a-fixup-for)

Thanks to [@&#8203;stefanhaller](https://github.com/stefanhaller) for
this feature.

##### Delete remote branches/tags

Now when you press `d` on a local branch, remote branch, or tag, you're
given the option to delete that branch/tag in the remote.

Thanks to [@&#8203;AzraelSec](https://github.com/AzraelSec) for this
feature.

##### Add co-author to commit

When you press `a` on a commit an option now appears to add a co-author
(something GitHub can read).

Thanks to [@&#8203;omaussa](https://github.com/omaussa) for this
feature.

##### Filter commits by author

You can now filter commits by author via pressing `ctrl+s` in the
commits view and selecting the option to filter by author.

Thanks to [@&#8203;Part22](https://github.com/Part22) for this
feature.

##### Change branch sort order

You can now change branch sort order by pressing `s` in the branches
view (and remote branches view). By default local branches are sorted by
'recency' meaning how recently they were checked out, but you can now
sort by head commit date and alphabetically.

Thanks to [@&#8203;hosaka](https://github.com/hosaka) for this
feature.

##### Better bare repo support

We have fixed a bunch of bugs relating to bare repos so if you had
issues with them in the past it should work fine now.

Thanks to [@&#8203;jwhitley](https://github.com/jwhitley) for this
feature.

##### Miscelleneous UI changes

- Unstaged files are now shown in white, not red, which is easier on the
eyes
-   Scrollbars are thinner (and, thus, cooler)
- Keybindings menu now has section headers
([@&#8203;stefanhaller](https://github.com/stefanhaller))
- Error toasts now appear for some errors (less intrusive than popups)
([@&#8203;stefanhaller](https://github.com/stefanhaller))
- Search history is now retained
([@&#8203;karimkhaleel](https://github.com/karimkhaleel))
- Git log is shown by default
([@&#8203;stefanhaller](https://github.com/stefanhaller))

##### More Breaking Changes 💥

- When you press 'g' to bring up the git reset menu, the 'mixed' option
is now the first and default, rather than 'soft'. This is because
'mixed' is the most commonly used option.
- Push/pull/fetch loading statuses are now shown against the branch
rather than in a popup. This allows you to e.g. fetch multiple branches
in parallel and see the status for each branch.
- The git log graph in the commits view is now always shown by default
(previously it was only shown when the view was maximised). If you find
this too noisy, you can change it back via `ctrl+L` -> 'Show git graph'
-> 'when maximised'
- Filtering (e.g. when pressing '/') is less fuzzy by default; it only
matches substrings now. Multiple substrings can be matched by separating
them with spaces. If you want to revert to the old behavior, set the
following in your config:

```yml
gui:
  filterMode: 'fuzzy'
```

#### What's Changed

##### All Enhancements 🔥

- Add range selection ability on list contexts by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3207](https://github.com/jesseduffield/lazygit/pull/3207)
- Allow deleting remote tags/branches from local tag/branch views by
[@&#8203;AzraelSec](https://github.com/AzraelSec) in
[https://github.com/jesseduffield/lazygit/pull/2738](https://github.com/jesseduffield/lazygit/pull/2738)
- Add command to show divergence from upstream by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2871](https://github.com/jesseduffield/lazygit/pull/2871)
- Add 'Quick start interactive rebase' action by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3213](https://github.com/jesseduffield/lazygit/pull/3213)
- Add command to open git difftool by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3156](https://github.com/jesseduffield/lazygit/pull/3156)
- Support editing files in existing neovim instance by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/2916](https://github.com/jesseduffield/lazygit/pull/2916)
- Show commit mark before showing extra info by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/2928](https://github.com/jesseduffield/lazygit/pull/2928)
- Jump to middle of the view when selection leaves the visible area by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2915](https://github.com/jesseduffield/lazygit/pull/2915)
- Add emacs-keybinds for word navigation by
[@&#8203;horriblename](https://github.com/horriblename) in
[https://github.com/jesseduffield/lazygit/pull/2935](https://github.com/jesseduffield/lazygit/pull/2935)
- Add `gui.scrollOffBehavior` config for scrolling list views by
half-pages by [@&#8203;stefanhaller](https://github.com/stefanhaller)
in
[https://github.com/jesseduffield/lazygit/pull/2939](https://github.com/jesseduffield/lazygit/pull/2939)
- Switch to editor from commit message panel by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2881](https://github.com/jesseduffield/lazygit/pull/2881)
- Select same commit again after pressing "e" to edit a commit by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2954](https://github.com/jesseduffield/lazygit/pull/2954)
- Support custom keybindings for confirm discard by
[@&#8203;mskelton](https://github.com/mskelton) in
[https://github.com/jesseduffield/lazygit/pull/2960](https://github.com/jesseduffield/lazygit/pull/2960)
- Allow adding a port to webDomain part of services config by
[@&#8203;raidora](https://github.com/raidora) in
[https://github.com/jesseduffield/lazygit/pull/2908](https://github.com/jesseduffield/lazygit/pull/2908)
- Add icons for files with .mdx and .svelte file extensions by
[@&#8203;hrstmr](https://github.com/hrstmr) in
[https://github.com/jesseduffield/lazygit/pull/2889](https://github.com/jesseduffield/lazygit/pull/2889)
- Section headers in keybindings menu by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2911](https://github.com/jesseduffield/lazygit/pull/2911)
- Check for staged files for "Amend commit" and "Create fixup commit" by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2970](https://github.com/jesseduffield/lazygit/pull/2970)
- Add support for external diff commands (e.g. difftastic) by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2868](https://github.com/jesseduffield/lazygit/pull/2868)
- Save diff context size in state.yml instead of config.yml by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2969](https://github.com/jesseduffield/lazygit/pull/2969)
- Support to reset the current branch to a selected branch upstream by
[@&#8203;AzraelSec](https://github.com/AzraelSec) in
[https://github.com/jesseduffield/lazygit/pull/2940](https://github.com/jesseduffield/lazygit/pull/2940)
- Replace whitespace with '-' when renaming a branch by
[@&#8203;calthejuggler](https://github.com/calthejuggler) in
[https://github.com/jesseduffield/lazygit/pull/2990](https://github.com/jesseduffield/lazygit/pull/2990)
- Add jump-to-panel label config setting by
[@&#8203;MariaSolOs](https://github.com/MariaSolOs) in
[https://github.com/jesseduffield/lazygit/pull/2993](https://github.com/jesseduffield/lazygit/pull/2993)
- Add co-author to commits by
[@&#8203;omaussa](https://github.com/omaussa) in
[https://github.com/jesseduffield/lazygit/pull/2912](https://github.com/jesseduffield/lazygit/pull/2912)
- Change the default of the "gui.borders" config to "rounded" by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2998](https://github.com/jesseduffield/lazygit/pull/2998)
- Add a DisabledReason mechanism for menu items and keybindings by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2992](https://github.com/jesseduffield/lazygit/pull/2992)
- Allow cherry-picking commits during a rebase by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3013](https://github.com/jesseduffield/lazygit/pull/3013)
- Add history for search view by
[@&#8203;karimkhaleel](https://github.com/karimkhaleel) in
[https://github.com/jesseduffield/lazygit/pull/2877](https://github.com/jesseduffield/lazygit/pull/2877)
- Replace loader panels with waiting status (pull/push/fetch) by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2973](https://github.com/jesseduffield/lazygit/pull/2973)
- Add menu to rebase onto selected branch remote upstream by
[@&#8203;AzraelSec](https://github.com/AzraelSec) in
[https://github.com/jesseduffield/lazygit/pull/3020](https://github.com/jesseduffield/lazygit/pull/3020)
- Add ability to force portrait mode by
[@&#8203;ldelossa](https://github.com/ldelossa) in
[https://github.com/jesseduffield/lazygit/pull/3037](https://github.com/jesseduffield/lazygit/pull/3037)
- Add Micro editor preset by [@&#8203;kytta](https://github.com/kytta)
in
[https://github.com/jesseduffield/lazygit/pull/3049](https://github.com/jesseduffield/lazygit/pull/3049)
- Show sync status in branches list by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3021](https://github.com/jesseduffield/lazygit/pull/3021)
- Add 'lvim' editor preset for lunarvim by
[@&#8203;zottelsheep](https://github.com/zottelsheep) in
[https://github.com/jesseduffield/lazygit/pull/3074](https://github.com/jesseduffield/lazygit/pull/3074)
- Truncate branch names to make branch status always visible by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3075](https://github.com/jesseduffield/lazygit/pull/3075)
- Color file icons by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3080](https://github.com/jesseduffield/lazygit/pull/3080)
- Add UserConfig jsonschema generation script by
[@&#8203;karimkhaleel](https://github.com/karimkhaleel) in
[https://github.com/jesseduffield/lazygit/pull/3039](https://github.com/jesseduffield/lazygit/pull/3039)
- Add a copy-to-clipboard menu to the file view (with `diff` copy
options) by [@&#8203;AzraelSec](https://github.com/AzraelSec) in
[https://github.com/jesseduffield/lazygit/pull/3104](https://github.com/jesseduffield/lazygit/pull/3104)
- Fix bottom line alignment by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3076](https://github.com/jesseduffield/lazygit/pull/3076)
- Make move up/down blocking by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2966](https://github.com/jesseduffield/lazygit/pull/2966)
- Add remote branch sorting menu by
[@&#8203;hosaka](https://github.com/hosaka) in
[https://github.com/jesseduffield/lazygit/pull/3171](https://github.com/jesseduffield/lazygit/pull/3171)
- Add age to stash entries by
[@&#8203;AzraelSec](https://github.com/AzraelSec) in
[https://github.com/jesseduffield/lazygit/pull/3174](https://github.com/jesseduffield/lazygit/pull/3174)
- Add local branch sorting menu by
[@&#8203;hosaka](https://github.com/hosaka) in
[https://github.com/jesseduffield/lazygit/pull/3182](https://github.com/jesseduffield/lazygit/pull/3182)
- Show a friendly error message when starting lazygit from a
non-existent cwd by
[@&#8203;simonwhitaker](https://github.com/simonwhitaker) in
[https://github.com/jesseduffield/lazygit/pull/3192](https://github.com/jesseduffield/lazygit/pull/3192)
- Replace copy commit SHA with copy commit subject on the y s keybind in
the commits view by
[@&#8203;karimkhaleel](https://github.com/karimkhaleel) in
[https://github.com/jesseduffield/lazygit/pull/3188](https://github.com/jesseduffield/lazygit/pull/3188)
- Add config setting for splitting window vertically in half screen mode
by [@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3133](https://github.com/jesseduffield/lazygit/pull/3133)
- Add command to find base commit for creating a fixup by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3105](https://github.com/jesseduffield/lazygit/pull/3105)
- Show Toast instead of error panel when invoking a disabled command by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3180](https://github.com/jesseduffield/lazygit/pull/3180)
- Show file names in default colour by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3081](https://github.com/jesseduffield/lazygit/pull/3081)
- Add config setting to suppress showing file icons by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3216](https://github.com/jesseduffield/lazygit/pull/3216)
- Support range select for rebase actions by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3232](https://github.com/jesseduffield/lazygit/pull/3232)
- Make range selections created with the mouse non-sticky by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3234](https://github.com/jesseduffield/lazygit/pull/3234)
- Support range select for staging/discarding files by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3248](https://github.com/jesseduffield/lazygit/pull/3248)
- Inline status for fetching remotes by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3238](https://github.com/jesseduffield/lazygit/pull/3238)
- Add shortcuts for filtering files by status by
[@&#8203;mark2185](https://github.com/mark2185) in
[https://github.com/jesseduffield/lazygit/pull/3137](https://github.com/jesseduffield/lazygit/pull/3137)
- Keep same selection range when quick-starting an interactive rebase by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3247](https://github.com/jesseduffield/lazygit/pull/3247)
- Add loads of tooltips by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3269](https://github.com/jesseduffield/lazygit/pull/3269)
- Show better keybinding suggestions by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3203](https://github.com/jesseduffield/lazygit/pull/3203)
- Support selecting file range in patch builder by
[@&#8203;afhoffman](https://github.com/afhoffman) in
[https://github.com/jesseduffield/lazygit/pull/3259](https://github.com/jesseduffield/lazygit/pull/3259)
- Add command to squash all fixups in the current branch by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3274](https://github.com/jesseduffield/lazygit/pull/3274)
- Use slimmer scrollbars by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3283](https://github.com/jesseduffield/lazygit/pull/3283)
- Clear cherry-picked commits after pasting by
[@&#8203;molejnik88](https://github.com/molejnik88) in
[https://github.com/jesseduffield/lazygit/pull/3240](https://github.com/jesseduffield/lazygit/pull/3240)
- Change default of git.log.showGraph to 'always' by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3314](https://github.com/jesseduffield/lazygit/pull/3314)
- Support range select removing files from a commit by
[@&#8203;afhoffman](https://github.com/afhoffman) in
[https://github.com/jesseduffield/lazygit/pull/3276](https://github.com/jesseduffield/lazygit/pull/3276)
- Migrate git.log.showGraph and git.log.order to app state by
[@&#8203;hosaka](https://github.com/hosaka) in
[https://github.com/jesseduffield/lazygit/pull/3197](https://github.com/jesseduffield/lazygit/pull/3197)
- Change "git reset" default to --mixed by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3264](https://github.com/jesseduffield/lazygit/pull/3264)
- Add author filtering to commit view by
[@&#8203;part22](https://github.com/part22) in
[https://github.com/jesseduffield/lazygit/pull/3302](https://github.com/jesseduffield/lazygit/pull/3302)
- Provide two helix presets, one for "helix" and one for "hx" by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3346](https://github.com/jesseduffield/lazygit/pull/3346)
- Don't show branch head on rebase todos if the rebase.updateRefs config
is on by [@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3340](https://github.com/jesseduffield/lazygit/pull/3340)
- Show all submodules recursively by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3341](https://github.com/jesseduffield/lazygit/pull/3341)
- Support setting a range of commits to "edit" outside of a rebase by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3370](https://github.com/jesseduffield/lazygit/pull/3370)
- Adjust selection after squashing fixups by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3338](https://github.com/jesseduffield/lazygit/pull/3338)
- Auto-wrap commit message while typing by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3173](https://github.com/jesseduffield/lazygit/pull/3173)
- Add Co-Author support to new commits by
[@&#8203;2KAbhishek](https://github.com/2KAbhishek) in
[https://github.com/jesseduffield/lazygit/pull/3097](https://github.com/jesseduffield/lazygit/pull/3097)
- Show "breaking changes" message at startup by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3377](https://github.com/jesseduffield/lazygit/pull/3377)
- Allow moving and deleting update-ref todos by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3391](https://github.com/jesseduffield/lazygit/pull/3391)
- When checking out a remote branch by name, ask the user how by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3388](https://github.com/jesseduffield/lazygit/pull/3388)
- Use substring filtering instead of fuzzy filtering by default by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3376](https://github.com/jesseduffield/lazygit/pull/3376)
- Always prompt to return from subprocess if there was an error by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3410](https://github.com/jesseduffield/lazygit/pull/3410)
- When adding a new remote, select it and fetch it by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3401](https://github.com/jesseduffield/lazygit/pull/3401)
- Support editing multiple files at once using range selection by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3407](https://github.com/jesseduffield/lazygit/pull/3407)
- Make it easy to create "amend!" commits by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3409](https://github.com/jesseduffield/lazygit/pull/3409)
- Add config to truncate commit hashes when copying them to the
clipboard by [@&#8203;stefanhaller](https://github.com/stefanhaller)
in
[https://github.com/jesseduffield/lazygit/pull/3402](https://github.com/jesseduffield/lazygit/pull/3402)

##### Fixes 🔧

- Fix issue where explosion effect was out-of-view by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/2909](https://github.com/jesseduffield/lazygit/pull/2909)
- Show dialogue when attempting to open info link fails by
[@&#8203;simonwhitaker](https://github.com/simonwhitaker) in
[https://github.com/jesseduffield/lazygit/pull/2899](https://github.com/jesseduffield/lazygit/pull/2899)
- Fix jumping to the correct line from the staging view by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2919](https://github.com/jesseduffield/lazygit/pull/2919)
- Fix sha colors when rebasing by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2946](https://github.com/jesseduffield/lazygit/pull/2946)
- Fix the commit graph display after selection jumps in commits view by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2943](https://github.com/jesseduffield/lazygit/pull/2943)
- Handle trailing slash in worktree path by
[@&#8203;Krismix1](https://github.com/Krismix1) in
[https://github.com/jesseduffield/lazygit/pull/2947](https://github.com/jesseduffield/lazygit/pull/2947)
- Fix escape not cancelling filter mode, but closing the menu instead by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2977](https://github.com/jesseduffield/lazygit/pull/2977)
- Use `Error` method to handle commits url copy from unknown service by
[@&#8203;AzraelSec](https://github.com/AzraelSec) in
[https://github.com/jesseduffield/lazygit/pull/3007](https://github.com/jesseduffield/lazygit/pull/3007)
- Hide waiting status during credentials prompt by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3016](https://github.com/jesseduffield/lazygit/pull/3016)
- Use upstream branch when opening pull requests by
[@&#8203;mark2185](https://github.com/mark2185) in
[https://github.com/jesseduffield/lazygit/pull/2693](https://github.com/jesseduffield/lazygit/pull/2693)
- Fix issue where active search inappropriately changed selected line by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3022](https://github.com/jesseduffield/lazygit/pull/3022)
- Respect $GIT_WORK_TREE and $GIT_DIR env vars (fix
[#&#8203;3010](https://github.com/jesseduffield/lazygit/issues/3010)).
by [@&#8203;intrntbrn](https://github.com/intrntbrn) in
[https://github.com/jesseduffield/lazygit/pull/3024](https://github.com/jesseduffield/lazygit/pull/3024)
- Fix crash when trying to filter the list of remotes by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3059](https://github.com/jesseduffield/lazygit/pull/3059)
- Re-apply filter when model changes by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3058](https://github.com/jesseduffield/lazygit/pull/3058)
- Use a PTY when calling external diff command by
[@&#8203;AFutureD](https://github.com/AFutureD) in
[https://github.com/jesseduffield/lazygit/pull/3120](https://github.com/jesseduffield/lazygit/pull/3120)
- Re-enable 'Unset upstream' option when upstream branch is missing by
[@&#8203;mark2185](https://github.com/mark2185) in
[https://github.com/jesseduffield/lazygit/pull/3086](https://github.com/jesseduffield/lazygit/pull/3086)
- Fall back to WithWaitingStatus if item is not visible by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3083](https://github.com/jesseduffield/lazygit/pull/3083)
- Fix checking out a tag when there is a branch with the same name by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3179](https://github.com/jesseduffield/lazygit/pull/3179)
- Fix preserving the commit message when description contains blank
lines by [@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3170](https://github.com/jesseduffield/lazygit/pull/3170)
- Allow multiple fetch commands (or fetch and pull) to run concurrently
by [@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3202](https://github.com/jesseduffield/lazygit/pull/3202)
- Support insteadOf URL rewriting when opening URLs in browser by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3177](https://github.com/jesseduffield/lazygit/pull/3177)
- Fix keybindings for characters involving AltGr on Windows by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3194](https://github.com/jesseduffield/lazygit/pull/3194)
- Do not include keybindings from another view in keybindings menu by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3220](https://github.com/jesseduffield/lazygit/pull/3220)
- Fix crash with short branch names by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3219](https://github.com/jesseduffield/lazygit/pull/3219)
- Keep same branch selected when fetching a branch while sorted by date
by [@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3186](https://github.com/jesseduffield/lazygit/pull/3186)
- Use git rev-parse to obtain repository and worktree paths by
[@&#8203;jwhitley](https://github.com/jwhitley) in
[https://github.com/jesseduffield/lazygit/pull/3183](https://github.com/jesseduffield/lazygit/pull/3183)
- Pass absolute file paths to all editor commands by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3255](https://github.com/jesseduffield/lazygit/pull/3255)
- Disallow cherry-picking merge commits by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3316](https://github.com/jesseduffield/lazygit/pull/3316)
- Fix two problems related to update-ref rebase todo items by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3290](https://github.com/jesseduffield/lazygit/pull/3290)
- Fix order of custom commands history by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3286](https://github.com/jesseduffield/lazygit/pull/3286)
- Fix some problems with patches if `git diff` was customized with
config (e.g. `external` or `noprefix`). by
[@&#8203;mricherzhagen](https://github.com/mricherzhagen) in
[https://github.com/jesseduffield/lazygit/pull/3222](https://github.com/jesseduffield/lazygit/pull/3222)
- Use $XDG_STATE_HOME for state.yml by
[@&#8203;horriblename](https://github.com/horriblename) in
[https://github.com/jesseduffield/lazygit/pull/2936](https://github.com/jesseduffield/lazygit/pull/2936)
- Fix display of Chinese characters on Windows by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3352](https://github.com/jesseduffield/lazygit/pull/3352)
- Allow more than one argument in git.merging.args config by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3336](https://github.com/jesseduffield/lazygit/pull/3336)
- Don't strike out reserved keys in menus by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3365](https://github.com/jesseduffield/lazygit/pull/3365)
- Don't ask to force-push if the remote rejected updates by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3387](https://github.com/jesseduffield/lazygit/pull/3387)
- Fix container detection by
[@&#8203;aritmos](https://github.com/aritmos) in
[https://github.com/jesseduffield/lazygit/pull/3412](https://github.com/jesseduffield/lazygit/pull/3412)

##### Maintenance ⚙️

- Add Click() to GuiDriver by
[@&#8203;simonwhitaker](https://github.com/simonwhitaker) in
[https://github.com/jesseduffield/lazygit/pull/2898](https://github.com/jesseduffield/lazygit/pull/2898)
- Add Makefile by [@&#8203;kyu08](https://github.com/kyu08) in
[https://github.com/jesseduffield/lazygit/pull/2937](https://github.com/jesseduffield/lazygit/pull/2937)
- fix GitHub Actions warnings by
[@&#8203;kyu08](https://github.com/kyu08) in
[https://github.com/jesseduffield/lazygit/pull/2950](https://github.com/jesseduffield/lazygit/pull/2950)
- Add instruction in PR template to start PRs with an imperative by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/2967](https://github.com/jesseduffield/lazygit/pull/2967)
- Don't show toasts when running integration tests by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/2975](https://github.com/jesseduffield/lazygit/pull/2975)
- Various debugging improvements by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3000](https://github.com/jesseduffield/lazygit/pull/3000)
- Rename `test/results` to `test/_results` by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3012](https://github.com/jesseduffield/lazygit/pull/3012)
- Support passing -race flag to integration tests by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3019](https://github.com/jesseduffield/lazygit/pull/3019)
- Improve debugging of integration tests by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3029](https://github.com/jesseduffield/lazygit/pull/3029)
- Use go:generate for cheatsheet by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3035](https://github.com/jesseduffield/lazygit/pull/3035)
- Change Makefile to build non-optimized by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3028](https://github.com/jesseduffield/lazygit/pull/3028)
- Update PR template to use go generate command by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3041](https://github.com/jesseduffield/lazygit/pull/3041)
- Band-aid fix for submodule/reset.go test failure by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3047](https://github.com/jesseduffield/lazygit/pull/3047)
- Remove redundant `len` check by
[@&#8203;Juneezee](https://github.com/Juneezee) in
[https://github.com/jesseduffield/lazygit/pull/3051](https://github.com/jesseduffield/lazygit/pull/3051)
- Add disabled compat for user config
([#&#8203;2833](https://github.com/jesseduffield/lazygit/issues/2833))
by [@&#8203;karimkhaleel](https://github.com/karimkhaleel) in
[https://github.com/jesseduffield/lazygit/pull/3060](https://github.com/jesseduffield/lazygit/pull/3060)
- Fix go.mod file by
[@&#8203;stefanhaller](https://github.com/stefanhaller) in
[https://github.com/jesseduffield/lazygit/pull/3118](https://github.com/jesseduffield/lazygit/pull/3118)
- Capture test code coverage stats by
[@&#8203;jesseduffield](https://github.com/jesseduffield) in
[https://github.com/jesseduffield/lazygit/pull/3135](https://github.com/jesseduffield/lazygit/pull/3135)
- fixed typo in test description by
[@&#8203;schuebel](https://github.com/schuebel) in
[https://github.com/jesseduffield/lazygit/pull/3101](https://github.com/jesseduffield/lazygit/pull/3101)
-   Update cheatsheets by [@&#8203;stefanhaller](https:

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 4pm on thursday" in timezone
America/Los_Angeles, Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/scottames/dots).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: scottames-github-bot[bot] <162828115+scottames-github-bot[bot]@users.noreply.github.com>
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.

Adding a command to copy current selected diff to clipboard
4 participants