111 lines
3.6 KiB
Python
111 lines
3.6 KiB
Python
import os
|
|
import platform
|
|
import requests
|
|
import tarfile
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
|
|
def get_platform_specific_filename():
|
|
system = platform.system()
|
|
machine = platform.machine()
|
|
|
|
if system == "Darwin":
|
|
if machine == "arm64":
|
|
return "apple-codesign-*-aarch64-apple-darwin.tar.gz"
|
|
else:
|
|
return "apple-codesign-*-x86_64-apple-darwin.tar.gz"
|
|
elif system == "Linux":
|
|
if machine == "aarch64":
|
|
return "apple-codesign-*-aarch64-unknown-linux-musl.tar.gz"
|
|
else:
|
|
return "apple-codesign-*-x86_64-unknown-linux-musl.tar.gz"
|
|
elif system == "Windows":
|
|
if machine.endswith("64"):
|
|
return "apple-codesign-*-x86_64-pc-windows-msvc.zip"
|
|
else:
|
|
return "apple-codesign-*-i686-pc-windows-msvc.zip"
|
|
else:
|
|
raise Exception(f"Unsupported platform: {system} {machine}")
|
|
|
|
|
|
def download_and_unpack():
|
|
dest_dir = Path("./apple-codesign")
|
|
|
|
repo_url = "https://api.github.com/repos/indygreg/apple-platform-rs/releases/latest"
|
|
dest_dir.mkdir(exist_ok=True)
|
|
|
|
# Fetch the latest release info from GitHub
|
|
print("Fetching latest release information...")
|
|
response = requests.get(repo_url)
|
|
response.raise_for_status()
|
|
release_data = response.json()
|
|
|
|
# Ensure release data has assets
|
|
if "assets" not in release_data:
|
|
raise Exception("Release data does not contain assets.")
|
|
|
|
# Determine the correct asset
|
|
platform_filename = get_platform_specific_filename()
|
|
asset = next((asset for asset in release_data["assets"] if asset["name"].startswith("apple-codesign-") and asset["name"].endswith(platform_filename.split("*")[-1])), None)
|
|
|
|
if not asset:
|
|
raise Exception(f"No matching asset found for platform: {platform_filename}")
|
|
|
|
# Download the archive
|
|
print(f"Downloading {asset['name']}...")
|
|
download_url = asset["browser_download_url"]
|
|
archive_path = dest_dir / asset["name"]
|
|
|
|
with requests.get(download_url, stream=True) as r:
|
|
r.raise_for_status()
|
|
with open(archive_path, "wb") as f:
|
|
for chunk in r.iter_content(chunk_size=8192):
|
|
f.write(chunk)
|
|
|
|
print(f"Downloaded to {archive_path}")
|
|
|
|
# Extract the archive
|
|
print("Extracting archive...")
|
|
temp_extract_dir = dest_dir / "temp_extract"
|
|
temp_extract_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
if archive_path.suffix == ".zip":
|
|
with zipfile.ZipFile(archive_path, "r") as zip_ref:
|
|
zip_ref.extractall(temp_extract_dir)
|
|
elif archive_path.suffixes[-2:] == [".tar", ".gz"]:
|
|
with tarfile.open(archive_path, "r:gz") as tar_ref:
|
|
tar_ref.extractall(temp_extract_dir)
|
|
else:
|
|
raise Exception(f"Unknown archive format: {archive_path}")
|
|
|
|
# Move contents of the root directory inside the archive to dest_dir
|
|
root_dir = next(temp_extract_dir.iterdir()) # Assuming only one root directory
|
|
for item in root_dir.iterdir():
|
|
target_path = dest_dir / item.name
|
|
if target_path.exists():
|
|
if target_path.is_dir():
|
|
os.rmdir(target_path)
|
|
else:
|
|
os.remove(target_path)
|
|
item.rename(target_path)
|
|
|
|
# Clean up temporary directories
|
|
for item in temp_extract_dir.iterdir():
|
|
if item.is_dir():
|
|
os.rmdir(item)
|
|
temp_extract_dir.rmdir()
|
|
|
|
print(f"Extracted to {dest_dir}")
|
|
|
|
# Clean up the archive
|
|
os.remove(archive_path)
|
|
print(f"Removed archive {archive_path}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
download_and_unpack()
|
|
except Exception as e:
|
|
print(f"Error: {e}")
|