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

# 何ができるの？
コードが変更されたGitLab上のMerge Request（MR）に，Emacs上から（ターミナル上から）一気に跳べます．

（最新版はここに置いてあります）
[GitHub/gitlab-mr-from-commit](https://github.com/blue0513/gitlab-mr-from-commit)

### ターミナルからブラウザのMRに飛ぶ
![out2.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/f0b5eddb-a9e4-4c2e-1ce4-1ca7f7f78b66.gif)

### EmacsからブラウザのMRに飛ぶ
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/ad518c46-cced-7179-6c11-ff2b4227d660.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を開けるようにした](http://blog.shibayu36.org/entry/2018/05/08/193000)という記事を発見．これはGit **Hub** で同様のことができる例でしたので，Git **Lab** でもやりたい！と思いつくりました．

# 実行方法

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

```sh
#!/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を取得 

[ここからいける](https://gitlab.com/profile/personal_access_tokens)
`gitlab-mr-from-commit` のPRIVATE_TOKENの部分に以下のようにペースト

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

#### 2. gitlabのproject idを取得

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

<img width="787" alt="Screen Shot 2018-05-20 at 16.01.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/d8cba978-13bb-976b-686e-787465bf3588.png">

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

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

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

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

```sh
$ cd my-gitlab-project
```

#### 2. `.tigrc`に以下を追記

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

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

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

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

## Emacsでやっちゃいましょう！
普段コードリーディングはEmacsでやっているので，Emacs上からMRに飛べれば便利（正直これが本題）
[Emacsで現在見ている行を変更したPRを開けるようにした](http://blog.shibayu36.org/entry/2018/05/08/193000)を参考に．

#### 1. `init.el`に以下を記述

```elisp
;; 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](https://github.com/blue0513/gitlab-mr-from-commit)

## 参考
[Emacsで現在見ている行を変更したPRを開けるようにした](http://blog.shibayu36.org/entry/2018/05/08/193000)
[Commit Hash から、該当 Pull Request を見つける方法](https://qiita.com/awakia/items/f14dc6310e469964a8f7)
[List Merge Requests asscociated with a commit](https://docs.gitlab.com/ee/api/commits.html#list-merge-requests-associated-with-a-commit)