php
· 5.5 KiB · PHP
Eredeti
#!/bin/bash
# Welcome to amusement park!
[[ "$1" = '--help' ]] || [[ "$1" = '-h' ]] && cat <<EOF && exit
NetBeans docker wrapper for php
===============================
Anthony Axenov (c) 2023, The MIT License
https://axenov.dev
https://opensource.org/license/mit
Replacement host php interpreter with dockerized one to run & debug cli php scripts.
Usage:
./$(basename $0) --container=<NAME> [--map=<PATH1>:<PATH2>] [PHP_ARGS] <SCRIPT> [SCRIPT_ARGS]
Arguments:
--container : docker container where your SCRIPT is located. Required.
--map : sources path mapped from the host to container. Not required.
PATH1 is an absolute path to php sources directory on the host.
PATH2 is an absolute path of the same directory inside of container.
Delimiter ':' is required. If PATH1, PATH2 or delimiter is missed
or value is empty then error will be thrown.
PHP_ARGS : arguments you can pass to real php interpreter according to its --help.
Not required.
SCRIPT : a path to script file (.php) to be executed in container. Required.
Note that this file must exist inside or be available from that container.
SCRIPT_ARGS : arguments to call your script with. They will be passed to script as is.
Not required.
Read this article to know how to set this helper as interpreter for NetBeans:
ru: https://axenov.dev/netbeans-php-docker-xdebug-cli
en: https://axenov.dev/en/netbeans-php-docker-xdebug-cli-en
EOF
pwd=$(pwd) # current working directory
cmdline=($@) # copy currently called command line to array
collect_php_args=1 # should we collect php args or script ones?
quiet=0 # should we print some useful data before executing?
# find a path where this wrapper is located
wrapper_dir="$(dirname $0)"
# find a path where project is probably located
project_dir="$(dirname $wrapper_dir)"
# here we check if this wrapper is global or local
# but if it is set as global from nbproject dir of
# current project then it is not detected as global
# anyway behavior will be correct
nbproject="$(basename $wrapper_dir)"
[ "$nbproject" = 'nbproject' ] && is_global=0 || is_global=1
# prepare new array to collect php args
declare -a php_cmd=("docker" "exec")
# and another one for script args
declare -a script_args=()
# and one more for directory mapping
declare -a map_arr=()
# iterate over arguments we received from netbeans
for arg in "${cmdline[@]}"; do
# if this is a container name
if [ "${arg::11}" = '--container' ]; then
container="${arg:12}" # save it
php_cmd+=("$container" 'php') # add php itself
continue # jump to next iteration
fi
# if this is a path map
if [ "${arg::5}" = '--map' ]; then
map="${arg:6}" # save it
map_arr=(${map//:/ }) # split it and check if it is correct
if [ -z "${map_arr[0]}" ] || [ -z "${map_arr[1]}" ]; then
echo "ERROR: directory map is incorrect!"
echo "Use $0 --help to get info about how to use this wrapper."
echo "Exit code 3."
exit 3
fi
continue # jump to next iteration
fi
# if this is a container name
if [ "${arg::7}" = '--quiet' ]; then
quiet=1
continue # jump to next iteration
fi
# if this is an absolute path to a script file
if [ -f "$arg" ]; then
# make its path correct for container
if [ "$map" ]; then # when paths are mapped
# remove first part of map from an absolute filepath and append result to second map part
filepath="${map_arr[1]}${arg##${map_arr[0]}}"
else # when paths are NOT mapped
# remove project path from absolute filepath
filepath="${arg##$project_dir/}"
fi
php_cmd+=("$filepath") # append php args with filepath
collect_php_args=0 # now we need to collect script args
continue # jump to next iteration
fi
if [ "$collect_php_args" = 1 ]; then # if we collect php args
php_cmd+=("$arg") # add current arg to php args as is
continue # jump to next iteration
fi
script_args+=("$arg") # otherwise add current arg to script args as is
done
# docker container name is required so we must halt here if there is no one
if [ -z "$container" ]; then
echo "ERROR: no docker container is specified!" >&2
echo "Use $0 --help to get info about how to use this wrapper." >&2
echo "Exit code 1." >&2
exit 1
fi
# path to php script is also required so we must halt here too if there is no one
if [ -z "$filepath" ]; then
echo "ERROR: no script filepath is specified!" >&2
echo "Use $0 --help to get info about how to use this wrapper." >&2
echo "Exit code 2." >&2
exit 2
fi
cmdline="${php_cmd[*]} ${script_args[*]}" # make a command to execute
# print some important data collected above
if [ "$quiet" = 0 ]; then
echo "NetBeans docker wrapper for php"
echo "==============================="
echo -e "Container name: $container"
echo -e "Script path: $filepath"
echo -e "Directory mapping: ${map:-(none)}"
echo -e "Command line:\n$cmdline\n"
fi
# some debug output
# echo "=== some debug output ========="
# cat <<EOF | column -t
# is_global $is_global
# container $container
# pwd $pwd
# wrapper_dir $wrapper_dir
# nbproject $nbproject
# project_dir $project_dir
# map $map
# map_arr[0] ${map_arr[0]}
# map_arr[1] ${map_arr[1]}
# filepath $filepath
# EOF
# echo "==============================="
$cmdline # execute
# that's folks!
1 | #!/bin/bash |
2 | |
3 | # Welcome to amusement park! |
4 | |
5 | [[ "$1" = '--help' ]] || [[ "$1" = '-h' ]] && cat <<EOF && exit |
6 | NetBeans docker wrapper for php |
7 | =============================== |
8 | Anthony Axenov (c) 2023, The MIT License |
9 | https://axenov.dev |
10 | https://opensource.org/license/mit |
11 | Replacement host php interpreter with dockerized one to run & debug cli php scripts. |
12 | Usage: |
13 | ./$(basename $0) --container=<NAME> [--map=<PATH1>:<PATH2>] [PHP_ARGS] <SCRIPT> [SCRIPT_ARGS] |
14 | Arguments: |
15 | --container : docker container where your SCRIPT is located. Required. |
16 | --map : sources path mapped from the host to container. Not required. |
17 | PATH1 is an absolute path to php sources directory on the host. |
18 | PATH2 is an absolute path of the same directory inside of container. |
19 | Delimiter ':' is required. If PATH1, PATH2 or delimiter is missed |
20 | or value is empty then error will be thrown. |
21 | PHP_ARGS : arguments you can pass to real php interpreter according to its --help. |
22 | Not required. |
23 | SCRIPT : a path to script file (.php) to be executed in container. Required. |
24 | Note that this file must exist inside or be available from that container. |
25 | SCRIPT_ARGS : arguments to call your script with. They will be passed to script as is. |
26 | Not required. |
27 | Read this article to know how to set this helper as interpreter for NetBeans: |
28 | ru: https://axenov.dev/netbeans-php-docker-xdebug-cli |
29 | en: https://axenov.dev/en/netbeans-php-docker-xdebug-cli-en |
30 | EOF |
31 | |
32 | pwd=$(pwd) # current working directory |
33 | cmdline=($@) # copy currently called command line to array |
34 | collect_php_args=1 # should we collect php args or script ones? |
35 | quiet=0 # should we print some useful data before executing? |
36 | |
37 | # find a path where this wrapper is located |
38 | wrapper_dir="$(dirname $0)" |
39 | |
40 | # find a path where project is probably located |
41 | project_dir="$(dirname $wrapper_dir)" |
42 | |
43 | # here we check if this wrapper is global or local |
44 | # but if it is set as global from nbproject dir of |
45 | # current project then it is not detected as global |
46 | # anyway behavior will be correct |
47 | nbproject="$(basename $wrapper_dir)" |
48 | [ "$nbproject" = 'nbproject' ] && is_global=0 || is_global=1 |
49 | |
50 | # prepare new array to collect php args |
51 | declare -a php_cmd=("docker" "exec") |
52 | |
53 | # and another one for script args |
54 | declare -a script_args=() |
55 | |
56 | # and one more for directory mapping |
57 | declare -a map_arr=() |
58 | |
59 | # iterate over arguments we received from netbeans |
60 | for arg in "${cmdline[@]}"; do |
61 | |
62 | # if this is a container name |
63 | if [ "${arg::11}" = '--container' ]; then |
64 | container="${arg:12}" # save it |
65 | php_cmd+=("$container" 'php') # add php itself |
66 | continue # jump to next iteration |
67 | fi |
68 | |
69 | # if this is a path map |
70 | if [ "${arg::5}" = '--map' ]; then |
71 | map="${arg:6}" # save it |
72 | map_arr=(${map//:/ }) # split it and check if it is correct |
73 | if [ -z "${map_arr[0]}" ] || [ -z "${map_arr[1]}" ]; then |
74 | echo "ERROR: directory map is incorrect!" |
75 | echo "Use $0 --help to get info about how to use this wrapper." |
76 | echo "Exit code 3." |
77 | exit 3 |
78 | fi |
79 | continue # jump to next iteration |
80 | fi |
81 | |
82 | # if this is a container name |
83 | if [ "${arg::7}" = '--quiet' ]; then |
84 | quiet=1 |
85 | continue # jump to next iteration |
86 | fi |
87 | |
88 | # if this is an absolute path to a script file |
89 | if [ -f "$arg" ]; then |
90 | # make its path correct for container |
91 | if [ "$map" ]; then # when paths are mapped |
92 | # remove first part of map from an absolute filepath and append result to second map part |
93 | filepath="${map_arr[1]}${arg##${map_arr[0]}}" |
94 | else # when paths are NOT mapped |
95 | # remove project path from absolute filepath |
96 | filepath="${arg##$project_dir/}" |
97 | fi |
98 | php_cmd+=("$filepath") # append php args with filepath |
99 | collect_php_args=0 # now we need to collect script args |
100 | continue # jump to next iteration |
101 | fi |
102 | |
103 | if [ "$collect_php_args" = 1 ]; then # if we collect php args |
104 | php_cmd+=("$arg") # add current arg to php args as is |
105 | continue # jump to next iteration |
106 | fi |
107 | |
108 | script_args+=("$arg") # otherwise add current arg to script args as is |
109 | done |
110 | |
111 | # docker container name is required so we must halt here if there is no one |
112 | if [ -z "$container" ]; then |
113 | echo "ERROR: no docker container is specified!" >&2 |
114 | echo "Use $0 --help to get info about how to use this wrapper." >&2 |
115 | echo "Exit code 1." >&2 |
116 | exit 1 |
117 | fi |
118 | |
119 | # path to php script is also required so we must halt here too if there is no one |
120 | if [ -z "$filepath" ]; then |
121 | echo "ERROR: no script filepath is specified!" >&2 |
122 | echo "Use $0 --help to get info about how to use this wrapper." >&2 |
123 | echo "Exit code 2." >&2 |
124 | exit 2 |
125 | fi |
126 | |
127 | cmdline="${php_cmd[*]} ${script_args[*]}" # make a command to execute |
128 | |
129 | # print some important data collected above |
130 | if [ "$quiet" = 0 ]; then |
131 | echo "NetBeans docker wrapper for php" |
132 | echo "===============================" |
133 | echo -e "Container name: $container" |
134 | echo -e "Script path: $filepath" |
135 | echo -e "Directory mapping: ${map:-(none)}" |
136 | echo -e "Command line:\n$cmdline\n" |
137 | fi |
138 | |
139 | # some debug output |
140 | # echo "=== some debug output =========" |
141 | # cat <<EOF | column -t |
142 | # is_global $is_global |
143 | # container $container |
144 | # pwd $pwd |
145 | # wrapper_dir $wrapper_dir |
146 | # nbproject $nbproject |
147 | # project_dir $project_dir |
148 | # map $map |
149 | # map_arr[0] ${map_arr[0]} |
150 | # map_arr[1] ${map_arr[1]} |
151 | # filepath $filepath |
152 | # EOF |
153 | # echo "===============================" |
154 | |
155 | $cmdline # execute |
156 | |
157 | # that's folks! |
158 |