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

Non-sticky range selection diff #3869

Merged
merged 15 commits into from
Aug 31, 2024
Merged

Conversation

stefanhaller
Copy link
Collaborator

  • PR Description

When selecting a range of commits, show the combined diff for them.

Along the way, fix a few minor issues with the current implementation of diffing mode; see the individual commit messages for details.

Fixes #3862.

  • 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

I found this indirection confusing when reading the code. It looks like
SwitchToDiffFilesController is instantiated with different such contexts, but
it's always Contexts.CommitFiles, so just use that directly.
viewFiles is only called from enter; it doesn't make much sense to fill in a
SwitchToCommitFilesContextOpts struct to pass it to viewFiles for this one call.
Simply inline viewFiles into enter and get rid of all that.
In the next commit it will be reused for checking whether we need to reset the
patch; and extracting it makes it easier to extend it for non-sticky diff ranges
later in the branch.
We need to compare more than just the "To" ref. The NewPatchRequired function
existed already for this purpose, it just wasn't used.
…e in diffing mode

The three nested `if` statements may looks strange, and you might wonder why we
don't have single one with &&. The answer is that later in this branch we will
add an `else` block to the middle one.
This fixes two problems:
- Set the title ref to the commit description (like
  SwitchToDiffFilesController.enter does), rather than just the hash
- SetTitleRef only sets the title of the DynamicTitleBuilder, but doesn't set it
  on the view; this only happens in ContextMgr.Activate, so you'd have to switch
  to a different side panel and then back to see the new title.
Hopefully this will help alleviate the problem that diffing mode is sticky, and
you often forget that it's still on.

Make it magenta like the mode text in the information view.
This is consistent with what we do for showing single commits (with git show),
and I find it very useful.
In other views that show lists of commits (reflog and stash) it doesn't make
sense to show a range diff of selected entries because they don't form a linear
sequence, so we keep the previous behavior of showing the diff for the free end
of the selection range in those view.

The same applies to the commits view if the selection range includes rebasing
todos; these can have an arbitrary order, and a range diff doesn't make sense
for those.
Right now it doesn't do very much yet, but it's still worth it even in this
state, I'd say. The function is going to become a bit longer in the next commit,
though.
We make the name of the GetSelectedRefRangeForDiffFiles very specific on purpose
to make it clear that this is only for switching to diff files, so the
implementations can make assumptions about that (unlike GetSelectedRef, which is
used for different purposes and needs to stay more generic).
@stefanhaller stefanhaller added the enhancement New feature or request label Aug 28, 2024
@stefanhaller stefanhaller changed the title Non-sticky range select diff Non-sticky range selection diff Aug 28, 2024
Copy link

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
Report missing for 05ae0801 83.84%
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (05ae080) Report Missing Report Missing Report Missing
Head commit (32fef9a) 49875 42700 85.61%

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 (#3869) 198 166 83.84%

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.

LGTM, great work!

One thing we may discover is that people do want to be able to use this when interactive rebasing. I can imagine an approach where we check to see if the range of commits have been reordered or not, and if they haven't, we show the range diff. At any rate, no need to do that now.

@stefanhaller
Copy link
Collaborator Author

One thing we may discover is that people do want to be able to use this when interactive rebasing. I can imagine an approach where we check to see if the range of commits have been reordered or not, and if they haven't, we show the range diff.

I'd be interested in a use case for this. I'm a very heavy user of interactive rebase myself, and never missed this.

@stefanhaller stefanhaller merged commit 2f01af4 into master Aug 31, 2024
17 checks passed
@stefanhaller stefanhaller deleted the non-sticky-range-select-diff branch August 31, 2024 06:16
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Sep 23, 2024
This MR contains the following updates:

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

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.44.1`](https://github.com/jesseduffield/lazygit/releases/tag/v0.44.1)

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

#### What's Changed

##### Enhancements 🔥

-   With stacked branches, create fixup commit at the end of the branch it belongs to by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3892
-   Add options for disabling switching to the Files panel after popping or applying a stash by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3913

##### Fixes 🔧

-   Fix crash when viewing the divergence of a branch which is up to date with its upstream by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3918

##### Performance improvements 📊

-   Improve performance with large numbers of untracked or modified files by [@&#8203;parthokunda](https://github.com/parthokunda) in jesseduffield/lazygit#3919

##### I18n 🌎

-   Update language files from Crowdin by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3898

#### New Contributors

-   [@&#8203;parthokunda](https://github.com/parthokunda) made their first contribution in jesseduffield/lazygit#3919

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

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

[Compare Source](jesseduffield/lazygit@v0.43.1...v0.44.0)

#### What's Changed

Lots of great changes in this release. Thanks to everybody who contributed!

##### Enhancements 🔥

-   Per-repo config files (and reloading of edited config files) by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3787
    -   In addition to the global config file you can now create repo-specific config files in `<repo>/.git/lazygit.yml`. Settings in these files override settings in the global config file. In addition, files called `.lazygit.yml` in any of the parent directories of a repo will also be loaded; this can be useful if you have settings that you want to apply to a group of repositories.
    -   We now also automatically apply (most) config changes without the need to restart lazygit
-   Easily view diff across range of commits by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3869
    -   If you select a range of commits, we now show the diff across the range (inclusive). This makes it easy to see the total changes across a number of commits. Likewise, if you press enter when a range of commits are selected, we will show the changed files for the range.

https://github.com/user-attachments/assets/6646c78b-5770-41c1-93b9-5442d32404de

-   Support hyperlinks from pagers by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3825
    -   If you're using delta as a pager (which I highly recommend trying), you can now click on line numbers to go to that line in your editor by using the following config:
    ```yaml
    git:
      paging:
        colorArg: always
        pager: delta --paging=never --line-numbers --hyperlinks --hyperlinks-file-link-format="lazygit-edit://{path}:{line}"
    ```

https://github.com/user-attachments/assets/75fef6c4-d437-4595-ab00-b8990215cfed

-   Switch to Files panel after popping/applying a stash by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3888
    -   This is a nice quality of life improvement. You generally want to go straight to the files panel after you pop or apply from the stash
-   Ask to auto-stage unstaged files when continuing a rebase after resolving conflicts by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3879
    -   Another quality of life improvement: often you resolve some conflicts, then make another couple changes, then in lazygit you say to continue and you get an error saying there are unstaged changes. Now instead of showing an error, lazygit asks if you want to stage those changes and continue.
-   Offer autostash option when creating new branch by [@&#8203;brandondong](https://github.com/brandondong) in jesseduffield/lazygit#3871
    -   Another great quality of life improvement
-   Allow using shell aliases in interactive custom commands by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3793
-   Switch tabs with panel jump keys by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3794
    -   If you've already been using the number keys (1-5) for jumping to specific side panels, you'll be pleased to know that you can now also use those keys for jumping to tabs within a side panel. E.g. to go to the reflog panel, you can now press 4 to jump to the commits panel, then 4 again to go to the reflog tab.
-   Rename "Custom Command" to "Shell Command" by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3800
    -   There are two ways of invoking a 'custom' command in Lazygit: first by pre-defining a command in your config, and second by pressing ':' and typing in the command directly. We referred to both of these as 'custom commands' which was confusing. We now refer to the second approach as invoking a 'shell command'.
-   Improve template placeholders for custom commands by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3809
    -   Now you can use `SelectedCommit` to refer to the selected commit regardless of which commits panel you're in (local commits, reflog, etc)
    -   Likewise, you can use `SelectedPath` whether you're in the files panel or the commit-files panel.
-   feat(custom command): support multiple contexts within one command by [@&#8203;yam-liu](https://github.com/yam-liu) in jesseduffield/lazygit#3784
    -   You can now use a comma-separated list of contexts for which a custom command can be invoked. For example:
    ```yaml
    customCommands:
      - description: 'Add empty commit'
        key: 'E'
        context: 'commits,files'
    ```
-   Improve mouse support for commit message panel by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3836
-   Make auto-staging resolved conflicts optional by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3870
    -   If you set `git.autoStageResolvedConflicts` to false in your config, lazygit will no longer auto-stage files in which you've resolved merge conflicts.
-   Allow using `<`/`>` and `,`/`.` in sticky range select mode in patch explorer by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3837
-   Add Zed editor support to editorPreset by [@&#8203;susl](https://github.com/susl) in jesseduffield/lazygit#3886

##### Fixes 🔧

-   Allow GPG reword for last commit by [@&#8203;Neko-Box-Coder](https://github.com/Neko-Box-Coder) in jesseduffield/lazygit#3815
-   Don't exit app when GetRepoPaths call fails during startup by [@&#8203;ppoum](https://github.com/ppoum) in jesseduffield/lazygit#3779
-   Fix lack of icon when extension isn't lowercase by [@&#8203;hasecilu](https://github.com/hasecilu) in jesseduffield/lazygit#3810
-   Fix redraw bug (stale content) in commits view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3783
-   Fix line coloring when using the delta pager by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3820
-   Fix pressing escape after clicking in diff view by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3828
-   Fix fast-forward issue caused by a conflicting tag name [@&#8203;Neko-Box-Coder](https://github.com/Neko-Box-Coder) in jesseduffield/lazygit#3807
-   Fix range select -> stage failure when deleted file is already staged by [@&#8203;brandondong](https://github.com/brandondong) in jesseduffield/lazygit#3631
-   Scroll views up if needed to show all their content by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3839
-   Fix crash when filtering commits by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3838
-   Fix cancelled autostash resulting in stuck inline status by [@&#8203;brandondong](https://github.com/brandondong) in jesseduffield/lazygit#3860
-   Don't allow opening a menu while the search or filter prompt is open by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3878

##### Maintenance ⚙️

-   Reapply "Check for fixup commits on CI" by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3745
-   Some cleanups for APIs related to contexts by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3808
-   Improve fixup commits script by [@&#8203;jesseduffield](https://github.com/jesseduffield) in jesseduffield/lazygit#3853
-   Fix linter warnings by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3854
-   Add codespell support (config, workflow to detect/not fix) and make it fix few typos by [@&#8203;yarikoptic](https://github.com/yarikoptic) in jesseduffield/lazygit#3751
-   Get rid of a lot of error return values by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3890
-   Add a readme file for the JSON files in pkg/i18n/translations by [@&#8203;stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#3781

#### New Contributors

-   [@&#8203;yam-liu](https://github.com/yam-liu) made their first contribution in jesseduffield/lazygit#3784
-   [@&#8203;ppoum](https://github.com/ppoum) made their first contribution in jesseduffield/lazygit#3779
-   [@&#8203;Neko-Box-Coder](https://github.com/Neko-Box-Coder) made their first contribution in jesseduffield/lazygit#3815
-   [@&#8203;yarikoptic](https://github.com/yarikoptic) made their first contribution in jesseduffield/lazygit#3751
-   [@&#8203;susl](https://github.com/susl) made their first contribution in jesseduffield/lazygit#3886

**Full Changelog**: jesseduffield/lazygit@v0.43.1...v0.44.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:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
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.

Non-sticky range diff
2 participants