diff options
Diffstat (limited to 'tools/file_packager.py')
-rw-r--r-- | tools/file_packager.py | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/tools/file_packager.py b/tools/file_packager.py index 7d9344cd..0c0f2444 100644 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -11,7 +11,7 @@ data downloads. Usage: - file_packager.py TARGET [--preload A [B..]] [--embed C [D..]] [--compress COMPRESSION_DATA] [--crunch[=X]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--no-heap-copy] + file_packager.py TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]] [--compress COMPRESSION_DATA] [--crunch[=X]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--no-heap-copy] --crunch=X Will compress dxt files to crn with quality level X. The crunch commandline tool must be present and CRUNCH should be defined in ~/.emscripten that points to it. JS crunch decompressing code will @@ -45,9 +45,10 @@ import posixpath import shared from shared import Compression, execute, suffix, unsuffixed from subprocess import Popen, PIPE, STDOUT +import fnmatch if len(sys.argv) == 1: - print '''Usage: file_packager.py TARGET [--preload A...] [--embed B...] [--compress COMPRESSION_DATA] [--crunch[=X]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--no-heap-copy] + print '''Usage: file_packager.py TARGET [--preload A...] [--embed B...] [--exclude C...] [--compress COMPRESSION_DATA] [--crunch[=X]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--no-heap-copy] See the source for more details.''' sys.exit(0) @@ -66,10 +67,10 @@ DDS_HEADER_SIZE = 128 AV_WORKAROUND = 0 # Set to 1 to randomize file order and add some padding, to work around silly av false positives data_files = [] -in_preload = False -in_embed = False +excluded_patterns = [] +leading = '' has_preloaded = False -in_compress = 0 +compress_cnt = 0 crunch = 0 plugins = [] jsoutput = None @@ -83,19 +84,16 @@ no_heap_copy = True for arg in sys.argv[1:]: if arg == '--preload': - in_preload = True - in_embed = False + leading = 'preload' has_preloaded = True - in_compress = 0 elif arg == '--embed': - in_embed = True - in_preload = False - in_compress = 0 + leading = 'embed' + elif arg == '--exclude': + leading = 'exclude' elif arg == '--compress': + leading = 'compress' + compress_cnt = 1 Compression.on = True - in_compress = 1 - in_preload = False - in_embed = False elif arg == '--no-force': force = False elif arg == '--use-preload-cache': @@ -107,19 +105,11 @@ for arg in sys.argv[1:]: elif arg.startswith('--crunch'): from shared import CRUNCH crunch = arg.split('=')[1] if '=' in arg else '128' - in_preload = False - in_embed = False - in_compress = 0 elif arg.startswith('--plugin'): plugin = open(arg.split('=')[1], 'r').read() eval(plugin) # should append itself to plugins - in_preload = False - in_embed = False - in_compress = 0 - elif in_preload or in_embed: - mode = 'preload' - if in_embed: - mode = 'embed' + elif leading == 'preload' or leading == 'embed': + mode = leading if '@' in arg: srcpath, dstpath = arg.split('@') # User is specifying destination filename explicitly. else: @@ -128,16 +118,18 @@ for arg in sys.argv[1:]: data_files.append({ 'srcpath': srcpath, 'dstpath': dstpath, 'mode': mode }) else: print >> sys.stderr, 'Warning: ' + arg + ' does not exist, ignoring.' - elif in_compress: - if in_compress == 1: + elif leading == 'exclude': + excluded_patterns.append(arg) + elif leading == 'compress': + if compress_cnt == 1: Compression.encoder = arg - in_compress = 2 - elif in_compress == 2: + compress_cnt = 2 + elif compress_cnt == 2: Compression.decoder = arg - in_compress = 3 - elif in_compress == 3: + compress_cnt = 3 + elif compress_cnt == 3: Compression.js_name = arg - in_compress = 0 + compress_cnt = 0 if (not force) and len(data_files) == 0: has_preloaded = False @@ -172,16 +164,14 @@ def has_hidden_attribute(filepath): result = False return result -# The packager should never preload/embed any directories that have a component starting with '.' in them, -# or if the file is hidden (Win32). Note that this filter ONLY applies to directories. Explicitly specified single files -# are always preloaded/embedded, even if they start with a '.'. -def should_ignore(filename): - if has_hidden_attribute(filename): +# The packager should never preload/embed files if the file is hidden (Win32). +# or it matches any pattern specified in --exclude +def should_ignore(fullname, filename): + if has_hidden_attribute(fullname): return True - components = filename.replace('\\\\', '/').replace('\\', '/').split('/') - for c in components: - if c.startswith('.') and c != '.' and c != '..': + for p in excluded_patterns: + if fnmatch.fnmatch(filename, p): return True return False @@ -190,20 +180,31 @@ def add(arg, dirname, names): # rootpathsrc: The path name of the root directory on the local FS we are adding to emscripten virtual FS. # rootpathdst: The name we want to make the source path available on the emscripten virtual FS. mode, rootpathsrc, rootpathdst = arg + new_names = [] for name in names: fullname = os.path.join(dirname, name) - if not os.path.isdir(fullname): - if should_ignore(fullname): - if DEBUG: - print >> sys.stderr, 'Skipping hidden file "' + fullname + '" from inclusion in the emscripten virtual file system.' - else: + if should_ignore(fullname, name): + if DEBUG: + print >> sys.stderr, 'Skipping file "' + fullname + '" from inclusion in the emscripten virtual file system.' + else: + new_names.append(name) + if not os.path.isdir(fullname): dstpath = os.path.join(rootpathdst, os.path.relpath(fullname, rootpathsrc)) # Convert source filename relative to root directory of target FS. - data_files.append({ 'srcpath': fullname, 'dstpath': dstpath, 'mode': mode }) + new_data_files.append({ 'srcpath': fullname, 'dstpath': dstpath, 'mode': mode }) + del names[:] + names.extend(new_names) +new_data_files = [] for file_ in data_files: - if os.path.isdir(file_['srcpath']): - os.path.walk(file_['srcpath'], add, [file_['mode'], file_['srcpath'], file_['dstpath']]) -data_files = filter(lambda file_: not os.path.isdir(file_['srcpath']), data_files) + if not should_ignore(file_['srcpath'], os.path.basename(file_['srcpath'])): + if os.path.isdir(file_['srcpath']): + os.path.walk(file_['srcpath'], add, [file_['mode'], file_['srcpath'], file_['dstpath']]) + else: + new_data_files.append(file_) +data_files = filter(lambda file_: not os.path.isdir(file_['srcpath']), new_data_files) +if len(data_files) == 0: + print >> sys.stderr, 'Nothing to do!' + sys.exit(1) # Absolutize paths, and check that they make sense curr_abspath = os.path.abspath(os.getcwd()) |