• Stars
    star
    187
  • Rank 202,271 (Top 5 %)
  • Language
    Lua
  • License
    MIT License
  • Created about 1 year ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Create, review, and manage Gitlab reources without leaving Neovim

gitlab.nvim

This Neovim plugin is designed to make it easy to review Gitlab MRs from within the editor. This means you can do things like:

  • Create, approve, and merge MRs for the current branch
  • Read and edit an MR description
  • Add or remove reviewers and assignees
  • Resolve, reply to, and unresolve discussion threads
  • Create, edit, delete, and reply to comments
  • View and manage pipeline Jobs
  • Upload files, jump to the browser, and a lot more!

Screenshot 2024-01-13 at 10 43 32 AM Screenshot 2024-01-13 at 10 43 17 AM

example.mov

To view these help docs and to get more detailed help information, please run :h gitlab.nvim

Requirements

  • Go >= v1.19

Quick Start

  1. Install Go
  2. Add configuration (see Installation section)
  3. Checkout your feature branch: git checkout feature-branch
  4. Open Neovim
  5. Run :lua require("gitlab").review() to open the reviewer pane

For more detailed information about the Lua APIs please run :h gitlab.nvim.api

Installation

With Lazy:

return {
  "harrisoncramer/gitlab.nvim",
  dependencies = {
    "MunifTanjim/nui.nvim",
    "nvim-lua/plenary.nvim",
    "sindrets/diffview.nvim",
    "stevearc/dressing.nvim", -- Recommended but not required. Better UI for pickers.
    "nvim-tree/nvim-web-devicons" -- Recommended but not required. Icons in discussion tree.
  },
  enabled = true,
  build = function () require("gitlab.server").build(true) end, -- Builds the Go binary
  config = function()
    require("gitlab").setup()
  end,
}

And with Packer:

use {
  'harrisoncramer/gitlab.nvim',
  requires = {
    "MunifTanjim/nui.nvim",
    "nvim-lua/plenary.nvim",
    "sindrets/diffview.nvim",
    "stevearc/dressing.nvim", -- Recommended but not required. Better UI for pickers.
    "nvim-tree/nvim-web-devicons", -- Recommended but not required. Icons in discussion tree.
  },
  run = function() require("gitlab.server").build(true) end,
  config = function()
    require("gitlab").setup()
  end,
}

Connecting to Gitlab

This plugin requires an auth token to connect to Gitlab. The token can be set in the root directory of the project in a .gitlab.nvim environment file, or can be set via a shell environment variable called GITLAB_TOKEN instead. If both are present, the .gitlab.nvim file will take precedence.

Optionally provide a GITLAB_URL environment variable (or gitlab_url value in the .gitlab.nvim file) to connect to a self-hosted Gitlab instance. This is optional, use ONLY for self-hosted instances. Here's what they'd look like as environment variables:

export GITLAB_TOKEN="your_gitlab_token"
export GITLAB_URL="https://my-personal-gitlab-instance.com/"

And as a .gitlab.nvim file:

auth_token=your_gitlab_token
gitlab_url=https://my-personal-gitlab-instance.com/

The plugin will look for the .gitlab.nvim file in the root of the current project by default. However, you may provide a custom path to the configuration file via the config_path option. This must be an absolute path to the directory that holds your .gitlab.nvim file.

Configuring the Plugin

Here is the default setup function. All of these values are optional, and if you call this function with no values the defaults will be used:

