Sha256: 84b4d09aaee0098250c9109e12fdf9e913eeca23dcc8495127fcf9d289d18784

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 KB

Contents

module Dandelion
  class RevisionError < StandardError; end

  class Workspace
    attr_reader :adapter, :config
    
    def initialize(repo, adapter, config = nil)
      @repo = repo
      @adapter = adapter

      if config.is_a?(Hash)
        @config = Config.new(data: config)
      else
        @config = config || Config.new
      end

      @config.defaults(revision_file: '.revision', local_path: '')
    end

    def tree
      Tree.new(@repo, local_commit)
    end

    def changeset
      Changeset.new(tree, remote_commit, @config)
    end

    def local_commit
      lookup(local_sha)
    end

    def remote_commit
      sha = remote_sha
      sha ? lookup(remote_sha) : nil
    end

    def remote_commit=(commit)
      self.remote_sha = commit.oid
    end

  private

    def lookup(val)
      result = lookup_sha(val) ||
        lookup_ref(val) ||
        lookup_ref("refs/tags/#{val}") ||
        lookup_ref("refs/branches/#{val}") ||
        lookup_ref("refs/heads/#{val}")

      raise RevisionError.new(val) unless result

      result
    end

    def lookup_sha(val)
      @repo.lookup(val)
    rescue Rugged::OdbError, Rugged::InvalidError
      nil
    end

    def lookup_ref(val)
      ref = @repo.ref(val)
      lookup_sha(ref.target) if ref
    rescue Rugged::ReferenceError
      nil
    end

    def local_sha
      @config[:revision] || @repo.head.target
    end

    def remote_sha
      @remote_sha ||= @adapter.read(@config[:revision_file])
    end

    def remote_sha=(sha)
      @adapter.write(@config[:revision_file], sha)
      @remote_sha = sha
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dandelion-0.4.6 lib/dandelion/workspace.rb