From a422270666b350058927b3de8f81a75d39ffd677 Mon Sep 17 00:00:00 2001 From: Nicolas F Date: Fri, 12 Jul 2019 23:37:35 +0200 Subject: [PATCH] Add force_writable argument to mirror_dir Fixes #1611. --- overviewer_core/assetmanager.py | 6 +++--- overviewer_core/files.py | 10 ++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/overviewer_core/assetmanager.py b/overviewer_core/assetmanager.py index f909029..b8465a9 100644 --- a/overviewer_core/assetmanager.py +++ b/overviewer_core/assetmanager.py @@ -165,14 +165,14 @@ top-level directory. "overviewer_core", "data", "web_assets") if not os.path.isdir(global_assets): global_assets = os.path.join(util.get_program_path(), "web_assets") - mirror_dir(global_assets, self.outputdir, capabilities=self.fs_caps) + mirror_dir(global_assets, self.outputdir, capabilities=self.fs_caps, force_writable=True) if self.custom_assets_dir: # We could have done something fancy here rather than just # overwriting the global files, but apparently this what we used to # do pre-rewrite. - mirror_dir(self.custom_assets_dir, self.outputdir, - capabilities=self.fs_caps) + mirror_dir(self.custom_assets_dir, self.outputdir, capabilities=self.fs_caps, + force_writable=True) # write a dummy baseMarkers.js if none exists basemarkers_path = os.path.join(self.outputdir, "baseMarkers.js") diff --git a/overviewer_core/files.py b/overviewer_core/files.py index 0d372c6..938b8aa 100644 --- a/overviewer_core/files.py +++ b/overviewer_core/files.py @@ -62,7 +62,7 @@ def does_rename_work(dir_to_test): return renameworks ## useful recursive copy, that ignores common OS cruft -def mirror_dir(src, dst, entities=None, capabilities=default_caps): +def mirror_dir(src, dst, entities=None, capabilities=default_caps, force_writable=False): '''copies all of the entities from src to dst''' chmod_works = capabilities.get("chmod_works") if not os.path.exists(dst): @@ -80,11 +80,14 @@ def mirror_dir(src, dst, entities=None, capabilities=default_caps): continue if os.path.isdir(os.path.join(src,entry)): - mirror_dir(os.path.join(src, entry), os.path.join(dst, entry), capabilities=capabilities) + mirror_dir(os.path.join(src, entry), os.path.join(dst, entry), capabilities=capabilities, force_writable=force_writable) elif os.path.isfile(os.path.join(src,entry)): try: if chmod_works: shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) + if force_writable: # for shitty neckbeard ware + dst_stat = os.stat(os.path.join(dst, entry)) + os.chmod(os.path.join(dst, entry), dst_stat.st_mode | stat.S_IWUSR) else: shutil.copyfile(os.path.join(src, entry), os.path.join(dst, entry)) except IOError as outer: @@ -99,6 +102,9 @@ def mirror_dir(src, dst, entities=None, capabilities=default_caps): # try again; if this stills throws an error, let it propagate up if chmod_works: shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) + if force_writable: + dst_stat = os.stat(os.path.join(dst, entry)) + os.chmod(os.path.join(dst, entry), dst_stat.st_mode | stat.S_IWUSR) else: shutil.copyfile(os.path.join(src, entry), os.path.join(dst, entry))