class Grit::Commit

Attributes

id[R]
repo[R]

Public Class Methods

actor(line) click to toggle source

Parse out the actor (author or committer) info

Returns [String (actor name and email), Time (acted at time)]

# File lib/grit/commit.rb, line 284
def self.actor(line)
  m, actor, epoch = *line.match(/^.+? (.*) (\d+) .*$/)
  [Actor.from_string(actor), Time.at(epoch.to_i)]
end
count(repo, ref) click to toggle source

Count the number of commits reachable from this ref

+repo+ is the Repo
+ref+ is the ref from which to begin (SHA1 or name)

Returns Integer

# File lib/grit/commit.rb, line 101
def self.count(repo, ref)
  repo.git.rev_list({}, ref).size / 41
end
create(repo, atts) click to toggle source

Create an unbaked Commit containing just the specified attributes

+repo+ is the Repo
+atts+ is a Hash of instance variable data

Returns Grit::Commit (unbaked)

# File lib/grit/commit.rb, line 75
def self.create(repo, atts)
  self.allocate.create_initialize(repo, atts)
end
diff(repo, a, b = nil, paths = [], options = {}) click to toggle source

Show diffs between two trees.

repo - The current Grit::Repo instance. a - A String named commit. b - An optional String named commit. Passing an array assumes you

wish to omit the second named commit and limit the diff to the
given paths.

paths - An optional Array of paths to limit the diff. options - An optional Hash of options. Merged into {:full_index => true}.

Returns Grit::Diff[] (baked)

# File lib/grit/commit.rb, line 186
def self.diff(repo, a, b = nil, paths = [], options = {})
  if b.is_a?(Array)
    paths = b
    b     = nil
  end
  paths.unshift("--") unless paths.empty?
  paths.unshift(b)    unless b.nil?
  paths.unshift(a)
  options = {:full_index => true}.update(options)
  text    = repo.git.diff(options, *paths)
  Diff.list_from_string(repo, text)
end
find_all(repo, ref, options = {}) click to toggle source

Find all commits matching the given criteria.

+repo+ is the Repo
+ref+ is the ref from which to begin (SHA1 or name) or nil for --all
+options+ is a Hash of optional arguments to git
  :max_count is the maximum number of commits to fetch
  :skip is the number of commits to skip

Returns Grit::Commit[] (baked)

# File lib/grit/commit.rb, line 113
def self.find_all(repo, ref, options = {})
  allowed_options = [:max_count, :skip, :since]

  default_options = {:pretty => "raw"}
  actual_options = default_options.merge(options)

  if ref
    output = repo.git.rev_list(actual_options, ref)
  else
    output = repo.git.rev_list(actual_options.merge(:all => true))
  end

  self.list_from_string(repo, output)
rescue Grit::GitRuby::Repository::NoSuchShaFound
  []
end
list_from_string(repo, text) click to toggle source

Parse out commit information into an array of baked Commit objects

+repo+ is the Repo
+text+ is the text output from the git command (raw format)

Returns Grit::Commit[] (baked)

really should re-write this to be more accepting of non-standard commit messages

  • it broke when 'encoding' was introduced - not sure what else might show up

# File lib/grit/commit.rb, line 139
def self.list_from_string(repo, text)
  lines = text.split("\n")

  commits = []

  while !lines.empty?
    id = lines.shift.split.last
    tree = lines.shift.split.last

    parents = []
    parents << lines.shift.split.last while lines.first =~ /^parent/

    author_line = lines.shift
    author_line << lines.shift if lines[0] !~ /^committer /
    author, authored_date = self.actor(author_line)

    committer_line = lines.shift
    committer_line << lines.shift if lines[0] && lines[0] != '' && lines[0] !~ /^encoding/
    committer, committed_date = self.actor(committer_line)

    # not doing anything with this yet, but it's sometimes there
    encoding = lines.shift.split.last if lines.first =~ /^encoding/

    lines.shift

    message_lines = []
    message_lines << lines.shift[4..-1] while lines.first =~ /^ {4}/

    lines.shift while lines.first && lines.first.empty?

    commits << Commit.new(repo, id, parents, tree, author, authored_date, committer, committed_date, message_lines)
  end

  commits
end
new(repo, id, parents, tree, author, authored_date, committer, committed_date, message) click to toggle source

Instantiate a new Commit

+id+ is the id of the commit
+parents+ is an array of commit ids (will be converted into Commit instances)
+tree+ is the correspdonding tree id (will be converted into a Tree object)
+author+ is the author string
+authored_date+ is the authored Time
+committer+ is the committer string
+committed_date+ is the committed Time
+message+ is an array of commit message lines

Returns Grit::Commit (baked)

# File lib/grit/commit.rb, line 53
def initialize(repo, id, parents, tree, author, authored_date, committer, committed_date, message)
  @repo = repo
  @id = id
  @parents = parents.map { |p| Commit.create(repo, :id => p) }
  @tree = Tree.create(repo, :id => tree)
  @author = author
  @authored_date = authored_date
  @committer = committer
  @committed_date = committed_date
  @message = message.join("\n")
  @short_message = message.find { |x| !x.strip.empty? } || ''
