##// END OF EJS Templates
use `git status` to check if it's a repo...
MinRK -
Show More
@@ -1,96 +1,105 b''
1 """utilities for checking submodule status"""
1 """utilities for checking submodule status"""
2
2
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (C) 2013 The IPython Development Team
4 # Copyright (C) 2013 The IPython Development Team
5 #
5 #
6 # Distributed under the terms of the BSD License. The full license is in
6 # Distributed under the terms of the BSD License. The full license is in
7 # the file COPYING, distributed as part of this software.
7 # the file COPYING, distributed as part of this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 import os
14 import os
15 import subprocess
15 import subprocess
16 import sys
16 import sys
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Globals
19 # Globals
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21
21
22 pjoin = os.path.join
22 pjoin = os.path.join
23
23
24 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
25 # Code
25 # Code
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27
27
28 def ipython_parent():
28 def ipython_parent():
29 """return IPython's parent (i.e. root if run from git)"""
29 """return IPython's parent (i.e. root if run from git)"""
30 from IPython.utils.path import get_ipython_package_dir
30 from IPython.utils.path import get_ipython_package_dir
31 return os.path.abspath(os.path.dirname(get_ipython_package_dir()))
31 return os.path.abspath(os.path.dirname(get_ipython_package_dir()))
32
32
33 def ipython_submodules(root):
33 def ipython_submodules(root):
34 """return IPython submodules relative to root"""
34 """return IPython submodules relative to root"""
35 return [
35 return [
36 pjoin(root, 'IPython', 'html', 'static', 'components'),
36 pjoin(root, 'IPython', 'html', 'static', 'components'),
37 ]
37 ]
38
38
39 def is_repo(d):
39 def is_repo(d):
40 """is d a git repo?"""
40 """is d a git repo?"""
41 return os.path.exists(pjoin(d, '.git'))
41 if not os.path.exists(pjoin(d, '.git')):
42 return False
43 proc = subprocess.Popen('git status',
44 stdout=subprocess.PIPE,
45 stderr=subprocess.PIPE,
46 shell=True,
47 cwd=d,
48 )
49 status, _ = proc.communicate()
50 return status == 0
42
51
43 def check_submodule_status(root=None):
52 def check_submodule_status(root=None):
44 """check submodule status
53 """check submodule status
45
54
46 Has three return values:
55 Has three return values:
47
56
48 'missing' - submodules are absent
57 'missing' - submodules are absent
49 'unclean' - submodules have unstaged changes
58 'unclean' - submodules have unstaged changes
50 'clean' - all submodules are up to date
59 'clean' - all submodules are up to date
51 """
60 """
52
61
53 if hasattr(sys, "frozen"):
62 if hasattr(sys, "frozen"):
54 # frozen via py2exe or similar, don't bother
63 # frozen via py2exe or similar, don't bother
55 return 'clean'
64 return 'clean'
56
65
57 if not root:
66 if not root:
58 root = ipython_parent()
67 root = ipython_parent()
59
68
60 if not is_repo(root):
69 if not is_repo(root):
61 # not in git, assume clean
70 # not in git, assume clean
62 return 'clean'
71 return 'clean'
63
72
64 submodules = ipython_submodules(root)
73 submodules = ipython_submodules(root)
65
74
66 for submodule in submodules:
75 for submodule in submodules:
67 if not os.path.exists(submodule):
76 if not os.path.exists(submodule):
68 return 'missing'
77 return 'missing'
69
78
70 # Popen can't handle unicode cwd on Windows Python 2
79 # Popen can't handle unicode cwd on Windows Python 2
71 if sys.platform == 'win32' and sys.version_info[0] < 3 \
80 if sys.platform == 'win32' and sys.version_info[0] < 3 \
72 and not isinstance(root, bytes):
81 and not isinstance(root, bytes):
73 root = root.encode(sys.getfilesystemencoding() or 'ascii')
82 root = root.encode(sys.getfilesystemencoding() or 'ascii')
74 # check with git submodule status
83 # check with git submodule status
75 proc = subprocess.Popen('git submodule status',
84 proc = subprocess.Popen('git submodule status',
76 stdout=subprocess.PIPE,
85 stdout=subprocess.PIPE,
77 stderr=subprocess.PIPE,
86 stderr=subprocess.PIPE,
78 shell=True,
87 shell=True,
79 cwd=root,
88 cwd=root,
80 )
89 )
81 status, _ = proc.communicate()
90 status, _ = proc.communicate()
82 status = status.decode("ascii", "replace")
91 status = status.decode("ascii", "replace")
83
92
84 for line in status.splitlines():
93 for line in status.splitlines():
85 if line.startswith('-'):
94 if line.startswith('-'):
86 return 'missing'
95 return 'missing'
87 elif line.startswith('+'):
96 elif line.startswith('+'):
88 return 'unclean'
97 return 'unclean'
89
98
90 return 'clean'
99 return 'clean'
91
100
92 def update_submodules(repo_dir):
101 def update_submodules(repo_dir):
93 """update submodules in a repo"""
102 """update submodules in a repo"""
94 subprocess.check_call("git submodule init", cwd=repo_dir, shell=True)
103 subprocess.check_call("git submodule init", cwd=repo_dir, shell=True)
95 subprocess.check_call("git submodule update --recursive", cwd=repo_dir, shell=True)
104 subprocess.check_call("git submodule update --recursive", cwd=repo_dir, shell=True)
96
105
General Comments 0
You need to be logged in to leave comments. Login now