Skip to content

Commit

Permalink
Fix #808: use mkdtemp to prevent permission and locking errors.
Browse files Browse the repository at this point in the history
  • Loading branch information
fschulze committed Jun 20, 2022
1 parent 053f8a1 commit 2f7a8d8
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 52 deletions.
21 changes: 11 additions & 10 deletions client/devpi/main.py
Expand Up @@ -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
Expand All @@ -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()

Expand Down Expand Up @@ -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):
Expand Down
50 changes: 26 additions & 24 deletions client/devpi/test.py
Expand Up @@ -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
37 changes: 19 additions & 18 deletions client/devpi/upload.py
Expand Up @@ -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):
Expand Down
1 change: 1 addition & 0 deletions 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``.

0 comments on commit 2f7a8d8

Please sign in to comment.