#!/usr/bin/python3

import subprocess
import tempfile
import os
from os.path import join, getsize
import argparse

# Set command line arguments
parser = argparse.ArgumentParser(
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument("-b", "--build_dir",
                    dest="BUILD_DIR",
                    default="/home/ed/openbmc-openbmc",
                    help="Build directory path.")

parser.add_argument("-s", "--squashfs_file",
                    dest="SQUASHFS_FILE",
                    default="/build/tmp/deploy/images/wolfpass" +
                    "/intel-platforms-wolfpass.squashfs-xz",
                    help="Squashfs file.")

args = parser.parse_args()

# files below this size wont be attempted
FILE_SIZE_LIMIT = 0

SQUASHFS = args.BUILD_DIR + args.SQUASHFS_FILE

original_size = getsize(SQUASHFS)
print("squashfs size: {}".format(original_size))

results = []

with tempfile.TemporaryDirectory() as tempremovedfile:
    with tempfile.TemporaryDirectory() as tempsquashfsdir:
        print("writing to " + tempsquashfsdir)
        command = ["unsquashfs", "-d",
                   os.path.join(tempsquashfsdir, "squashfs-root"),  SQUASHFS]
        print(" ".join(command))
        subprocess.check_call(command)
        squashfsdir = tempsquashfsdir + "/squashfs-root"

        files_to_test = []
        for root, dirs, files in os.walk(squashfsdir):
            for name in files + dirs:
                filepath = os.path.join(root, name)
                if not os.path.islink(filepath):
                    # ensure files/dirs can be renamed
                    os.chmod(filepath, 0o711)
                    if getsize(filepath) > FILE_SIZE_LIMIT:
                        files_to_test.append(filepath)

        print("{} files to attempt removing".format(len(files_to_test)))

        for filepath in files_to_test:
            name = os.path.basename(filepath)
            newname = os.path.join(tempremovedfile, name)
            os.rename(filepath, newname)
            with tempfile.TemporaryDirectory() as newsquashfsroot:
                subprocess.check_output(
                    ["mksquashfs", tempsquashfsdir,
                     newsquashfsroot + "/test", "-comp", "xz"])

                results.append((filepath.replace(squashfsdir, ""),
                                original_size -
                                getsize(newsquashfsroot + "/test")))

            os.rename(newname, filepath)

            print("{:>6} of {}".format(len(results), len(files_to_test)))

results.sort(key=lambda x: x[1], reverse=True)

with open("results.txt", 'w') as result_file:
    for filepath, size in results:
        result = "{:>10}: {}".format(size, filepath)
        print(result)
        result_file.write(result + "\n")
