Re: My WEE updater

new topic     » goto parent     » topic index » view thread      » older message » newer message
--   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. 
 
--      Provides an option to view differences between 
--      the updated file and the backup file 
 
--      The Windows compare files command 
--      is taken from edx.ex and 
--      has not been tested on Windows 
--  
 
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 
 
-- mods 
sequence BFILE = "" 
sequence S = {}                         --  for source files which have backed up 
sequence compare_cmd 
ifdef WINDOWS then 
    compare_cmd = "fc /T " 
elsifdef LINUX then 
    compare_cmd = "diff -y --suppress-common-lines " 
end ifdef 
--------- 
 
procedure update(integer backup = 0) 
     
    if not backup then 
        -- update pass 
        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 
                if file_exists(name) then 
                    --     backup files that need updating, overwrite existing backup file 
                    if copy_file(name, filebase(name) & "-bak." & fileext(name), 1) then  
                        BFILE= filebase(name) & "-bak." & fileext(name) 
                        S = append(S, name) 
                        printf(1, "%s backed up as %s\n", {name, BFILE}) 
                    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 
                end if 
            else 
                -- update pass: backup = 0  
                printf(1, "Updating %s...\t", {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}) 
                        if find(name, S) then 
                            printf(1, "Would you like to view changes between %s and %s now?", {name, BFILE}) 
                            puts(1,"\nPress 'y' to view changes now. \nPress any other key to continue without view changes.\n") 
                            if wait_key()='y' then 
                                BFILE= filebase(name) & "-bak." & fileext(name) 
                                system(compare_cmd & name & " " & BFILE  & " | more", 0) 
                            end if 
                        end if 
                    end if 
                end if 
            end if     
        end if 
    end for 
    if backup then 
        --  backup run compete 
        --  go back for 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)   -- functions like Pete's original updater.ex 
 
-- Allows user to choose the backup option.  
-- Make sure both calls to update above are commented out: 
-- integer backup 
-- backup = prompt_number("\nBackup files which will be updated? 0 = no, 1 = yes ::  ", {0,1}) 
-- update(backup) 
-- 
new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu