--- MacOS X app release.
-- @module scripts.macosx
-- @usage macosx(project)
local fs = require "luarocks.fs"
local semver = require "semver"
local zip = require "brimworks.zip"
local Script = require "love-release.script"
local utils = require "love-release.utils"
local s = {}
local function validate(project)
local valid, err = true, utils.io.err
if type(project.identifier) ~= "string" or project.identifier == "" then
err("MacOS X: No identifier specified.\n")
valid = false
end
if not valid then os.exit(1) end
return project
end
function s.script(project)
local script = Script:new(validate(project))
script:createLoveFile()
fs.change_dir(project.releaseDirectory)
local prefix = "love-"..tostring(project.loveVersion).."-macosx-"
local bin
if project.loveVersion >= semver'0.9.0' then
bin = prefix.."x64.zip"
else
bin = prefix.."ub.zip"
end
local url = "https://bitbucket.org/rude/love/downloads/"..bin
local cache = utils.cache.."/"..bin
-- Can't cache the archive because luarocks functions use a HEAD request to
-- Amazon AWS which will answer a 403.
-- assert(fs.download(url, cache, true))
if not fs.exists(cache) then
assert(fs.download(url, cache))
end
fs.delete(bin)
assert(fs.copy(cache, bin))
-- local ar = assert(zip.open(bin, zip.OR(zip.CHECKCONS)))
local ar = zip.open(bin)
local infoPlistIndex = assert(ar:name_locate("love.app/Contents/Info.plist"))
local infoPlistSize = assert(ar:stat(infoPlistIndex).size)
local infoPlistHandle = assert(ar:open(infoPlistIndex))
local infoPlist = assert(infoPlistHandle:read(infoPlistSize))
infoPlistHandle:close()
infoPlist = infoPlist
:gsub("\n\tUTExportedTypeDeclarations.*",
"")
:gsub("(CFBundleIdentifier.-)(.-)()",
"%1"..project.identifier.."%3")
:gsub("(CFBundleName.-)(.-)()",
"%1"..project.title..".love%3")
ar:add("love.app/Contents/Resources/"..script.loveFile,
"file", script.loveFile)
local app = project.title..".app"
for i = 1, #ar do
ar:rename(i, ar:stat(i).name:gsub("^love%.app", app))
end
ar:close()
-- for unknown reason, replacing the Info.plist content earlier would cause
-- random crashes
ar = zip.open(bin)
assert(ar:replace(infoPlistIndex, "string", infoPlist))
ar:close()
os.rename(bin, project.title.."-macosx.zip")
fs.pop_dir()
end
setmetatable(s, {
__call = function(_, project) return s.script(project) end,
})
return s