mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-06-19 22:00:00 +10:00
Merge pull request #1002 from dortania/cim-tmp
Work-around createinstallmedia erroring with 12.4+ installers
This commit is contained in:
@@ -123,6 +123,9 @@ class create_binary:
|
|||||||
if file.name in delete_files:
|
if file.name in delete_files:
|
||||||
print(f" - Deleting {file.name}")
|
print(f" - Deleting {file.name}")
|
||||||
file.unlink()
|
file.unlink()
|
||||||
|
elif (Path(file) / Path("Contents/Resources/createinstallmedia")).exists():
|
||||||
|
print(f" - Deleting {file}")
|
||||||
|
subprocess.run(["rm", "-rf", file])
|
||||||
|
|
||||||
def download_resources(self):
|
def download_resources(self):
|
||||||
patcher_support_pkg_version = constants.Constants().patcher_support_pkg_version
|
patcher_support_pkg_version = constants.Constants().patcher_support_pkg_version
|
||||||
|
|||||||
+22
-3
@@ -31,6 +31,7 @@ class wx_python_gui:
|
|||||||
self.finished_cim_process = False
|
self.finished_cim_process = False
|
||||||
self.target_disk = ""
|
self.target_disk = ""
|
||||||
self.pulse_forward = False
|
self.pulse_forward = False
|
||||||
|
self.prepare_result = False
|
||||||
self.non_metal_required = self.use_non_metal_alternative()
|
self.non_metal_required = self.use_non_metal_alternative()
|
||||||
self.hyperlink_colour = (25, 179, 231)
|
self.hyperlink_colour = (25, 179, 231)
|
||||||
|
|
||||||
@@ -1832,9 +1833,8 @@ class wx_python_gui:
|
|||||||
20
|
20
|
||||||
)
|
)
|
||||||
self.progress_bar.Centre(wx.HORIZONTAL)
|
self.progress_bar.Centre(wx.HORIZONTAL)
|
||||||
self.progress_bar.SetValue(0)
|
|
||||||
|
|
||||||
self.progress_label = wx.StaticText(self.frame, label="Bytes Written: 0")
|
self.progress_label = wx.StaticText(self.frame, label="Preparing files, beginning shortly...")
|
||||||
self.progress_label.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
|
self.progress_label.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
|
||||||
self.progress_label.SetPosition(
|
self.progress_label.SetPosition(
|
||||||
wx.Point(
|
wx.Point(
|
||||||
@@ -1863,7 +1863,18 @@ class wx_python_gui:
|
|||||||
print("- Creating installer.sh script")
|
print("- Creating installer.sh script")
|
||||||
print(f"- Disk: {disk}")
|
print(f"- Disk: {disk}")
|
||||||
print(f"- Installer: {installer_path}")
|
print(f"- Installer: {installer_path}")
|
||||||
if installer.generate_installer_creation_script(self.constants.installer_sh_path, installer_path, disk):
|
|
||||||
|
self.prepare_script_thread = threading.Thread(target=self.prepare_script, args=(installer_path,disk))
|
||||||
|
self.prepare_script_thread.start()
|
||||||
|
self.progress_bar.Pulse()
|
||||||
|
|
||||||
|
while self.prepare_script_thread.is_alive():
|
||||||
|
self.pulse_alternative(self.progress_bar)
|
||||||
|
wx.GetApp().Yield()
|
||||||
|
|
||||||
|
if self.prepare_result is True:
|
||||||
|
self.progress_label.SetLabel("Bytes Written: 0")
|
||||||
|
self.progress_label.Centre(wx.HORIZONTAL)
|
||||||
print("- Sucessfully generated creation script")
|
print("- Sucessfully generated creation script")
|
||||||
print("- Starting creation script as admin")
|
print("- Starting creation script as admin")
|
||||||
wx.GetApp().Yield()
|
wx.GetApp().Yield()
|
||||||
@@ -1875,6 +1886,7 @@ class wx_python_gui:
|
|||||||
self.download_thread = threading.Thread(target=self.download_and_unzip_pkg)
|
self.download_thread = threading.Thread(target=self.download_and_unzip_pkg)
|
||||||
self.download_thread.start()
|
self.download_thread.start()
|
||||||
default_output = float(utilities.monitor_disk_output(disk))
|
default_output = float(utilities.monitor_disk_output(disk))
|
||||||
|
self.progress_bar.SetValue(0)
|
||||||
while True:
|
while True:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
output = float(utilities.monitor_disk_output(disk))
|
output = float(utilities.monitor_disk_output(disk))
|
||||||
@@ -1918,8 +1930,15 @@ class wx_python_gui:
|
|||||||
self.build_install_menu()
|
self.build_install_menu()
|
||||||
else:
|
else:
|
||||||
print("- Failed to create installer script")
|
print("- Failed to create installer script")
|
||||||
|
self.progress_label.SetLabel("Failed to copy files to tmp directory")
|
||||||
|
self.progress_label.Centre(wx.HORIZONTAL)
|
||||||
|
popup_message = wx.MessageDialog(self.frame, "Failed to prepare the base files for installer creation.\n\nPlease ensure you have 20GB~ free on-disk before starting to ensure the installer has enough room to work.", "Error", wx.OK)
|
||||||
|
popup_message.ShowModal()
|
||||||
self.return_to_main_menu.Enable()
|
self.return_to_main_menu.Enable()
|
||||||
|
|
||||||
|
def prepare_script(self, installer_path, disk):
|
||||||
|
self.prepare_result = installer.generate_installer_creation_script(self.constants.payload_path, installer_path, disk)
|
||||||
|
|
||||||
def start_script(self):
|
def start_script(self):
|
||||||
utilities.disable_sleep_while_running()
|
utilities.disable_sleep_while_running()
|
||||||
args = [self.constants.oclp_helper_path, "/bin/sh", self.constants.installer_sh_path]
|
args = [self.constants.oclp_helper_path, "/bin/sh", self.constants.installer_sh_path]
|
||||||
|
|||||||
+27
-1
@@ -3,6 +3,7 @@ from pathlib import Path
|
|||||||
import plistlib
|
import plistlib
|
||||||
import subprocess
|
import subprocess
|
||||||
import requests
|
import requests
|
||||||
|
import tempfile
|
||||||
from resources import utilities, tui_helpers
|
from resources import utilities, tui_helpers
|
||||||
|
|
||||||
def list_local_macOS_installers():
|
def list_local_macOS_installers():
|
||||||
@@ -331,8 +332,10 @@ def list_disk_to_format():
|
|||||||
})
|
})
|
||||||
return list_disks
|
return list_disks
|
||||||
|
|
||||||
|
# Create global tmp directory
|
||||||
|
tmp_dir = tempfile.TemporaryDirectory()
|
||||||
|
|
||||||
def generate_installer_creation_script(script_location, installer_path, disk):
|
def generate_installer_creation_script(tmp_location, installer_path, disk):
|
||||||
# Creates installer.sh to be piped to OCLP-Helper and run as admin
|
# Creates installer.sh to be piped to OCLP-Helper and run as admin
|
||||||
# Goals:
|
# Goals:
|
||||||
# - Format provided disk as HFS+ GPT
|
# - Format provided disk as HFS+ GPT
|
||||||
@@ -341,6 +344,29 @@ def generate_installer_creation_script(script_location, installer_path, disk):
|
|||||||
# OCLP-Helper once to avoid nagging the user about permissions
|
# OCLP-Helper once to avoid nagging the user about permissions
|
||||||
|
|
||||||
additional_args = ""
|
additional_args = ""
|
||||||
|
script_location = Path(tmp_location) / Path("Installer.sh")
|
||||||
|
|
||||||
|
# Due to a bug in createinstallmedia, running from '/Applications' may sometimes error:
|
||||||
|
# 'Failed to extract AssetData/boot/Firmware/Manifests/InstallerBoot/*'
|
||||||
|
# This affects native Macs as well even when manually invoking createinstallmedia
|
||||||
|
|
||||||
|
# To resolve, we'll copy into our temp directory and run from there
|
||||||
|
|
||||||
|
# Create a new tmp directory
|
||||||
|
# Our current one is a disk image, thus CoW will not work
|
||||||
|
global tmp_dir
|
||||||
|
ia_tmp = tmp_dir.name
|
||||||
|
|
||||||
|
print(f"Creating temporary directory at {ia_tmp}")
|
||||||
|
# Delete all files in tmp_dir
|
||||||
|
for file in Path(ia_tmp).glob("*"):
|
||||||
|
subprocess.run(["rm", "-rf", str(file)])
|
||||||
|
|
||||||
|
# Copy installer to tmp (use CoW to avoid extra disk writes)
|
||||||
|
subprocess.run(["cp", "-cR", installer_path, ia_tmp])
|
||||||
|
|
||||||
|
# Adjust installer_path to point to the copied installer
|
||||||
|
installer_path = Path(ia_tmp) / Path(Path(installer_path).name)
|
||||||
|
|
||||||
createinstallmedia_path = str(Path(installer_path) / Path("Contents/Resources/createinstallmedia"))
|
createinstallmedia_path = str(Path(installer_path) / Path("Contents/Resources/createinstallmedia"))
|
||||||
plist_path = str(Path(installer_path) / Path("Contents/Info.plist"))
|
plist_path = str(Path(installer_path) / Path("Contents/Info.plist"))
|
||||||
|
|||||||
Reference in New Issue
Block a user