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