8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitHub API経由でコミットを取り出す

Posted at

GitHub APIは大変よくできていて、Gitのさまざまな操作をAPI経由で行うことができる。

スマートフォンなどのgitがインストールしにくい環境であっても、GitHubからプログラムをクローンしたりコミットすることが可能になる。これは素晴らしいのでまずはレポジトリのクローンから試してみることにした。

レポジトリの取得

ongaeshi/tango: Flashcard for RubyPico から。GitHubのAPIは分かりやすくてurlの項目を数珠つなぎに見ていけば目的のデータを取得できる。

$ curl https://api.github.com/repos/ongaeshi/tango/git/trees/master?recursive=1
{
  "sha": "f5ef6ef11cba6ad1654e04631395e5758d5ad6f2",
  "url": "https://api.github.com/repos/ongaeshi/tango/git/trees/f5ef6ef11cba6ad1654e04631395e5758d5ad6f2",
  "tree": [
    {
      "path": ".gitignore",
      "mode": "100644",
      "type": "blob",
      "sha": "d045bfa4618473ed28e1fa157d6fda40ccc1059a",
      "size": 9,
      "url": "https://api.github.com/repos/ongaeshi/tango/git/blobs/d045bfa4618473ed28e1fa157d6fda40ccc1059a"
    },
    {
      "path": "README.md",
      "mode": "100644",
      "type": "blob",
      "sha": "17092b70377aec764a6bc3ce9b8bf891ff407737",
      "size": 279,
      "url": "https://api.github.com/repos/ongaeshi/tango/git/blobs/17092b70377aec764a6bc3ce9b8bf891ff407737"
    },
    {
      "path": "cli.rb",
      "mode": "100644",
      "type": "blob",
      "sha": "55a1a4266ddfde1833582afcf7408e045d63ba2d",
      "size": 1075,
      "url": "https://api.github.com/repos/ongaeshi/tango/git/blobs/55a1a4266ddfde1833582afcf7408e045d63ba2d"
    },
  .
  .
  ],
  "truncated": false
}

treeの取得

各ファイルやディレクトリの情報。例としてcli.rbのtreeを取り出す。

$ curl https://api.github.com/repos/ongaeshi/tango/git/blobs/55a1a4266ddfde1833582afcf7408e045d63ba2d
{
  "sha": "55a1a4266ddfde1833582afcf7408e045d63ba2d",
  "size": 1075,
  "url": "https://api.github.com/repos/ongaeshi/tango/git/blobs/55a1a4266ddfde1833582afcf7408e045d63ba2d",
  "content": "cmVxdWlyZSAidGFuZ28vanNvbl9maWxlIgpyZXF1aXJlICJ0YW5nby93b3Jk\ncyIKCm1vZHVsZSBUYW5nbwogIGNsYXNzIENsaQogICAgZGVmIGluaXRpYWxp\nemUKICAgICAgQGpzb24gPSBKc29uRmlsZS5uZXcoIndvcmQuanNvbiIpCiAg\nICAgIEB3b3JkcyA9IFdvcmRzLm5ldyhAanNvbikKICAgIGVuZAogICAgCiAg\nICBkZWYgbWFpbmxvb3AKICAgICAgbG9vcCBkbwogICAgICAgIGNvbW1hbmQg\nPSBwcm9tcHQKCiAgICAgICAgY2FzZSBjb21tYW5kCiAgICAgICAgd2hlbiAv\nXmwvCiAgICAgICAgICBsaXN0KGNvbW1hbmQuc3BsaXRbMS4uLTFdKQogICAg\nICAgIHdoZW4gL15ybS8KICAgICAgICAgIHJtKGNvbW1hbmQuc3BsaXRbMS4u\nLTFdKQogICAgICAgIHdoZW4gInQiCiAgICAgICAgd2hlbiAiaCIKICAgICAg\nICAgIGhlbHAKICAgICAgICBlbHNlCiAgICAgICAgICBhZGQoY29tbWFuZCkK\nICAgICAgICBlbmQKICAgICAgZW5kCiAgICBlbmQKICAgIAogICAgZGVmIGFk\nZChjb21tYW5kKQogICAgICBjbWRzID0gY29tbWFuZC5zcGxpdCgiICIpCgog\nICAgICBAd29yZHMuYWRkX29yX3VwZGF0ZShjbWRzWzBdLCBjbWRzWzFdKQog\nICAgICBAd29yZHMuc2F2ZQogICAgZW5kCiAgICAgIAogICAgZGVmIGxpc3Qo\nYXJncykKICAgICAgd29yZHMgPSBAd29yZHMudG9fYQogICAgICB3b3JkcyA9\nIHdvcmRzLnNvcnRfYnkgeyB8ZXwgZS51cGRhdGVkX2F0IH0ucmV2ZXJzZQog\nICAgICAKICAgICAgd29yZHMuZWFjaCBkbyB8ZXwKICAgICAgICBpZiBhcmdz\nLmVtcHR5PwogICAgICAgICAgcHV0cyBlLmFzdHIKICAgICAgICBlbHNlCiAg\nICAgICAgICBwdXRzIGUuYXN0ciBpZiBlLndvcmQuaW5jbHVkZT8gYXJnc1sw\nXQogICAgICAgIGVuZAogICAgICBlbmQKICAgIGVuZAogICAgCiAgICBkZWYg\ncm0oYXJncykKICAgICAgYXJncy5lYWNoIGRvIHxlfAogICAgICAgIHIgPSBA\nd29yZHMucm0gZQogICAgICAgIHB1dHMgIk5vdCBmb3VuZCAje2V9IiB1bmxl\nc3MgcgogICAgICBlbmQKICAgICAgCiAgICAgIEB3b3Jkcy5zYXZlCiAgICBl\nbmQKICAgIAogICAgZGVmIGhlbHAKICAgIGVuZAogIGVuZAplbmQKCg==\n",
  "encoding": "base64"
}

