diff options
author | Justin Mayer <entroP@gmail.com> | 2020-04-15 14:55:41 +0200 |
---|---|---|
committer | Justin Mayer <entroP@gmail.com> | 2020-04-15 15:19:41 +0200 |
commit | 9d10abaed4c3fd208dee98ed431ab6ddfbb0d6fa (patch) | |
tree | b218044927f47b76664a0eba1d936aa698ec9a88 | |
parent | 7e52b61934b0fd2fa830125bfb1fedbddf08f11d (diff) | |
download | pelican-9d10abaed4c3fd208dee98ed431ab6ddfbb0d6fa.tar.gz |
Fix output directory deletion logicfix-delete-output-logic
The intention was to prevent accidental source content data loss by
skipping output directory deletion if the output directory is a parent
of the source content directory. But the previous implementation did so
by checking path *strings*, resulting in scenarios where the following
settings would erroneously skip deletion of the output directory:
PATH = "/repo/docs-src/content"
OUTPUT_PATH = "/repo/docs"
The output directory should have been deleted but wasn't because the
PATH string contains "/repo/docs". This change eschews string comparison
and instead compares actual paths to ensure that the output path is not
a parent of the source content directory.
-rw-r--r-- | pelican/__init__.py | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/pelican/__init__.py b/pelican/__init__.py index 97135a62..e19644e0 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -99,10 +99,11 @@ class Pelican(object): ) for cls in self.get_generator_classes() ] - # erase the directory if it is not the source and if that's - # explicitly asked - if (self.delete_outputdir and not - os.path.realpath(self.path).startswith(self.output_path)): + # Delete the output directory if (1) the appropriate setting is True + # and (2) that directory is not the parent of the source directory + if (self.delete_outputdir + and os.path.commonpath([self.output_path]) != + os.path.commonpath([self.output_path, self.path])): clean_output_dir(self.output_path, self.output_retention) for p in generators: |