2 changed files with 101 additions and 0 deletions
@ -0,0 +1,100 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# |
||||||
|
# Поиск пакета Gentoo на сайте zugaina. |
||||||
|
# |
||||||
|
# Идея: https://megabaks.blogspot.com/2013/04/portage.html |
||||||
|
# |
||||||
|
|
||||||
|
set -e |
||||||
|
set -o errtrace |
||||||
|
trap stacktrace ERR |
||||||
|
|
||||||
|
\unalias -a |
||||||
|
|
||||||
|
IFS=$' \t\n' |
||||||
|
|
||||||
|
stacktrace() { |
||||||
|
[ -n "$TRACED" ] && return |
||||||
|
|
||||||
|
local depth=${#FUNCNAME[@]} |
||||||
|
|
||||||
|
for ((i=1; i < "$depth"; i++)); do |
||||||
|
printf '%*scall at %s:%s: %s()\n' "$i" '' \ |
||||||
|
"${BASH_SOURCE[$i]}" \ |
||||||
|
"${BASH_LINENO[$((i-1))]}" \ |
||||||
|
"${FUNCNAME[$i]}" |
||||||
|
done |
||||||
|
|
||||||
|
TRACED=true |
||||||
|
} |
||||||
|
|
||||||
|
die() { |
||||||
|
echo -e "$@" >&2 |
||||||
|
exit 1 |
||||||
|
} |
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------ |
||||||
|
|
||||||
|
join() { |
||||||
|
paste -d " " - - |
||||||
|
} |
||||||
|
|
||||||
|
zxpath() { |
||||||
|
curl -sq "$1" | xmllint --html --xpath "$2" - 2>&- |
||||||
|
} |
||||||
|
|
||||||
|
search_packages() { |
||||||
|
zxpath "${ZUGAINA_URL}/Search?search=${1}" "//div[@id='search_results']/a/div/descendant::text()" | join |
||||||
|
} |
||||||
|
|
||||||
|
get_package_overlays() { |
||||||
|
read -r category package_name rest <<<"$(qatom "$1")" |
||||||
|
|
||||||
|
local packages |
||||||
|
local pages |
||||||
|
|
||||||
|
pages=$(zxpath "${ZUGAINA_URL}/${category}/${package_name}" "//a[contains(@href, '#')]/@href" \ |
||||||
|
| awk -F '/' '{printf "%s/%s\n", $2, $3}' \ |
||||||
|
| sort -u) |
||||||
|
|
||||||
|
for page in $pages;do |
||||||
|
packages=$(zxpath "${ZUGAINA_URL}/${page}" "//b[not(./a)]/text()|//b/a/text()" | join | sort --version-sort --reverse) |
||||||
|
|
||||||
|
while read -r version overlay; do |
||||||
|
OVERLAYS+="${category}/${version}:"${overlay//$'\n'/ }$'\n' |
||||||
|
done <<<"$packages" |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------ |
||||||
|
|
||||||
|
[[ "${BASH_VERSINFO[0]}" -lt 5 ]] && die "ERROR: Bash >= 5 required." |
||||||
|
|
||||||
|
[[ -z "$1" ]] && die "USAGE: $(basename "$0") package" |
||||||
|
|
||||||
|
DEPENDENCIES=(xmllint awk) |
||||||
|
for dependency in "${DEPENDENCIES[@]}"; do |
||||||
|
command -V "$dependency" >&- 2>&- || die "ERROR: The required '$dependency' command is not found." |
||||||
|
done |
||||||
|
|
||||||
|
green="\033[01;32m" |
||||||
|
rstc="\033[00m" |
||||||
|
|
||||||
|
ZUGAINA_URL="http://gpo.zugaina.org" |
||||||
|
|
||||||
|
while read -r package desc;do |
||||||
|
echo -e "${green}${package}${rstc}: ${desc}" |
||||||
|
get_package_overlays "$package" |
||||||
|
done < <(search_packages "$1") |
||||||
|
|
||||||
|
if [[ -n "${OVERLAYS}" ]]; then |
||||||
|
echo -e ":" |
||||||
|
echo -e "PACKAGE:REPOSITORY" |
||||||
|
echo -e "-------:----------" |
||||||
|
echo -e "${OVERLAYS}" |
||||||
|
echo -e ":" |
||||||
|
else |
||||||
|
die "Package '$1' not found." |
||||||
|
fi | column -t -s ':' |
||||||
|
|
Loading…
Reference in new issue