Check if the runtime is up to date on dev install #123
			
				
			
		
		
		
	| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
import hashlib
 | 
					import hashlib
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .log import *
 | 
					from .log import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,3 +29,80 @@ def checkfile(filepath):
 | 
				
			||||||
def filesum(filepath):
 | 
					def filesum(filepath):
 | 
				
			||||||
    with open(filepath, "rb") as file:
 | 
					    with open(filepath, "rb") as file:
 | 
				
			||||||
        return hashlib.sha256(file.read()).hexdigest()
 | 
					        return hashlib.sha256(file.read()).hexdigest()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Directory-hashing implementation pulled from the checksumdir package on pypi.
 | 
				
			||||||
 | 
					# Licensed under the MIT license.
 | 
				
			||||||
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def dirsum(
 | 
				
			||||||
 | 
					    dirname,
 | 
				
			||||||
 | 
					    hash_func=hashlib.sha1,
 | 
				
			||||||
 | 
					    excluded_files=None,
 | 
				
			||||||
 | 
					    ignore_hidden=False,
 | 
				
			||||||
 | 
					    followlinks=False,
 | 
				
			||||||
 | 
					    excluded_extensions=None,
 | 
				
			||||||
 | 
					    include_paths=False
 | 
				
			||||||
 | 
					):
 | 
				
			||||||
 | 
					    if not excluded_files:
 | 
				
			||||||
 | 
					        excluded_files = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if not excluded_extensions:
 | 
				
			||||||
 | 
					        excluded_extensions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if not os.path.isdir(dirname):
 | 
				
			||||||
 | 
					        raise TypeError("{} is not a directory.".format(dirname))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hashvalues = []
 | 
				
			||||||
 | 
					    for root, dirs, files in os.walk(dirname, topdown=True, followlinks=followlinks):
 | 
				
			||||||
 | 
					        if ignore_hidden and re.search(r"/\.", root):
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dirs.sort()
 | 
				
			||||||
 | 
					        files.sort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for fname in files:
 | 
				
			||||||
 | 
					            if ignore_hidden and fname.startswith("."):
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if fname.split(".")[-1:][0] in excluded_extensions:
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if fname in excluded_files:
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            hashvalues.append(_filehash(os.path.join(root, fname), hash_func))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if include_paths:
 | 
				
			||||||
 | 
					                hasher = hash_func()
 | 
				
			||||||
 | 
					                # get the resulting relative path into array of elements
 | 
				
			||||||
 | 
					                path_list = os.path.relpath(os.path.join(root, fname)).split(os.sep)
 | 
				
			||||||
 | 
					                # compute the hash on joined list, removes all os specific separators
 | 
				
			||||||
 | 
					                hasher.update(''.join(path_list).encode('utf-8'))
 | 
				
			||||||
 | 
					                hashvalues.append(hasher.hexdigest())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return _reduce_hash(hashvalues, hash_func)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _filehash(filepath, hashfunc):
 | 
				
			||||||
 | 
					    hasher = hashfunc()
 | 
				
			||||||
 | 
					    blocksize = 64 * 1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if not os.path.exists(filepath):
 | 
				
			||||||
 | 
					        return hasher.hexdigest()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with open(filepath, "rb") as fp:
 | 
				
			||||||
 | 
					        while True:
 | 
				
			||||||
 | 
					            data = fp.read(blocksize)
 | 
				
			||||||
 | 
					            if not data:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            hasher.update(data)
 | 
				
			||||||
 | 
					    return hasher.hexdigest()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _reduce_hash(hashlist, hashfunc):
 | 
				
			||||||
 | 
					    hasher = hashfunc()
 | 
				
			||||||
 | 
					    for hashvalue in sorted(hashlist):
 | 
				
			||||||
 | 
					        hasher.update(hashvalue.encode("utf-8"))
 | 
				
			||||||
 | 
					    return hasher.hexdigest()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@ from zipfile import ZipFile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from . import checksum
 | 
					from . import checksum
 | 
				
			||||||
from .bindgen import bindgen
 | 
					from .bindgen import bindgen
 | 
				
			||||||
 | 
					from .checksum import dirsum
 | 
				
			||||||
from .gles_gen import gles_gen
 | 
					from .gles_gen import gles_gen
 | 
				
			||||||
from .log import *
 | 
					from .log import *
 | 
				
			||||||
from .utils import pushd, removeall, yeetdir, yeetfile
 | 
					from .utils import pushd, removeall, yeetdir, yeetfile
 | 
				
			||||||
| 
						 | 
					@ -65,6 +66,21 @@ def build_runtime(args):
 | 
				
			||||||
    build_wasm3(args.release)
 | 
					    build_wasm3(args.release)
 | 
				
			||||||
    build_orca(args.release)
 | 
					    build_orca(args.release)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with open("build/orcaruntime.sum", "w") as f:
 | 
				
			||||||
 | 
					        f.write(runtime_checksum())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def runtime_checksum_last():
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        with open("build/orcaruntime.sum", "r") as f:
 | 
				
			||||||
 | 
					            return f.read()
 | 
				
			||||||
 | 
					    except FileNotFoundError:
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def runtime_checksum():
 | 
				
			||||||
 | 
					    return dirsum("src")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def clean(args):
 | 
					def clean(args):
 | 
				
			||||||
    yeetdir("build")
 | 
					    yeetdir("build")
 | 
				
			||||||
