我想编写一个小的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。
答案 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'