class Ruby::Builder::RevisionParser

Public Class Methods

new(source_dir) click to toggle source

@param [String] source_dir

# File lib/ruby/builder/revision_parser.rb, line 8
def initialize(source_dir)
  @source_dir = source_dir
end

Public Instance Methods

parse(spec) click to toggle source

@param [String] spec

# File lib/ruby/builder/revision_parser.rb, line 13
def parse(spec)
  unless match = spec.match(/\Ar(?<beg_rev>\d+)(\.\.r(?<end_rev>\d+))?\z/)
    abort "Invalid revision specification '#{spec}': Doesn't match 'rXXXXX' or 'rXXXXX..rXXXXX'"
  end

  beg_rev = Integer(match[:beg_rev])
  end_rev = Integer(match[:end_rev] || beg_rev)
  if end_rev < beg_rev
    abort "Invalid revision specification '#{spec}': #{beg_rev} is larger than #{end_rev}"
  end

  # Note: ruby-builder currently supports only trunk revisions
  trunk_revs = (beg_rev..end_rev).select { |rev| trunk_revision?(rev) }
  trunk_revs.map! do |rev|
    build_revision(rev)
  end
end

Private Instance Methods

build_revision(rev) click to toggle source

@param [Integer] rev

# File lib/ruby/builder/revision_parser.rb, line 44
def build_revision(rev)
  command = ['git', '-C', @source_dir, 'log', '--grep', "/trunk@#{rev} ", '--format=format:%H', '-1']
  git_revision = IO.popen(command, &:read)
  unless $?.success?
    abort "Failed to execute (exit status: #{$?.exitstatus}): #{command.shelljoin}"
  end
  Revision.new(svn: rev, git: git_revision)
end
trunk_revision?(rev) click to toggle source

@param [Integer] rev

# File lib/ruby/builder/revision_parser.rb, line 34
def trunk_revision?(rev)
  command = ['git', '-C', @source_dir, 'log', '--grep', "/trunk@#{rev} ", '-1']
  result = IO.popen(command, &:read)
  unless $?.success?
    abort "Failed to execute (exit status: #{$?.exitstatus}): #{command.shelljoin}"
  end
  !result.empty?
end