107 lines
2.8 KiB
Elixir
107 lines
2.8 KiB
Elixir
-- WEE source code updater
|
|
|
|
include std/console.e
|
|
include std/net/http.e
|
|
include std/io.e
|
|
include std/get.e
|
|
include std/filesys.e
|
|
include std/hash.e
|
|
|
|
puts(1, "=== WEE Source Code Updater ===\n"&
|
|
"This will overwrite any local changes to the source files.\n"&
|
|
"Press a key to continue, or 'q' to quit.\n")
|
|
if wait_key() = 'q' then
|
|
abort(0)
|
|
end if
|
|
|
|
constant
|
|
repo = "peberlein/WEE/",
|
|
base_url = "http://cdn.rawgit.com/" & repo -- & "commit/filename"
|
|
|
|
-- this needs to be .json since rawgit.com has a whitelist of extensions
|
|
-- otherwise it will just redirect to https://raw.githubusercontent.com
|
|
-- and http_get doesn't support https: protocol
|
|
constant
|
|
manifest = http_get("http://rawgit.com/"& repo &"master/manifest.json")
|
|
|
|
procedure fail(sequence fmt, object args={})
|
|
printf(1, fmt, args)
|
|
puts(1, "\nPress any key to exit, then try updating again.\n")
|
|
wait_key()
|
|
abort(1)
|
|
end procedure
|
|
|
|
if atom(manifest) or not equal(manifest[1][1][2], "200") then
|
|
display(manifest)
|
|
fail("Failed to download manifest.json\n")
|
|
end if
|
|
|
|
-- manifest format
|
|
-- {
|
|
-- {"pathname", hash, "commit-tag", platform-bits, platforms...}
|
|
-- }
|
|
|
|
sequence files, name, commit_tag
|
|
files = value(manifest[2])
|
|
--display(files)
|
|
if files[1] != 0 then
|
|
fail("Failed to parse manifest\n")
|
|
end if
|
|
files = files[2]
|
|
|
|
ifdef BITS64 then
|
|
constant PLATFORM_BITS = 64
|
|
elsedef
|
|
constant PLATFORM_BITS = 32
|
|
end ifdef
|
|
|
|
integer platform_bits
|
|
sequence platforms, subdir
|
|
|
|
object result, hashcode
|
|
|
|
for i = 1 to length(files) do
|
|
if length(files[i]) < 4 then
|
|
fail("Manifest file has invalid format.\n")
|
|
end if
|
|
|
|
name = files[i][1]
|
|
hashcode = files[i][2]
|
|
commit_tag = files[i][3]
|
|
platform_bits = files[i][4]
|
|
platforms = files[i][5..$]
|
|
|
|
if length(platforms) and not find(platform(), platforms) then
|
|
-- file not used on this platform
|
|
|
|
elsif platform_bits != 0 and platform_bits != PLATFORM_BITS then
|
|
-- file not compatible with 32/64-bit platform
|
|
|
|
elsif equal(hashcode, hash(read_file(name), HSIEH30)) then
|
|
-- file hash is ok
|
|
printf(1, "%s is up-to-date.\n", {name})
|
|
|
|
else
|
|
printf(1, "Updating %s...\n", {name})
|
|
result = http_get(base_url & commit_tag & "/" & name)
|
|
if atom(result) or not equal(result[1][1][2], "200") then
|
|
display(result)
|
|
fail("Failed to download %s\n", {name})
|
|
elsif not equal(hashcode, hash(result[2], HSIEH30)) then
|
|
fail("Failed to validate %s\n", {name})
|
|
else
|
|
subdir = dirname(name)
|
|
if length(subdir) and atom(dir(subdir)) then
|
|
printf(1, "Creating directory %s\n", {subdir})
|
|
create_directory(subdir)
|
|
end if
|
|
if write_file(name, result[2]) = -1 then
|
|
printf(1, "Failed to write_file %s\n", {name})
|
|
end if
|
|
end if
|
|
end if
|
|
end for
|
|
|
|
puts(1, "Done. Press any key to exit.\n")
|
|
wait_key()
|