From d6986af3a6a85f38967636815993b932f55b7fcc Mon Sep 17 00:00:00 2001 From: Jorge Bucaran Date: Fri, 29 Apr 2016 04:10:21 +0900 Subject: [PATCH] Add new sub command ls-remote to list what plugins you can install. Running fisher ls-remote will query the GitHub API for all the repos in the fisherman org and retrieve the JSON file which is saved to .cache/fisherman/.index.json. This file is updated every half and hour whenever you run the command again. This number is subject to change in the future as we learn how people are actually using this option. The ls-remote option can take --format= option used to customize the list output. By default, it shows only names and breaks it into columns as wide as your terminal window. can contain \t tabs or \n line breaks and one or more of the following variables with information about plugins. * %name * %info * %url * %stars --- fisher.fish | 225 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 211 insertions(+), 14 deletions(-) diff --git a/fisher.fish b/fisher.fish index ece7877..0b9ee80 100644 --- a/fisher.fish +++ b/fisher.fish @@ -73,6 +73,7 @@ function fisher end set -l cmd + set -l value switch "$argv[1]" case i install @@ -91,6 +92,15 @@ function fisher set -e argv[1] set cmd "ls" + case ls-remote + set -e argv[1] + set cmd "ls-remote" + + switch "$argv[1]" + case --format\* + set value (printf "%s\n" "$argv" | command sed 's|^--[^= ]*[= ]\(.*\)|\1|') + end + case h help set -e argv[1] __fisher_help $argv @@ -207,6 +217,9 @@ function fisher __fisher_list_plugin_directory $argv end + case ls-remote + __fisher_list_remote "$value" + case rm if test -z "$items" __fisher_parse_column_output | __fisher_read_bundle_file | read -az items @@ -330,11 +343,11 @@ function __fisher_plugin_fetch_items if test "$count" = 1 -a -d "$argv[1]" if test "$argv[1]" = "$PWD" set -l home ~ - set -l name (printf "%s\n" "$argv[1]" | sed "s|$home|~|") + set -l name (printf "%s\n" "$argv[1]" | command sed "s|$home|~|") __fisher_log info "Installing @""$name""@ " $__fisher_stderr else - set -l name (printf "%s\n" "$argv[1]" | sed "s|$PWD/||") + set -l name (printf "%s\n" "$argv[1]" | command sed "s|$PWD/||") __fisher_log info "Installing @""$name""@ " $__fisher_stderr end @@ -442,7 +455,7 @@ function __fisher_plugin_url_clone_async -a url name set -l error (set_color red) set -l okay (set_color green) - set -l hm_url (printf "%s\n" "$url" | sed 's|^https://||') + set -l hm_url (printf "%s\n" "$url" | command sed 's|^https://||') fish -c " set -lx GIT_ASKPASS /bin/echo @@ -518,6 +531,7 @@ function __fisher_self_update return 1 end + set -l completions "$fish_config/completions/fisher.fish" set -l raw_url "https://raw.githubusercontent.com/fisherman/fisherman/master/fisher.fish" set -l fake_qs (date "+%s") @@ -532,9 +546,14 @@ function __fisher_self_update end source "$file" + fisher -v > /dev/null + set -l new_version "$fisher_version" + __fisher_completions_write > "$completions" + source "$completions" + if test "$previous_version" = "$fisher_version" __fisher_log okay "fisherman is up to date" $__fisher_stderr else @@ -786,8 +805,159 @@ function __fisher_get_plugin_name_from_gist -a url end +function __fisher_remote_index_update + set -l index "$fisher_cache/.index.json" + set -l interval 2160 + + if test ! -z "$fisher_index_update_interval" + set interval "$fin_index_update_interval" + end + + if test -s "$index" + if test (__fisher_get_file_age "$index") -lt "$interval" + return + end + end + + fish -c "curl -s 'https://api.github.com/orgs/fisherman/repos?per_page=100' > '$index'" & + + __fisher_jobs_await (__fisher_jobs_get -l) + + if test ! -s "$index" + return 1 + end +end + + +function __fisher_list_remote -a format + set -l index "$fisher_cache/.index.json" + + if not __fisher_remote_index_update + __fisher_log error "I could not update the remote index." + __fisher_log info " + + This is most likely a problem with http://api.github.com/ + or a connection timeout. If the problem persists, open an + issue in: + " + + return 1 + end + + set -l column_options + + if test -z "$format" + set format "%name\n" + else + set column_options -c0 + end + + set -l config "$fisher_config"/* + + command awk -v format_s="$format" -v config="$config" ' + + function qsort(A, L, R, pivot, j, i, t) { + pivot = j = i = t + if (L >= R) { + return + } + pivot = L + i = L + j = R + while (i < j) { + while (A[i] <= A[pivot] && i < R) i++ + while (A[j] > A[pivot]) j-- + if (i < j) { + t = A[i] + A[i] = A[j] + A[j] = t + } + } + t = A[pivot] + A[pivot] = A[j] + A[j] = t + qsort(A, L, j - 1) + qsort(A, j + 1, R) + } + + function basename(s, n, a) { + n = split(s, a, "/") + return a[n] + } + + function in_config(item, i) { + for (i = 1; i <= config_n; i++) { + if (item == config_a[i]) { + return 1 + } + } + + return 0 + } + + function print_record_with_format(name, stars, url, info, fmt) { + gsub(/%name/, name, fmt) + gsub(/%stars/, stars, fmt) + gsub(/%url/, url, fmt) + gsub(/%info/, info, fmt) + + printf(fmt) + } + + function json_get_field(s) { + if ($0 ~ "^" s ":") { + return substr($0, length(s) + 3) + } + } + + BEGIN { + config_n = split(config, config_a) + + for (i = 1; i <= config_n; i++) { + config_a[i] = basename(config_a[i]) + } + } + + { + gsub(/[\[\],{}"]|^[\t ]+/, "") + + s = json_get_field("name") + name = s != "" ? s : name + + s = json_get_field("description") + info = s != "" ? s : info + + s = json_get_field("stargazers_count") + stars = s != "" ? s : stars + + if (name != "" && info != "" && stars != "" && !in_config(name)) { + if (name !~ /^awesome-fish|^fisherman|^index|logo/) { + info = (info == "null") ? "No description." : info + records[++record_index] = name ";" info ";" stars + } + + name = info = stars = "" + } + } + + END { + qsort(records, 1, record_index) + + for (i = 1; i <= record_index; i++) { + n = split(records[i], r, ";") + + if (n == 3) { + print_record_with_format(r[1], r[2], "github.com/fisherman/"r[1], r[3], format_s) + } + } + } + + ' < "$index" | column $column_options +end + + function __fisher_list - set -l config $fisher_config/* + set -l config "$fisher_config"/* if test -z "$config" return 1 @@ -988,9 +1158,9 @@ function __fisher_key_bindings_remove -a plugin_name set -l user_key_bindings "$fish_config/functions/fish_user_key_bindings.fish" set -l tmp (date "+%s") - fish_indent < "$user_key_bindings" | sed -n "/### $plugin_name ###/,/### $plugin_name ###/{s/^ *bind /bind -e /p;};" | source ^ /dev/null + fish_indent < "$user_key_bindings" | command sed -n "/### $plugin_name ###/,/### $plugin_name ###/{s/^ *bind /bind -e /p;};" | source ^ /dev/null - sed "/### $plugin_name ###/,/### $plugin_name ###/d" < "$user_key_bindings" > "$user_key_bindings.$tmp" + command sed "/### $plugin_name ###/,/### $plugin_name ###/d" < "$user_key_bindings" > "$user_key_bindings.$tmp" command mv -f "$user_key_bindings.$tmp" "$user_key_bindings" if awk ' @@ -1260,14 +1430,15 @@ end function __fisher_completions_write functions __fisher_completions_write | fish_indent | __fisher_parse_comments_from_function - # complete -xc fisher -s h -l help -d "Show usage help" # complete -xc fisher -s q -l quiet -d "Enable quiet mode" - # complete -xc fisher -s v -l version -d "Show version information" - # complete -xc fisher -n "__fish_use_subcommand" -a install -d "Install plugins / i" - # complete -xc fisher -n "__fish_use_subcommand" -a update -d "Update itself and plugins / u" - # complete -xc fisher -n "__fish_use_subcommand" -a rm -d "Remove plugins / r" - # complete -xc fisher -n "__fish_use_subcommand" -a ls -d "List plugins / l" - # complete -xc fisher -n "__fish_use_subcommand" -a help -d "Show help / h" + # complete -xc fisher -n "__fish_use_subcommand" -s h -l help -d "Show usage help" + # complete -xc fisher -n "__fish_use_subcommand" -s v -l version -d "Show version information" + # complete -xc fisher -n "__fish_use_subcommand" -a install -d "Install plugins" + # complete -xc fisher -n "__fish_use_subcommand" -a update -d "Upgrade and update plugins" + # complete -xc fisher -n "__fish_use_subcommand" -a rm -d "Remove plugins" + # complete -xc fisher -n "__fish_use_subcommand" -a ls -d "List what's installed" + # complete -xc fisher -n "__fish_use_subcommand" -a ls-remote -d "List what can be installed" + # complete -xc fisher -n "__fish_use_subcommand" -a help -d "Show help" end @@ -1358,6 +1529,15 @@ function __fisher_parse_comments_from_function end +function __fisher_get_file_age -a file + if not type -q python + return 1 + end + + python -c "import os, time; print int(time.time() - os.path.getmtime('$file'))" ^ /dev/null +end + + function __fisher_usage set -l u (set_color -u) set -l nc (set_color normal) @@ -1368,7 +1548,7 @@ function __fisher_usage echo " "$u"i"$nc"nstall (default)" echo " "$u"u"$nc"pdate" echo " "$u"r"$nc"m" - echo " "$u"l"$nc"s" + echo " "$u"l"$nc"s (or ls-remote)" echo " "$u"h"$nc"elp" end @@ -1619,6 +1799,23 @@ function __fisher_man_page_write # .IP "" 0 # . # .P + # See what you can install\. + # . + # .IP "" 4 + # . + # .nf + # + # fisher ls\-remote + # \.\.\. + # spin roach git_util pwd_info + # submit flash pyenv host_info + # \.\.\. + # . + # .fi + # . + # .IP "" 0 + # . + # .P # Update everything\. # . # .IP "" 4