Factor out submodule presence checking.
[bbaumbach/samba-autobuild/.git] / buildtools / wafsamba / samba_git.py
1 import os
2 import subprocess
3
4 def find_git(env=None):
5     """Find the git binary."""
6     if env is not None and 'GIT' in env:
7         return env['GIT']
8
9     # Get version from GIT
10     if os.path.exists("/usr/bin/git"):
11         # this is useful when doing make dist without configuring
12         return "/usr/bin/git"
13
14     return None
15
16
17 def has_submodules(path):
18     """Check whether a source directory is git-versioned and has submodules.
19
20     :param path: Path to Samba source directory
21     """
22     return (os.path.isdir(os.path.join(path, ".git")) and
23             os.path.isfile(os.path.join(path, ".gitmodules")))
24
25
26 def read_submodule_status(path, env=None):
27     """Check status of submodules.
28
29     :param path: Path to git directory
30     :param env: Optional waf environment
31     :return: Yields tuples with submodule relpath and status
32         (one of: 'out-of-date', 'not-checked-out', 'up-to-date')
33     :raise RuntimeError: raised when parsing of 'git submodule status' output
34         fails.
35     """
36     if not has_submodules(path):
37         # No point in running git.
38         return
39     git = find_git(env)
40     if git is None:
41         return
42     p = subprocess.Popen([git, "submodule", "status"], stdout=subprocess.PIPE,
43         cwd=path)
44     (stdout, stderr) = p.communicate(None)
45     for l in stdout.splitlines():
46         l = l.rstrip()
47         status = l[0]
48         l = l[1:]
49         parts = l.split(" ")
50         if len(parts) > 2 and status in ("-", "+"):
51             yield (parts[1], "out-of-date")
52         elif len(parts) == 2 and status == "-":
53             yield (parts[1], "not-checked-out")
54         elif len(parts) > 2 and status == " ":
55             yield (parts[1], "up-to-date")
56         else:
57             raise RuntimeError("Unable to parse submodule status: %r, %r" % (status, parts))