Sha256: e73b18024190a611bf5881d8e86e21d8412b3d945f3f5965858cce6db0dbb4c8

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

module GemOnDemand
  class Checkout
    NotFound = Class.new(Exception)
    NOT_FOUND = "not-found"
    UPDATED_AT = "updated_at"
    DIR = File.expand_path("~/.gem-on-demand/cache")
    CACHE_DURATION = 15 * 60 # for project tags

    attr_accessor :user, :project

    def initialize(user, project)
      self.user = user
      self.project = project
      Utils.ensure_directory(dir)
    end

    def chdir(&block)
      clone_or_refresh
      Dir.chdir(dir, &block)
    end

    def cache
      @cache ||= FileCache.new("#{dir}/cache")
    end

    private

    def dir
      "#{DIR}/#{user}/#{project}"
    end

    def was_not_found?
      cache.read(NOT_FOUND)
    end

    def not_found!
      cache.write(NOT_FOUND, true)
      raise NotFound
    end

    def need_refresh?
      cache.read(UPDATED_AT).to_i < Time.now.to_i - CACHE_DURATION
    end

    def fresh!
      cache.write(UPDATED_AT, Time.now.to_i)
    end

    def clone_or_refresh
      if cloned?
        refresh if need_refresh?
      elsif was_not_found?
        not_found!
      else
        clone
      end
    end

    def refresh
      Dir.chdir(dir) { Utils.sh "git fetch origin" }
      cache.delete Project::DEPENDENCIES
      fresh!
    end

    def clone
      Utils.remove_directory(dir)
      cloned = Utils.sh "git clone git@github.com:#{user}/#{project}.git #{dir}", :fail => :allow
      Utils.ensure_directory(dir)
      if cloned
        fresh!
      else
        not_found!
      end
    end

    def cloned?
      File.directory?("#{dir}/.git")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
gem_on_demand-1.1.0 lib/gem_on_demand/checkout.rb