aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-06-18 16:27:29 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-06-18 16:27:29 -0700
commit0b2ef820afa027b66358d9cf4b535af25136c606 (patch)
tree1b9286758c5ac7bd7169aabac00e32db32d43126
parentb72e2aaedfc3df159312fda3b2ecd355584e7281 (diff)
do not recrunch if dds is unchanged
-rwxr-xr-xtests/runner.py19
-rw-r--r--tools/file_packager.py10
2 files changed, 27 insertions, 2 deletions
diff --git a/tests/runner.py b/tests/runner.py
index 861277e6..d840465d 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -7183,6 +7183,25 @@ fscanfed: 10 - hello
code = open('a.out.js').read()
assert 'SAFE_HEAP' in code, 'valid -s option had an effect'
+ def test_crunch(self):
+ # crunch should not be run if a .crn exists that is more recent than the .dds
+ shutil.copyfile(path_from_root('tests', 'ship.dds'), 'ship.dds')
+ time.sleep(0.1)
+ Popen(['python', FILE_PACKAGER, 'test.data', '--pre-run', '--crunch=32', '--preload', 'ship.dds'], stdout=open('pre.js', 'w')).communicate()
+ assert os.stat('test.data').st_size < 0.25*os.stat('ship.dds').st_size, 'Compressed should be much smaller than dds'
+ crunch_time = os.stat('ship.crn').st_mtime
+ dds_time = os.stat('ship.dds').st_mtime
+ assert crunch_time > dds_time, 'Crunch is more recent'
+ # run again, should not recrunch!
+ time.sleep(0.1)
+ Popen(['python', FILE_PACKAGER, 'test.data', '--pre-run', '--crunch=32', '--preload', 'ship.dds'], stdout=open('pre.js', 'w')).communicate()
+ assert crunch_time == os.stat('ship.crn').st_mtime, 'Crunch is unchanged'
+ # update dds, so should recrunch
+ time.sleep(0.1)
+ os.utime('ship.dds', None)
+ Popen(['python', FILE_PACKAGER, 'test.data', '--pre-run', '--crunch=32', '--preload', 'ship.dds'], stdout=open('pre.js', 'w')).communicate()
+ assert crunch_time < os.stat('ship.crn').st_mtime, 'Crunch was changed'
+
elif 'browser' in str(sys.argv):
# Browser tests.
diff --git a/tools/file_packager.py b/tools/file_packager.py
index 1e96361c..4a3d8030 100644
--- a/tools/file_packager.py
+++ b/tools/file_packager.py
@@ -18,6 +18,8 @@ Notes:
be added to convert the crn to dds in the browser.
crunch-worker.js will be generated in the current directory. You should include that file when
packaging your site.
+ DDS files will not be crunched if the .crn is more recent than the .dds. This prevents a lot of
+ unneeded computation.
TODO: You can also provide .crn files yourself, pre-crunched. With this option, they will be decompressed
to dds files in the browser, exactly the same as if this tool compressed them.
@@ -156,9 +158,13 @@ if crunch:
for file_ in data_files:
if file_['name'].endswith(CRUNCH_INPUT_SUFFIX):
- # TODO: do not crunch if crunched version exists and is more recent than dds source
- Popen([CRUNCH, '-file', file_['name'], '-quality', crunch], stdout=sys.stderr).communicate()
+ # Do not crunch if crunched version exists and is more recent than dds source
crunch_name = unsuffixed(file_['name']) + CRUNCH_OUTPUT_SUFFIX
+ crunch_time = os.stat(crunch_name).st_mtime
+ dds_time = os.stat(file_['name']).st_mtime
+ if dds_time < crunch_time: continue
+
+ Popen([CRUNCH, '-file', file_['name'], '-quality', crunch], stdout=sys.stderr).communicate()
shutil.move(os.path.basename(crunch_name), crunch_name) # crunch places files in the current dir
# prepend the dds header
crunched = open(crunch_name, 'rb').read()