mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-27 11:43:37 +08:00
e9f0a8cf2c
Closes #5475
69 lines
2.9 KiB
Fish
69 lines
2.9 KiB
Fish
function __fish_complete_ant_targets -d "Print list of targets from build.xml and imported files"
|
|
function __filter_xml_start_tag -d "Filter xml start-tags in a buildfile"
|
|
set -l buildfile $argv[1] # full path to buildfile
|
|
set -l tag_pattern $argv[2] # regex pattern for tagname
|
|
# regex to filter start-tags ignoring newlines and '>' in attr values
|
|
# https://www.debuggex.com/r/wRgxHE1yTIgnjfNz
|
|
string join ' ' <$buildfile | string match -ar "<(?:$tag_pattern)(?:[^>\"']*?(?:(?:'[^']*?')|(?:\"[^\"]*\"))?)*?>"
|
|
end
|
|
function __filter_xml_attr_value -d "Filter xml attr value in a start-tag"
|
|
set -l tag $argv[1] # start-tag
|
|
set -l attr $argv[2] # attr name
|
|
# regex to filter attr values ignoring (single|double) quotes in attr values
|
|
# https://www.debuggex.com/r/x7lhtLJSP4msleik
|
|
string replace -rf "^.*$attr=((?:'(?:.*?)')|(?:\"(?:.*?)\")).*\$" '$1' $tag | string trim -c='"\''
|
|
end
|
|
function __get_buildfile -d "Get a buildfile that will be used by ant"
|
|
set -l tokens $argv # tokens from 'commandline -co'
|
|
set -l prev $tokens[1]
|
|
set -l buildfile "build.xml"
|
|
for token in $argv[2..-1]
|
|
switch $prev
|
|
case -buildfile -file -f
|
|
set buildfile (eval echo $token)
|
|
end
|
|
set prev $token
|
|
end
|
|
# return last one
|
|
echo $buildfile
|
|
end
|
|
function __parse_ant_targets -d "Parse ant targets in the given build file"
|
|
set -l buildfile $argv[1] # full path to buildfile
|
|
set -l targets (__filter_xml_start_tag $buildfile 'target|extension-point')
|
|
for target in $targets
|
|
set -l target_name (__filter_xml_attr_value $target 'name')
|
|
if [ $status -eq 0 ]
|
|
set -l target_description (__filter_xml_attr_value $target 'description')
|
|
if [ $status -eq 0 ]
|
|
echo $target_name\t$target_description
|
|
else
|
|
echo $target_name
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function __get_ant_targets -d "Get ant targets recursively"
|
|
set -l buildfile $argv[1] # full path to buildfile
|
|
__parse_ant_targets $buildfile
|
|
|
|
set -l basedir (string split -r -m 1 / $buildfile)[1]
|
|
set -l imports (__filter_xml_start_tag $buildfile 'import')
|
|
for import in $imports
|
|
set -l filepath (__filter_xml_attr_value $import 'file')
|
|
# Set basedir if $filepath is not a full path
|
|
if string match -rvq '^/.*' $filepath
|
|
set filename $basedir/$filepath
|
|
end
|
|
if [ -f $filepath ]
|
|
__get_ant_targets $filepath
|
|
end
|
|
end
|
|
end
|
|
|
|
set -l tokens (commandline -co)
|
|
set -l buildfile (realpath -eq $buildfile (__get_buildfile $tokens))
|
|
if [ $status -eq 0 ]
|
|
__get_ant_targets $buildfile
|
|
end
|
|
end
|