51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
import os
|
|
from itertools import chain
|
|
|
|
import six
|
|
|
|
from tox.reporter import verbosity1
|
|
|
|
|
|
def create_session_view(package, temp_dir):
|
|
"""once we build a package we cannot return that directly, as a subsequent call
|
|
might delete that package (in order to do its own build); therefore we need to
|
|
return a view of the file that it's not prone to deletion and can be removed when the
|
|
session ends
|
|
"""
|
|
if not package:
|
|
return package
|
|
package_dir = temp_dir.join("package")
|
|
package_dir.ensure(dir=True)
|
|
|
|
# we'll number the active instances, and use the max value as session folder for a new build
|
|
# note we cannot change package names as PEP-491 (wheel binary format)
|
|
# is strict about file name structure
|
|
exists = [i.basename for i in package_dir.listdir()]
|
|
file_id = max(chain((0,), (int(i) for i in exists if six.text_type(i).isnumeric())))
|
|
|
|
session_dir = package_dir.join(str(file_id + 1))
|
|
session_dir.ensure(dir=True)
|
|
session_package = session_dir.join(package.basename)
|
|
|
|
# if we can do hard links do that, otherwise just copy
|
|
links = False
|
|
if hasattr(os, "link"):
|
|
try:
|
|
os.link(str(package), str(session_package))
|
|
links = True
|
|
except (OSError, NotImplementedError):
|
|
pass
|
|
if not links:
|
|
package.copy(session_package)
|
|
operation = "links" if links else "copied"
|
|
common = session_package.common(package)
|
|
verbosity1(
|
|
"package {} {} to {} ({})".format(
|
|
common.bestrelpath(session_package),
|
|
operation,
|
|
common.bestrelpath(package),
|
|
common,
|
|
),
|
|
)
|
|
return session_package
|