proton: When copying ignore EPERM error

This commit is contained in:
Dāvis Mosāns 2019-02-01 01:02:36 +02:00 committed by Andrew Eikum
parent 6dfd6e12f6
commit 817828ec72

27
proton
View File

@ -8,6 +8,7 @@ import filecmp
import json import json
import os import os
import shutil import shutil
import errno
import struct import struct
import subprocess import subprocess
import sys import sys
@ -81,7 +82,7 @@ def upgrade_pfx(old_ver):
log("Removing newer prefix") log("Removing newer prefix")
if old_proton_ver == "3.7" and not os.path.exists(os.environ["STEAM_COMPAT_DATA_PATH"] + "/tracked_files"): if old_proton_ver == "3.7" and not os.path.exists(os.environ["STEAM_COMPAT_DATA_PATH"] + "/tracked_files"):
#proton 3.7 did not generate tracked_files, so copy it into place first #proton 3.7 did not generate tracked_files, so copy it into place first
shutil.copy(basedir + "/proton_3.7_tracked_files", os.environ["STEAM_COMPAT_DATA_PATH"] + "/tracked_files") try_copy(basedir + "/proton_3.7_tracked_files", os.environ["STEAM_COMPAT_DATA_PATH"] + "/tracked_files")
remove_tracked_files(os.environ["STEAM_COMPAT_DATA_PATH"]) remove_tracked_files(os.environ["STEAM_COMPAT_DATA_PATH"])
return return
@ -107,11 +108,21 @@ def makedirs(path):
#already exists #already exists
pass pass
def try_copy(src, dst):
try:
shutil.copy(src, dst)
except PermissionError as e:
if e.errno == errno.EPERM:
#be forgiving about permissions errors; if it's a real problem, things will explode later anyway
log('Error while copying to \"' + dst + '\": ' + e.strerror)
else:
raise
def real_copy(src, dst): def real_copy(src, dst):
if os.path.islink(src): if os.path.islink(src):
os.symlink(os.readlink(src), dst) os.symlink(os.readlink(src), dst)
else: else:
shutil.copy(src,dst) try_copy(src, dst)
def mergedirs(src, dst, tracked_files): def mergedirs(src, dst, tracked_files):
for src_dir, dirs, files in os.walk(src): for src_dir, dirs, files in os.walk(src):
@ -156,7 +167,7 @@ with dist_lock:
tar = tarfile.open(basedir + "/proton_dist.tar.gz", mode="r:gz") tar = tarfile.open(basedir + "/proton_dist.tar.gz", mode="r:gz")
tar.extractall(path=basedir + "/dist") tar.extractall(path=basedir + "/dist")
tar.close() tar.close()
shutil.copy(basedir + "/version", basedir + "/dist/") try_copy(basedir + "/version", basedir + "/dist/")
env = dict(os.environ) env = dict(os.environ)
dlloverrides = {} dlloverrides = {}
@ -324,16 +335,16 @@ with prefix_lock:
dstfile = dst + "Steam/" + f dstfile = dst + "Steam/" + f
if os.path.isfile(dstfile): if os.path.isfile(dstfile):
os.remove(dstfile) os.remove(dstfile)
shutil.copy(steamdir + "/legacycompat/" + f, dstfile) try_copy(steamdir + "/legacycompat/" + f, dstfile)
#copy openvr files into place #copy openvr files into place
dst = prefix + "/drive_c/vrclient/bin/" dst = prefix + "/drive_c/vrclient/bin/"
makedirs(dst) makedirs(dst)
shutil.copy(basedir + "/dist/lib/wine/fakedlls/vrclient.dll", dst) try_copy(basedir + "/dist/lib/wine/fakedlls/vrclient.dll", dst)
shutil.copy(basedir + "/dist/lib64/wine/fakedlls/vrclient_x64.dll", dst) try_copy(basedir + "/dist/lib64/wine/fakedlls/vrclient_x64.dll", dst)
shutil.copy(basedir + "/dist/lib/wine/dxvk/openvr_api_dxvk.dll", prefix + "/drive_c/windows/syswow64/") try_copy(basedir + "/dist/lib/wine/dxvk/openvr_api_dxvk.dll", prefix + "/drive_c/windows/syswow64/")
shutil.copy(basedir + "/dist/lib64/wine/dxvk/openvr_api_dxvk.dll", prefix + "/drive_c/windows/system32/") try_copy(basedir + "/dist/lib64/wine/dxvk/openvr_api_dxvk.dll", prefix + "/drive_c/windows/system32/")
#parse linux openvr config and present it in win32 format to the app. #parse linux openvr config and present it in win32 format to the app.
#logic from openvr's CVRPathRegistry_Public::GetPaths #logic from openvr's CVRPathRegistry_Public::GetPaths