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

Drop merge commits #4094

Merged
merged 6 commits into from
Dec 23, 2024
Merged

Drop merge commits #4094

merged 6 commits into from
Dec 23, 2024

Conversation

stefanhaller
Copy link
Collaborator

@stefanhaller stefanhaller commented Dec 1, 2024

  • PR Description

Allow deleting a merge commit. We only allow this when the merge commit is the only selected item, and only outside of a rebase. The reason for this is that we don't show the "label" and "reset" todos in lazygit, so deleting a merge commit would leave the commits from the branch that is being merged in the list as "pick" commits, with no indication that they are going to be dropped because they are on a different branch, and the merge commit that would have brought them in is gone. This could be very confusing.

Fixes #3164.

  • 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)
  • If a new UserConfig entry was added, make sure it can be hot-reloaded (see here)
  • Docs have been updated if necessary
  • You've read through your own file changes for silly mistakes etc

@stefanhaller stefanhaller added the enhancement New feature or request label Dec 1, 2024
Copy link

codacy-production bot commented Dec 1, 2024

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
Report missing for 13e9e1d1 92.08%
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (13e9e1d) Report Missing Report Missing Report Missing
Head commit (078445d) 51323 44298 86.31%

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#4094) 101 93 92.08%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

Codacy stopped sending the deprecated coverage status on June 5th, 2024. Learn more

Footnotes

  1. Codacy didn't receive coverage data for the commit, or there was an error processing the received data. Check your integration for errors and validate that your coverage setup is correct.

Copy link
Owner

@jesseduffield jesseduffield left a comment

Choose a reason for hiding this comment

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

Just one thing

@@ -56,18 +50,18 @@ func EditRebaseTodo(filePath string, changes []TodoChange, commentChar byte) err
}

