Skip to content

Commit 8dfe0c9

Browse files
author
Yorick
committed
create xdebug debugger plugin
1 parent 6b8ba6b commit 8dfe0c9

2 files changed

Lines changed: 94 additions & 15 deletions

File tree

.led/plugins/php.plugin.sh

Lines changed: 90 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,26 @@ _php_plugin_desc()
55
}
66

77
# get env key from a service starting with "php" or "apache"
8-
# _php_get_service_env_key "ENV_VARIABLE"
9-
_php_get_service_env_key()
8+
# _php_get_service_key "ENV_VARIABLE"
9+
_php_get_service_key()
1010
{
11-
local env_var=$1
11+
local service_key=$1
12+
local service_value=$2
1213

13-
local service_keys service_key
14+
local services service
1415
local dc_key
1516

16-
service_keys=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get ".services | keys" | cut -c3-)
17-
for service_key in ${service_keys}
17+
services=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get ".services | keys" | cut -c3-)
18+
for service in ${services}
1819
do
1920
# if a service start with "php" or "apache", stop and get his env key
20-
if [[ "${service_key}" == php* ]] || [[ "${service_key}" == apache* ]]; then
21-
dc_key=".services.${service_key}.environment.${env_var}"
21+
if [[ "${service}" == php* ]] || [[ "${service}" == apache* ]]; then
22+
dc_key=".services.${service}.${service_key}"
23+
24+
if [ ! -z "${service_value}" ]; then
25+
dc_key="${dc_key}.${service_value}"
26+
fi
27+
2228
break
2329
fi
2430
done
@@ -114,7 +120,7 @@ php_xdebug()
114120
exit 1
115121
fi
116122

117-
if ! dc_key=$(_php_get_service_env_key "PHP_XDEBUG"); then
123+
if ! dc_xdebug_key=$(_php_get_service_key "environment" "PHP_XDEBUG"); then
118124
exit 1
119125
fi
120126

@@ -123,33 +129,102 @@ php_xdebug()
123129
enable) xdebug_value=1;;
124130
disable) xdebug_value=0;;
125131
switch)
126-
xdebug_value=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get "${dc_key}")
132+
xdebug_value=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get "${dc_xdebug_key}")
127133
[ "${xdebug_value}" == "null" ] && xdebug_value=0
128134
# value can be 1 or 0, so substract to reverse
129135
xdebug_value=$((1 - xdebug_value))
130136
;;
131137
esac
132138

133-
139+
local dc_xdebug_value=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get "${dc_xdebug_key}")
134140
if [ ${xdebug_value} -eq 0 ]; then
135-
${VENDORS_BIN_JYPARSER} "${dc_file}" del "${dc_key}" > "${dc_file_tmp}" \
141+
_check_xdebug_state ${dc_xdebug_value} ${xdebug_value}
142+
143+
${VENDORS_BIN_JYPARSER} "${dc_file}" del "${dc_xdebug_key}" > "${dc_file_tmp}" \
136144
&& mv "${dc_file_tmp}" "${dc_file}"
145+
_disable_debugger
137146
ret=$?
138147
message="XDebug disabled"
139148
else
140-
${VENDORS_BIN_JYPARSER} "${dc_file}" set "${dc_key}" 1 > "${dc_file_tmp}" \
149+
_check_xdebug_state ${dc_xdebug_value} ${xdebug_value}
150+
151+
${VENDORS_BIN_JYPARSER} "${dc_file}" set "${dc_xdebug_key}" 1 > "${dc_file_tmp}" \
141152
&& mv "${dc_file_tmp}" "${dc_file}"
153+
_enable_debugger
142154
ret=$?
143155
message="XDebug enabled"
144156
fi
145157

146158
# refresh container
147159
if [ $ret -eq 0 ]; then
148160
echo "${message}"
149-
$0 up
161+
# $0 up
150162
fi
163+
}
151164

