summaryrefslogtreecommitdiffstats
path: root/buildtools/wafsamba/samba_git.py
blob: fe540ecccff68e49fc80ba52e21b615d21f7deb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import os
import subprocess

def find_git(env=None):
    """Find the git binary."""
    if env is not None and 'GIT' in env:
        return env.get_flat('GIT')

    # Get version from GIT
    if os.path.exists("/usr/bin/git"):
        # this is useful when doing make dist without configuring
        return "/usr/bin/git"

    return None


def has_submodules(path):
    """Check whether a source directory is git-versioned and has submodules.

    :param path: Path to Samba source directory
    """
    return (os.path.isdir(os.path.join(path, ".git")) and
            os.path.isfile(os.path.join(path, ".gitmodules")))


def read_submodule_status(path, env=None):
    """Check status of submodules.

    :param path: Path to git directory
    :param env: Optional waf environment
    :return: Yields tuples with submodule relpath and status
        (one of: 'out-of-date', 'not-checked-out', 'up-to-date')
    :raise RuntimeError: raised when parsing of 'git submodule status' output
        fails.
    """
    if not has_submodules(path):
        # No point in running git.
        return
    git = find_git(env)
    if git is None:
        return
    p = subprocess.Popen([git, "submodule", "status"], stdout=subprocess.PIPE,
        cwd=path)
    (stdout, stderr) = p.communicate(None)
    for l in stdout.splitlines():
        l = l.decode('utf-8')
        l = l.rstrip()
        status = l[0]
        l = l[1:]
        parts = l.split(" ")
        if len(parts) > 2 and status in ("-", "+"):
            yield (parts[1], "out-of-date")
        elif len(parts) == 2 and status == "-":
            yield (parts[1], "not-checked-out")
        elif len(parts) > 2 and status == " ":
            yield (parts[1], "up-to-date")
        else:
            raise RuntimeError("Unable to parse submodule status: %r, %r" % (status, parts))