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