Class Grit::Commit
In: lib/grit/commit.rb
Parent: Object

Methods

actor   author_string   count   create   create_initialize   date   diff   diffs   find_all   id_abbrev   inspect   lazy_source   list_from_string   new   sha   show   stats   to_hash   to_patch   to_s  

Attributes

id  [R] 

Public Class methods

Parse out the actor (author or committer) info

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

[Source]

# File lib/grit/commit.rb, line 213
    def self.actor(line)
      m, actor, epoch = *line.match(/^.+? (.*) (\d+) .*$/)
      [Actor.from_string(actor), Time.at(epoch.to_i)]
    end

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

[Source]

# File lib/grit/commit.rb, line 74
    def self.count(repo, ref)
      repo.git.rev_list({}, ref).size / 41
    end

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)

[Source]

# File lib/grit/commit.rb, line 48
    def self.create(repo, atts)
      self.allocate.create_initialize(repo, atts)
    end

Show diffs between two trees:

  +repo+ is the Repo
  +a+ is a named commit
  +b+ is an optional named commit.  Passing an array assumes you
    wish to omit the second named commit and limit the diff to the
    given paths.
  +paths* is an array of paths to limit the diff.

Returns Grit::Diff[] (baked)

[Source]

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

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)

[Source]

# File lib/grit/commit.rb, line 86
    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

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

[Source]

# File lib/grit/commit.rb, line 112
    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, authored_date = self.actor(lines.shift)
        committer, committed_date = self.actor(lines.shift)

        # 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

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)

[Source]

# File lib/grit/commit.rb, line 26
    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[0] || ''
    end

Public Instance methods

[Source]

# File lib/grit/commit.rb, line 218
    def author_string
      "%s <%s> %s %+05d" % [author.name, author.email, authored_date.to_i, 800]
    end

Initializer for Commit.create

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

Returns Grit::Commit (unbaked)

[Source]

# File lib/grit/commit.rb, line 57
    def create_initialize(repo, atts)
      @repo = repo
      atts.each do |k, v|
        instance_variable_set("@#{k}", v)
      end
      self
    end

[Source]

# File lib/grit/commit.rb, line 195
    def date
      @committed_date
    end

[Source]

# File lib/grit/commit.rb, line 174
    def diffs
      if parents.empty?
        show
      else
        self.class.diff(@repo, parents.first.id, @id)
      end
    end

[Source]

# File lib/grit/commit.rb, line 39
    def id_abbrev
      @id_abbrev ||= @repo.git.rev_parse({}, self.id).chomp[0, 7]
    end

Pretty object inspection

[Source]

# File lib/grit/commit.rb, line 204
    def inspect
      %Q{#<Grit::Commit "#{@id}">}
    end

[Source]

# File lib/grit/commit.rb, line 65
    def lazy_source
      self.class.find_all(@repo, @id, {:max_count => 1}).first
    end

[Source]

# File lib/grit/commit.rb, line 191
    def sha
      @id
    end

[Source]

# File lib/grit/commit.rb, line 164
    def show
      diff = @repo.git.show({:full_index => true, :pretty => 'raw'}, @id)
      if diff =~ /diff --git a/
        diff = diff.sub(/.+?(diff --git a)/m, '\1')
      else
        diff = ''
      end
      Diff.list_from_string(@repo, diff)
    end

[Source]

# File lib/grit/commit.rb, line 182
    def stats
      stats = @repo.commit_stats(self.sha, 1)[0][-1]
    end

[Source]

# File lib/grit/commit.rb, line 222
    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

[Source]

# File lib/grit/commit.rb, line 199
    def to_patch
      @repo.git.format_patch({'1' => true, :stdout => true}, to_s)
    end

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

[Source]

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

[Validate]