end
parse_batch(repo, sha, size, object) click to toggle source

Parses output from the `git-cat-file –batch'.

repo - Grit::Repo instance. sha - String SHA of the Commit. size - Fixnum size of the object. object - Parsed String output from `git cat-file –batch`.

Returns an Array of Grit::Commit objects.

# File lib/grit/commit.rb, line 25
def self.parse_batch(repo, sha, size, object)
  info, message = object.split("\n\n", 2)

  lines = info.split("\n")
  tree = lines.shift.split(' ', 2).last
  parents = []
  parents << lines.shift[7..-1] while lines.first[0, 6] == 'parent'
  author,    authored_date  = Grit::Commit.actor(lines.shift)
  committer, committed_date = Grit::Commit.actor(lines.shift)

  Grit::Commit.new(
    repo, sha, parents, tree,
    author, authored_date,
    committer, committed_date,
    message.to_s.split("\n"))
end

Public Instance Methods

author_string() click to toggle source
# File lib/grit/commit.rb, line 289
def author_string
  "%s <%s> %s %+05d" % [author.name, author.email, authored_date.to_i, 800]
end
create_initialize(repo, atts) click to toggle source

Initializer for ::create

+repo+ is the Repo
+atts+ is a Hash of instance variable data

Returns Grit::Commit (unbaked)

# File lib/grit/commit.rb, line 84
def create_initialize(repo, atts)
  @repo = repo
  atts.each do |k, v|
    instance_variable_set("@#{k}", v)
  end
  self
end
date() click to toggle source
# File lib/grit/commit.rb, line 240
def date
  @committed_date
end
diffs(options = {}) click to toggle source

Shows diffs between the commit's parent and the commit.

options - An optional Hash of options, passed to ::diff.

Returns Grit::Diff[] (baked)

# File lib/grit/commit.rb, line 219
def diffs(options = {})
  if parents.empty?
    show
  else
    self.class.diff(@repo, parents.first.id, @id, [], options)
  end
end
id_abbrev() click to toggle source
# File lib/grit/commit.rb, line 66
def id_abbrev
  @id_abbrev ||= @repo.git.rev_parse({}, self.id).chomp[0, 7]
end
inspect() click to toggle source

Pretty object inspection

# File lib/grit/commit.rb, line 275
def inspect
  %Q{#<Grit::Commit "#{@id}">}
end
lazy_source() click to toggle source
# File lib/grit/commit.rb, line 92
def lazy_source
  self.class.find_all(@repo, @id, {:max_count => 1}).first
end
notes() click to toggle source
# File lib/grit/commit.rb, line 248
def notes
  ret = {}
  notes = Note.find_all(@repo)
  notes.each do |note|
    if n = note.commit.tree/(self.id)
      ret[note.name] = n.data
    end
  end
  ret
end
patch_id() click to toggle source

Calculates the commit's Patch ID. The Patch ID is essentially the SHA1 of the diff that the commit is introducing.

Returns the 40 character hex String if a patch-id could be calculated

or nil otherwise.
# File lib/grit/commit.rb, line 264
def patch_id
  show = @repo.git.show({}, @id)
  patch_line = @repo.git.native(:patch_id, :input => show)
  if patch_line =~ /^([0-9a-f]{40}) [0-9a-f]{40}\n$/
    $1
  else
    nil
  end
end
sha() click to toggle source
# File lib/grit/commit.rb, line 236
def sha
  @id
end
show() click to toggle source
# File lib/grit/commit.rb, line 199
def show
  if parents.size > 1
    diff = @repo.git.native(:diff, {:full_index => true}, "#{parents[0].id}...#{parents[1].id}")
  else
    diff = @repo.git.show({:full_index => true, :pretty => 'raw'}, @id)
  end

  if diff =~ /diff --git a/
    diff = diff.sub(/.+?(diff --git a)/m, '\1')
  else
    diff = ''
  end
  Diff.list_from_string(@repo, diff)
end
stats() click to toggle source
# File lib/grit/commit.rb, line 227
def stats
  stats = @repo.commit_stats(self.sha, 1)[0][-1]
end
to_hash() click to toggle source
# File lib/grit/commit.rb, line 293
def to_hash
  {
    'id'       => id,
    'parents'  => parents.map { |p| { 'id' => p.id } },
    'tree'     => tree.id,
    'message'  => message,
    'author'   => {
      'name'  => author.name,
      'email' => author.email
    },
    'committer' => {
      'name'  => committer.name,
      'email' => committer.email
    },
    'authored_date'  => authored_date.xmlschema,
    'committed_date' => committed_date.xmlschema,
  }
end
to_patch() click to toggle source
# File lib/grit/commit.rb, line 244
def to_patch
  @repo.git.format_patch({'1' => true, :stdout => true}, to_s)
end
to_s() click to toggle source

Convert this Commit to a String which is just the SHA1 id

# File lib/grit/commit.rb, line 232
def to_s
  @id
end