summaryrefslogtreecommitdiff
path: root/scripts/support.py
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 /scripts/support.py
parent7dd053aa3cc99e63b3be57514c28ac2b94932e2e (diff)
downloadbinaryen-74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09.tar.gz
binaryen-74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09.tar.bz2
binaryen-74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09.zip
Make the untar API more intuitive
As discussed in #112.
Diffstat (limited to 'scripts/support.py')
-rwxr-xr-xscripts/support.py79
1 files changed, 57 insertions, 22 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)