Sha256: 1e505dd240c9de3a41394093b8820f28fe0d49384fc86626580d300490478156

Contents?: true

Size: 1.33 KB

Versions: 3

Compression:

Stored size: 1.33 KB

Contents

require 'rugged'

class GitFileReader
  def initialize(repo_dir = '.')
    @repo = Rugged::Repository.new repo_dir
  end

  def blob_at(ref, path)
    commit = @repo.rev_parse ref # Rugged::Commit
    @repo.blob_at(commit.oid, path) # Rugged::Blob
  end

  def commit_for_ref(ref)
    reference = @repo.ref ref # Rugged::Reference
    abort "Error: #{ref} is an invalid ref" if reference.nil?

    reference_direct = reference.type == :symbolic ? reference.target : reference
    @commit = reference_direct.target # Rugged::Commit
    self
  end

  # @return content of desired file
  def contents(filename)
    abort('Error: @commit is undefined; invoke commit_for_ref before invoking contents') if @commit.nil?

    tree = @commit.tree # Rugged::Tree
    entry = tree.get_entry filename # hash
    abort("Error: #{filename} is not present in commit #{commit.oid}") if entry.nil?

    sha = entry[:oid] # String
    object = @repo.read sha # Rugged::ObdObject; this is a blob
    object.data # String
  end
end

if $PROGRAM_NAME == __FILE__
  puts GitFileReader.new('.').blob_at('HEAD~2', 'README.md').content
  # puts GitFileReader.new('.').commit_for_ref('HEAD^').contents('README.md')
  # puts GitFileReader.new('.').commit_for_ref('HEAD').contents('README.md')
  # puts GitFileReader.new('.').commit_for_ref('refs/heads/master').contents('README.md')
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
jekyll_flexible_include-2.0.20 lib/git_util.rb
jekyll_flexible_include-2.0.19 lib/git_util.rb
jekyll_flexible_include-2.0.18 lib/git_util.rb