Help us understand the problem. What is going on with this article?

GitLabでもCommit Hashから該当MRを見つけたい

More than 1 year has passed since last update.

何ができるの?

コードが変更されたGitLab上のMerge Request(MR)に,Emacs上から(ターミナル上から)一気に跳べます.

(最新版はここに置いてあります)
GitHub/gitlab-mr-from-commit

ターミナルからブラウザのMRに飛ぶ

out2.gif

EmacsからブラウザのMRに飛ぶ

out.gif

制約

  1. Git Lab でソースコードが管理されている
  2. git remote -vしたときのURLがhttps://で始まる(git@だと現行バージョンだと失敗する.要望あれば改修します)
  3. (ターミナルから行いたい人)tigがインストールされている
  4. (Emacsから行いたい人)vc-annotate がインストールされている

モチベーション

複数人で開発していると「このコードはどういう経緯で書かれたんだろう」とか色々思って該当のPull Request(Merge Request)を探す機会が増えてきました.そんな時に一々,ブラウザを開いて該当のファイルを見つけてgit blameしてリンクを辿って.....とかするのは面倒でした.

そんなときEmacsで現在見ている行を変更したPRを開けるようにしたという記事を発見.これはGit Hub で同様のことができる例でしたので,Git Lab でもやりたい!と思いつくりました.

実行方法

以下のスクリプトを適当なところに置く(名前はgitlab-mr-from-commitとでもしておく)
実行権限を付与するのを忘れないでね (chmod +x gitlab-mr-from-commit

#!/bin/bash

# NOTE: Get it from gitlab
PRIVATE_TOKEN='[YOUR PRIVATE TOKEN]'

# NOTE: Get it from your project's setting page
PROJECT_ID='[YOUR PROJECT ID]'

# NOTE: URL should start from `[https|http]://`
PROJECT_URL=$(git config remote.origin.url | cut -f2 | rev | cut -c 5- | rev)

# NOTE: Set your commit hash
COMMIT_HASH=$1

# Get response
curl_response=$(curl -s --request GET --header "PRIVATE-TOKEN: ${PRIVATE_TOKEN}" https://gitlab.com/api/v4/projects/${PROJECT_ID}/repository/commits/${COMMIT_HASH}/merge_requests)

# Convert response into json format
response_json=$(echo "${curl_response}" | cut -c 2- | rev | cut -c 2- | rev)

# MR's ID
mr_id=$(echo "${response_json}" | jq -r '.iid')

# NOTE: Choose your fav browser
open -a "Google Chrome" ${PROJECT_URL}/merge_requests/${mr_id}

1. gitlabからprivate access tokenを取得

ここからいける
gitlab-mr-from-commit のPRIVATE_TOKENの部分に以下のようにペースト

# NOTE: Get it from gitlab
PRIVATE_TOKEN='ABCDEFGH'

2. gitlabのproject idを取得

https://gitlab.com/USER_NAME/PROJECT_NAME/edit からいける

Screen Shot 2018-05-20 at 16.01.04.png

gitlab-mr-from-commit のPROJECT_IDの部分に以下のようにペースト

# NOTE: Get it from your project's setting page
PROJECT_ID='12345'

ターミナルでやっちゃいましょう!

1. ターミナル上でgitlabのprojectに移動

$ cd my-gitlab-project

2. .tigrcに以下を追記

# .tigrc
bind generic O @gitlab-mr-from-commit %(commit)

3. ターミナル上で以下のように実行

# tigでやりたい人は
$ tig [FILE]
# tigで該当Commitにカーソルをあわせて, `O`

# or
$ gitlab-mr-from-commit [COMMIT_HASH]

Emacsでやっちゃいましょう!

普段コードリーディングはEmacsでやっているので,Emacs上からMRに飛べれば便利(正直これが本題)
Emacsで現在見ている行を変更したPRを開けるようにしたを参考に.

1. init.elに以下を記述

;; init.elに記述
(defun gitlab-open-mr ()
  (interactive)
  (let* ((rev-at-line (vc-annotate-extract-revision-at-line))
         (rev (car rev-at-line)))
    (shell-command (concat "gitlab-mr-from-commit " rev))))

;; キーバインドはお好みで
(global-set-key (kbd "C-o") 'gitlab-open-mr)

2. vc-annotateを起動

M-x vc-annotate

3. 該当の変更箇所に移動し,gitlab-open-mrを起動

Ctrl+o

コード

コード自体はここに置いておきます(現状かなり雑ですので,改修のPR大歓迎です)
GitHub/gitlab-mr-from-commit

参考

Emacsで現在見ている行を変更したPRを開けるようにした
Commit Hash から、該当 Pull Request を見つける方法
List Merge Requests asscociated with a commit

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away