class Mercurial::CommitFactory

This class represents a factory for {Mercurial::Commit Commit} instances.

Attributes

repository[R]

Instance of {Mercurial::Repository Repository}.

Public Instance Methods

after(hash_id, options={}, cmd_options={}) click to toggle source

Return an array of {Mercurial::Commit Commit} instances that appear in hg log after the specified revision id.

Example:

repository.commits.after('bf6386c0a0cc')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 144
def after(hash_id, options={}, cmd_options={})
  in_direction(:after, hash_id, options, cmd_options)
end
all(options={}, cmd_options={}) click to toggle source

Return an array of {Mercurial::Commit Commit} instances for all changesets in the repository. Accept a :limit setting.

Example:

repository.commits.all
repository.commits.all(:limit => 15)
# File lib/mercurial-ruby/factories/commit_factory.rb, line 34
def all(options={}, cmd_options={})
  cmd = command_with_limit(["log --style ?", style], options[:limit])

  hg_to_array(cmd, {:separator => changeset_separator}, cmd_options) do |line|
    build(line)
  end
end
ancestors_of(hash_id, options={}, cmd_options={}) click to toggle source

Return an array of {Mercurial::Commit Commit} instances that appear in hg log as ancestors of the specified commit ID.

Example:

repository.commits.ancestors_of('bf6386c0a0cc')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 165
def ancestors_of(hash_id, options={}, cmd_options={})
  cmd = command_with_limit(["log -r \"ancestors(?)\" --style ?", hash_id, style], options[:limit])
  hg_to_array(cmd, {:separator => changeset_separator}, cmd_options) do |line|
    build(line)
  end
end
before(hash_id, options={}, cmd_options={}) click to toggle source

Return an array of {Mercurial::Commit Commit} instances that appear in hg log before the specified revision id.

Example:

repository.commits.before('bf6386c0a0cc')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 135
def before(hash_id, options={}, cmd_options={})
  in_direction(:before, hash_id, options, cmd_options)
end
by_branch(branch, cmd_options={}) click to toggle source

Return an array of {Mercurial::Commit Commit} instances for changesets in a specific branch.

Example:

repository.commits.by_branch('brancname')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 80
def by_branch(branch, cmd_options={})
  hg_to_array(["log -b ? --style ?", branch, style], {:separator => changeset_separator}, cmd_options) do |line|
    build(line)
  end
end
by_hash_id(hash, cmd_options={}) click to toggle source

Return an instance of {Mercurial::Commit Commit} for a changeset with a specified id.

Example:

repository.commits.by_hash_id('291a498f04e9')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 91
def by_hash_id(hash, cmd_options={})
  build do
    hg(["log -r ? --style ?", hash, style], cmd_options)
  end
end
by_hash_ids(*args) click to toggle source

Return an array of {Mercurial::Commit Commit} instances for changesets with specified ids.

Example:

repository.commits.by_hash_ids('291a498f04e9', '63f70b2314ed')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 102
def by_hash_ids(*args)
  cmd_options = args.last.kind_of?(Hash) ? args.last : {}
  
  if args.size == 1 && args.first.kind_of?(Array)
    array = args.first
  else
    array = args
  end      
  return [] if array.empty?

  args = array.map{|hash| " -r#{ hash }"}
  hg_to_array ["log#{ args.join('') } --style ?", style], {:separator => changeset_separator}, cmd_options do |line|
    build(line)
  end
end
count(cmd_options={}) click to toggle source

Count all changesets in the repository.

Example:

repository.commits.count
# File lib/mercurial-ruby/factories/commit_factory.rb, line 58
def count(cmd_options={})
  hg_to_array(%Q[log --template "{node}\n"], {}, cmd_options) do |line|
    line
  end.size
end
count_range(hash_a, hash_b, cmd_options={}) click to toggle source

Count changesets in the range from hash_a to hash_b in the repository.

Example:

repository.commits.count_range(hash_a, hash_b)
# File lib/mercurial-ruby/factories/commit_factory.rb, line 69
def count_range(hash_a, hash_b, cmd_options={})
  hg_to_array([%Q[log -r ?:? --template "{node}\n"], hash_a, hash_b], {}, cmd_options) do |line|
    line
  end.size
