forked from dials/dials
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlibtbx_refresh.py
116 lines (103 loc) · 4.36 KB
/
libtbx_refresh.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from __future__ import absolute_import, division, print_function
try:
from glob import glob
import libtbx.load_env
import os
dials_path = libtbx.env.dist_path('dials')
filenames = glob(os.path.join(dials_path, "extensions", "*.pyc"))
if filenames:
print("Cleaning up 'dials/extensions':")
for filename in filenames:
print(" Deleting %s" % filename)
os.remove(filename)
except Exception:
pass
try:
from dials.framework import env
env.cache.wipe()
except Exception:
pass
try:
from dials.util.version import dials_version
print(dials_version())
except Exception:
pass
try:
import libtbx.pkg_utils
libtbx.pkg_utils.require('mock', '>=2.0')
libtbx.pkg_utils.require('pytest', '>=3.1')
except ImportError:
print("\n" * 10 + "Could not verify dependencies: cctbx sources out of date" + "\n" * 10)
def _install_dials_autocompletion():
'''generate bash.sh and SConscript file in /build/dials/autocomplete'''
import libtbx.load_env
import os
# Find the dials source directory
dist_path = libtbx.env.dist_path('dials')
# Set the location of the output directory
output_directory = libtbx.env.under_build(os.path.join('dials', 'autocomplete'))
try:
os.makedirs(output_directory)
except OSError:
pass
commands_dir = os.path.join(dist_path, 'command_line')
command_list = []
print('Identifying autocompletable commands:', end=' ')
for file in sorted(os.listdir(commands_dir)):
if not file.startswith('_') and file.endswith('.py'):
if 'DIALS_ENABLE_COMMAND_LINE_COMPLETION' in open(os.path.join(commands_dir, file)).read():
command_name = 'dials.%s' % file[:-3]
print(command_name, end=' ')
command_list.append(command_name)
print()
# Generate the autocompletion SConscript.
with open(os.path.join(output_directory, 'SConscript'), 'w') as builder:
builder.write('''Import("env")
import os.path
import libtbx.load_env
def dispatcher_outer(name):
return os.path.join(libtbx.env.under_build('bin'), name)
def dispatcher_inner(name):
return os.path.join(libtbx.env.dist_path('dials'), 'command_line', '%%s.py' %% name.partition('.')[2])
env.Append( BUILDERS={'AutoComplete': Builder(action='-$SOURCE --export-autocomplete-hints > $TARGET')} )
for cmd in [%s]:
ac = env.AutoComplete(cmd, [dispatcher_outer(cmd), dispatcher_inner(cmd)])
Requires(ac, Dir(libtbx.env.under_build('lib')))
Depends(ac, os.path.join(libtbx.env.dist_path('dials'), 'util', 'options.py'))
Depends(ac, os.path.join(libtbx.env.dist_path('dials'), 'util', 'autocomplete.sh'))
''' % ', '.join(["'%s'" % cmd for cmd in command_list]))
# Generate a bash script activating command line completion for each relevant command
with open(os.path.join(output_directory, 'bash.sh'), 'w') as script:
script.write("type compopt &>/dev/null && {\n")
for cmd in command_list:
script.write(" complete -F _dials_autocomplete %s\n" % cmd)
script.write("}\n")
script.write("type compopt &>/dev/null || {\n")
for cmd in command_list:
script.write(" complete -o nospace -F _dials_autocomplete %s\n" % cmd)
script.write("}\n")
# Find the dials build directory
build_path = abs(libtbx.env.build_path)
# Permanently install the autocompletion script into setpaths-scripts.
print("Installing autocompletion script into:", end=' ')
for file in os.listdir(build_path):
if file.startswith('setpath') and file.endswith('.sh'):
original_file = open(os.path.join(build_path, file)).read()
if not 'DIALS_ENABLE_COMMAND_LINE_COMPLETION' in original_file:
marker = "\nexport PATH\n"
original_position = original_file.find(marker)
if original_position >= 0:
print(file, end=' ')
insert_position = original_position + len(marker)
added_script = \
'# DIALS_ENABLE_COMMAND_LINE_COMPLETION\n' \
'[ -n "$BASH_VERSION" ] && {\n' \
' source $(libtbx.find_in_repositories dials/util/autocomplete.sh) && source %s || echo dials command line completion not available\n' \
'}\n' % (
os.path.join('$LIBTBX_BUILD', 'dials', 'autocomplete', 'bash.sh'))
with open(os.path.join(build_path, file), 'w') as script:
script.write(original_file[:insert_position] +
added_script +
original_file[insert_position:])
print()
_install_dials_autocompletion()