From 480e95147cc375df9967568fbeac7f5c32bf0184 Mon Sep 17 00:00:00 2001 From: wyahiro Date: Sun, 13 Jan 2019 21:36:05 +0900 Subject: [PATCH] use cache file for ant targets --- share/completions/ant.fish | 2 +- .../__fish_complete_ant_targets.fish | 68 ++++++++----------- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/share/completions/ant.fish b/share/completions/ant.fish index 82b82a7a0..7436876cb 100644 --- a/share/completions/ant.fish +++ b/share/completions/ant.fish @@ -1,7 +1,7 @@ # Apache Ant (1.9.5) completion for Fish Shell. # completion for ant targets -complete -x -c ant -a "(__fish_complete_ant_targets)" +complete -x -c ant -a "(__fish_complete_ant_targets (commandline -co))" # Script Options: complete -f -c ant -l help -l h -d 'print help message and ant help' diff --git a/share/functions/__fish_complete_ant_targets.fish b/share/functions/__fish_complete_ant_targets.fish index f7324006c..d3013bb7b 100644 --- a/share/functions/__fish_complete_ant_targets.fish +++ b/share/functions/__fish_complete_ant_targets.fish @@ -1,18 +1,4 @@ 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] @@ -27,42 +13,42 @@ function __fish_complete_ant_targets -d "Print list of targets from build.xml an # return last one echo $buildfile end - function __parse_ant_targets -d "Parse ant targets in the given build file" + function __parse_ant_targets_from_projecthelp -d "Parse ant targets from projecthelp" set -l buildfile $argv[1] # full path to buildfile - set -l targets (__filter_xml_start_tag $buildfile 'target|extension-point') + set -l targets (ant -p -debug -f $buildfile 2> /dev/null | string match -r '^\s\S+.*$' $projecthelp) 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 + set -l tokens (string match -r '^\s([[:graph:]]+)(?:\s+([[:print:]]+))?' "$target") + if [ (count $tokens) -ge 3 ] + echo $tokens[2]\t$tokens[3] + else if [ (count $tokens) -ge 2 ] + echo $tokens[2] end end end - function __get_ant_targets -d "Get ant targets recursively" + function __get_ant_targets_from_projecthelp -d "Get ant targets from projecthelp" 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 + set -l cache_dir + if [ \( -n $__fish_user_data_dir \) -a \( -d $__fish_user_data_dir \) ] + set cache_dir $__fish_user_data_dir/ant_completions + else + set cache_dir "$HOME/.local/share/fish/ant_completions" end + mkdir -p $cache_dir + + set -l cache_file $cache_dir/(string escape --style=var $buildfile) + if [ ! -s $cache_file ] + # generate cache file if empty + __parse_ant_targets_from_projecthelp $buildfile > $cache_file + end + + cat $cache_file end - set -l tokens (commandline -co) - set -l buildfile (realpath -eq $buildfile (__get_buildfile $tokens)) - if [ $status -eq 0 ] - __get_ant_targets $buildfile + set -l tokens $argv + if not set -l buildfile (realpath -eq $buildfile (__get_buildfile $tokens)) + return 1 # return nothing if buildfile does not exist end + + __get_ant_targets_from_projecthelp $buildfile end