From 19c0511f571aa19d0448d36817c81657a782c050 Mon Sep 17 00:00:00 2001 From: Matt Clay Date: Mon, 8 Oct 2018 12:47:39 -0700 Subject: [PATCH] Add link check to `make sdist`. This will cause `make sdist` to fail on platforms which create hard links of symbolic links as regular files, such as MacOS (Darwin). This prevents accidental creation of an sdist tarball without the necessary symbolic links. --- Makefile | 6 ++- packaging/sdist/check-link-behavior.py | 51 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100755 packaging/sdist/check-link-behavior.py diff --git a/Makefile b/Makefile index a7d21b3a600..c5b01199322 100644 --- a/Makefile +++ b/Makefile @@ -231,8 +231,12 @@ install_manpages: gzip -9 $(wildcard ./docs/man/man1/ansible*.1) cp $(wildcard ./docs/man/man1/ansible*.1.gz) $(PREFIX)/man/man1/ +.PHONY: sdist_check +sdist_check: + $(PYTHON) packaging/sdist/check-link-behavior.py + .PHONY: sdist -sdist: clean docs +sdist: sdist_check clean docs $(PYTHON) setup.py sdist .PHONY: sdist_upload diff --git a/packaging/sdist/check-link-behavior.py b/packaging/sdist/check-link-behavior.py new file mode 100755 index 00000000000..34e05023d48 --- /dev/null +++ b/packaging/sdist/check-link-behavior.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +"""Checks for link behavior required for sdist to retain symlinks.""" + +from __future__ import (absolute_import, division, print_function) + +__metaclass__ = type + +import os +import platform +import shutil +import sys +import tempfile + + +def main(): + """Main program entry point.""" + temp_dir = tempfile.mkdtemp() + + target_path = os.path.join(temp_dir, 'file.txt') + symlink_path = os.path.join(temp_dir, 'symlink.txt') + hardlink_path = os.path.join(temp_dir, 'hardlink.txt') + + try: + with open(target_path, 'w'): + pass + + os.symlink(target_path, symlink_path) + os.link(symlink_path, hardlink_path) + + if not os.path.islink(symlink_path): + abort('Symbolic link not created.') + + if not os.path.islink(hardlink_path): + # known issue on MacOS (Darwin) + abort('Hard link of symbolic link created as a regular file.') + finally: + shutil.rmtree(temp_dir) + + +def abort(reason): + """ + :type reason: str + """ + sys.exit('ERROR: %s\n' + 'This will prevent symbolic links from being preserved in the resulting tarball.\n' + 'Aborting creation of sdist on platform: %s' + % (reason, platform.system())) + + +if __name__ == '__main__': + main()