logo

live-bootstrap

Mirror of <https://github.com/fosslinux/live-bootstrap>
commit: 7e8db9c508f423a1a4a4877d87b263b7c59cd87b
parent 3896c1dfc9001fcbfaf1e80a27bd0cd43205106a
Author: fosslinux <fosslinux@aussies.space>
Date:   Tue, 24 Dec 2024 10:19:27 +1100

Remove "substitutes"

It wasn't ever really useful.

Diffstat:

M.github/workflows/lint.yml11+----------
Dcheck_substitutes.py162-------------------------------------------------------------------------------
Dsubstitutes3---
3 files changed, 1 insertion(+), 175 deletions(-)

diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: - name: Install pylint run: sudo pip3 install pylint - name: pylint - run: pylint rootfs.py lib/utils.py lib/generator.py lib/target.py check_substitutes.py --disable=duplicate-code + run: pylint rootfs.py lib/utils.py lib/generator.py lib/target.py --disable=duplicate-code shellcheck: name: Lint shell files @@ -42,12 +42,3 @@ jobs: run: sudo pip3 install reuse - name: reuse run: reuse lint - - substitutes: - name: Check validity of substituted tarballs - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - name: Check validity of substitutes - run: ./check_substitutes.py diff --git a/check_substitutes.py b/check_substitutes.py @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -# SPDX-License-Identifier: GPL-3.0-or-later -# -# SPDX-FileCopyrightText: 2024 fosslinux <fosslinux@aussies.space> - -"""Check that substituted files are the same.""" -import bz2 -import filecmp -import gzip -import itertools -import lzma -import shutil -import tarfile -import tempfile -import sys -import os - -from lib.generator import Generator - -# Get a temporary directory to work in -working = tempfile.mkdtemp() - -# Colour constants -# pylint: disable=too-few-public-methods -class Colors(): - """ANSI Color Codes""" - GREY = "\033[90m" - RED = "\033[91m" - GREEN = "\033[92m" - ORANGE = "\033[91m\033[93m" - YELLOW = "\033[93m" - END = "\033[0m" - -def traverse_path(base_root): - """Takes a path and returns a set of all directories and files in that path.""" - all_dirs = set() - all_files = set() - for root, directories, files in os.walk(base_root, topdown=True): - for d in directories: - all_dirs.add(os.path.join(root, d).lstrip(base_root)) - for f in files: - all_files.add(os.path.join(root, f).lstrip(base_root)) - return (all_dirs, all_files) - -class Distfile(): - """Represents one distfile and operations performed on it.""" - def __init__(self, i, url): - self.i = i - self.url = url - self.out_file = f"{i}-{os.path.basename(url)}" - self.filepath = "" - - def download(self): - """Downloads the distfile.""" - Generator.download_file(self.url, working, self.out_file, silent=True) - self.filepath = os.path.join(working, self.out_file) - - def decompress(self): - """Decompresses the distfile.""" - compression = self.out_file.rsplit('.', maxsplit=1)[-1] - decompress_func = { - "gz": gzip.open, - "tgz": gzip.open, - "bz2": bz2.open, - "xz": lzma.open, - "lzma": lzma.open - } - if compression not in decompress_func: - # No decompression needed - return - # Remove the compression extension - new_path = '.'.join(self.filepath.split('.')[:-1]) - # tgz -> .tar - if compression == "tgz": - new_path = f"{new_path}.tar" - # Move the decompressed binary stream to a new file - with decompress_func[compression](self.filepath, 'rb') as fin: - with open(new_path, 'wb') as fout: - shutil.copyfileobj(fin, fout) - self.filepath = new_path - - def extract(self): - """Extracts the distfile.""" - # Sanity check - if not tarfile.is_tarfile(self.filepath): - return - out_dir = os.path.join(working, f"{self.i}") - os.mkdir(out_dir) - with tarfile.open(self.filepath, 'r') as f: - f.extractall(path=out_dir) - self.filepath = out_dir - - # It makes more sense here to label them d1 and d2 rather than have one be self. - # pylint: disable=no-self-argument - def compare(d1, d2): - """Compares the distfile to another distfile.""" - if not os.path.isdir(d1.filepath): - # Compare files - return filecmp.cmp(d1.filepath, d2.filepath, shallow=False) - if not os.path.isdir(d2.filepath): - # Then, d2 is a file and d1 is a directory - return False - # Otherwise it's two directories - dirnames1, filenames1 = traverse_path(d1.filepath) - dirnames2, filenames2 = traverse_path(d2.filepath) - if dirnames1 != dirnames2: - return False - if filenames1 != filenames2: - return False - return filecmp.cmpfiles(d1.filepath, d2.filepath, filenames1, shallow=False) - -def check(*args): - """Check if a list of distfiles are equivalent.""" - notequiv = [] - # Find all pairs that are not equivalent - for pair in itertools.combinations(args, 2): - if pair[0].compare(pair[1]): - print(f"{Colors.GREY}DEBUG: {pair[0].url} is equivalent to {pair[1].url}{Colors.END}") - else: - notequiv.append(pair) - - # Decompress all, and check again - for d in {y for x in notequiv for y in x}: - d.decompress() - for pair in notequiv.copy(): - if pair[0].compare(pair[1]): - # pylint: disable=line-too-long - print(f"{Colors.YELLOW}NOTE: {pair[0].url} is equivalent to {pair[1].url} when decompressed{Colors.END}") - notequiv.remove(pair) - - # Extract all, and check again - for d in {y for x in notequiv for y in x}: - d.extract() - has_error = False - for pair in notequiv: - if pair[0].compare(pair[1]): - # pylint: disable=line-too-long - print(f"{Colors.ORANGE}WARN: {pair[0].url} is equivalent to {pair[1].url} when extracted{Colors.END}") - else: - has_error = True - # pylint: disable=line-too-long - print(f"{Colors.RED}ERROR: {pair[0].url} is not equivalent to {pair[1].url}!{Colors.END}") - - return has_error - -def main(): - """Main function.""" - has_error = False - with open("substitutes", 'r', encoding="utf-8") as f: - for line in f.readlines(): - urls = line.strip().split(' ') - distfiles = [] - for i, url in enumerate(urls): - distfiles.append(Distfile(i, url)) - for distfile in distfiles: - distfile.download() - if check(*distfiles): - has_error = True - sys.exit(has_error) - -if __name__ == "__main__": - main() diff --git a/substitutes b/substitutes @@ -1,3 +0,0 @@ -https://mirrors.kernel.org/gnu/bash/bash-2.05b.tar.gz https://src.fedoraproject.org/repo/pkgs/bash/bash-2.05b.tar.bz2/f3e5428ed52a4f536f571a945d5de95d/bash-2.05b.tar.bz2 -https://mirrors.kernel.org/gnu/bc/bc-1.07.1.tar.gz https://mirrors.kernel.org/slackware/slackware64-15.0/source/ap/bc/bc-1.07.1.tar.xz -https://mirrors.kernel.org/gnu/ed/ed-1.4.tar.gz https://mirrors.kernel.org/slackware/slackware-13.37/source/a/ed/ed-1.4.tar.xz