diff --git a/resources.tgz b/resources.tgz deleted file mode 100644 index 77a51de..0000000 Binary files a/resources.tgz and /dev/null differ diff --git a/resources/.version b/resources/.version new file mode 100644 index 0000000..8acdd82 --- /dev/null +++ b/resources/.version @@ -0,0 +1 @@ +0.0.1 diff --git a/src/lib/constants.nim b/src/lib/constants.nim new file mode 100644 index 0000000..1635aa9 --- /dev/null +++ b/src/lib/constants.nim @@ -0,0 +1,5 @@ +# vim: set et sta sw=4 ts=4 : + +# Don't forget to update resources/.version to match this! +const VERSION* = "0.0.1" + diff --git a/src/lib/embeddedfs.nim b/src/lib/embeddedfs.nim index 8149b5d..cc8ba80 100644 --- a/src/lib/embeddedfs.nim +++ b/src/lib/embeddedfs.nim @@ -9,13 +9,16 @@ import std/files, std/paths, std/strformat, + std/strutils, std/tempfiles +import + constants + type EmbeddedFS* = object EmbeddedFSError* = object of CatchableError -let embeddedFs* = EmbeddedFS() when not defined( emscripten ): import zippy/tarballs @@ -33,6 +36,7 @@ else: let confFile* = confDir / Path("config.ini") + proc path*( data: EmbeddedFS, path: string ): Path = ## Returns the path of an embedded file. return dataDir / Path( path ) @@ -48,23 +52,38 @@ proc `[]`*( data: EmbeddedFS, path: string ): string = return f.readAll -# TODO: version check, extract over old stuff -# no-op if versions match -# -proc update*( e: EmbeddedFS ) = - when not defined( emscripten ): - createDir( getDataDir() ) - createDir( $confDir ) +proc newEmbeddedFS(): EmbeddedFS = + ## Initialize the embedded filesystem. + ## + ## If the current runtime version is different than the binary version, + ## re-extract the embedded filesystem to disk. - # check existing path / version + result = EmbeddedFS() + when defined( emscripten ): return - let ( tarball, path ) = createTempFile( "{appname}_resources_".fmt, ".tgz" ) - tarball.write( RESOURCES ) - tarball.close + try: + var fsVersion = readFile( $result.path(".version") ) + fsVersion.removeSuffix + if fsVersion == VERSION: return + except: + discard - extractAll( path, $dataDir ) - removeFile( path ) + echo "Extracting embedded resources for v{VERSION}".fmt - let source = dataDir / Path( "config.ini" ) - if not fileExists( confFile ): moveFile( source, confFile ) + createDir( getDataDir() ) + createDir( $confDir ) + + let ( tarball, path ) = createTempFile( "{appname}_resources_".fmt, ".tgz" ) + tarball.write( RESOURCES ) + tarball.close + + removeDir( $dataDir ) + extractAll( path, $dataDir ) + removeFile( path ) + + let source = dataDir / Path( "config.ini" ) + if not fileExists( confFile ): copyFile( $source, $confFile ) + + +let embeddedFs* = newEmbeddedFS() diff --git a/src/nim_wasm_test.nim b/src/nim_wasm_test.nim index 74922e8..772a67b 100644 --- a/src/nim_wasm_test.nim +++ b/src/nim_wasm_test.nim @@ -7,6 +7,7 @@ import reasings import raylib import + lib/constants, lib/configuration, lib/embeddedfs