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