何ができるの?
コードが変更されたGitLab上のMerge Request(MR)に,Emacs上から(ターミナル上から)一気に跳べます.
(最新版はここに置いてあります)
GitHub/gitlab-mr-from-commit
ターミナルからブラウザのMRに飛ぶ
EmacsからブラウザのMRに飛ぶ
制約
- Git Lab でソースコードが管理されている
-
git remote -v
したときのURLがhttps://
で始まる(git@
だと現行バージョンだと失敗する.要望あれば改修します) - (ターミナルから行いたい人)
tig
がインストールされている - (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
からいける
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