| 
						 | 
					@ -504,6 +520,20 @@ def install_dir():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def install(args):
 | 
					def install(args):
 | 
				
			||||||
 | 
					    if runtime_checksum_last() is None:
 | 
				
			||||||
 | 
					        print("You must build the Orca runtime before you can install it to your")
 | 
				
			||||||
 | 
					        print("system. Please run the following command first:")
 | 
				
			||||||
 | 
					        print()
 | 
				
			||||||
 | 
					        print("orca dev build-runtime")
 | 
				
			||||||
 | 
					        exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if runtime_checksum() != runtime_checksum_last():
 | 
				
			||||||
 | 
					        print("Your build of the Orca runtime is out of date. We recommend that you")
 | 
				
			||||||
 | 
					        print("rebuild the runtime first with `orca dev build-runtime`.")
 | 
				
			||||||
 | 
					        if not prompt("Do you wish to install the runtime anyway?"):
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        print()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dest = install_dir()
 | 
					    dest = install_dir()
 | 
				
			||||||
    bin_dir = os.path.join(dest, "bin")
 | 
					    bin_dir = os.path.join(dest, "bin")
 | 
				
			||||||
    src_dir = os.path.join(dest, "src")
 | 
					    src_dir = os.path.join(dest, "src")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ import os
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .checksum import dirsum
 | 
				
			||||||
from .log import *
 | 
					from .log import *
 | 
				
			||||||
from .utils import yeetdir
 | 
					from .utils import yeetdir
 | 
				
			||||||
from .version import src_dir, orca_version
 | 
					from .version import src_dir, orca_version
 | 
				
			||||||
| 
						 | 
					@ -54,7 +55,7 @@ def vendor_file_path(vendor_dir):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def vendor_checksum(dir):
 | 
					def vendor_checksum(dir):
 | 
				
			||||||
    return dirhash(dir, excluded_extensions=["orcavendor"])
 | 
					    return dirsum(dir, excluded_extensions=["orcavendor"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def cflags(args):
 | 
					def cflags(args):
 | 
				
			||||||
| 
						 | 
					@ -110,80 +111,3 @@ def cflags(args):
 | 
				
			||||||
        print("If these paths look crazy to you, consider vendoring the source code into your")
 | 
					        print("If these paths look crazy to you, consider vendoring the source code into your")
 | 
				
			||||||
        print("project using `orca source vendor`.")
 | 
					        print("project using `orca source vendor`.")
 | 
				
			||||||
        print()
 | 
					        print()
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
# Directory-hashing implementation pulled from the checksumdir package on pypi.
 | 
					 | 
				
			||||||
# Licensed under the MIT license.
 | 
					 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def dirhash(
 | 
					 | 
				
			||||||
    dirname,
 | 
					 | 
				
			||||||
    hash_func=hashlib.sha1,
 | 
					 | 
				
			||||||
    excluded_files=None,
 | 
					 | 
				
			||||||
    ignore_hidden=False,
 | 
					 | 
				
			||||||
    followlinks=False,
 | 
					 | 
				
			||||||
    excluded_extensions=None,
 | 
					 | 
				
			||||||
    include_paths=False
 | 
					 | 
				
			||||||
):
 | 
					 | 
				
			||||||
    if not excluded_files:
 | 
					 | 
				
			||||||
        excluded_files = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if not excluded_extensions:
 | 
					 | 
				
			||||||
        excluded_extensions = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if not os.path.isdir(dirname):
 | 
					 | 
				
			||||||
        raise TypeError("{} is not a directory.".format(dirname))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    hashvalues = []
 | 
					 | 
				
			||||||
    for root, dirs, files in os.walk(dirname, topdown=True, followlinks=followlinks):
 | 
					 | 
				
			||||||
        if ignore_hidden and re.search(r"/\.", root):
 | 
					 | 
				
			||||||
            continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        dirs.sort()
 | 
					 | 
				
			||||||
        files.sort()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for fname in files:
 | 
					 | 
				
			||||||
            if ignore_hidden and fname.startswith("."):
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if fname.split(".")[-1:][0] in excluded_extensions:
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if fname in excluded_files:
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            hashvalues.append(_filehash(os.path.join(root, fname), hash_func))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if include_paths:
 | 
					 | 
				
			||||||
                hasher = hash_func()
 | 
					 | 
				
			||||||
                # get the resulting relative path into array of elements
 | 
					 | 
				
			||||||
                path_list = os.path.relpath(os.path.join(root, fname)).split(os.sep)
 | 
					 | 
				
			||||||
                # compute the hash on joined list, removes all os specific separators
 | 
					 | 
				
			||||||
                hasher.update(''.join(path_list).encode('utf-8'))
 | 
					 | 
				
			||||||
                hashvalues.append(hasher.hexdigest())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return _reduce_hash(hashvalues, hash_func)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _filehash(filepath, hashfunc):
 | 
					 | 
				
			||||||
    hasher = hashfunc()
 | 
					 | 
				
			||||||
    blocksize = 64 * 1024
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if not os.path.exists(filepath):
 | 
					 | 
				
			||||||
        return hasher.hexdigest()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    with open(filepath, "rb") as fp:
 | 
					 | 
				
			||||||
        while True:
 | 
					 | 
				
			||||||
            data = fp.read(blocksize)
 | 
					 | 
				
			||||||
            if not data:
 | 
					 | 
				
			||||||
                break
 | 
					 | 
				
			||||||
            hasher.update(data)
 | 
					 | 
				
			||||||
    return hasher.hexdigest()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _reduce_hash(hashlist, hashfunc):
 | 
					 | 
				
			||||||
    hasher = hashfunc()
 | 
					 | 
				
			||||||
    for hashvalue in sorted(hashlist):
 | 
					 | 
				
			||||||
        hasher.update(hashvalue.encode("utf-8"))
 | 
					 | 
				
			||||||
    return hasher.hexdigest()
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue