Skip to content

Draft: feat: implement rebasing#534

Open
jakubbortlik wants to merge 11 commits intoharrisoncramer:developfrom
jakubbortlik:feat/implement-rebasing
Open

Draft: feat: implement rebasing#534
jakubbortlik wants to merge 11 commits intoharrisoncramer:developfrom
jakubbortlik:feat/implement-rebasing

Conversation

@jakubbortlik
Copy link
Copy Markdown
Collaborator

@jakubbortlik jakubbortlik commented Mar 4, 2026

Closes #497.

This is still in draft because I would like to test it thoroughly, but the main functionality works. The maintained Diffview fork supports updating a diffview, and programmatically modifying selections which enables us to update the reviewer in place without closing and reopening after a rebase.

There will be a trivial conflict with #530 because both PR's add keybindings in the same place in settings.

AI use: The Go code is mostly generated by Claude Opus 4.5. The same model has been used for reviewing the lua code.

Comment thread lua/gitlab/reviewer/init.lua Outdated
end

vim.api.nvim_command(string.format("%s %s..%s", diffview_open_command, diff_refs.base_sha, diff_refs.head_sha))
local full_command = string.format("%s %s..%s", diffview_open_command, remote_target_branch, state.INFO.source_branch)
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

By using branch names to open the Diffview the view automatically updates after fetching the remote target branch and pulling the source branch which has been rebased on the server.

I still need to find out if this doesn't break anything or if the diff_refs should not be replaced in other parts of the codebase as well.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

After some testing, I think it will be more appropriate if the base SHA is taken from the diff_refs (vim.api.nvim_command(string.format("%s %s..%s", diffview_open_command, diff_refs.base_sha, state.INFO.source_branch)), as it was originally otherwise the diffview shows too many "changed" files when the MR needs to be rebased.

@jakubbortlik jakubbortlik force-pushed the feat/implement-rebasing branch from 27e544a to 6fc6475 Compare March 17, 2026 16:20
@jakubbortlik jakubbortlik force-pushed the feat/implement-rebasing branch from 6fc6475 to 3384ee1 Compare March 28, 2026 22:29
@jakubbortlik jakubbortlik force-pushed the feat/implement-rebasing branch from 3384ee1 to d528de8 Compare March 30, 2026 13:12
@jakubbortlik jakubbortlik changed the title Draft: feat: implement rebasing feat: implement rebasing Apr 10, 2026
@jakubbortlik jakubbortlik changed the title feat: implement rebasing Draft: feat: implement rebasing Apr 10, 2026
@jakubbortlik jakubbortlik force-pushed the feat/implement-rebasing branch from dff2d2a to 49d2495 Compare April 11, 2026 11:40
Comment thread doc/gitlab.nvim.txt
create_mr = "glC", -- Create a new MR for currently checked-out feature branch
choose_merge_request = "glc", -- Chose MR for review (if necessary check out the feature branch)
start_review = "glS", -- Start review for the currently checked-out branch
reload_review = "gl<C-R>", -- Load new MR state from Gitlab and apply new diff refs to the diff view
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I'm wondering whether it would make sense to connect this to the refresh of the discussion tree instead of making it a separate function and keybinding.

Comment thread doc/gitlab.nvim.txt
Comment on lines +865 to 871
gitlab.close_review() ~

Closes the reviewer tab and discussion tree and cleans up (e.g., removes
winbar timer).
>lua
require("gitlab").close_review()
<
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

This is an existing API that was just missing documentation.

M.is_open = true
local cur_view = diffview_lib.get_current_view()
M.diffview_layout = cur_view.cur_layout
M.diffview = require("diffview.lib").get_current_view()
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Saving this to the module table makes it possible to reduce the reliance on the diffview.lib in other places of the codebase.

Comment thread lua/gitlab/reviewer/init.lua Outdated
Comment on lines +104 to +106
if M.tabnr ~= nil and vim.api.nvim_tabpage_is_valid(M.tabnr) then
vim.cmd.tabclose(vim.api.nvim_tabpage_get_number(M.tabnr))
end
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

This approach makes sure we close the tab created by gitlab.nvim when the reviewer.close() function is called in a different diffview.

The `vim.api.nvim_get_current_tabpage()` function returns a tab ID, not
a tab number, as exemplified by the usage:
`vim.cmd.tabclose(vim.api.nvim_tabpage_get_number(M.tabid))`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve rebasing experience

1 participant