submodule.py
96 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
MinRK
|
r10555 | """utilities for checking submodule status""" | ||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2013 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import os | ||||
import subprocess | ||||
import sys | ||||
#----------------------------------------------------------------------------- | ||||
# Globals | ||||
#----------------------------------------------------------------------------- | ||||
pjoin = os.path.join | ||||
#----------------------------------------------------------------------------- | ||||
# Code | ||||
#----------------------------------------------------------------------------- | ||||
def ipython_parent(): | ||||
"""return IPython's parent (i.e. root if run from git)""" | ||||
from IPython.utils.path import get_ipython_package_dir | ||||
return os.path.abspath(os.path.dirname(get_ipython_package_dir())) | ||||
def ipython_submodules(root): | ||||
"""return IPython submodules relative to root""" | ||||
return [ | ||||
MinRK
|
r11035 | pjoin(root, 'IPython', 'html', 'static', 'components'), | ||
MinRK
|
r10555 | ] | ||
def is_repo(d): | ||||
"""is d a git repo?""" | ||||
return os.path.exists(pjoin(d, '.git')) | ||||
def check_submodule_status(root=None): | ||||
"""check submodule status | ||||
Has three return values: | ||||
'missing' - submodules are absent | ||||
'unclean' - submodules have unstaged changes | ||||
'clean' - all submodules are up to date | ||||
""" | ||||
if hasattr(sys, "frozen"): | ||||
MinRK
|
r10683 | # frozen via py2exe or similar, don't bother | ||
return 'clean' | ||||
MinRK
|
r10555 | |||
if not root: | ||||
root = ipython_parent() | ||||
Thomas Kluyver
|
r10815 | |||
if not is_repo(root): | ||||
# not in git, assume clean | ||||
return 'clean' | ||||
MinRK
|
r10555 | |||
submodules = ipython_submodules(root) | ||||
for submodule in submodules: | ||||
if not os.path.exists(submodule): | ||||
return 'missing' | ||||
Thomas Kluyver
|
r14916 | |||
# Popen can't handle unicode cwd on Windows Python 2 | ||||
if sys.platform == 'win32' and sys.version_info[0] < 3 \ | ||||
and not isinstance(root, bytes): | ||||
root = root.encode(sys.getfilesystemencoding() or 'ascii') | ||||
MinRK
|
r10555 | # check with git submodule status | ||
proc = subprocess.Popen('git submodule status', | ||||
stdout=subprocess.PIPE, | ||||
stderr=subprocess.PIPE, | ||||
shell=True, | ||||
cwd=root, | ||||
) | ||||
status, _ = proc.communicate() | ||||
Thomas Kluyver
|
r14916 | status = status.decode("ascii", "replace") | ||
MinRK
|
r10555 | |||
for line in status.splitlines(): | ||||
Thomas Kluyver
|
r14916 | if line.startswith('-'): | ||
MinRK
|
r10555 | return 'missing' | ||
Thomas Kluyver
|
r14916 | elif line.startswith('+'): | ||
MinRK
|
r10555 | return 'unclean' | ||
return 'clean' | ||||
def update_submodules(repo_dir): | ||||
"""update submodules in a repo""" | ||||
MinRK
|
r10583 | subprocess.check_call("git submodule init", cwd=repo_dir, shell=True) | ||
subprocess.check_call("git submodule update --recursive", cwd=repo_dir, shell=True) | ||||
MinRK
|
r10555 | |||