git @ Cat's Eye Technologies klaus / master klaus / ctagsutils.py
master

Tree @master (Download .tar.gz)

ctagsutils.py @masterraw · history · blame

import os
import subprocess
import shutil
import tempfile
import subprocess


def check_have_exuberant_ctags():
    """Check that the 'ctags' binary is *Exuberant* ctags (not etags etc)"""
    try:
        return b"Exuberant" in subprocess.check_output(["ctags", "--version"], stderr=subprocess.PIPE)
    except subprocess.CalledProcessError:
        return False


def create_tagsfile(git_repo_path, git_rev):
    """Create a ctags tagsfile for the given Git repository and revision.

    This creates a temporary clone of the repository, checks out the revision,
    runs 'ctags -R' and deletes the temporary clone.

    :return: path to the generated tagsfile
    """
    assert check_have_exuberant_ctags(), "'ctags' binary is missing or not *Exuberant* ctags"

    _, target_tagsfile = tempfile.mkstemp()
    checkout_tmpdir = tempfile.mkdtemp()
    try:
        subprocess.check_call(["git", "clone", "-q", "--shared", git_repo_path, checkout_tmpdir])
        subprocess.check_call(["git", "checkout", "-q", git_rev], cwd=checkout_tmpdir)
        subprocess.check_call(["ctags", "--fields=+l", "-Rno", target_tagsfile], cwd=checkout_tmpdir)
    finally:
        shutil.rmtree(checkout_tmpdir)
    return target_tagsfile


def delete_tagsfile(tagsfile_path):
    """Delete a tagsfile."""
    os.remove(tagsfile_path)