165+
_enable_debugger()
166+
{
167+
local phpstorm_ip
168+
local plugin_dir="$(_plugin_files_dir "php")"
169+
local origin_xdebug_config_file="${plugin_dir}/90-xdebug-config.ini"
170+
local dc_volumes_key=$(_php_get_service_key "volumes")
171+
local dc_ide_config_key=$(_php_get_service_key "environment" "PHP_IDE_CONFIG")
172+
local dc_volumes_length
173+
local dc_xdebug_env_value
174+
175+
if [[ -f "${origin_xdebug_config_file}" ]]; then
176+
target_xdebug_config=".led/90-xdebug-config.ini"
177+
178+
#get the ip of docker network
179+
phpstorm_ip=$(docker network inspect bridge | jq -r '.[].IPAM.Config[].Gateway')
180+
#put it into xdebug config file
181+
sed "s/DOCKER_IP/${phpstorm_ip}/" "${origin_xdebug_config_file}" > "${target_xdebug_config}"
182+
dc_xdebug_env_value="${target_xdebug_config}:/etc/php.d/90-xdebug-config.ini"
183+
184+
dc_volumes_length=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get "${dc_volumes_key} | length")
185+
#edit docker-compose file
186+
${VENDORS_BIN_JYPARSER} "${dc_file}" set "${dc_volumes_key}[${dc_volumes_length}]" \"${dc_xdebug_env_value}\" > "${dc_file_tmp}" \
187+
&& mv "${dc_file_tmp}" "${dc_file}"
188+
${VENDORS_BIN_JYPARSER} "${dc_file}" set "${dc_ide_config_key}" \"serverName=localhost\" > "${dc_file_tmp}" \
189+
&& mv "${dc_file_tmp}" "${dc_file}"
190+
fi
191+
}
152192

193+
_disable_debugger()
194+
{
195+
local dc_volumes_key=$(_php_get_service_key "volumes")
196+
local dc_ide_config_key=$(_php_get_service_key "environment" "PHP_IDE_CONFIG")
197+
local dc_volumes_length
198+
target_xdebug_config=".led/90-xdebug-config.ini"
199+
dc_volumes_length=$(${VENDORS_BIN_JYPARSER} "${dc_file}" get "${dc_volumes_key} | length")
200+
201+
#edit docker-compose file
202+
${VENDORS_BIN_JYPARSER} "${dc_file}" del "${dc_volumes_key}[${dc_volumes_length} - 1]" > "${dc_file_tmp}" \
203+
&& mv "${dc_file_tmp}" "${dc_file}"
204+
${VENDORS_BIN_JYPARSER} "${dc_file}" del "${dc_ide_config_key}" > "${dc_file_tmp}" \
205+
&& mv "${dc_file_tmp}" "${dc_file}"
206+
207+
if [[ -e "${target_xdebug_config}" ]]; then
208+
rm "${target_xdebug_config}"
209+
fi
210+
}
211+
212+
# Checks the state of xDebug in led, in order to avoid that some
213+
# manipulations are performed several times in a row
214+
_check_xdebug_state()
215+
{
216+
local dc_xdebug_value=$1
217+
local xdebug_arg_value=$2
218+
219+
if [[ "${dc_xdebug_value}" -eq 0 && "${xdebug_arg_value}" -eq 0 ]]; then
220+
echo "Xdebug is already disabled"
221+
exit 1;
222+
fi
223+
224+
if [[ "${dc_xdebug_value}" -eq 1 && "${xdebug_arg_value}" -eq 1 ]]; then
225+
echo "Xdebug is already enabled"
226+
exit 1;
227+
fi
153228
}
154229

155230
# memory
@@ -182,7 +257,7 @@ php_memory()
182257
exit 1
183258
fi
184259

185-
if ! dc_key=$(_php_get_service_env_key "PHP_MEMORY_LIMIT"); then
260+
if ! dc_key=$(_php_get_service_key "environment" "PHP_MEMORY_LIMIT"); then
186261
exit 1
187262
fi
188263

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
xdebug.client_port = 9000
2+
xdebug.mode = debug
3+
xdebug.client_host = DOCKER_IP
4+
xdebug.start_with_request = yes

0 commit comments

Comments
 (0)