shikhalev/set_version

View on GitHub
lib/set_version.rb

Summary

Maintainability
B
5 hrs
Test Coverage
# encoding: utf-8

require 'rubygems'
require 'digest/sha1'

class Gem::Specification

  SET_VERSION_VERSION = [0, 1, 2]

  def set_version *vers, git: false, message: 'Build #%<version>s', tag: false

    if Integer === vers[-1]
      beta = ''
    else
      beta = vers.pop.to_s
    end
    major = vers[0] || 0
    minor = vers[1] || 0
    patch = vers[2] || 0
    key = "#{major}.#{minor}.#{patch}.#{beta}"

    s_fn = caller_locations[0].absolute_path
    s_nm = File.basename caller_locations[0].path, '.gemspec'
    v_fn = File.expand_path "../#{s_nm}.gemvers", s_fn
    if File.exist? v_fn
      data = eval(File.read v_fn)
    else
      data = {}
    end
    stored = data[key]
    if !stored
      stored = {}
    end
    build = stored[:build] || -1

    digest = Digest::SHA1.new
    digest << (File.read s_fn)
    files.each do |f|
      digest << (File.read f) if File.file? f
    end

    if digest.hexdigest != stored[:hash]
      build += 1
      stored[:hash] = digest.hexdigest
      stored[:build] = build
      data[key] = stored
      File.open(v_fn, 'w') { |f| f.puts data.inspect }
    end

    if beta == '' && build == 0
      if patch == 0
        result = "#{major}.#{minor}"
      else
        result = "#{major}.#{minor}.#{patch}"
      end
    else
      result = "#{major}.#{minor}.#{patch}.#{beta}#{build}"
    end
    self.version = result

    if git
      msg = message % { version: result, major: major, minor: minor,
                        patch: patch, beta: beta, build: build }
      if system "git ls-files #{s_fn} --error-unmatch > /dev/null 2>&1"
        system "git add #{v_fn} > /dev/null 2>&1"
        system "git commit -a -m '#{msg}' > /dev/null 2>&1"
        if tag
          system "git tag #{result}"
        end
      end
    end

    return result

  end

end