# encoding: utf-8 module Github class Client::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. # # @example # github = Github.new # github.git_data.references.list 'user-name', 'repo-name' # # @example # github.git_data.references.list 'user-name', 'repo-name', ref:'tags' # # @api public def list(*args) arguments(args, required: [:user, :repo]) params = arguments.params user = arguments.user repo = arguments.repo 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 # # @example # github = Github.new # github.git_data.references.get 'user-name', 'repo-name', 'heads/branch' # # @api public def get(*args) arguments(args, required: [:user, :repo, :ref]) validate_reference arguments.ref params = arguments.params get_request("/repos/#{arguments.user}/#{arguments.repo}/git/refs/#{arguments.ref}", params) end alias :find :get # Create a reference # # @param [Hash] params # @input params [String] :ref # 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. # @input params [String] :sha # The SHA1 value to set this reference to # # @example # github = Github.new # github.git_data.references.create 'user-name', 'repo-name', # ref: "refs/heads/master", # sha: "827efc6d56897b048c772eb4087f854f46256132" # # @api public def create(*args) arguments(args, required: [:user, :repo]) do permit VALID_REF_PARAM_NAMES assert_required REQUIRED_REF_PARAMS end params = arguments.params validate_reference params['ref'] post_request("/repos/#{arguments.user}/#{arguments.repo}/git/refs", params) end # Update a reference # # @param [Hash] params # @input params [String] :sha # The SHA1 value to set this reference to # @input params [Boolean] :force # Indicates whether to force the update or to make sure the update # is a fast-forward update. Leaving this out or setting it to false # will make sure you’re not overwriting work. Default: false # # @example # github = Github.new # github.git_data.references.update 'user-name', 'repo-name', 'heads/master', # sha: "827efc6d56897b048c772eb4087f854f46256132", # force: true # # @api public def update(*args) arguments(args, required: [:user, :repo, :ref]) do permit VALID_REF_PARAM_NAMES assert_required %w[ sha ] end patch_request("/repos/#{arguments.user}/#{arguments.repo}/git/refs/#{arguments.ref}", arguments.params) end # Delete a reference # # @example # github = Github.new # github.git_data.references.delete 'user-name', 'repo-name', # ref: "refs/heads/master" # # @api public def delete(*args) arguments(args, required: [:user, :repo, :ref]) params = arguments.params delete_request("/repos/#{arguments.user}/#{arguments.repo}/git/refs/#{arguments.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