Download 7zip automatically if not found

This commit is contained in:
drojf
2024-02-05 20:39:54 +11:00
parent 8c9579ac6c
commit f9057f64ad
2 changed files with 49 additions and 24 deletions

5
.gitignore vendored
View File

@@ -3,4 +3,7 @@
/target /target
**/*.rs.bk **/*.rs.bk
/64bit /64bit
lastModified.json lastModified.json
7za.dll
7za.exe
7zxa.dll

View File

@@ -6,6 +6,7 @@ import pathlib
import shutil import shutil
import argparse import argparse
import json import json
import zipfile
from typing import List from typing import List
from urllib.request import Request, urlopen from urllib.request import Request, urlopen
from warnings import catch_warnings from warnings import catch_warnings
@@ -236,6 +237,43 @@ def get_build_variants(selected_chapter: str) -> List[BuildVariant]:
f"Unknown Chapter {selected_chapter} - please update the build.py script" f"Unknown Chapter {selected_chapter} - please update the build.py script"
) )
def check_7z():
Globals.SEVEN_ZIP_EXECUTABLE = findWorkingExecutablePath(["7za", "7z"], ['-h'])
if Globals.SEVEN_ZIP_EXECUTABLE is None:
seven_zip_filename = '7z_x64_23-06-20.zip'
seven_zip_url = f"https://github.com/07th-mod/ui-editing-scripts/releases/download/v1.0.0/{seven_zip_filename}"
print(">>>> NOTE: Downloading 7zip as can't find 7zip as '7z' or '7za'")
if os.path.exists(seven_zip_filename):
os.remove(seven_zip_filename)
print(f"Downloading and Extracting 7-zip from {seven_zip_url}...")
download(seven_zip_url)
with zipfile.ZipFile(seven_zip_filename, 'r') as zip_ref:
zip_ref.extractall('.')
os.remove(seven_zip_filename)
Globals.SEVEN_ZIP_EXECUTABLE = findWorkingExecutablePath(["7za", "7z"], ['-h'])
if Globals.SEVEN_ZIP_EXECUTABLE is None:
print(">>>> ERROR: Can't find 7zip as '7z' or '7za', even after downloading it!")
print("Try running this script again. If it still fails, report this issue to 07th-mod")
# Check that 7zip is 64-bit
seven_zip_bitness = None
seven_zip_info = subprocess.check_output(Globals.SEVEN_ZIP_EXECUTABLE, text=True)
for line in seven_zip_info.splitlines():
if line.strip().startswith('7-Zip'):
if 'x64' in line:
seven_zip_bitness = 64
elif 'x86' in line:
seven_zip_bitness = 32
break
if seven_zip_bitness == 64:
print("7zip is 64-bit - OK")
else:
print(f">>>> ERROR: Unacceptable 7zip bitness '{seven_zip_bitness}' - need 64 bit.\n\n Please make sure your 7zip is 64-bit, or manually edit this script to use 128mb 7z dictionary size")
exit(-1)
class LastModifiedManager: class LastModifiedManager:
savePath = 'lastModified.json' savePath = 'lastModified.json'
@@ -282,29 +320,6 @@ if sys.version_info < (2, 7):
print(">>>> ERROR: This script does not work on Python 2.7") print(">>>> ERROR: This script does not work on Python 2.7")
exit(-1) exit(-1)
Globals.SEVEN_ZIP_EXECUTABLE = findWorkingExecutablePath(["7za", "7z"], ['-h'])
if Globals.SEVEN_ZIP_EXECUTABLE is None:
print(">>>> ERROR: Can't find 7zip as '7z' or '7za'")
exit(-1)
# Check that 7zip is 64-bit
seven_zip_bitness = None
seven_zip_info = subprocess.check_output(Globals.SEVEN_ZIP_EXECUTABLE, text=True)
for line in seven_zip_info.splitlines():
if line.strip().startswith('7-Zip'):
if 'x64' in line:
seven_zip_bitness = 64
elif 'x86' in line:
seven_zip_bitness = 32
break
if seven_zip_bitness == 64:
print("7zip is 64-bit - OK")
else:
print(f">>>> ERROR: Unacceptable 7zip bitness '{seven_zip_bitness}' - need 64 bit.\n\n Please make sure your 7zip is 64-bit, or manually edit this script to use 128mb 7z dictionary size")
exit(-1)
lastModifiedManager = LastModifiedManager() lastModifiedManager = LastModifiedManager()
# Parse command line arguments # Parse command line arguments
@@ -349,6 +364,13 @@ print(f" - {build_variants_list}")
print(f"-------------------------------") print(f"-------------------------------")
print() print()
# Add the current folder to PATH (temporarily), so that any processes spawned
# by this one can see the 7zip executable (downloaded if 7zip not found)
os.environ['PATH'] += os.getcwd()
# Install 7zip if required
check_7z()
# Install python dependencies # Install python dependencies
print("Installing python dependencies") print("Installing python dependencies")
call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"]) call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])