"""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""" from IPython.frontend.html.notebook import DEFAULT_STATIC_FILES_PATH return [ pjoin(DEFAULT_STATIC_FILES_PATH, 'components') ] def is_repo(d): """is d a git repo?""" return os.path.exists(pjoin(d, '.git')) def is_package(): """Is a package manager responsible for the static files path?""" from IPython.utils.path import get_ipython_package_dir from IPython.frontend.html.notebook import DEFAULT_STATIC_FILES_PATH return not DEFAULT_STATIC_FILES_PATH.startswith(get_ipython_package_dir()) 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"): # frozen via py2exe or similar, don't bother return 'clean' if is_package(): # package manager is responsible for static files, don't bother return 'clean' if not root: root = ipython_parent() submodules = ipython_submodules(root) for submodule in submodules: if not os.path.exists(submodule): return 'missing' if not is_repo(root): # not in git, assume clean return 'clean' # check with git submodule status proc = subprocess.Popen('git submodule status', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, cwd=root, ) status, _ = proc.communicate() status = status.decode("ascii") for line in status.splitlines(): if status.startswith('-'): return 'missing' elif status.startswith('+'): return 'unclean' return 'clean' def update_submodules(repo_dir): """update submodules in a repo""" subprocess.check_call("git submodule init", cwd=repo_dir, shell=True) subprocess.check_call("git submodule update --recursive", cwd=repo_dir, shell=True)