blob: 4a43dd03142a9b84be4add998b5fead0164a6221 [file] [log] [blame]
#!/usr/bin/python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import contextlib
import os
import shutil
import tempfile
import logging
@contextlib.contextmanager
def TempDeploymentDir(paths, use_symlinks=True, cleanup=True, reuse_path=None):
"""Sets up and tears down a directory for deploying an app."""
if use_symlinks:
link_func = _Symlink
else:
link_func = _Copy
try:
deployment_dir = None
if reuse_path is not None:
deployment_dir = reuse_path
# Ensure the directory exists
try:
os.makedirs(reuse_path)
except OSError:
pass
logging.info('Reusing path: %s', reuse_path)
else:
deployment_dir = tempfile.mkdtemp(prefix='deploy-')
logging.info('Created path: %s', deployment_dir)
_PopulateDeploymentDir(deployment_dir, paths, link_func)
yield deployment_dir
finally:
if cleanup and reuse_path is not None:
logging.info('Cleaning up: %s', deployment_dir)
shutil.rmtree(deployment_dir)
def _Symlink(src, dst):
if os.path.exists(dst):
# Update the symlink.
os.unlink(dst)
os.symlink(src, dst)
else:
os.symlink(src, dst)
def _Copy(src, dst):
if os.path.isdir(src):
shutil.copytree(src, dst)
else:
shutil.copy2(src, dst)
def _PopulateDeploymentDir(deployment_dir, paths, link_func):
"""Fills the deployment directory using the link_func specified."""
for path in paths:
destination = os.path.join(deployment_dir, os.path.basename(path))
logging.info('Populating: %s', destination)
link_func(path, destination)