diff options
author | JF Bastien <jfb@chromium.org> | 2016-01-16 20:08:36 -0800 |
---|---|---|
committer | JF Bastien <jfb@chromium.org> | 2016-01-16 20:08:36 -0800 |
commit | 74b3798652f65fbbbe94b9aac2cb4f0fb8ccea09 (patch) | |
tree | 25954fa5dbdabcfcf0e79775d00f9282e154f621 /scripts/support.py | |
parent | 7dd053aa3cc99e63b3be57514c28ac2b94932e2e (diff) | |
download | binaryen-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-x | scripts/support.py | 79 |
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) |