Sha256: 070a244d6aebdea37d19a46f2ddf5243b1e967c0dae5d12a5bba5be5488de810

Contents?: true

Size: 1.48 KB

Versions: 3

Compression:

Stored size: 1.48 KB

Contents

module CronForGithub
  class Ping
    NAMESPACE = 'cron_for_github'
    BASE = 'master'
    RESERVED_REFS = %w(
      tags
      gh-pages
      master
      branches
      trunk
      feature
      develop
      release
      hotfix
    )

    def ping(params)
      client = Client.new
      slug = decide_slug(params[:slug])
      head_ref = decide_head_ref(params[:base])
      cron_ref = decide_cron_ref(params[:namespace], __method__)

      latest_sha = client.latest_sha(slug, head_ref)
      client.create_ref(slug, cron_ref, latest_sha)
    end

    def decide_slug(text)
      text
    end

    def decide_head_ref(text)
      text = BASE if !text || text.empty?
      "heads/#{text}"
    end

    def decide_cron_ref(text, caller = nil)
      "#{decide_cron_ref_prefix(text, caller)}#{SecureRandom.uuid}"
    end

    def clear(params)
      client = Client.new
      slug = decide_slug(params[:slug])
      cron_ref_prefix = decide_cron_ref_prefix(params[:namespace])

      cron_refs = client.refs(slug, cron_ref_prefix)
      cron_refs
        .each do |clear_ref|
          client.delete_ref(slug, clear_ref)
        end
    end

    def decide_cron_ref_prefix(text, caller = nil)
      if caller != :ping && RESERVED_REFS.include?(text)
        fail ReservedNamespaceError, \
             %("#{text}" is reserved. List: #{RESERVED_REFS.join(', ')})
      end
      text = NAMESPACE if !text || text.empty?
      "heads/#{text}/"
    end

    def logger
      ::CronForGithub.logger
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
cron_for_github-2.0.1 lib/cron_for_github/ping.rb
cron_for_github-2.0.0 lib/cron_for_github/ping.rb
cron_for_github-1.0.0 lib/cron_for_github/ping.rb