end
each(cmd_options={}, &block) click to toggle source

Run a block for every {Mercurial::Commit Commit} instance of all changesets in the repository.

Example:

repository.commits.each {|commit| ... }
# File lib/mercurial-ruby/factories/commit_factory.rb, line 47
def each(cmd_options={}, &block)
  all(cmd_options).each do |commit|
    block.call(commit)
  end
end
for_range(hash_a, hash_b, options={}, cmd_options={}) click to toggle source

Return an array of {Mercurial::Commit Commit} instances for a specified range of changeset ids.

Example:

repository.commits.for_range('bf6386c0a0cc', '63f70b2314ed')
# File lib/mercurial-ruby/factories/commit_factory.rb, line 123
def for_range(hash_a, hash_b, options={}, cmd_options={})
  cmd = command_with_limit(["log -r ?:? --style ?", hash_a, hash_b, style], options[:limit])
  hg_to_array(cmd, {:separator => changeset_separator}, cmd_options) do |line|
    build(line)
  end
end
latest(cmd_options={})
Alias for: tip
parent(cmd_options={}) click to toggle source

Return a parent commit for this working copy.

Example:

repository.commits.parent
# File lib/mercurial-ruby/factories/commit_factory.rb, line 21
def parent(cmd_options={})
  build do
    hg(["parent --style ?", style], cmd_options)
  end
end
tip(cmd_options={}) click to toggle source

Return an instance of {Mercurial::Commit Commit} for a repository's tip changeset (latest).

Example:

repository.commits.tip
# File lib/mercurial-ruby/factories/commit_factory.rb, line 153
def tip(cmd_options={})
  build do
    hg(["tip --style ?", style], cmd_options)
  end
end
Also aliased as: latest

Protected Instance Methods

build(data=nil, &block) click to toggle source
# File lib/mercurial-ruby/factories/commit_factory.rb, line 192
def build(data=nil, &block)
  data ||= block.call
  return if data.empty?
  data = data.gsub(/#{ Regexp.escape(changeset_separator) }$/, '')
  data = data.split(field_separator)
  commit = Mercurial::Commit.new(
    repository,
    :hash_id         => data[0],
    :author          => data[1],
    :author_email    => data[2],
    :date            => data[3],
    :message         => data[4],
    :changed_files   => [data[5], data[6], data[7], data[8]],
    :branch_name     => data[9],
    :tags_names      => data[10],
    :parents         => data[11]
  )
  
  if commit.blank?
    nil
  else
    commit
  end
end
changeset_separator() click to toggle source
# File lib/mercurial-ruby/factories/commit_factory.rb, line 184
def changeset_separator
  Mercurial::Style::CHANGESET_SEPARATOR
end
command_with_limit(cmd, limit) click to toggle source
# File lib/mercurial-ruby/factories/commit_factory.rb, line 221
def command_with_limit(cmd, limit)
  if limit
    cmd[0] << ' --limit ?'
    cmd << limit
  end
  cmd
end
field_separator() click to toggle source
# File lib/mercurial-ruby/factories/commit_factory.rb, line 188
def field_separator
  Mercurial::Style::FIELD_SEPARATOR
end
in_direction(direction, hash_id, options={}, cmd_options={}) click to toggle source
# File lib/mercurial-ruby/factories/commit_factory.rb, line 174
def in_direction(direction, hash_id, options={}, cmd_options={})
  query = direction.to_sym == :before ? '"reverse(:?)"' : '?:'
  cmd = command_with_limit(["log -r #{ query } --style ?", hash_id, style], options[:limit])

  hg_to_array(cmd, {:separator => changeset_separator}, cmd_options) do |line|
    c = build(line)
    c.short_hash_id == hash_id[0,12] ? next : c
  end
end
style() click to toggle source
# File lib/mercurial-ruby/factories/commit_factory.rb, line 217
def style
  Mercurial::Style.changeset
end