require("gitlab").setup({
  port = nil, -- The port of the Go server, which runs in the background, if omitted or `nil` the port will be chosen automatically
  log_path = vim.fn.stdpath("cache") .. "/gitlab.nvim.log", -- Log path for the Go server
  config_path = nil, -- Custom path for `.gitlab.nvim` file, please read the "Connecting to Gitlab" section
  debug = { go_request = false, go_response = false }, -- Which values to log
  attachment_dir = nil, -- The local directory for files (see the "summary" section)
  reviewer_settings = {
    diffview = {
      imply_local = false, -- If true, will attempt to use --imply_local option when calling |:DiffviewOpen|
    },
  },
  help = "g?", -- Opens a help popup for local keymaps when a relevant view is focused (popup, discussion panel, etc)
  popup = { -- The popup for comment creation, editing, and replying
    exit = "<Esc>",
    perform_action = "<leader>s", -- Once in normal mode, does action (like saving comment or editing description, etc)
    perform_linewise_action = "<leader>l", -- Once in normal mode, does the linewise action (see logs for this job, etc)
    width = "40%",
    height = "60%",
    border = "rounded", -- One of "rounded", "single", "double", "solid"
    opacity = 1.0, -- From 0.0 (fully transparent) to 1.0 (fully opaque)
    comment = nil, -- Individual popup overrides, e.g. { width = "60%", height = "80%", border = "single", opacity = 0.85 },
    edit = nil,
    note = nil,
    pipeline = nil,
    reply = nil,
    squash_message = nil,
    backup_register = nil,
  },
  discussion_tree = { -- The discussion tree that holds all comments
    auto_open = true, -- Automatically open when the reviewer is opened
    switch_view = "S", -- Toggles between the notes and discussions views
    default_view = "discussions" -- Show "discussions" or "notes" by default
    blacklist = {}, -- List of usernames to remove from tree (bots, CI, etc)
    jump_to_file = "o", -- Jump to comment location in file
    jump_to_reviewer = "m", -- Jump to the location in the reviewer window
    edit_comment = "e", -- Edit comment
    delete_comment = "dd", -- Delete comment
    reply = "r", -- Reply to comment
    toggle_node = "t", -- Opens or closes the discussion
    add_emoji = "Ea" -- Add an emoji to the note/comment
    add_emoji = "Ed" -- Remove an emoji from a note/comment
    toggle_all_discussions = "T", -- Open or close separately both resolved and unresolved discussions
    toggle_resolved_discussions = "R", -- Open or close all resolved discussions
    toggle_unresolved_discussions = "U", -- Open or close all unresolved discussions
    keep_current_open = false, -- If true, current discussion stays open even if it should otherwise be closed when toggling
    toggle_resolved = "p" -- Toggles the resolved status of the whole discussion
    position = "left", -- "top", "right", "bottom" or "left"
    open_in_browser = "b" -- Jump to the URL of the current note/discussion
    size = "20%", -- Size of split
    relative = "editor", -- Position of tree split relative to "editor" or "window"
    resolved = '', -- Symbol to show next to resolved discussions
    unresolved = '-', -- Symbol to show next to unresolved discussions
    tree_type = "simple", -- Type of discussion tree - "simple" means just list of discussions, "by_file_name" means file tree with discussions under file
    toggle_tree_type = "i", -- Toggle type of discussion tree - "simple", or "by_file_name"
    winbar = nil -- Custom function to return winbar title, should return a string. Provided with WinbarTable (defined in annotations.lua)
                 -- If using lualine, please add "gitlab" to disabled file types, otherwise you will not see the winbar.
  },
  info = { -- Show additional fields in the summary view
    enabled = true,
    horizontal = false, -- Display metadata to the left of the summary rather than underneath
    fields = { -- The fields listed here will be displayed, in whatever order you choose
      "author",
      "created_at",
      "updated_at",
      "merge_status",
      "draft",
      "conflicts",
      "assignees",
      "reviewers",
      "branch",
      "pipeline",
    },
  },
  discussion_signs = {
    enabled = true, -- Show diagnostics for gitlab comments in the reviewer
    skip_resolved_discussion = false, -- Show diagnostics for resolved discussions
    severity = vim.diagnostic.severity.INFO, -- ERROR, WARN, INFO, or HINT
    virtual_text = false, -- Whether to show the comment text inline as floating virtual text
    priority = 100, -- Higher will override LSP warnings, etc
    icons = {
      comment = "→|",
      range = " |",
    },
  },
  pipeline = {
    created = "",
    pending = "",
    preparing = "",
    scheduled = "",
    running = "",
    canceled = "",
    skipped = "",
    success = "",
    failed = "",
  },
  merge = { -- The default behaviors when merging an MR, see "Merging an MR"
    squash = false,
    delete_branch = false,
  },
  create_mr = {
    target = nil, -- Default branch to target when creating an MR
    template_file = nil, -- Default MR template in .gitlab/merge_request_templates
    title_input = { -- Default settings for MR title input window
      width = 40,
      border = "rounded",
    },
  },
  colors = {
    discussion_tree = {
      username = "Keyword",
      date = "Comment",
      chevron = "DiffviewNonText",
      directory = "Directory",
      directory_icon = "DiffviewFolderSign",
      file_name = "Normal",
    }
  }
})

Usage

First, check out the branch that you want to review locally.

git checkout feature-branch

Then open Neovim. To begin, try running the summary command or the review command.

Keybindings

