class Mercurial::DiffFactory
This class represents a factory for {Mercurial::Diff Diff} instances.
Attributes
repository[R]
Instance of {Mercurial::Repository Repository}.
Public Class Methods
new(repository)
click to toggle source
# File lib/mercurial-ruby/factories/diff_factory.rb, line 12 def initialize(repository) @repository = repository end
Public Instance Methods
for_commit(commit, cmd_options={})
click to toggle source
Returns an array of {Mercurial::Diff Diff} instances for a specified instance of {Mercurial::Commit Commit}. Represents changeset's diffs.
Example:¶ ↑
commit = repository.commits.by_hash_id('291a498f04e9') repository.diffs.for_commit(commit)
# File lib/mercurial-ruby/factories/diff_factory.rb, line 23 def for_commit(commit, cmd_options={}) [].tap do |returning| data = hg(["diff -c ?", commit.hash_id], cmd_options) chunks = data.split(/^diff/)[1..-1] unless chunks.nil? chunks.map do |piece| piece = "diff" << piece returning << build(piece) end end end end
for_path(path, revision_a, revision_b, options={}, cmd_options={})
click to toggle source
# File lib/mercurial-ruby/factories/diff_factory.rb, line 36 def for_path(path, revision_a, revision_b, options={}, cmd_options={}) cmd = "diff ? -r ? -r ?" cmd << ' -w' if options[:ignore_whitespace] build(hg([cmd, path, revision_a, revision_b], cmd_options)) end
Private Instance Methods
build(data)
click to toggle source
# File lib/mercurial-ruby/factories/diff_factory.rb, line 44 def build(data) return if data.empty? hash_a, hash_b = *data.scan(/^diff -r (\w+) -r (\w+)/).first if binary_file = data.scan(/^Binary file (.+) has changed/).flatten.first file_a = binary_file body = 'Binary files differ' else file_a = data.scan(/^\[?--- (?:a\/([^\+]+)|\/dev\/null)-?\]?\t/).flatten.first file_b = data.scan(/^\{?\+\+\+ (?:b\/([^\+]+)|\/dev\/null)\+?\}?\t/).flatten.first body = data[data.index("\n")+1..-1] end Mercurial::Diff.new( :hash_a => hash_a, :hash_b => hash_b, :file_a => file_a, :file_b => file_b, :body => body, :binary => !!binary_file ) end