proton: Better handle broken symlinks

This commit is contained in:
Andrew Eikum 2022-02-09 11:11:11 -06:00
parent bc57d557cf
commit 63b32e09f6

11
proton
View file

@ -69,6 +69,9 @@ def file_is_wine_builtin_dll(path):
def makedirs(path): def makedirs(path):
try: try:
#replace broken symlinks with a new directory
if os.path.islink(path) and not file_exists(path, follow_symlinks=True):
os.remove(path)
os.makedirs(path) os.makedirs(path)
except OSError: except OSError:
#already exists #already exists
@ -229,7 +232,7 @@ class CompatData:
dirs = [] dirs = []
for f in tracked_files: for f in tracked_files:
path = self.prefix_dir + f.strip() path = self.prefix_dir + f.strip()
if file_exists(path, follow_symlinks=True): if file_exists(path, follow_symlinks=False):
if os.path.isfile(path) or os.path.islink(path): if os.path.isfile(path) or os.path.islink(path):
os.remove(path) os.remove(path)
else: else:
@ -342,7 +345,7 @@ class CompatData:
rel_dir = rel_dir + "/" rel_dir = rel_dir + "/"
dst_dir = src_dir.replace(g_proton.default_pfx_dir, self.prefix_dir, 1) dst_dir = src_dir.replace(g_proton.default_pfx_dir, self.prefix_dir, 1)
if not file_exists(dst_dir, follow_symlinks=True): if not file_exists(dst_dir, follow_symlinks=True):
os.makedirs(dst_dir) makedirs(dst_dir)
tracked_files.write(rel_dir + "\n") tracked_files.write(rel_dir + "\n")
for dir_ in dirs: for dir_ in dirs:
src_file = os.path.join(src_dir, dir_) src_file = os.path.join(src_dir, dir_)
@ -369,7 +372,7 @@ class CompatData:
rel_dir = rel_dir + "/" rel_dir = rel_dir + "/"
dst_dir = src_dir.replace(g_proton.default_pfx_dir, self.prefix_dir, 1) dst_dir = src_dir.replace(g_proton.default_pfx_dir, self.prefix_dir, 1)
if not file_exists(dst_dir, follow_symlinks=True): if not file_exists(dst_dir, follow_symlinks=True):
os.makedirs(dst_dir) makedirs(dst_dir)
tracked_files.write(rel_dir + "\n") tracked_files.write(rel_dir + "\n")
for file_ in files: for file_ in files:
src_file = os.path.join(src_dir, file_) src_file = os.path.join(src_dir, file_)
@ -771,7 +774,7 @@ class Session:
basedir = self.env.get("PROTON_LOG_DIR", os.environ["HOME"]) basedir = self.env.get("PROTON_LOG_DIR", os.environ["HOME"])
makedirs(basedir) makedirs(basedir)
lfile_path = basedir + "/steam-" + os.environ["SteamGameId"] + ".log" lfile_path = basedir + "/steam-" + os.environ["SteamGameId"] + ".log"
if file_exists(lfile_path, follow_symlinks=True): if file_exists(lfile_path, follow_symlinks=False):
os.remove(lfile_path) os.remove(lfile_path)
self.log_file = open(lfile_path, "w+") self.log_file = open(lfile_path, "w+")
self.log_file.write("======================\n") self.log_file.write("======================\n")