Modify build.py to make the patch-application process resistant to CRLF nonsense

This commit is contained in:
2025-06-23 15:20:44 -04:00
parent bc04fc9f20
commit d625584573

View File

@@ -7,8 +7,6 @@
# script are in README.md # script are in README.md
# #
#
import sys, os, json, shutil, subprocess, re, time, tarfile import sys, os, json, shutil, subprocess, re, time, tarfile
import itertools, hashlib, zipfile, fnmatch import itertools, hashlib, zipfile, fnmatch
@@ -88,6 +86,40 @@ def expand_json_file(sourcefile, outputfile, config):
expanded = expand_json(data, vars(config)) expanded = expand_json(data, vars(config))
Path(outputfile).write_text(json.dumps(expanded, indent=4)) Path(outputfile).write_text(json.dumps(expanded, indent=4))
#
# Applying patches to files with DOS line endings.
#
# We want to apply a patch to the UnrealEngine source, and some but not all
# of the files we want to patch have DOS line endings. Unfortunately, the
# unix patch utility can't handle a codebase with mixed line endings.
# To make it work, we convert all files to UNIX line endings, apply the
# patch, and then convert the appropriate files back.
#
def patched_files(patchfn):
patch_lines = Path(patchfn).read_text().splitlines()
return [line[6:].strip() for line in patch_lines if line.startswith('--- a/')]
def dos2unix(fn):
before = Path(fn).read_text()
after = before.replace("\r\n", "\n")
if before != after:
Path(fn).write_text(after)
return True
return False
def unix2dos(fn):
before = Path(fn).read_text()
after = before.replace("\n", "\r\n")
if before != after:
Path(fn).write_text(after)
return True
return False
#
# Given a patch file, generate a list of the files being modified.
#
# #
# Determining the build configuration. # Determining the build configuration.
# #
@@ -159,7 +191,6 @@ def unzip_unreal_engine_and_apply_patch():
""" """
Unzip the unreal engine source, then apply a patch. Unzip the unreal engine source, then apply a patch.
""" """
# Find out the unreal version that we're using
if not Path(UNREALENGINE).is_dir(): if not Path(UNREALENGINE).is_dir():
zipfn = f"{INTEGRATION}/UnrealEngine.zip"; zipfn = f"{INTEGRATION}/UnrealEngine.zip";
with zipfile.ZipFile(zipfn, 'r') as z: with zipfile.ZipFile(zipfn, 'r') as z:
@@ -170,9 +201,14 @@ def unzip_unreal_engine_and_apply_patch():
shutil.rmtree(UNREALENGINE, ignore_errors=True) shutil.rmtree(UNREALENGINE, ignore_errors=True)
shutil.rmtree(unrealversion, ignore_errors=True) shutil.rmtree(unrealversion, ignore_errors=True)
shell(INTEGRATION, "unzip UnrealEngine.zip") shell(INTEGRATION, "unzip UnrealEngine.zip")
patchfile = f"{INTEGRATION}/EnginePatches/EnginePatch"
dos2unix(patchfile)
rel_files = patched_files(patchfile)
abs_files = [ os.path.join(unrealversion, file) for file in rel_files ]
dos_files = [ file for file in abs_files if dos2unix(file)]
shell(unrealversion, f"patch -p1 < {patchfile}")
for file in dos_files: unix2dos(file)
Path(unrealversion).rename(UNREALENGINE) Path(unrealversion).rename(UNREALENGINE)
shell(UNREALENGINE, f"patch -p1 < {INTEGRATION}/EnginePatches/EnginePatch")
def generate_buildconfiguration_xml(): def generate_buildconfiguration_xml():
""" """