Sha256: 5a0fbccec76c4942ed740b522757d53bb630c1b3712df643106f9e05ab6ffaff

Contents?: true

Size: 1.44 KB

Versions: 2

Compression:

Stored size: 1.44 KB

Contents

require 'rugged'

require 'method_log/source_file'

module MethodLog
  class Commit
    attr_reader :sha

    def initialize(repository: nil, sha: nil)
      @repository = repository
      @sha = sha
      @index = Rugged::Index.new
    end

    def add(source_file)
      oid = @repository.write(source_file.source, :blob)
      @index.add(path: source_file.path, oid: oid, mode: 0100644)
    end

    def apply(user: { email: 'test@example.com', name: 'test', time: Time.now }, message: 'commit-message')
      tree = @index.write_tree(@repository)
      parents = @repository.empty? ? [] : [@repository.head.target].compact
      @sha = Rugged::Commit.create(@repository, tree: tree, parents: parents, update_ref: 'HEAD', author: user, committer: user, message: message)
    end

    def source_files
      source_files = []
      commit.tree.walk_blobs do |root, blob_hash|
        name = blob_hash[:name]
        next unless File.extname(name) == '.rb'
        path = root.empty? ? name : File.join(root, name)
        source = @repository.lookup(blob_hash[:oid]).text
        source_files << SourceFile.new(path: path, source: source)
      end
      source_files
    end

    def author
      commit.author
    end

    def message
      commit.message
    end

    def ==(other)
      sha == other.sha
    end

    def hash
      sha.hash
    end

    def to_s
      sha
    end

    private

    def commit
      @commit ||= @repository.lookup(sha)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
method_log-0.0.4 lib/method_log/commit.rb
method_log-0.0.3 lib/method_log/commit.rb