class Git::Diff

object that holds the last X commits on given branch

Attributes

from[R]
to[R]

Public Class Methods

new(base, from = nil, to = nil) click to toggle source
# File lib/git/diff.rb, line 7
def initialize(base, from = nil, to = nil)
  @base = base
  @from = from && from.to_s
  @to = to && to.to_s

  @path = nil
  @full_diff = nil
  @full_diff_files = nil
  @stats = nil
end

Public Instance Methods

[](key) click to toggle source

enumerable methods

# File lib/git/diff.rb, line 62
def [](key)
  process_full
  @full_diff_files.assoc(key)[1]
end
deletions() click to toggle source
# File lib/git/diff.rb, line 38
def deletions
  cache_stats
  @stats[:total][:deletions]
end
each() { |each DiffFile in turn| ... } click to toggle source
# File lib/git/diff.rb, line 67
def each(&block) # :yields: each Git::DiffFile in turn
  process_full
  @full_diff_files.map { |file| file[1] }.each(&block)
end
insertions() click to toggle source
# File lib/git/diff.rb, line 43
def insertions
  cache_stats
  @stats[:total][:insertions]
end
lines() click to toggle source
# File lib/git/diff.rb, line 33
def lines
  cache_stats
  @stats[:total][:lines]
end
name_status() click to toggle source
# File lib/git/diff.rb, line 19
def name_status
  cache_name_status
end
patch(file = nil) click to toggle source

if file is provided and is writable, it will write the patch into the file

# File lib/git/diff.rb, line 54
def patch(file = nil)
  cache_full
  @full_diff
end
Also aliased as: to_s
path(path) click to toggle source
# File lib/git/diff.rb, line 23
def path(path)
  @path = path
  return self
end
size() click to toggle source
# File lib/git/diff.rb, line 28
def size
  cache_stats
  @stats[:total][:files]
end
stats() click to toggle source
# File lib/git/diff.rb, line 48
def stats
  cache_stats
  @stats
end
to_s(file = nil)
Alias for: patch

Private Instance Methods

cache_full() click to toggle source
# File lib/git/diff.rb, line 103
def cache_full
  @full_diff ||= @base.lib.diff_full(@from, @to, {:path_limiter => @path})
end
cache_name_status() click to toggle source
# File lib/git/diff.rb, line 117
def cache_name_status
  @name_status ||= @base.lib.diff_name_status(@from, @to, {:path => @path})
end
cache_stats() click to toggle source
# File lib/git/diff.rb, line 113
def cache_stats
  @stats ||=  @base.lib.diff_stats(@from, @to, {:path_limiter => @path})
end
process_full() click to toggle source
# File lib/git/diff.rb, line 107
def process_full
  return if @full_diff_files
  cache_full
  @full_diff_files = process_full_diff
end
process_full_diff() click to toggle source

break up @diff_full

# File lib/git/diff.rb, line 122
def process_full_diff
  defaults = {
    :mode => '',
    :src => '',
    :dst => '',
    :type => 'modified'
  }
  final = {}
  current_file = nil
  @full_diff.split("\n").each do |line|
    if m = %r{\Adiff --git ("?)a/(.+?)\1 ("?)b/(.+?)\3\z}.match(line)
      current_file = Git::EscapedPath.new(m[2]).unescape
      final[current_file] = defaults.merge({:patch => line, :path => current_file})
    else
      if m = /^index ([0-9a-f]{4,40})\.\.([0-9a-f]{4,40})( ......)*/.match(line)
        final[current_file][:src] = m[1]
        final[current_file][:dst] = m[2]
        final[current_file][:mode] = m[3].strip if m[3]
      end
      if m = /^([[:alpha:]]*?) file mode (......)/.match(line)
        final[current_file][:type] = m[1]
        final[current_file][:mode] = m[2]
      end
      if m = /^Binary files /.match(line)
        final[current_file][:binary] = true
      end
      final[current_file][:patch] << "\n" + line
    end
  end
  final.map { |e| [e[0], DiffFile.new(@base, e[1])] }
end