# encoding: utf-8
module Github
class GitData::Trees < API
VALID_TREE_PARAM_NAMES = %w[
base_tree
tree
path
mode
type
sha
content
url
].freeze
VALID_TREE_PARAM_VALUES = {
'mode' => %w[ 100644 100755 040000 160000 120000 ],
'type' => %w[ blob tree commit ]
}
# Creates new GitData::Trees API
def initialize(options = {})
super(options)
end
# Get a tree
#
# = Examples
# github = Github.new
# github.git_data.trees.get 'user-name', 'repo-name', 'sha'
# github.git_data.trees.get 'user-name', 'repo-name', 'sha' do |file|
# file.path
# end
#
# Get a tree recursively
#
# = Examples
# github = Github.new
# github.git_data.trees.get 'user-name', 'repo-name', 'sha', 'recursive' => true
#
def get(user_name, repo_name, sha, params={})
set :user => user_name, :repo => repo_name
assert_presence_of user, repo, sha
normalize! params
response = if params['recursive']
params['recursive'] = 1
get_request("/repos/#{user}/#{repo}/git/trees/#{sha}", params)
else
get_request("/repos/#{user}/#{repo}/git/trees/#{sha.to_s}", params)
end
return response unless block_given?
response.tree.each { |el| yield el }
end
alias :find :get
# Create a tree
#
# The tree creation API will take nested entries as well.
# If both a tree and a nested path modifying that tree are specified,
# it will overwrite the contents of that tree with the new path contents
# and write a new tree out.
#
# = Parameters
# * :base_tree - optional string of the SHA1 of the tree you want to update with new data
# * :tree - array of hash objects(of :path, :mode, :type and sha)
# * tree.path:: String of the file referenced in the tree
# * tree.mode:: String of the file mode - one of 100644 for file(blob), 100755 for executable (blob), 040000 for subdirectory (tree), 160000 for submodule (commit) or 120000 for a blob that specifies the path of a symlink
# * tree.type:: String of blob, tree, commit
# * tree.sha:: String of SHA1 checksum ID of the object in the tree
# * tree.content:: String of content you want this file to have - GitHub will write this blob out and use the SHA for this entry. Use either this or tree.sha
#
# = Examples
# github = Github.new
# github.git_data.trees.create 'user-name', 'repo-name',
# "tree" => [
# {
# "path" => "file.rb",
# "mode" => "100644",
# "type" => "blob",
# "sha" => "44b4fc6d56897b048c772eb4087f854f46256132"
# },
# ...
# ]
#
def create(user_name, repo_name, params={})
set :user => user_name, :repo => repo_name
assert_presence_of user, repo
normalize! params
assert_required_keys(%w[ tree ], params)
filter! VALID_TREE_PARAM_NAMES, params['tree']
assert_valid_values(VALID_TREE_PARAM_VALUES, params['tree'])
post_request("/repos/#{user}/#{repo}/git/trees", params)
end
end # GitData::Trees
end # Github