func equalHash(a, b string) bool {
return strings.HasPrefix(a, b) || strings.HasPrefix(b, a)
if len(a) == 0 && len(b) == 0 {
Copy link
Owner

Choose a reason for hiding this comment

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

If I'm reading this right: this function implicitly handles the case of update-ref todos by checking if the hash is empty. That's not very obvious from reading it, and I wonder if we can make this more explicit, either by moving the length check to the callsite so that equalHash() can assume that the hashes are non-empty, or by doing some kind of check on the type of the todo before comparing hashes.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

If I'm reading this right: this function implicitly handles the case of update-ref todos by checking if the hash is empty.

I wouldn't say it like that. This function simply compares two hashes, without making assumptions about the context. Two empty hashes are equal; one empty hash and a non-empty hash are not. Before this change the function was broken in that it returned true when comparing an empty hash against a non-empty one; it just didn't have any bad consequences because it was never called with such arguments. That's what we're fixing here.

Now, whether anything can be made clearer at the call sites is a different question. Adding a check on the type there seems unnecessary to me. It would have to be something like "if both sides are update-refs, we don't have to bother comparing the hashes because we know they will both be empty; and if one side is an update-ref but the other isn't, then we don't have to bother comparing them either because we know one hash will be empty and the other isn't". But it's not worth doing that extra work because the equalHash function does the right thing in these cases now.

I'd be open to adding a comment at the call site though if you think this helps. Wanna make a suggestion?

Copy link
Owner

Choose a reason for hiding this comment

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

Adding a check on the type there seems unnecessary to me. It would have to be something like "if both sides are update-refs, we don't have to bother comparing the hashes because we know they will both be empty; and if one side is an update-ref but the other isn't, then we don't have to bother comparing them either because we know one hash will be empty and the other isn't". But it's not worth doing that extra work because the equalHash function does the right thing in these cases now.

That is indeed exactly what I'm thinking of i.e. being explicit about the fact that we don't need to compare hashes unless both sides are not update-refs. I spent some time seeing if I could get it working but the type mismatches were making it awkward. I'd still like to have another crack at it later but I don't want to hold up this PR so I'm happy to approve

Copy link
Owner

@jesseduffield jesseduffield left a comment

Choose a reason for hiding this comment

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

LGTM

@@ -56,18 +50,18 @@ func EditRebaseTodo(filePath string, changes []TodoChange, commentChar byte) err
}

func equalHash(a, b string) bool {
return strings.HasPrefix(a, b) || strings.HasPrefix(b, a)
if len(a) == 0 && len(b) == 0 {
Copy link
Owner

Choose a reason for hiding this comment

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

Adding a check on the type there seems unnecessary to me. It would have to be something like "if both sides are update-refs, we don't have to bother comparing the hashes because we know they will both be empty; and if one side is an update-ref but the other isn't, then we don't have to bother comparing them either because we know one hash will be empty and the other isn't". But it's not worth doing that extra work because the equalHash function does the right thing in these cases now.

That is indeed exactly what I'm thinking of i.e. being explicit about the fact that we don't need to compare hashes unless both sides are not update-refs. I spent some time seeing if I could get it working but the type mismatches were making it awkward. I'd still like to have another crack at it later but I don't want to hold up this PR so I'm happy to approve

Not much of a change in behavior, because moving merge commits was already not
possible. However, it failed with a cryptic error message ("Todo fa1afe1 not
found in git-rebase-todo"), so disable it properly instead.
So far it didn't have to handle the case where one hash is empty and the other
isn't, but in the next commit we need that, so let's handle that case correctly.
There's enough logic in the function now that it's worth covering it with tests.
One of the comments we are deleting here said:

  // Comparing just the hash is not enough; we need to compare both the
  // action and the hash, as the hash could appear multiple times (e.g. in a
  // pick and later in a merge).

I don't remember what I was thinking when I wrote this code, but it's nonsense
of course. Maybe I was thinking that the hash that appears in a "merge" todo
would be the hash of the commit that is being merged in (which would then
actually appear in an earlier pick), but it isn't, it's the hash of the merge
commit itself (so that the rebase can reuse its commit message). Which means
that hashes are unique, no need to compare the action.
For non-merge commits we change "pick" to "drop" when we delete them. We do this
so that we can use the same code for dropping a commit no matter whether we are
in an interactive rebase or not. (If we aren't, we could just as well delete the
pick line from the todo list instead of setting it to "drop", but if we are, it
is better to keep the line around so that the user can change it back to "pick"
if they change their mind.)

However, merge commits can't be changed to "drop", so we have to delete them
from the todo file. We add a new daemon instruction that does this.

We still don't allow deleting a merge commit from within an interactive rebase.
The reason is that we don't show the "label" and "reset" todos in lazygit, so
deleting a merge commit would leave the commits from the branch that is being
merged in the list as "pick" commits, with no indication that they are going to
be dropped because they are on a different branch, and the merge commit that
would have brought them in is gone. This could be very confusing.
@stefanhaller stefanhaller merged commit 7512138 into master Dec 23, 2024
15 checks passed
@stefanhaller stefanhaller deleted the drop-merge-commits branch December 23, 2024 11:17
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 28, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [jesseduffield/lazygit](https://github.com/jesseduffield/lazygit) | minor | `v0.44.1` -> `v0.45.2` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

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

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

[Compare Source](jesseduffield/lazygit@v0.45.0...v0.45.2)

<!-- Release notes generated using configuration in .github/release.yml at v0.45.2 -->

#### What's Changed

##### Enhancements 🔥

-   Add ability to configure branch color patterns using regex by [@&#8203;mtrajano](https://github.com/mtrajano) in jesseduffield/lazygit#4130
-   Collapse/uncollapse all files in tree by [@&#8203;mtrajano](https://github.com/mtrajano) in jesseduffield/lazygit#4131
-   Improve undo action to restore files upon undoing a commit by [@&#8203;gabriellanata](https://github.com/gabriellanata) in jesseduffield/lazygit#4167

##### Fixes 🔧

-   Bump gocui (and tcell) by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4166

##### Maintenance ⚙️

-   Cut a new release automatically each month by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4146
-   Bump tcell to fix broken deployment by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4178

#### New Contributors

-   [@&#8203;mtrajano](https://github.com/mtrajano) made their first contribution in jesseduffield/lazygit#4130
-   [@&#8203;gabriellanata](https://github.com/gabriellanata) made their first contribution in jesseduffield/lazygit#4167

**Full Changelog**: jesseduffield/lazygit@v0.45.0...v0.45.2

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

[Compare Source](jesseduffield/lazygit@v0.44.1...v0.45.0)

<!-- Release notes generated using configuration in .github/release.yml at v0.45.0 -->

Lots of great improvements in this one! Thanks to all the contributors who helped make this release happen.

Apologies for the long waits between releases. As of jesseduffield/lazygit#4146 we're now (almost) guaranteed to do monthly releases.

#### What's Changed

##### Enhancements 🔥

-   Better branch delete confirmation by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3915
-   Add a menu item to delete both local and remote branch at once by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3916
-   Auto-render hyperlinks by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3914
-   Allow pasting commits multiple times by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3983
-   Add config option to disable switching tabs with panel jump keys (and disable by default) by [@&#8203;hgreenstein](https://github.com/hgreenstein) in jesseduffield/lazygit#3927
    -   We jumped the gun on this change in the last release: having the number key both select a panel and switch tabs was bad for muscle memory so it's that behaviour is now disabled by default.
-   Add new filter to only show tracked files in Files panel by [@&#8203;veremenko-y](https://github.com/veremenko-y) in jesseduffield/lazygit#4024
-   Allow DiffContextSize to be decreased to zero by [@&#8203;LuxxxLucy](https://github.com/LuxxxLucy) in jesseduffield/lazygit#4050
-   Allow user to select remote and branch when creating a MR by [@&#8203;moha-gh](https://github.com/moha-gh) in jesseduffield/lazygit#1889
-   Delete range selection of branches by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4073
-   Show the number of lines changed per file in working file tree view by [@&#8203;johannaschwarz](https://github.com/johannaschwarz) in jesseduffield/lazygit#4015
-   Drop merge commits by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4094
-   Wrap lines in staging view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4098
-   Allow to switch branches in Commit View ([#&#8203;4115](jesseduffield/lazygit#4115)) by [@&#8203;seflue](https://github.com/seflue) in jesseduffield/lazygit#4117
-   Allow on prem Azure DevOps Server pull request by [@&#8203;waynebowie99](https://github.com/waynebowie99) in jesseduffield/lazygit#3954
-   Add screen-mode command line argument by [@&#8203;alewis001](https://github.com/alewis001) in jesseduffield/lazygit#4103
-   Default to half-screen mode when opening with certain CLI args by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4141
-   Show the alt-enter keybinding at bottom of commit description view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4136
-   Add number of commits to cherry-pick confirmation prompt by [@&#8203;brandondong](https://github.com/brandondong) in jesseduffield/lazygit#4158

##### Fixes 🔧

-   Fix copying commit author to clipboard by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3936
-   Fix merge conflict resolution when file doesn't end with a LF by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3976
-   Fix file icons by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3975
-   Fix non-sticky range select after clicking in staging view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3998
-   Fix scroll position when entering staging view by clicking in the main view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3992
-   Fix mouse wheel scrolling of custom patch view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4089
-   Improve editing a commit by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4090
-   Use custom context size in range diff by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4082
-   commits panel: add missing default sort order by [@&#8203;phanirithvij](https://github.com/phanirithvij) in jesseduffield/lazygit#4097
-   Fix issues with opening links and files using WSL by [@&#8203;bottino](https://github.com/bottino) in jesseduffield/lazygit#3850
-   Fix moving a commit across a branch boundary in a stack of branches by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4096
-   Don't preserve commit message when it's unchanged from initial message by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4110
-   Fix hang when returning from shell command by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4126
-   Prevent killing of unrelated processes on windows by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4137
-   Add worktree option to fast forwarding operation by [@&#8203;john-mutuma](https://github.com/john-mutuma) in jesseduffield/lazygit#4051
-   Don't show keybindings option in bottom line when panel is open by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4143
-   Fix reset/rebase to upstream by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4151
-   Avoid blank line at end of view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4152
-   Adjust line number for working copy when editing a line by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4119
-   Fix `micro` editor preset by [@&#8203;kytta](https://github.com/kytta) in jesseduffield/lazygit#4156
-   Use interactive shell for running shell commands only if shell is bash or zsh by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4159

##### Maintenance ⚙️

-   Add performance improvements section to release notes by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#3922
-   ci: update `upload-artifact` and `download-artifact` actions to v4 by [@&#8203;Juneezee](https://github.com/Juneezee) in jesseduffield/lazygit#4063
-   Let schema/config.json end with a line feed by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4092
-   Saner view geometry by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4085
-   Cleanup background fetch by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4084
-   remove duplicate secondary MouseWheelUp keybind by [@&#8203;samueldominguez](https://github.com/samueldominguez) in jesseduffield/lazygit#4120
-   enhancement: Use HEX colors on file icons instead of C256 colors by [@&#8203;hasecilu](https://github.com/hasecilu) in jesseduffield/lazygit#4029
-   chore: use errors.New to replace fmt.Errorf with no parameters by [@&#8203;RiceChuan](https://github.com/RiceChuan) in jesseduffield/lazygit#4107
-   Fix typos by [@&#8203;NathanBaulch](https://github.com/NathanBaulch) in jesseduffield/lazygit#3920
-   Bump crypto and net packages by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4144
-   Tweak file icons by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4145
-   Standardise on 'screen mode' naming convention by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4142

##### Docs 📖

-   Fix installation for Ubuntu in README.md by [@&#8203;shaobosong](https://github.com/shaobosong) in jesseduffield/lazygit#4031
-   Fixes to lazygit Ubuntu install instructions in README.md by [@&#8203;wrecklass](https://github.com/wrecklass) in jesseduffield/lazygit#3970
-   Fix typos by [@&#8203;skoch13](https://github.com/skoch13) in jesseduffield/lazygit#4121
-   Add vision and design principles doc by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4053
-   docs: Stylize and correct the NixOS section in README.md by [@&#8203;wadsaek](https://github.com/wadsaek) in jesseduffield/lazygit#4135
-   Update chinese translation for pull requests by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#4140
-   Set repology table to 3 columns by [@&#8203;hasecilu](https://github.com/hasecilu) in jesseduffield/lazygit#4138
-   Update instructions for using OSC52 with tmux by [@&#8203;EliasA5](https://github.com/EliasA5) in jesseduffield/lazygit#3597
-   Update docs to describe use of custom commands without keybindings by [@&#8203;a-jentleman](https://github.com/a-jentleman) in jesseduffield/lazygit#3846
-   documentation - describe os.openLink by [@&#8203;smangels](https://github.com/smangels) in jesseduffield/lazygit#3094
-   Clarify commit message prefix mechanics by [@&#8203;zeromask1337](https://github.com/zeromask1337) in jesseduffield/lazygit#4114

#### New Contributors

-   [@&#8203;shaobosong](https://github.com/shaobosong) made their first contribution in jesseduffield/lazygit#4031
-   [@&#8203;hgreenstein](https://github.com/hgreenstein) made their first contribution in jesseduffield/lazygit#3927
-   [@&#8203;wrecklass](https://github.com/wrecklass) made their first contribution in jesseduffield/lazygit#3970
-   [@&#8203;veremenko-y](https://github.com/veremenko-y) made their first contribution in jesseduffield/lazygit#4024
-   [@&#8203;LuxxxLucy](https://github.com/LuxxxLucy) made their first contribution in jesseduffield/lazygit#4050
-   [@&#8203;phanirithvij](https://github.com/phanirithvij) made their first contribution in jesseduffield/lazygit#4097
-   [@&#8203;bottino](https://github.com/bottino) made their first contribution in jesseduffield/lazygit#3850
-   [@&#8203;johannaschwarz](https://github.com/johannaschwarz) made their first contribution in jesseduffield/lazygit#4015
-   [@&#8203;samueldominguez](https://github.com/samueldominguez) made their first contribution in jesseduffield/lazygit#4120
-   [@&#8203;skoch13](https://github.com/skoch13) made their first contribution in jesseduffield/lazygit#4121
-   [@&#8203;wadsaek](https://github.com/wadsaek) made their first contribution in jesseduffield/lazygit#4135
-   [@&#8203;seflue](https://github.com/seflue) made their first contribution in jesseduffield/lazygit#4117
-   [@&#8203;waynebowie99](https://github.com/waynebowie99) made their first contribution in jesseduffield/lazygit#3954
-   [@&#8203;EliasA5](https://github.com/EliasA5) made their first contribution in jesseduffield/lazygit#3597
-   [@&#8203;alewis001](https://github.com/alewis001) made their first contribution in jesseduffield/lazygit#4103
-   [@&#8203;a-jentleman](https://github.com/a-jentleman) made their first contribution in jesseduffield/lazygit#3846
-   [@&#8203;john-mutuma](https://github.com/john-mutuma) made their first contribution in jesseduffield/lazygit#4051
-   [@&#8203;RiceChuan](https://github.com/RiceChuan) made their first contribution in jesseduffield/lazygit#4107
-   [@&#8203;NathanBaulch](https://github.com/NathanBaulch) made their first contribution in jesseduffield/lazygit#3920

**Full Changelog**: jesseduffield/lazygit@v0.44.1...v0.45.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

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

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xMzcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjEzNy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
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.

"Todo not found in git-rebase-todo" error when we try to drop merge commit
2 participants