GitLab&GitHubを操作するためのCLIツール、hlbのご紹介

GitHubには[hub](https://github.com/github/hub)というツールがあります。
これは、以下のようにTerminalからリポジトリの作成やブラウザ表示、プルリクエストの作成などを行うCLIツールです。

```Shell
$ hub create # GitHubにカレントディレクトリ名のリポジトリが作成される
$ hub browse # カレントディレクトリのGitHubリポジトリページをブラウザで表示する
$ hub pull-request # 現在のブランチに対応するプルリクエストを作成する
```

これは慣れるととにかく便利で、ghq+pecoと組み合わせて爆速でGitHubリポジトリを開いたり、パッと思いついたコードをシュッとGitHubにpushしたりできます。
GitLabアドベントカレンダーでいきなりGitHubの話をしてしまいましたが、こういうツールはGitLabにも当然あって、[Applications Supporting GitLab | GitLab](https://about.gitlab.com/applications/#cli-clients)から対応しているツールの一覧を確認できます。
Starの数的には[NARKOZ/gitlab: Ruby wrapper and CLI for GitLab REST API](https://github.com/NARKOZ/gitlab)が一番多そうです。

ところで、私は仕事でwindows+GitLab、家ではmac+GitHubという環境で開発しています。
そうすると、GitHubとGitLabに対応した、クロスプラットフォームなhubが欲しくなりますが、探してもそういうツールは見当たらない、というか複数のgitホスティングサービスに対応するのが明らかにめんどくさいので、誰もやろうとしないことがわかります。
というわけで、自分で作りはじました。(ここまで前置き)

# hlb: git + hub/lab/bucket and more
[mpppk/hlb: CLI that provides unified & interactive interface to multiple git repository hosting services](https://github.com/mpppk/hlb)

## 特徴
- 複数のgitホスティングサービスをサポート
    - 現時点ではGitHubとGitLabに対応しています。
    - 勢いあまってreadmeにhub/lab/bucketとか書いてしまったので、抽象化レイヤーのAPIが固まったらやっていきたい...
- hubと同じコマンド体系
    - まずはbrowse, create, pull-requestをサポート
- Interactive command
    - 外部のfuzzy finderを利用して操作するコマンド(後述)
- クロスプラットフォーム
    - golangの恩恵により、バイナリを落としてくるだけでwindows/mac/linux/etcで動きます。

## 導入
バイナリがあるので[Releases](https://github.com/mpppk/hlb/releases)から落としてきていい感じにしてください。
macの方はbrewでinstallできます。

```Shell
$ brew tap mpppk/mpppk
$ brew install hlb
```
gopherな方はソースからどうぞ

```Shell
$ go get github.com/mpppk/hlb
```

## tokenの登録
`~/.config/hlb/.hlb.yaml`を作成し、以下をコピペしてください

```yaml
services:
  - name: github.com # もしくはGHEのドメイン名
    type: github
    protocol: https # or http
    oauth_token: xxxxxxxxxxxxxxxxxx
  - name: gitlab.com # もしくはGitLabのドメイン名
    type: gitlab
    protocol: https # or http
    oauth_token: xxxxxxxxxxxxxxxxxxxxx
```

GitHubのtokenは[Personal Access Tokens](https://github.com/settings/tokens)から、GitLabのtokenは[Personal Access Tokens · User Settings · GitLab](https://gitlab.com/profile/personal_access_tokens)から取得してください。
(使わないサービスのtokenは取得しなくて大丈夫です!)

## browseコマンド
GitHubやGitLabがremoteとして登録されているリポジトリ内で`hlb browse`を実行すると、そのリポジトリのページへ飛びます。
`hlb browse issues`でIssueの一覧ページに飛んだり、`hlb browse pull-requests/merge-requests`でPR/MRの一覧に飛んだりできます。利用可能なサブコマンドの一覧はhelpを見てください。

### ibrowseコマンド
hlbでは複数のgitホスティングサービスサポート以外に、interactiveな操作を提供するという目標があります。
ibrowse(interactive browse)はその最初の実装で、[peco](https://github.com/peco/peco)というfuzzy finderを利用してインタラクティブに表示するページを決めることができます。(なので、ibrowseコマンドを使う場合は、予めpecoのバイナリをパスが通る場所へ置いておく必要があります)
例えば`# MR`と入力すると、Issueのうち`MR`という単語を含むものが絞り込まれ、Enterでそのページを開くことができます。
[![Image](https://i.gyazo.com/510fe10751129f1716b3a99b1a5014ec/thumb/1000)](https://i.gyazo.com/510fe10751129f1716b3a99b1a5014ec.png)

以下は`#`でIssue、`!`でPR/MRを絞り込んで表示する例です。
[![Image](https://raw.githubusercontent.com/wiki/mpppk/hlb/images/hlb_ibrowse.gif)](https://raw.githubusercontent.com/wiki/mpppk/hlb/images/hlb_ibrowse.gif)


## createコマンド
origin remoteが登録されていないgitリポジトリで`hlb create`を実行すると以下のような表示になります。
[![Image](https://i.gyazo.com/56d7fe0535e79819c22ec4248fcfabc4/thumb/1000)](https://i.gyazo.com/56d7fe0535e79819c22ec4248fcfabc4.png)
このようにサービスの一覧が表示されるので、pushしたいサービスを選択すればOKです。
リモートリポジトリの生成とorigin remoteの登録が行われます。
以下は作成したリモートリポジトリにそのままpushして`hlb browse`で表示する例です。
[![Image](https://raw.githubusercontent.com/wiki/mpppk/hlb/images/hlb_create_and_browse.gif)](https://raw.githubusercontent.com/wiki/mpppk/hlb/images/hlb_create_and_browse.gif)

## pull-requestコマンド
実行するとエディタが開くので、PR/MRのタイトルとメッセージを入力してください。
保存して閉じるとカレントブランチに対応するPR/MRが作成されます。
以下はPR/MRを作って、`hlb browse`で表示する例です。
![hlb pull-requet image](https://raw.githubusercontent.com/wiki/mpppk/hlb/images/hlb_pull-request.gif)

というわけで複数のgitホスティングサービスで使えるCLI、[hlb](https://github.com/mpppk/hlb)のご紹介でした。
まだまだ作り始めたばかりですが、Issueなど投げて頂けると泣いて喜びます！