forked from dials/dials
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlibtbx_refresh.py
156 lines (139 loc) · 6.48 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
from __future__ import absolute_import, division, print_function
import dials.precommitbx.nagger
import libtbx.pkg_utils
libtbx.pkg_utils.define_entry_points(
{
"dxtbx.profile_model": [
"gaussian_rs = dials.extensions.gaussian_rs_profile_model_ext:GaussianRSProfileModelExt"
],
"dxtbx.scaling_model_ext": [
"physical = dials.algorithms.scaling.model.model:PhysicalScalingModel",
"KB = dials.algorithms.scaling.model.model:KBScalingModel",
"array = dials.algorithms.scaling.model.model:ArrayScalingModel",
],
"dials.index.basis_vector_search": [
"fft1d = dials.algorithms.indexing.basis_vector_search:FFT1D",
"fft3d = dials.algorithms.indexing.basis_vector_search:FFT3D",
"real_space_grid_search = dials.algorithms.indexing.basis_vector_search:RealSpaceGridSearch",
],
"dials.index.lattice_search": [
"low_res_spot_match = dials.algorithms.indexing.lattice_search:LowResSpotMatch"
],
"dials.integration.background": [
"Auto = dials.extensions.auto_background_ext:AutoBackgroundExt",
"glm = dials.extensions.glm_background_ext:GLMBackgroundExt",
"gmodel = dials.extensions.gmodel_background_ext:GModelBackgroundExt",
"simple = dials.extensions.simple_background_ext:SimpleBackgroundExt",
"null = dials.extensions.null_background_ext:NullBackgroundExt",
"median = dials.extensions.median_background_ext:MedianBackgroundExt",
],
"dials.integration.centroid": [
"simple = dials.extensions.simple_centroid_ext:SimpleCentroidExt"
],
"dials.spotfinder.threshold": [
"dispersion = dials.extensions.dispersion_spotfinder_threshold_ext:DispersionSpotFinderThresholdExt",
"dispersion_extended = dials.extensions.dispersion_extended_spotfinder_threshold_ext:DispersionExtendedSpotFinderThresholdExt",
],
}
)
try:
from dials.util.version import dials_version
print(dials_version())
except Exception:
pass
dials.precommitbx.nagger.nag()
def _install_dials_autocompletion():
"""generate bash.sh and SConscript file in /build/dials/autocomplete"""
import libtbx.load_env
import os # required due to cctbx weirdness
# 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
# Build a list of autocompleteable commands
commands_dir = os.path.join(dist_path, "command_line")
command_list = []
for filename in sorted(os.listdir(commands_dir)):
if not filename.startswith("_") and filename.endswith(".py"):
# Check if this file marks itself as completable
with open(os.path.join(commands_dir, filename), "rb") as f:
if b"DIALS_ENABLE_COMMAND_LINE_COMPLETION" in f.read():
command_name = "dials.%s" % filename[:-3]
command_list.append(command_name)
print("Identified autocompletable commands: " + " ".join(command_list))
# Generate the autocompletion SConscript.
with open(os.path.join(output_directory, "SConscript"), "w") as builder:
builder.write(
"""import os.path
import libtbx.load_env\n
Import("env")\n\n
def dispatcher_outer(name):
return os.path.join(libtbx.env.under_build("bin"), name)\n\n
def dispatcher_inner(name):
return os.path.join(
libtbx.env.dist_path("dials"), "command_line", "%s.py" % name.partition(".")[2]
)\n\n
env.Append(
BUILDERS={{
"AutoComplete": Builder(action="-$SOURCE --export-autocomplete-hints > $TARGET")
}}
)
env["ENV"]["DIALS_NOBANNER"] = "1"
for cmd in [
{}
]:
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"))
""".format(
"\n".join([' "{}",'.format(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 filename in os.listdir(build_path):
if filename.startswith("setpath") and filename.endswith(".sh"):
with open(os.path.join(build_path, filename)) as f:
original_file = f.read()
if "DIALS_ENABLE_COMMAND_LINE_COMPLETION" not in original_file:
marker = "\nexport PATH\n"
original_position = original_file.find(marker)
if original_position >= 0:
print(filename, 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, filename), "w") as script:
script.write(
original_file[:insert_position]
+ added_script
+ original_file[insert_position:]
)
print()
_install_dials_autocompletion()