class Armature::Repo::Forge

Get a module from the Forge

Constants

CANONICAL_FORGE_URL
FORGE_URLS

Public Class Methods

from_url(cache, forge_url, full_name) click to toggle source

Gets a repo object for a given Forge module. This just contains metadata.

# File lib/armature/repo/forge.rb, line 24
def self.from_url(cache, forge_url, full_name)
  forge_url = self.normalize_forge_url(forge_url)

  url = "#{forge_url}/#{full_name}"
  repo = cache.get_repo("forge", url)
  if repo
    return repo
  end

  repo_dir = cache.open_repo("forge", url) do |temp_path|
    File.write("#{temp_path}/url", "#{url}\n")
    File.write("#{temp_path}/forge_url", "#{forge_url}\n")
    File.write("#{temp_path}/full_name", "#{full_name}\n")

    Logging.logger[self].debug("Created stub repo for '#{url}'")
  end

  return self.new(cache, repo_dir)
end
normalize_forge_url(url) click to toggle source
# File lib/armature/repo/forge.rb, line 14
def self.normalize_forge_url(url)
  url.chomp!("/")
  if FORGE_URLS.include? url
    CANONICAL_FORGE_URL
  else
    url
  end
end

Public Instance Methods

check_out(ref) click to toggle source

Ensure we've got the correct version and return its path

# File lib/armature/repo/forge.rb, line 57
def check_out(ref)
  @cache.open_ref(ref) do |object_path|
    @cache.open_temp() do
      @logger.debug("Downloading #{ref} from #{url}")
      url = forge_url() + release_metadata(ref.identity, "file_uri")

      tarball = Armature::Util::http_get(url)

      # This extracts into a temp directory
      Armature::Run::pipe_command(tarball, "tar", "xzf" , "-")

      # Move everything into the object directory
      extract_dir = Dir["*"].first()
      Dir.entries(extract_dir).each do |child|
        if ! [".", ".."].include?(child)
          File.rename("#{extract_dir}/#{child}", "#{object_path}/#{child}")
        end
      end
    end
  end
end
flush_memory!() click to toggle source
# File lib/armature/repo/forge.rb, line 84
def flush_memory!
  @fresh = false
  @metadata = nil
end
forge_url() click to toggle source
# File lib/armature/repo/forge.rb, line 48
def forge_url
  @forge_url || File.read("#{@repo_dir}/forge_url").chomp()
end
freshen!() click to toggle source
# File lib/armature/repo/forge.rb, line 79
def freshen!
  flush_memory!
  download_metadata()
end
full_name() click to toggle source
# File lib/armature/repo/forge.rb, line 52
def full_name
  @full_name || File.read("#{@repo_dir}/full_name").chomp()
end
general_ref(version) click to toggle source

Get ref object

# File lib/armature/repo/forge.rb, line 90
def general_ref(version)
  if version.nil? || version.to_s == "latest"
    latest_ref()
  else
    version_ref(version)
  end
end
latest_ref() click to toggle source
# File lib/armature/repo/forge.rb, line 102
def latest_ref
  freshen()
  version = metadata("current_release.version")

  Armature::Ref::Mutable.new(self, "latest", version, "version", "latest")
end
url() click to toggle source
# File lib/armature/repo/forge.rb, line 44
def url
  @url || File.read("#{@repo_dir}/url").chomp()
end
version_ref(version) click to toggle source
# File lib/armature/repo/forge.rb, line 98
def version_ref(version)
  Armature::Ref::Immutable.new(self, version, version, "version", version)
end

Private Instance Methods

dig(parent, path) click to toggle source
# File lib/armature/repo/forge.rb, line 146
def dig(parent, path)
  key = path.shift()
  if path.length() == 0
    parent[key]
  else
    dig(parent[key], path)
  end
end
download_metadata() click to toggle source
# File lib/armature/repo/forge.rb, line 141
def download_metadata
  @fresh = true
  @metadata = Armature::Util::http_get_json(metadata_url())
end
metadata(path=nil) click to toggle source
# File lib/armature/repo/forge.rb, line 111
def metadata(path=nil)
  ### FIXME cache metadata in repo
  @metadata ||= download_metadata()
  return @metadata if path == nil

  begin
    dig(@metadata, path.split("."))
  rescue => e
    raise "Got invalid metadata from #{metadata_url()}: #{e}"
  end
end
metadata_url() click to toggle source
# File lib/armature/repo/forge.rb, line 137
def metadata_url
  [forge_url(), "v3", "modules", full_name()].join("/")
end
release_metadata(version, path=nil) click to toggle source
# File lib/armature/repo/forge.rb, line 123
def release_metadata(version, path=nil)
  metadata("releases").each do |release|
    begin
      if release["version"] == version
        return dig(release, path.split("."))
      end
    rescue => e
      raise "Got invalid metadata from #{metadata_url()}: #{e}"
    end
  end

  raise "Release #{version} not found"
end