# encoding: utf-8 module Github class GitData::References < API VALID_REF_PARAM_NAMES = %w[ ref sha force ].freeze REQUIRED_REF_PARAMS = %w[ ref sha ].freeze VALID_REF_PARAM_VALUES = { 'ref' => %r{^refs\/\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.list 'user-name', 'repo-name' # # github.git_data.references.list 'user-name', 'repo-name', ref:'tags' # def list(*args) arguments(args, :required => [:user, :repo]) params = arguments.params response = if (ref = params.delete('ref')) validate_reference ref get_request("/repos/#{user}/#{repo}/git/refs/#{ref}", params) else get_request("/repos/#{user}/#{repo}/git/refs", params) end return response unless block_given? response.each { |el| yield el } end alias :all :list # 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.references.get 'user-name', 'repo-name', 'heads/branch' # def get(*args) arguments(args, :required => [:user, :repo, :ref]) validate_reference ref params = arguments.params get_request("/repos/#{user}/#{repo}/git/refs/#{ref}", params) end alias :find :get # 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.references.create 'user-name', 'repo-name', # "ref" => "refs/heads/master", # "sha" => "827efc6d56897b048c772eb4087f854f46256132" # def create(*args) arguments(args, :required => [:user, :repo]) do sift VALID_REF_PARAM_NAMES assert_required REQUIRED_REF_PARAMS end params = arguments.params validate_reference params['ref'] post_request("/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.references.update 'user-name', 'repo-name', 'heads/master', # "sha" => "827efc6d56897b048c772eb4087f854f46256132", # "force" => true # def update(*args) arguments(args, :required => [:user, :repo, :ref]) do sift VALID_REF_PARAM_NAMES assert_required %w[ sha ] end params = arguments.params patch_request("/repos/#{user}/#{repo}/git/refs/#{ref}", params) end # Delete a reference # # = Examples # github = Github.new # github.git_data.references.delete 'user-name', 'repo-name', # "ref" => "refs/heads/master", # def delete(*args) arguments(args, :required => [:user, :repo, :ref]) params = arguments.params delete_request("/repos/#{user}/#{repo}/git/refs/#{ref}", params) end alias :remove :delete private def validate_reference(ref) refs = (ref =~ (/^(\/)?refs.*/) ? ref : "refs/#{ref}").gsub(/(\/)+/, '/') refs.gsub!(/^\//, '') unless VALID_REF_PARAM_VALUES['ref'] =~ refs raise ArgumentError, "Provided 'reference' is invalid" end end end # GitData::References end # Github