从ruby中的用户的公共github repos获取文件的内容

时间:2014-08-29 14:13:32

标签: ruby github

我想编写一个小的ruby脚本来遍历用户的所有公共存储库并获取特定文件(如果存在)。这里有一个小代码片段,可以在文件存在的irb中运行,但是我得到的是404,所以一定有什么问题,但是我没有看到它:

require 'octokit'
user = Octokit.user 'octokit'
repos = user.rels[:repos].get.data

>   repos[3].name
 => "octokit.rb"

Octokit.contents repos[3], path:'Gemfile'

Octokit::NotFound: GET https://api.github.com/contents/Gemfile: 404 - Not Found // See: https://developer.github.com/v3

特定的repo(https://github.com/octokit/octokit.rb)肯定在根级别有一个名为'Gemfile'的文件,但它仍然报告404。

1 个答案:

答案 0 :(得分:3)

这就是你要找的东西

require 'octokit'
user = Octokit.user("octokit")
repos = user.rels[:repos].get.data
Octokit.contents repos[3].full_name, path:"Gemfile"

Octokit#contents接受repo的以下对象类型:

Integer @id = repo
String @owner, @name = repo.split('/') #this is what I used with #full_name
Repository @owner = repo.owner;  @name = repo.name
Hash @name = repo[:repo] ||= repo[:name]; @owner = repo[:owner] ||= repo[:user] ||= repo[:username]

当您使用get.data时,实际上没有Repository您有Sawyer::Resource没有处理权限,所以当它生成网址时,您会获得/

可能有更好的方法,但这是调整特定代码的最简单方法。

<强>更新

repos更容易访问,您可以像这样创建Hash

repos = Hash[user.rels[:repos].get.data.map{|r| [r.name, Octokit::Repository.new(r.full_name)]}]
#=> {"go-octokit"=>octokit/go-octokit, "octokit.net"=>octokit/octokit.net, "octokit.objc"=>octokit/octokit.objc, "octokit.rb"=>octokit/octokit.rb}
Octokit.contents repos["octokit.rb"], path: "Gemfile"

我认为这增加了一些可读性,或者你可以使用补丁Sawyer::Resource

class Sawyer::Resource
  def to_repo
    Octokit::Repositiory.new(self.full_name)
  end
end
repos = user.rels[:repos].get.data.map(&:to_repo) #this will return an array of `Octokit::Repository` Objects
Octokit.contents repos[3], path:'Gemfile'