summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJF Bastien <jfb@chromium.org>2016-01-16 20:08:36 -0800
committerJF Bastien <jfb@chromium.org>2016-01-16 20:08:36 -0800
commit74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09 (patch)
tree25954fa5dbdabcfcf0e79775d00f9282e154f621
parent7dd053aa3cc99e63b3be57514c28ac2b94932e2e (diff)
downloadbinaryen-74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09.tar.gz
binaryen-74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09.tar.bz2
binaryen-74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09.zip
Make the untar API more intuitive
As discussed in #112.
-rwxr-xr-xscripts/support.py79
-rwxr-xr-xupdate.py3
2 files changed, 58 insertions, 24 deletions
diff --git a/scripts/support.py b/scripts/support.py
index 95d663fe0..7cb0e0963 100755
--- a/scripts/support.py
+++ b/scripts/support.py
@@ -22,29 +22,64 @@ import sys
import tempfile
+def _open_archive(tarfile, tmp_dir):
+ with tempfile.TemporaryFile(mode='w+') as f:
+ try:
+ subprocess.check_call(['tar', '-xvf', tarfile], cwd=tmp_dir, stdout=f)
+ except:
+ f.seek(0)
+ sys.stderr.write(f.read())
+ raise
+ return os.listdir(tmp_dir)
+
+
+def _files_same(dir1, dir2, basenames):
+ diff = filecmp.cmpfiles(dir1, dir2, basenames)
+ return 0 == len(diff[1] + diff[2])
+
+
+def _dirs_same(dir1, dir2, basenames):
+ for d in basenames:
+ diff = filecmp.dircmp(os.path.join(dir1, d), os.path.join(dir2, d))
+ if 0 != len(diff.left_only + diff.right_only + diff.diff_files +
+ diff.common_funny + diff.funny_files):
+ return False
+ return True
+
+
+def _move_files(dirfrom, dirto, basenames):
+ for f in basenames:
+ from_file = os.path.join(dirfrom, f)
+ to_file = os.path.join(dirto, f)
+ if os.path.isfile(to_file):
+ os.path.remove(to_file)
+ shutil.move(from_file, to_file)
+
+
+def _move_dirs(dirfrom, dirto, basenames):
+ for d in basenames:
+ from_dir = os.path.join(dirfrom, d)
+ to_dir = os.path.join(dirto, d)
+ if os.path.isdir(to_dir):
+ shutil.rmtree(to_dir)
+ shutil.move(from_dir, to_dir)
+
+
def untar(tarfile, outdir):
- """Returns True if the untar dir differs from a pre-existing dir."""
- tmp_dir = tempfile.mkdtemp()
+ """Returns True if untar content differs from pre-existing outdir content."""
+ tmpdir = tempfile.mkdtemp()
try:
- with tempfile.TemporaryFile(mode='w+') as f:
- try:
- subprocess.check_call(['tar', '-xvf', tarfile], cwd=tmp_dir, stdout=f)
- except:
- f.seek(0)
- sys.stderr.write(f.read())
- raise
- untar_outdir = os.path.join(tmp_dir, os.path.basename(outdir))
- if os.path.exists(outdir):
- diff = filecmp.dircmp(untar_outdir, outdir)
- if not (diff.left_only + diff.right_only + diff.diff_files +
- diff.common_funny + diff.funny_files):
- # outdir already existed with exactly the same content.
- return False
- shutil.rmtree(outdir)
- # The untar files are different, or there was no previous outdir.
- print 'Updating', outdir
- shutil.move(untar_outdir, outdir)
+ untared = _open_archive(tarfile, tmpdir)
+ files = [f for f in untared if os.path.isfile(os.path.join(tmpdir, f))]
+ dirs = [d for d in untared if os.path.isdir(os.path.join(tmpdir, d))]
+ assert len(files) + len(dirs) == len(untared), 'Only files and directories'
+ if _files_same(tmpdir, outdir, files) and _dirs_same(tmpdir, outdir, dirs):
+ # Nothing new or different in the tarfile.
+ return False
+ # Some or all of the files / directories are new.
+ _move_files(tmpdir, outdir, files)
+ _move_dirs(tmpdir, outdir, dirs)
return True
finally:
- if os.path.isdir(tmp_dir):
- shutil.rmtree(tmp_dir)
+ if os.path.isdir(tmpdir):
+ shutil.rmtree(tmpdir)
diff --git a/update.py b/update.py
index d224c74b2..c0d14411c 100755
--- a/update.py
+++ b/update.py
@@ -25,7 +25,6 @@ import scripts.support
BASE_DIR = os.path.abspath('test')
REVISION_PATH = os.path.join(BASE_DIR, 'revision')
TORTURE_TAR = 'wasm-torture-s-%s.tbz2'
-TORTURE_DIR = os.path.join(BASE_DIR, 'torture-s')
def write_revision(revision):
@@ -43,7 +42,7 @@ def run(force_latest, override_hash):
revision = (override_hash if override_hash else
scripts.storage.download_revision(force_latest=force_latest))
downloaded = scripts.storage.download_tar(TORTURE_TAR, BASE_DIR, revision)
- updates += scripts.support.untar(downloaded, TORTURE_DIR)
+ updates += scripts.support.untar(downloaded, BASE_DIR)
if updates:
# Only update revision if the files it downloaded are different.
print 'Updating revision to', revision