---
-- Create a source or binary release package.
---


---
-- Helper function: run a command while hiding its output.
---

	local function execQuiet(cmd, ...)
		cmd = string.format(cmd, ...) .. " > _output_.log 2> _error_.log"
		local z = os.execute(cmd)
		os.remove("_output_.log")
		os.remove("_error_.log")
		return z
	end


---
-- Check the command line arguments, and show some help if needed.
---

	local usage = 'usage is: package <branch> <type>\n' ..
		'       <branch> is the name of the release branch to target\n' ..
		'       <type> is one of "source" or "binary"\n'

	if #_ARGS ~= 2 then
		error(usage, 0)
	end

	local branch = _ARGS[1]
	local kind = _ARGS[2]

	if kind ~= "source" and kind ~= "binary" then
		error(usage, 0)
	end


--
-- Make sure I've got what I've need to be happy.
--

	local required = { "git", "make", "gcc", "premake5", "zip" }
	for _, value in ipairs(required) do
		local z = execQuiet("%s --version", value)
		if z ~= 0 then
			error("required tool '" .. value .. "' not found", 0)
		end
	end


--
-- Figure out what I'm making.
--

	os.chdir("..")
	local text = os.outputof(string.format('git show %s:src/host/premake.c', branch))
	local _, _, version = text:find('VERSION%s*"([%w%p]+)"')

	local pkgName = "premake-" .. version
	local pkgExt = ".zip"

	if not os.is("windows") and kind == "binary" then
		pkgExt = ".tar.gz"
	end


--
-- Make sure I'm sure.
--

	printf("")
	printf("I am about to create a %s package", kind:upper())
	printf("  ...named release/%s%s", pkgName, pkgExt)
	printf("  ...from the %s branch", branch)
	printf("")
	printf("Does this look right to you? If so, press [Enter] to begin.")
	io.read()


--
-- Pull down the release branch.
--

	print("Preparing release folder")
	os.mkdir("release")
	os.chdir("release")
	os.rmdir(pkgName)

	print("Cloning source code")
	z = os.executef("git clone .. %s", pkgName)
	if z ~= 0 then
		error("clone failed", 0)
	end

	os.chdir(pkgName)

	z = os.executef("git checkout %s", branch)
	if z ~= 0 then
		error("unable to checkout branch " .. branch, 0)
	end

	z = os.executef("git submodule update --init")
	if z ~= 0 then
		error("unable to clone submodules", 0)
	end


--
-- Make absolutely sure the embedded scripts have been updated
--

	print("Updating embedded scripts...")
	z = execQuiet("premake5 embed")
	if z ~= 0 then
		error("failed to update the embedded scripts", 0)
	end


--
-- Clear out files I don't want included in any packages.
--

	print("Cleaning up the source tree...")
	os.rmdir("packages")

	local modules = table.join(".", os.matchdirs("modules/*"))
	for _, module in ipairs(modules) do
		for _, name in ipairs { ".git" } do
			os.rmdir(path.join(module, name))
		end
		for _, name in ipairs { ".DS_Store", ".git", ".gitignore", ".gitmodules", ".travis.yml", ".editorconfig", "Bootstrap.mak" } do
			os.remove(path.join(module, name))
		end
	end


--
-- Generate a source package.
--

if kind == "source" then

	print("Generating project files...")
	execQuiet("premake5 /to=build/vs2005 vs2005")
	execQuiet("premake5 /to=build/vs2008 vs2008")
	execQuiet("premake5 /to=build/vs2010 vs2010")
	execQuiet("premake5 /to=build/vs2012 vs2012")
	execQuiet("premake5 /to=build/vs2013 vs2013")
	execQuiet("premake5 /to=build/gmake.windows /os=windows gmake")
	execQuiet("premake5 /to=build/gmake.unix /os=linux gmake")
	execQuiet("premake5 /to=build/gmake.macosx /os=macosx gmake")

	print("Creating source code package...")
	os.chdir("..")
	execQuiet("zip -r9 %s-src.zip %s/*", pkgName, pkgName)

end


--
-- Create a binary package for this platform. This step requires a working
-- GNU/Make/GCC environment. I use MinGW on Windows as it produces the
-- smallest binaries.
--

if kind == "binary" then

	print("Building binary...")
	execQuiet("premake5 gmake")
	z = execQuiet("make config=release")
	if z ~= 0 then
		error("build failed")
	end

	os.chdir("bin/release")

	local name = string.format("%s-%s%s", pkgName, os.get(), pkgExt)
	if os.is("windows") then
		execQuiet("zip -9 %s premake5.exe", name)
	else
		execQuiet("tar czvf %s premake5", name)
	end

	os.copyfile(name, path.join("../../../", name))
	os.chdir("../../..")

end


--
-- Clean up
--

	os.rmdir(pkgName)
