lib/gem/release/cmds/github.rb



require_relative 'base'
require_relative '../context/github'

module Gem
  module Release
    module Cmds
      class Github < Base
        summary "Creates a GitHub release for the current version."

        description <<-str.split("\n").map(&:lstrip).join("\n")
          Creates a GitHub release for the current version.

          Requires a tag `v[version]` to be present or --tag to be given.
        str

        MSGS = {
          release:  'Creating GitHub release for %s version %s.',
          no_tag:   'Tag %s does not exist. Run `gem tag` or pass `--tag`.',
          no_repo:  'Could not determine the repository name. Please pass `--repo REPO`, or set homepage or metadata[:github_url] to the GitHub repository URL in the gemspec.',
          no_token: 'Could not determine the GitHub OAuth token. Please pass `--token TOKEN`. See https://developer.github.com/v3/#oauth2-token-sent-in-a-header for more details.',
        }.freeze

        def run
          in_gem_dirs do
            announce :release, gem.name, tag_name
            validate
            release
          end
        end

        private

          def validate
            abort :no_tag, tag_name unless tagged?
            abort :no_token unless token
          end

          def tagged?
            git.tags.include?(tag_name)
          end

          def release
            return if pretend?
            Context::Github.new(repo, data).release
          end

          def data
            {
              version:  gem.version,
              tag_name: tag_name,
              name:     "#{gem.name} #{tag_name}",
              descr:    descr,
              token:    token
            }
          end

          def tag_name
            "v#{gem.version}"
          end

          def repo
            opts[:repo] || repo_from(gem.spec.homepage) || repo_from(gem.spec.metadata[:github_url]) || abort(:no_repo)
          end

          def repo_from(url)
            url && url =~ %r(https://github\.com/(.*/.*)) && $1
          end

          def token
            opts[:token]
          end

          def descr
            opts[:descr]
          end
      end
    end
  end
end