class Nginxbrew::Catalog

Constants

CacheExpireDays
TypeNginx
TypeOpenresty

Attributes

ngx_type[R]
versions[R]

Public Class Methods

new(ngx_type, versions) click to toggle source
# File lib/nginxbrew/catalog.rb, line 28
def initialize(ngx_type, versions)
    unless [TypeNginx, TypeOpenresty].include?(ngx_type)
        raise Exception.new("Invalid ngx_type #{ngx_type}")
    end
    raise Exception.new("No versions of nginx!") if versions.size == 0
    @ngx_type = ngx_type
    @versions = versions.uniq.map do |v|
        Gem::Version.new(v) # 1.15.x <> 1.8.x should be 1.15.x > 1.8.x
    end.sort.reverse.map do |v|
        v.to_s
    end
end
nginxes(cache_dir=nil) click to toggle source
# File lib/nginxbrew/catalog.rb, line 72
def self.nginxes(cache_dir=nil)
    catalog_cache_or(cache_dir, "nginxes") do
        versions = html_body_of("http://nginx.org", "/download/").
            gsub(/href="nginx\-([0-9\.]+?)\.tar\.gz"/).inject([]) do |memo, match|
                memo << $1
                memo
        end
        c = Catalog.new(TypeNginx, versions)
        c.unsupport_under!("0.5.38") # can not build under this version
        c
    end
end
openresties(cache_dir=nil) click to toggle source
# File lib/nginxbrew/catalog.rb, line 85
def self.openresties(cache_dir=nil)
    catalog_cache_or(cache_dir, "openresties") do
        versions = html_body_of("http://openresty.org", "/").
            gsub(/ngx_openresty\-([0-9\.]+?)\.tar\.gz/).inject([]) do |memo, match|
                memo << $1
                memo
        end
        Catalog.new(TypeOpenresty, versions)
    end
end

Private Class Methods

catalog_cache_or(dir, key, &block) click to toggle source
# File lib/nginxbrew/catalog.rb, line 98
def self.catalog_cache_or(dir, key, &block)
    return block.call if !dir || !key

    cache_dir = File.join(dir, "catalog")
    FileUtils.mkdir_p(cache_dir) unless FileTest.directory?(cache_dir)

    cache_file = File.join(cache_dir, "#{key}.ca")

    if FileTest.file?(cache_file)
        expired = File.mtime(cache_file) + CacheExpireDays * 24 * 60 * 60
        if Time.now < expired
            $logger.debug("Cache file: #{cache_file}")
            begin
                return Marshal.load(File.binread(cache_file))
            rescue Exception => e
                File.delete(cache_file)
                $logger.error("#{e}")
                $logger.error("#{cache_file} removed")
            end
        else
            File.delete(cache_file)
        end
    end

    dest = block.call
    File.binwrite(cache_file, Marshal.dump(dest))
    $logger.debug("Cache saved to #{cache_file}")

    dest
end
html_body_of(host, page) click to toggle source
# File lib/nginxbrew/catalog.rb, line 129
def self.html_body_of(host, page)
    url = URI.parse(host)
    res = Net::HTTP.start(url.host, url.port) {|http|
        http.get(page)
    }
    raise Exception.new("Failed get list of nginx") if res.code.to_i != 200
    res.body
end

Public Instance Methods

filter_versions(head_of) click to toggle source
# File lib/nginxbrew/catalog.rb, line 52
def filter_versions(head_of)
    src_numbers = head_of.split(".")
    src_numbers_size = src_numbers.size
    r = @versions.select do |v|
        v.split(".").slice(0, src_numbers_size) == src_numbers
    end
    raise VersionNotFoundError.new(head_of) if r.size == 0
    r
end
head_of(version) click to toggle source
# File lib/nginxbrew/catalog.rb, line 62
def head_of(version)
    src_numbers = version.split(".")
    src_numbers_size = src_numbers.size
    r = @versions.detect do |v|
        v.split(".").slice(0, src_numbers_size) == src_numbers
    end
    raise VersionNotFoundError.new(version) unless r
    r
end
size() click to toggle source
# File lib/nginxbrew/catalog.rb, line 48
def size
    @versions.size
end
unsupport_under!(version) click to toggle source
# File lib/nginxbrew/catalog.rb, line 41
def unsupport_under!(version)
    min_version = Gem::Version.new(version)
    @versions = @versions.select do |v|
        Gem::Version.new(v) >= min_version
    end
end