From 7c15439be4f4dc996dbcada3296e4442a02355bc Mon Sep 17 00:00:00 2001 From: Florian Schulze Date: Sat, 28 May 2022 13:45:12 +0200 Subject: [PATCH] Fix #808: use mkdtemp to prevent permission and locking errors. --- client/devpi/main.py | 21 +++++++++--------- client/devpi/test.py | 50 ++++++++++++++++++++++-------------------- client/devpi/upload.py | 37 ++++++++++++++++--------------- client/news/808.bugfix | 1 + 4 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 client/news/808.bugfix diff --git a/client/devpi/main.py b/client/devpi/main.py index 581a536e8..77fcef070 100644 --- a/client/devpi/main.py +++ b/client/devpi/main.py @@ -7,7 +7,7 @@ import subprocess import textwrap from base64 import b64encode -from contextlib import closing +from contextlib import closing, contextmanager from devpi import hookspecs from devpi_common.types import lazydecorator, cached_property from devpi_common.url import URL @@ -16,6 +16,8 @@ from devpi import __version__ as client_version from pluggy import HookimplMarker from pluggy import PluginManager +from shutil import rmtree +from tempfile import mkdtemp import json subcommand = lazydecorator() @@ -223,17 +225,16 @@ def raw_input(self, msg): except NameError: return input(msg) - def getdir(self, name): - return self._workdir.mkdir(name) + @contextmanager + def workdir(self, prefix='devpi-'): + workdir = py.path.local( + mkdtemp(prefix=prefix)) - @property - def _workdir(self): + self.info("using workdir", workdir) try: - return self.__workdir - except AttributeError: - self.__workdir = py.path.local.make_numbered_dir(prefix="devpi") - self.info("using workdir", self.__workdir) - return self.__workdir + yield workdir + finally: + rmtree(workdir.strpath) @cached_property def current(self): diff --git a/client/devpi/test.py b/client/devpi/test.py index 22a8f6517..abd8bd0af 100644 --- a/client/devpi/test.py +++ b/client/devpi/test.py @@ -234,29 +234,31 @@ def main(hub, args): index = None elif index.count("/") > 1: hub.fatal("index %r not of form URL, USER/NAME or NAME" % index) - tmpdir = py.path.local.make_numbered_dir("devpi-test", keep=3) - devindex = DevIndex(hub, tmpdir, current) - for pkgspec in args.pkgspec: - versioninfo = devindex.get_matching_versioninfo(pkgspec, index) - if not versioninfo: - hub.fatal("could not find/receive links for", pkgspec) - links = versioninfo.get_links("releasefile") - if not links: - hub.fatal("could not find/receive links for", pkgspec) + with hub.workdir(prefix="devpi-test-") as tmpdir: + devindex = DevIndex(hub, tmpdir, current) + for pkgspec in args.pkgspec: + versioninfo = devindex.get_matching_versioninfo(pkgspec, index) + if not versioninfo: + hub.fatal("could not find/receive links for", pkgspec) + links = versioninfo.get_links("releasefile") + if not links: + hub.fatal("could not find/receive links for", pkgspec) - universal_only = args.select is None - sdist_links, wheel_links = find_sdist_and_wheels( - hub, links, universal_only=universal_only) - toxrunargs = prepare_toxrun_args( - devindex, versioninfo, sdist_links, wheel_links, select=args.select) - all_ret = 0 - if args.list: - hub.info("would test:") - for toxargs in toxrunargs: + universal_only = args.select is None + sdist_links, wheel_links = find_sdist_and_wheels( + hub, links, universal_only=universal_only) + toxrunargs = prepare_toxrun_args( + devindex, versioninfo, sdist_links, wheel_links, + select=args.select) + all_ret = 0 if args.list: - hub.info(" ", toxargs[0].href) - continue - ret = devindex.runtox(*toxargs, upload_tox_results=args.upload_tox_results) - if ret != 0: - all_ret = 1 - return all_ret + hub.info("would test:") + for toxargs in toxrunargs: + if args.list: + hub.info(" ", toxargs[0].href) + continue + ret = devindex.runtox( + *toxargs, upload_tox_results=args.upload_tox_results) + if ret != 0: + all_ret = 1 + return all_ret diff --git a/client/devpi/upload.py b/client/devpi/upload.py index 6a126dc57..ee214f7fe 100644 --- a/client/devpi/upload.py +++ b/client/devpi/upload.py @@ -27,24 +27,25 @@ def main(hub, args): setupcfg = read_setupcfg(hub, hub.cwd) checkout = Checkout(hub, args, hub.cwd, hasvcs=setupcfg.get("no-vcs"), setupdir_only=setupcfg.get("setupdir-only")) - uploadbase = hub.getdir("upload") - exported = checkout.export(uploadbase) - - exported.prepare() - archives = [] - if not args.onlydocs: - archives.extend(exported.setup_build( - default_formats=setupcfg.get("formats"))) - if args.onlydocs or args.withdocs: - p = exported.setup_build_docs() - if p: - archives.append(p) - if not archives: - hub.fatal("nothing built!") - uploader = Uploader(hub, args) - if args.index: - uploader.pypisubmit = hub.current.get_index_url(args.index).url - uploader.do_upload_paths(archives) + + with hub.workdir() as uploadbase: + exported = checkout.export(uploadbase) + + exported.prepare() + archives = [] + if not args.onlydocs: + archives.extend(exported.setup_build( + default_formats=setupcfg.get("formats"))) + if args.onlydocs or args.withdocs: + p = exported.setup_build_docs() + if p: + archives.append(p) + if not archives: + hub.fatal("nothing built!") + uploader = Uploader(hub, args) + if args.index: + uploader.pypisubmit = hub.current.get_index_url(args.index).url + uploader.do_upload_paths(archives) def filter_latest(path_pkginfo): diff --git a/client/news/808.bugfix b/client/news/808.bugfix new file mode 100644 index 000000000..b006e9299 --- /dev/null +++ b/client/news/808.bugfix @@ -0,0 +1 @@ +Fix #808: Use mkdtemp from Python tempfile module to prevent permission and locking errors during ``devpi test`` and ``devpi upload``. \ No newline at end of file