へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

GitHub APIを使ってgit push時に自動でプルリクにラベルを付与したり外したりしてみた。

はじめに

GitHub APIがひどい。
APIを叩くと、値ではなくて、「リンク先」が返ってくる。
ひどすぎる。

curlとかで叩く方法もある

けど、当然つらいのでやめたほうがいいです(`・ω・´)

公式のAPIクライアント

Libraries | GitHub API

RubyとObj-Cと.NETはいけるようだ。
でもPythonとかはなんか野生のクライアントが乱立していて使えなさげ

Octokit.rbというやつを使った

github.com

概要

認証する
 ↓
なんでもとれるようになった(`・ω・´)

注意:
 URL系の値が大量に取れるので、APIとして酷い。醜すぎてつらい。

やりかた

認証する

# Provide authentication credentials
client = Octokit::Client.new(:login => 'harukaeru', :password => 'password')

なんでもとれるようになる

irb(main):007:0> pulls = client.pull_requests("harukaeru/GitHubAPITest")
=> [{:url=>"https://api.github.com/repos/harukaeru/GitHubAPITest/pulls/1", :id=>52087545, :html_url=>"https://github.com/harukaeru/GitHubAPITest/pull/1", :diff_url=>"https://github.com/harukaeru/GitHubAPITest/pull/1.diff", :patch_url=>"https://github.com/harukaeru/GitHubAPITest/pull/1.patch", :issue_url=>"https://api.github.com/repos/harukaeru/GitHubAPITest/issues/1", :

(省略

ラベルはissueにあるので、プルリクリストからブランチ名を元にプルリクを特定して、

def get_pr(prs, branch_name)
  (prs).each do |p|
    if p.head.ref == branch_name then
      return p
    end
  end
  return nil
end

そしてissue番号を手に入れて(get_pr(~~~).number)、ラベルを付与する(client.add_labels_to_an_issue)という感じ

自動でラベルつくるやつは、
.git/hooks/pre-pushとかに書けばおk

まあGitHub上でできることはだいたいAPIでできるっぽい
ラベルやassigneeやauthorを自動でつけるようにしたり、
プルリクに対するコメントが増えたらプルリク一覧の表示を赤色にするとかして、
プルリク指摘しあうときとか捗りそう。
ポーリングして、"LGTM"って書かれたら「1人がいいねと言っています!」みたいなラベルを張るということもできそう
夢が広がりんぐwwwwww

めんどいので、誰かつくってください。

おまけ

ドキュメントよりoctokit.rbのソースを読んだほうがわかりやすいです。
大したこと書いてないので

それにしてもruby全くしらなかったから今日一日で結構勉強になった感ある。

追記:
基本困ったら、メソッドはclientオブジェクトから全部呼び出せるので、それを使うとよいかもです
GitHubのpublicのレポジトリは、別にログインしていなくても見えるのでclientオブジェクトを作らなくてもよさげ。

octokitのソースをうまいことgrepしながらやってくとすぐ終わりそう。

octokitを使っているときに出現するURL系の値は、ぶっちゃけ邪魔なので
あんまり使うことはないかもしれないです。