# encoding: utf-8
module Github
class GitData
module References
VALID_REF_PARAM_NAMES = %w[ ref sha force ].freeze
VALID_REF_PARAM_VALUES = {
'ref' => %r{^refs\/\w+\/\w+(\/\w+)*} # test fully qualified reference
}
# Get all references
#
# This will return an array of all the references on the system,
# including things like notes and stashes if they exist on the server.
# Anything in the namespace, not just heads and tags,
# though that would be the most common.
#
# = Examples
# @github = Github.new
# @github.git_data.references 'user-name', 'repo-name'
#
# @github.git_data.references 'user-name', 'repo-name', 'tags'
#
def references(user_name, repo_name, ref=nil, params={})
_update_user_repo_params(user_name, repo_name)
_validate_user_repo_params(user, repo) unless user? && repo?
_normalize_params_keys(params)
response = if ref
_validate_reference ref
get("/repos/#{user}/#{repo}/git/refs/#{ref}", params)
else
get("/repos/#{user}/#{repo}/git/refs", params)
end
return response unless block_given?
response.each { |el| yield el }
end
alias :list_references :references
alias :get_all_references :references
# Get a reference
#
# The ref in the URL must be formatted as heads/branch,
# not just branch. For example, the call to get the data for a
# branch named sc/featureA would be formatted as
# heads/sc/featureA
#
# = Examples
# @github = Github.new
# @github.git_data.reference 'user-name', 'repo-name', 'reference'
#
def reference(user_name, repo_name, ref, params={})
_update_user_repo_params(user_name, repo_name)
_validate_user_repo_params(user, repo) unless user? && repo?
_validate_presence_of ref
_validate_reference ref
_normalize_params_keys params
get("/repos/#{user}/#{repo}/git/refs/#{ref}", params)
end
alias :get_reference :reference
# Create a reference
#
# = Inputs
# * :ref - String of the name of the fully qualified reference (ie: refs/heads/master). If it doesn’t start with ‘refs’ and have at least two slashes, it will be rejected.
# * :sha - String of the SHA1 value to set this reference to
#
# = Examples
# @github = Github.new
# @github.git_data.create_reference 'user-name', 'repo-name',
# "ref" => "refs/heads/master",
# "sha" => "827efc6d56897b048c772eb4087f854f46256132"
#
def create_reference(user_name, repo_name, params={})
_update_user_repo_params(user_name, repo_name)
_validate_user_repo_params(user, repo) unless user? && repo?
_normalize_params_keys params
_filter_params_keys VALID_REF_PARAM_NAMES, params
_validate_reference params['ref']
raise ArgumentError, "Required params are: ref, sha" unless _validate_inputs(%w[ ref sha ], params)
post("/repos/#{user}/#{repo}/git/refs", params)
end
# Update a reference
#
# = Inputs
# * :sha - String of the SHA1 value to set this reference to
# * :force - Boolean indicating whether to force the update or to make sure the update is a fast-forward update. The default is false, so leaving this out or setting it to false will make sure you’re not overwriting work.
#
# = Examples
# @github = Github.new
# @github.git_data.create_reference 'user-name', 'repo-name',
# "sha" => "827efc6d56897b048c772eb4087f854f46256132",
# "force" => true
#
def update_reference(user_name, repo_name, ref, params={})
_update_user_repo_params(user_name, repo_name)
_validate_user_repo_params(user, repo) unless user? && repo?
_validate_presence_of ref
_validate_reference ref
_normalize_params_keys(params)
_filter_params_keys(VALID_REF_PARAM_NAMES, params)
raise ArgumentError, "Required params are: sha" unless _validate_inputs(%w[ sha ], params)
patch("/repos/#{user}/#{repo}/git/refs/#{ref}", params)
end
private
def _validate_reference ref
unless VALID_REF_PARAM_VALUES['ref'] =~ "refs/#{ref}"
raise ArgumentError, "Provided 'reference' is invalid"
end
end
end # References
end # GitData
end # Github