diff --git a/blag/blag.py b/blag/blag.py index c770489..4633e56 100644 --- a/blag/blag.py +++ b/blag/blag.py @@ -218,6 +218,7 @@ def build(args: argparse.Namespace) -> None: """ os.makedirs(f"{args.output_dir}", exist_ok=True) convertibles = [] + known_targets = [] for root, dirnames, filenames in os.walk(args.input_dir): for filename in filenames: rel_src = os.path.relpath( @@ -229,15 +230,22 @@ def build(args: argparse.Namespace) -> None: rel_dst = rel_src rel_dst = rel_dst[:-3] + ".html" convertibles.append((rel_src, rel_dst)) + known_targets.append( + os.path.abspath(f"{args.output_dir}/{rel_dst}") + ) else: shutil.copy( f"{args.input_dir}/{rel_src}", f"{args.output_dir}/{rel_src}", ) + known_targets.append( + os.path.abspath(f"{args.output_dir}/{rel_src}") + ) for dirname in dirnames: # all directories are copied into the output directory path = os.path.relpath(f"{root}/{dirname}", start=args.input_dir) os.makedirs(f"{args.output_dir}/{path}", exist_ok=True) + known_targets.append(os.path.abspath(f"{args.output_dir}/{path}")) # copy static files over logger.info("Copying static files.") @@ -273,6 +281,24 @@ def build(args: argparse.Namespace) -> None: article_template, ) + # clean up files that should not be there + for root, dirnames, filenames in os.walk(args.output_dir): + for filename in filenames: + dst = os.path.abspath(f"{root}/{filename}") + if dst not in known_targets: + logger.info(f"deleting {dst}") + os.remove(dst) + else: + known_targets.remove(dst) + for dirname in dirnames: + dst = os.path.abspath(f"{root}/{dirname}") + if dst not in known_targets: + logger.info(f"deleting {dst}") + shutil.rmtree(dst) + else: + known_targets.remove(dst) + logger.debug(known_targets) + generate_feed( articles, args.output_dir, diff --git a/tests/test_blag.py b/tests/test_blag.py index 155e483..cd4bf71 100644 --- a/tests/test_blag.py +++ b/tests/test_blag.py @@ -312,6 +312,22 @@ def test_build(args: Namespace) -> None: assert os.path.exists(f"{args.output_dir}/tags/bar.html") +def test_remove_extra_files(args): + """Test that extra files are removed.""" + # create a file and directory in output dir that have no corresponding + # source + file_path = f'{args.output_dir}/a' + dir_path = f'{args.output_dir}/b' + fh = open(file_path, 'w') + fh.close() + os.mkdir(dir_path) + + blag.build(args) + + assert not os.path.exists(file_path) + assert not os.path.exists(dir_path) + + @pytest.mark.parametrize( "template", [