tazpkg diff modules/search @ rev 840
Add a bunch of modules with new-style support of 'root' (not all commands are modules yet); strip and compress resources.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Fri Aug 28 16:10:34 2015 +0300 (2015-08-28) |
parents | |
children | 0560ba4306a1 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/modules/search Fri Aug 28 16:10:34 2015 +0300 1.3 @@ -0,0 +1,238 @@ 1.4 +#!/bin/sh 1.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg 1.6 +# search - TazPkg module 1.7 +# Search packages and files 1.8 + 1.9 + 1.10 +# Connect function libraries 1.11 +. /lib/libtaz.sh 1.12 + 1.13 +# Get TazPkg working environment 1.14 +. @@MODULES@@/getenv 1.15 + 1.16 + 1.17 + 1.18 + 1.19 +# Translate category names (must be last in line) 1.20 + 1.21 +translate_category() { 1.22 + sed "s|base-system$|$(_ base-system)|; s|x-window$|$(_ x-window)|; 1.23 + s|utilities$|$(_ utilities)|; s|network$|$(_ network)|; 1.24 + s|graphics$|$(_ graphics)|; s|multimedia$|$(_ multimedia)|; 1.25 + s|office$|$(_ office)|; s|development$|$(_ development)|; 1.26 + s|system-tools$|$(_ system-tools)|; s|security$|$(_ security)|; 1.27 + s|games$|$(_ games)|; s|misc$|$(_ misc)|; s|meta$|$(_ meta)|; 1.28 + s|non-free$|$(_ non-free)|; s|all$|$(_ all)|; s|extra$|$(_ extra)|" 1.29 +} 1.30 + 1.31 + 1.32 +# Search pattern in installed packages. 1.33 + 1.34 +search_in_installed_packages() { 1.35 + _ 'Installed packages'; separator '-' 1.36 + num='0' 1.37 + TMPLIST=$(mktemp) 1.38 + 1.39 + awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" ' 1.40 + BEGIN { IGNORECASE = 1 } 1.41 + index($1 "-" $2, pattern) { 1.42 + printf "%-24s%-18s%s\n", $1, $2, $3; 1.43 + printf "1" >> t 1.44 + }' "$PKGS_DB/installed.info" | translate_category 1.45 + num=$(wc -m < "$TMPLIST"); rm "$TMPLIST" 1.46 + 1.47 + footer "$(_p \ 1.48 + '%s installed package found for "%s"' \ 1.49 + '%s installed packages found for "%s"' "$num" \ 1.50 + "$num" "$PATTERN")" 1.51 +} 1.52 + 1.53 + 1.54 +# Search in packages.list for available pkgs. 1.55 + 1.56 +search_in_packages_list() { 1.57 + _ 'Available packages'; separator '-' 1.58 + num='0' 1.59 + TMPLIST=$(mktemp) 1.60 + 1.61 + for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do 1.62 + [ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" ' 1.63 + BEGIN { IGNORECASE = 1 } 1.64 + index($1 "-" $2, pattern) { 1.65 + printf "%-24s%-18s%s\n", $1, $2, $3; 1.66 + printf "1" >> t 1.67 + }' "$i" | translate_category 1.68 + done 1.69 + 1.70 + for i in $PKGS_DB/extra.list $PKGS_DB/undigest/*/extra.list; do 1.71 + [ -e "$i" ] && awk -F'|' -vpattern="$PATTERN" -vt="$TMPLIST" ' 1.72 + BEGIN { IGNORECASE = 1 } 1.73 + index($1 "-" $5, pattern) { 1.74 + printf "%-24s%-18s%s\n", $1 " (extra)", $5, $4; 1.75 + printf "1" >> t 1.76 + }' "$i" | translate_category 1.77 + done 1.78 + 1.79 + if [ ! -f "$PKGS_DB/packages.info" ]; then 1.80 + newline 1.81 + longline "$(_ \ 1.82 +"No \"%s\" found to check for mirrored packages. For more results, please run \ 1.83 +\"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')" 1.84 + newline 1.85 + fi 1.86 + 1.87 + num=$(wc -m < "$TMPLIST"); rm "$TMPLIST" 1.88 + footer "$(_p \ 1.89 + '%s available package found for "%s"' \ 1.90 + '%s available packages found for "%s"' "$num" \ 1.91 + "$num" "$PATTERN")" 1.92 +} 1.93 + 1.94 + 1.95 +# search --mirror: Search in packages.txt for available pkgs and give more 1.96 +# info than --list or default. 1.97 + 1.98 +search_in_packages_txt() { 1.99 + _ 'Matching packages name with version and desc'; separator '-' 1.100 + num='0' 1.101 + TMPLIST=$(mktemp) 1.102 + 1.103 + for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do 1.104 + [ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" ' 1.105 + BEGIN { IGNORECASE = 1 } 1.106 + index($1 " " $2 " " $4, pattern) { 1.107 + split($7, s, " "); 1.108 + printf "%s\n%s\n%s\n%s (%s installed)\n\n", $1, $2, $4, s[1], s[2]; 1.109 + printf "1" >> t; 1.110 + }' "$i" 1.111 + done 1.112 + 1.113 + if [ ! -f "$PKGS_DB/packages.info" ]; then 1.114 + newline 1.115 + longline "$(_ \ 1.116 +"No \"%s\" found to check for mirrored packages. For more results, please run \ 1.117 +\"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')" 1.118 + newline 1.119 + fi 1.120 + 1.121 + num=$(wc -m < "$TMPLIST"); rm "$TMPLIST" 1.122 + footer "$(_p \ 1.123 + '%s available package found for "%s"' \ 1.124 + '%s available packages found for "%s"' "$num" \ 1.125 + "$num" "$PATTERN")" 1.126 +} 1.127 + 1.128 + 1.129 + 1.130 + 1.131 +case "$1" in 1.132 + pkg) 1.133 + # Search for a package by pattern or name 1.134 + 1.135 + # Input: package_name pattern (part of package name) 1.136 + # Output: 1.137 + # installed: list of installed packages (as info table) 1.138 + # list: list of available packages (installed and installable) (as info table) 1.139 + # mirror: list of available packages (installed and installable) (in special format) 1.140 + # (matching package name, version, or short description) 1.141 + 1.142 + PATTERN="$2" 1.143 + title 'Search result for "%s"' "$PATTERN" 1.144 + [ -n "$installed" ] && search_in_installed_packages 1.145 + [ -n "$list" ] && search_in_packages_list 1.146 + [ -n "$mirror" ] && search_in_packages_txt 1.147 + if [ -z "$installed$list$mirror" ]; then 1.148 + # If none of "--installed", "--list", "--mirror" given 1.149 + search_in_installed_packages 1.150 + search_in_packages_list 1.151 + fi 1.152 + ;; 1.153 + 1.154 + file) 1.155 + # Search for a file by pattern or name 1.156 + 1.157 + # Input: file_name pattern (part of file name) 1.158 + # Output: list of (installed or available) packages with matched filenames by file_name pattern 1.159 + 1.160 + title 'Search result for file "%s"' "$2" 1.161 + TMPLIST=$(mktemp) 1.162 + 1.163 + if [ -n "$mirror" ]; then 1.164 + # Option "--mirror" given: process available packages 1.165 + TMPDIR=$(mktemp -d) 1.166 + for i in $PKGS_DB/files.list.lzma $PKGS_DB/undigest/*/files.list.lzma; do 1.167 + [ -f "$i" ] || continue 1.168 + lzcat "$i" | awk -F: -vtmp="$TMPLIST" -vdir="$TMPDIR" \ 1.169 + -vfile="$2" -vcfile="$(colorize 32 "$2")" ' 1.170 + BEGIN { efile = gensub("\+", "\\\+", "g", file); } 1.171 + index($2, file) { 1.172 + gsub(efile, cfile, $2); 1.173 + print $2 >> dir"/"$1; 1.174 + printf "1" >> tmp; 1.175 + }' 1.176 + done 1.177 + 1.178 + for pkg in $(cd "$TMPDIR"; ls); do 1.179 + newline 1.180 + emsg "<c 33>$(_ 'Package %s:' $pkg)</c>" 1.181 + cat "$TMPDIR/$pkg" 1.182 + done 1.183 + 1.184 + rm -r "$TMPDIR" 1.185 + 1.186 + else 1.187 + # Option "--mirror" not given: process installed packages 1.188 + 1.189 + # Check all pkg files.list in search match which specify the package 1.190 + # name and the full path to the file(s). 1.191 + for pkg in $INSTALLED/*; do 1.192 + if grep -qs "$2" "$pkg/files.list"; then 1.193 + newline 1.194 + emsg "<c 33>$(_ 'Package %s:' "$pkg")</c>" 1.195 + awk -vtmp="$TMPLIST" -vfile="$2" -vcfile="$(colorize 32 $2)" ' 1.196 + BEGIN { efile = gensub("\+", "\\\+", "g", file); } 1.197 + index($0, file) { 1.198 + gsub(efile, cfile); 1.199 + print " "$0; 1.200 + printf "1" >> tmp; 1.201 + } 1.202 + ' "$pkg/files.list" 1.203 + fi 1.204 + done 1.205 + 1.206 + fi 1.207 + 1.208 + num=$(wc -m < "$TMPLIST"); rm "$TMPLIST" 1.209 + footer "$(_p '%s file' '%s files' "$num" \ 1.210 + "$(colorize 32 "$num")")" 1.211 + ;; 1.212 + 1.213 + file2) 1.214 + # Search for a package name 1.215 + 1.216 + # Input: file_name pattern (part of file name) 1.217 + # Output: list of available packages with matched filenames by file_name pattern 1.218 + 1.219 + title 'Search result for package "%s"' "$2" 1.220 + 1.221 + # Search for a file on mirror and output only the package name 1.222 + TMPLIST=$(mktemp) 1.223 + for i in $PKGS_DB/files.list.lzma $PKGS_DB/undigest/*/files.list.lzma; do 1.224 + [ -f "$i" ] || continue 1.225 + lzcat "$i" | awk -F: -vT="$TMPLIST" -vterm="$2" ' 1.226 + BEGIN { P = "" } 1.227 + index($2, term) { 1.228 + if ($1 != P) { 1.229 + print $1; 1.230 + printf "1" >> T; 1.231 + P = $1 1.232 + } 1.233 + }' 1.234 + done 1.235 + match=$(wc -m < "$TMPLIST") 1.236 + rm "$TMPLIST" 1.237 + 1.238 + footer "$(emsg "$(_p '%s package' '%s packages' "$match" \ 1.239 + "<c 32>$match</c>")")" 1.240 + ;; 1.241 +esac