fisher/functions/fisher_search.fish
Jorge Bucaran 4b15cf374f
Ahoy! We are getting close to 0.8.0
* Move AUTHORS -> THANKS and remove automatic generation.

THANKS is more sensible than AUTHORS. CREDITS was second best.
Also, after perusing similar files in other projects I noticed
some entries lacking a valid email address and decided fow now
this file should be curated manually to make sure each entry
contains a useful link. This allows users who have contributed
to the project ways other than committing code to be added to
the list as well.

* Rename wait -> spin.

* Remove extra padding in links. (Cosmetic)

* Update to reflect API refactorings.

* Fix bug causing brackets to show up in description.

* Implement using spin function.

* __fisher_gist_to_name uses curl to query the GitHub API which will
return a JSON stream even if the Gist could not be found. So, it's
not possible to determine whether we failed or not using our spin
function and actually need to check the returned string to see if
it contains a valid name or not.

* Let git pull write errors to stderr.

* Use new internal __fisher_spin.

* Extract spin to independent / external module and tweak Makefile
to better integrate with new install process.
2016-02-14 13:17:47 +09:00

160 lines
4.1 KiB
Fish

function fisher_search -d "Search Plugins"
set -l fields
set -l query
set -l index
set -l join "||"
set -l quiet 0
getopts $argv | while read -l 1 2 3
switch "$1"
case _
switch "$2"
case \*/\*
set -l url (__fisher_plugin_validate $2)
if test ! -z "$url"
set 2 $url
end
set query $query "url==\"$2\"" $join
case \*
set query $query "name==\"$2\"" $join
end
case name url info author
if test -z "$2"
set fields $fields $1 ,
else
switch "$2"
case ~\*
set query $query "$1$3$2" $join
case \*
if test -z "$3"
set 3 =
end
set query $query "$1$3=\"$2\"" $join
end
end
case tag{,s}
if test -z "$2"
set fields $fields "tags(0)" ,
else
set query $query "$3 tags(\"$2\")" $join
end
case a and
set join "&&"
case o or
set join "||"
case query
set query $query $2
case index
set index $2
case q quiet
set quiet 1
case h
printf "usage: fisher search [<plugins>] [--and|--or] [--quiet] [--help]\n\n"
printf " *--<field> Filter by url, name, info, author or tags\n"
printf " -o --or Join query with OR operator\n"
printf " -a --and Join query with AND operator\n"
printf " -q --quiet Enable quiet mode\n"
printf " -h --help Show usage help\n"
return
case \*
printf "fisher: '%s' is not a valid option.\n" $1 > /dev/stderr
fisher_search -h > /dev/stderr
return 1
end
end
if test -z "$index"
set index $fisher_cache/.index
set fisher_last_update (math (date +%s) - "0$fisher_last_update")
if not set -q fisher_update_interval
set -g fisher_update_interval 10
end
if test $fisher_last_update -gt $fisher_update_interval -o ! -f $index
if spin "__fisher_index_update" --error=/dev/null
__fisher_complete_reset
end
end
set -U fisher_last_update (date +%s)
end
set -e fields[-1]
set -e query[-1]
if test -z "$fields[1]"
set fields '$0'
end
awk -F'\n' -v RS='' -v OFS=';' (
if test "$fields" = '$0'
printf "%s\nORS=%s" -v '\\n\\n'
end
) "
function tags(tag, _list) {
if (!tag) {
for (i in tag_list) {
if (!seen[tag_list[i]]++) {
_list = tag_list[i] \"\n\" _list
}
}
return substr(_list, 1, length(_list) - 1)
}
for (i in tag_list) {
if (tag == tag_list[i]) {
return 1
}
}
return 0
}
/^ *#/ { next } {
delete tag_list
if (\$4) split(\$4, tag_list, \" \")
name = \$1
url = \$2
info = \$3
author = \$5
}
$query { print $fields } " $index | awk -v quiet=$quiet '
!/^ *$/ { hasRecords = 1 } {
if (quiet) {
exit !hasRecords
} else {
records[NR] = $0
}
}
END {
for (i = 1; i <= NR; i++) {
if (i == NR && records[i] ~ /^ *$/) {
break
}
print records[i]
}
exit !hasRecords
}
'
end