Sha256: 4988e6e39f9666d034df86575cc51922af8f5426b409b7bb7235c669faf1f81a

Contents?: true

Size: 1.55 KB

Versions: 3

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

require "core"
require "refinements/string_io"
require "versionaire"

module Milestoner
  module Tags
    # Handles the creation of project repository tags.
    class Creator
      include Import[:input, :git, :logger]

      using Refinements::StringIO
      using Versionaire::Cast

      def initialize(
        collector: Commits::Collector.new,
        builder: Builders::Stream.new(kernel: StringIO.new),
        **
      )
        @collector = collector
        @builder = builder
        super(**)
      end

      def call override = nil
        version = compute_version override

        return false if local? version

        collection = collector.call.value_or Core::EMPTY_ARRAY

        fail Error, "Unable to tag without commits." if collection.empty?

        create version
      end

      private

      attr_reader :collector, :builder

      def compute_version value
        Version value || input.project_version
      rescue Versionaire::Error => error
        raise Error, error
      end

      def local? version
        if git.tag_local? version
          logger.warn { "Local tag exists: #{version}. Skipped." }
          true
        else
          false
        end
      end

      def create version
        build(version).fmap { |body| git.tag_create version, body }
                      .or { |error| fail Error, error }
                      .bind { true }
      end

      def build version
        builder.call.fmap do |body|
          "Version #{version}\n\n#{body.reread}\n\n"
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
milestoner-17.11.0 lib/milestoner/tags/creator.rb
milestoner-17.10.0 lib/milestoner/tags/creator.rb
milestoner-17.9.0 lib/milestoner/tags/creator.rb