You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.6 KiB

4 years ago
require "bento/common"
require "mixlib/shellout" unless defined?(Mixlib::ShellOut)
class BuildMetadata
include Common
def initialize(template, build_timestamp, override_version)
@template = template
@build_timestamp = build_timestamp
@override_version = override_version
end
def read
{
name: name,
version: version,
build_timestamp: build_timestamp,
git_revision: git_revision,
git_status: git_clean? ? "clean" : "dirty",
box_basename: box_basename,
template: template_vars.fetch("template", UNKNOWN),
packer: packer_ver,
}
end
private
UNKNOWN = "__unknown__".freeze
attr_reader :template, :build_timestamp, :override_version
def box_basename
"#{name.gsub("/", "__")}-#{version}"
end
def git_revision
`git rev-parse HEAD`.strip
end
def git_clean?
`git status --porcelain`.strip.empty?
end
def merged_vars
@merged_vars ||= begin
if File.exist?("#{template}.variables.json")
template_vars.merge(JSON.load(IO.read("#{template}.variables.json")))
else
template_vars
end
end
end
def name
merged_vars.fetch("name", template)
end
def template_vars
@template_vars ||= JSON.load(IO.read("#{template}.json")).fetch("variables")
end
def version
override_version || merged_vars.fetch("version", "#{UNKNOWN}.TIMESTAMP")
.rpartition(".").first.concat(build_timestamp.to_s)
end
def packer_ver
cmd = Mixlib::ShellOut.new("packer --version")
cmd.run_command
cmd.stdout.split("\n")[0]
end
end