My WEE updater

new topic     » topic index » view thread      » older message » newer message

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

new topic     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu