Source code for fabtools.require.mercurial

"""
Mercurial
=========

This module provides high-level tools for managing `Mercurial`_ repositories.

.. _Mercurial: http://mercurial.selenic.com/

"""

from __future__ import with_statement

from fabric.api import run

from fabtools import mercurial
from fabtools.files import is_dir
from fabtools.system import UnsupportedFamily


[docs]def command(): """ Require the ``hg`` command-line tool. Example:: from fabric.api import run from fabtools import require require.mercurial.command() run('hg --help') """ from fabtools.require.deb import package as require_deb_package from fabtools.require.rpm import package as require_rpm_package from fabtools.require.portage import package as require_portage_package from fabtools.system import distrib_family res = run('hg --version', quiet=True) if res.failed: family = distrib_family() if family == 'debian': require_deb_package('mercurial') elif family == 'gentoo': require_portage_package('mercurial') elif family == 'redhat': require_rpm_package('mercurial') else: raise UnsupportedFamily(supported=['debian', 'redhat', 'gentoo'])
[docs]def working_copy(remote_url, path=None, branch="default", update=True, use_sudo=False, user=None): """ Require a working copy of the repository from the ``remote_url``. The ``path`` is optional, and defaults to the last segment of the remote repository URL. If the ``path`` does not exist, this will clone the remote repository and check out the specified branch. If the ``path`` exists and ``update`` is ``True``, it will pull changes from the remote repository, check out the specified branch, then update the working copy. If the ``path`` exists and ``update`` is ``False``, it will only check out the specified branch, without pulling remote changesets. :param remote_url: URL of the remote repository :type remote_url: str :param path: Absolute or relative path of the working copy on the filesystem. If this directory doesn't exist yet, a new working copy is created through ``hg clone``. If the directory does exist *and* ``update == True``, a ``hg pull && hg up`` is issued. If ``path is None`` the ``hg clone`` is issued in the current working directory and the directory name of the working copy is created by ``hg``. :type path: str :param branch: Branch or tag to check out. If the given value is a tag name, update must be ``False`` or consecutive calls will fail. :type branch: str :param update: Whether or not to pull and update remote changesets. :type update: bool :param use_sudo: If ``True`` execute ``hg`` with :func:`fabric.operations.sudo`, else with :func:`fabric.operations.run`. :type use_sudo: bool :param user: If ``use_sudo is True``, run :func:`fabric.operations.sudo` with the given user. If ``use_sudo is False`` this parameter has no effect. :type user: str """ command() if path is None: path = remote_url.split('/')[-1] if is_dir(path, use_sudo=use_sudo): mercurial.pull(path, use_sudo=use_sudo, user=user) if update: mercurial.update(path=path, branch=branch, use_sudo=use_sudo, user=user) elif not is_dir(path, use_sudo=use_sudo): mercurial.clone(remote_url, path=path, use_sudo=use_sudo, user=user) mercurial.update(path=path, branch=branch, use_sudo=use_sudo, user=user) else: raise ValueError("Invalid combination of parameters.")