contentの変換

base64エンコーディングされているのでデコードすれば中身を取り出すことができる。以下は雑なRubyスクリプト。

require 'base64'

str = "cmVxdWlyZSAidGFuZ28vanNvbl9maWxlIgpyZXF1aXJlICJ0YW5nby93b3Jk\ncyIKCm1vZHVsZSBUYW5nbwogIGNsYXNzIENsaQogICAgZGVmIGluaXRpYWxp\nemUKICAgICAgQGpzb24gPSBKc29uRmlsZS5uZXcoIndvcmQuanNvbiIpCiAg\nICAgIEB3b3JkcyA9IFdvcmRzLm5ldyhAanNvbikKICAgIGVuZAogICAgCiAg\nICBkZWYgbWFpbmxvb3AKICAgICAgbG9vcCBkbwogICAgICAgIGNvbW1hbmQg\nPSBwcm9tcHQKCiAgICAgICAgY2FzZSBjb21tYW5kCiAgICAgICAgd2hlbiAv\nXmwvCiAgICAgICAgICBsaXN0KGNvbW1hbmQuc3BsaXRbMS4uLTFdKQogICAg\nICAgIHdoZW4gL15ybS8KICAgICAgICAgIHJtKGNvbW1hbmQuc3BsaXRbMS4u\nLTFdKQogICAgICAgIHdoZW4gInQiCiAgICAgICAgd2hlbiAiaCIKICAgICAg\nICAgIGhlbHAKICAgICAgICBlbHNlCiAgICAgICAgICBhZGQoY29tbWFuZCkK\nICAgICAgICBlbmQKICAgICAgZW5kCiAgICBlbmQKICAgIAogICAgZGVmIGFk\nZChjb21tYW5kKQogICAgICBjbWRzID0gY29tbWFuZC5zcGxpdCgiICIpCgog\nICAgICBAd29yZHMuYWRkX29yX3VwZGF0ZShjbWRzWzBdLCBjbWRzWzFdKQog\nICAgICBAd29yZHMuc2F2ZQogICAgZW5kCiAgICAgIAogICAgZGVmIGxpc3Qo\nYXJncykKICAgICAgd29yZHMgPSBAd29yZHMudG9fYQogICAgICB3b3JkcyA9\nIHdvcmRzLnNvcnRfYnkgeyB8ZXwgZS51cGRhdGVkX2F0IH0ucmV2ZXJzZQog\nICAgICAKICAgICAgd29yZHMuZWFjaCBkbyB8ZXwKICAgICAgICBpZiBhcmdz\nLmVtcHR5PwogICAgICAgICAgcHV0cyBlLmFzdHIKICAgICAgICBlbHNlCiAg\nICAgICAgICBwdXRzIGUuYXN0ciBpZiBlLndvcmQuaW5jbHVkZT8gYXJnc1sw\nXQogICAgICAgIGVuZAogICAgICBlbmQKICAgIGVuZAogICAgCiAgICBkZWYg\ncm0oYXJncykKICAgICAgYXJncy5lYWNoIGRvIHxlfAogICAgICAgIHIgPSBA\nd29yZHMucm0gZQogICAgICAgIHB1dHMgIk5vdCBmb3VuZCAje2V9IiB1bmxl\nc3MgcgogICAgICBlbmQKICAgICAgCiAgICAgIEB3b3Jkcy5zYXZlCiAgICBl\nbmQKICAgIAogICAgZGVmIGhlbHAKICAgIGVuZAogIGVuZAplbmQKCg==\n"
puts Base64.decode64 str

結果

require "tango/json_file"
require "tango/words"

module Tango
  class Cli
    def initialize
      @json = JsonFile.new("word.json")
      @words = Words.new(@json)
    end
    
    def mainloop
      loop do
        command = prompt

        case command
        when /^l/
          list(command.split[1..-1])
        when /^rm/
          rm(command.split[1..-1])
        when "t"
        when "h"
          help
        else
          add(command)
        end
      end
    end
    
    def add(command)
      cmds = command.split(" ")

      @words.add_or_update(cmds[0], cmds[1])
      @words.save
    end
      
    def list(args)
      words = @words.to_a
      words = words.sort_by { |e| e.updated_at }.reverse
      
      words.each do |e|
        if args.empty?
          puts e.astr
        else
          puts e.astr if e.word.include? args[0]
        end
      end
    end
    
    def rm(args)
      args.each do |e|
        r = @words.rm e
        puts "Not found #{e}" unless r
      end
      
      @words.save
    end
    
    def help
    end
  end
end

残り

  • treeをたどる
  • treeだったらディレクトリ作成
  • blobだったらcontentをbase64デコードして内容をファイルに書き出し

だれかすでに書いてそうだなぁ。探してみよう。

mrubyで動かすには

mrubyで動くようになればRubyPicoでもできるようになるはず。

GETはすでにBrowser.getでできるようになっているので、あとはbase64。

mruby-base64 mgemを追加すればよさそう。今回もmattnさんに足を向けて寝られない結果となりました。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?