First commit
This commit is contained in:
106
tools/WEE/updater.ex
Normal file
106
tools/WEE/updater.ex
Normal file
@@ -0,0 +1,106 @@
|
||||
-- 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()
|
Reference in New Issue
Block a user