The plugin does not set up any keybindings outside of the special buffers it creates, you need to set them up yourself. Here's what I'm using:

local gitlab = require("gitlab")
local gitlab_server = require("gitlab.server")
vim.keymap.set("n", "glr", gitlab.review)
vim.keymap.set("n", "gls", gitlab.summary)
vim.keymap.set("n", "glA", gitlab.approve)
vim.keymap.set("n", "glR", gitlab.revoke)
vim.keymap.set("n", "glc", gitlab.create_comment)
vim.keymap.set("v", "glc", gitlab.create_multiline_comment)
vim.keymap.set("v", "glC", gitlab.create_comment_suggestion)
vim.keymap.set("n", "glO", gitlab.create_mr)
vim.keymap.set("n", "glm", gitlab.move_to_discussion_tree_from_diagnostic)
vim.keymap.set("n", "gln", gitlab.create_note)
vim.keymap.set("n", "gld", gitlab.toggle_discussions)
vim.keymap.set("n", "glaa", gitlab.add_assignee)
vim.keymap.set("n", "glad", gitlab.delete_assignee)
vim.keymap.set("n", "glla", gitlab.add_label)
vim.keymap.set("n", "glld", gitlab.delete_label)
vim.keymap.set("n", "glra", gitlab.add_reviewer)
vim.keymap.set("n", "glrd", gitlab.delete_reviewer)
vim.keymap.set("n", "glp", gitlab.pipeline)
vim.keymap.set("n", "glo", gitlab.open_in_browser)
vim.keymap.set("n", "glM", gitlab.merge)

For more information about each of these commands, and about the APIs in general, run :h gitlab.nvim.api

More Repositories

1

nvim

My personal Neovim configuration.
Lua
117
star
2

fullstack-template

This is a template repository to get up and running quickly with Vite, React, Jest, Express Docker, and Github Actions for CI/CD.
JavaScript
16
star
3

jump-tag

Neovim plugin for jumping between HTML tags.
Lua
13
star
4

go-shell-run

Simple Golang HTTP server to allow for the remote execution of shell commands.
Go
4
star
5

harrisoncramer.me

My personal blog and coding website.
MDX
3
star
6

cloture

Monorepo for Cloture, the web scraper that aggregates congressional information from across Capitol Hill.
TypeScript
2
star
7

DoD-Contract-Bot

Tweets out contracts from @DeptDefense at 5:00 p.m. EST every day.
JavaScript
2
star
8

dc_filing_bots

This is a repository of useful web crawlers for journalists. They ping DOJ's Foreign Agents Registration Act for new lobbyists, and the Senate stock and other asset disclosures. There's also a bot that's helping me get a scoop from the ACLU case on border wall funding.
JavaScript
2
star
9

node_login_with_trackers

JavaScript
1
star
10

Digital-Ocean-Scripts

These are a series of configuration scripts to setup a NodeJS production environment on a Digital Ocean droplet.
Shell
1
star
11

streetsleazy

It's hard to be a saint in the city
TypeScript
1
star
12

gql3.0_processors

JavaScript
1
star
13

arduino-security

An alarm using Arudino Uno and TinyGo!
Go
1
star
14

video-streaming-microservices

Distributed video streaming application built on Node.js, RabbitMQ, and Azure for file storage.
HCL
1
star
15

terraform-and-gh-actions

Simple repository showing how you can combine Terraform Cloud with Github Actions to automate your IAC.
HCL
1
star
16

typeorm-typegrapqhl-api

Dockerized API using typeorm, type-graphql, and Postgres.
TypeScript
1
star
17

serverless-typescript

Template project for AWS/Serverless development with Typescript.
TypeScript
1
star
18

serverless-scraper-api

Web scraping endpoints that use puppeteer and axios, which accept arguments via a POST request.
TypeScript
1
star
19

Tor_Puppeteer_Template

JavaScript
1
star
20

ts_frontend_template

TypeScript
1
star
21

Sked_Checker_Text_Bot

JavaScript
1
star
22

quiet.sh

An application that will help Github users check if they have accidentally committed sensitive keys to their repositories.
JavaScript
1
star
23

clipNotes

A Google Chrome Extension that lets you write notes about the sites that you visit, which persist across your visits. Designed for developers to take notes on documentation.
JavaScript
1
star
24

ts-react-dockerized

Template for building and deploying a React project (with Typescript) using Docker and Nginx as a reverse proxy.
TypeScript
1
star