My WEE updater
- Posted by K_D_R Jan 15, 2016
- 1761 views
This is helpful if you have made any mods to WEE which you may want to keep.
-- -- WEE source code updater -- modified by Kenneth Rhodes -- Provides an initial option to backup all files -- which need updating, before updating any files. -- If any file backup fails, the program can be aborted -- without updating any files. 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") 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 procedure update(integer backup = 0) if backup then puts(1, "\n\nUpdate will overwrite any local changes to the source files.\n"& "Press any key to continue, or 'q' to quit.\n") if wait_key() = 'q' then abort(0) end if end if puts(1, "\n") 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 if not backup then -- file hash is ok printf(1, "%s is up-to-date.\n", {name}) end if else if backup then -- backup files that need updating, overwrite existing backup file if copy_file(name, filebase(name) & "-bak." & fileext(name), 1) then printf(1, "%s backed up as %s\n", {name, filebase(name) & "-bak." & fileext(name)}) else printf(1, "\nFailed to backup file %s, continuing the update \n" & "will overwrite this file. Press 'q' to quit, or\n" & "press any other key to continue.\n", {name}) if wait_key() = 'q' then abort(1) end if end if 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}) else printf(1, "%s is up-to-date.\n", {name}) end if end if end if end if end for if backup then -- start update pass update(0) else puts(1, "\n\nDone. Press any key to exit.\n") wait_key() end if end procedure -- update(1) -- backup files before updating -- update(0) -- Run update without backing up files -- if you always want to backup files before updating -- comment out the following lines as well and then -- uncomment the line -- update(1) above. integer backup backup = prompt_number("\nBackup/Rename files which will be updated? 0 = no, 1 = yes :: ", {0,1}) update(backup)
If you are running Linux, and you have chosen to back up files you can view the differences between the old file and the new file by using diff and then copy your changes back into the newly updated file, if you wish:
diff -y --suppress-common-lines ~/wee/parser-bak.e ~/wee/parser.e
For what it is worth in edx.ex the Windows compare command is something like:
fc /T parser-bak.e parser.e
I think a "Mods" option in WEE kinda like the old edx.ex routine which would compare the current file to the file saved on disk would be pretty nice. I haven't been able to implement it WEE so far.
Thanks again to Pete Eberlein and Irv Mullins for WEE and EuGTK!
Regards, Ken Rhodes