Sha256: 1e78642d410f3ada226127ae1452f000ed0c6e2ea4418bd50c48b304e8c2dd3c

Contents?: true

Size: 1.62 KB

Versions: 13

Compression:

Stored size: 1.62 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

    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

  private

    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.oid) if ref
    rescue Rugged::ReferenceError
      nil
    end

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

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

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

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
dandelion-0.6.0 lib/dandelion/workspace.rb
dandelion-0.5.4 lib/dandelion/workspace.rb
dandelion-0.5.3 lib/dandelion/workspace.rb
dandelion-0.5.2 lib/dandelion/workspace.rb
dandelion-0.5.1 lib/dandelion/workspace.rb
dandelion-0.5.0 lib/dandelion/workspace.rb
dandelion-0.4.17 lib/dandelion/workspace.rb
dandelion-0.4.16 lib/dandelion/workspace.rb
dandelion-0.4.15 lib/dandelion/workspace.rb
dandelion-0.4.14 lib/dandelion/workspace.rb
dandelion-0.4.10 lib/dandelion/workspace.rb
dandelion-0.4.9 lib/dandelion/workspace.rb
dandelion-0.4.8 lib/dandelion/workspace.rb