Source code for regolith.deploy

"""Helps deploy what we have built."""
import os
import time
from xonsh.lib import subprocess
from warnings import warn
from distutils.dir_util import copy_tree

try:
    import hglib
except:
    hglib = None


[docs]def ensure_deploy_dir(rc): """Ensure deployment dir is on rc and physically exists.""" if not hasattr(rc, "deploydir") or rc.deploydir is None: rc.deploydir = os.path.join(rc.builddir, "deploy") if not os.path.isdir(rc.deploydir): os.makedirs(rc.deploydir, exist_ok=True)
[docs]def deploy_git(rc, name, url, src="html", dst=None): """Loads a git database""" targetdir = os.path.join(rc.deploydir, name) # get or update the database if os.path.isdir(targetdir): cmd = ["git", "pull"] cwd = targetdir else: cmd = ["git", "clone", url, targetdir] cwd = None subprocess.check_call(cmd, cwd=cwd) # copy the files over srcdir = os.path.join(rc.builddir, src) dstdir = os.path.join(targetdir, dst) if dst else targetdir copy_tree(srcdir, dstdir, verbose=1) # commit everything cmd = ["git", "add", "."] subprocess.check_call(cmd, cwd=targetdir) # commit cmd = [ "git", "commit", "-m", "regolith auto-deploy at {0}".format(time.time()), ] try: subprocess.check_call(cmd, cwd=targetdir) except subprocess.CalledProcessError: warn("Could not git commit to " + targetdir, RuntimeWarning) # don't return, just in case... # deploy! cmd = ["git", "push"] try: subprocess.check_call(cmd, cwd=targetdir) except subprocess.CalledProcessError: warn("Could not git push from " + targetdir, RuntimeWarning) return
[docs]def deploy_hg(rc, name, url, src="html", dst=None): """Loads an hg database""" if hglib is None: raise ImportError("hglib") targetdir = os.path.join(rc.deploydir, name) # get or update the database if os.path.isdir(targetdir): client = hglib.open(targetdir) client.pull(update=True) else: # Strip off hg+ hglib.clone(url[3:], targetdir) client = hglib.open(targetdir) # copy the files over srcdir = os.path.join(rc.builddir, src) dstdir = os.path.join(targetdir, dst) if dst else targetdir copy_tree(srcdir, dstdir, verbose=1) # commit everything client.commit( message="regolith auto-deploy at {0}".format(time.time()), addremove=True, ) client.push()
[docs]def deploy(rc, name, url, src="html", dst=None): """Deploys a target""" ensure_deploy_dir(rc) if url.startswith("git") or url.endswith(".git"): deploy_git(rc, name, url, src=src, dst=dst) elif url.startswith("hg+"): deploy_hg(rc, name, url, src=src, dst=dst) else: raise ValueError( "Do not know how to deploy to this kind of URL: " + url )