tazpkg view 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 source
1 #!/bin/sh
2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
3 # search - TazPkg module
4 # Search packages and files
7 # Connect function libraries
8 . /lib/libtaz.sh
10 # Get TazPkg working environment
11 . @@MODULES@@/getenv
16 # Translate category names (must be last in line)
18 translate_category() {
19 sed "s|base-system$|$(_ base-system)|; s|x-window$|$(_ x-window)|;
20 s|utilities$|$(_ utilities)|; s|network$|$(_ network)|;
21 s|graphics$|$(_ graphics)|; s|multimedia$|$(_ multimedia)|;
22 s|office$|$(_ office)|; s|development$|$(_ development)|;
23 s|system-tools$|$(_ system-tools)|; s|security$|$(_ security)|;
24 s|games$|$(_ games)|; s|misc$|$(_ misc)|; s|meta$|$(_ meta)|;
25 s|non-free$|$(_ non-free)|; s|all$|$(_ all)|; s|extra$|$(_ extra)|"
26 }
29 # Search pattern in installed packages.
31 search_in_installed_packages() {
32 _ 'Installed packages'; separator '-'
33 num='0'
34 TMPLIST=$(mktemp)
36 awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
37 BEGIN { IGNORECASE = 1 }
38 index($1 "-" $2, pattern) {
39 printf "%-24s%-18s%s\n", $1, $2, $3;
40 printf "1" >> t
41 }' "$PKGS_DB/installed.info" | translate_category
42 num=$(wc -m < "$TMPLIST"); rm "$TMPLIST"
44 footer "$(_p \
45 '%s installed package found for "%s"' \
46 '%s installed packages found for "%s"' "$num" \
47 "$num" "$PATTERN")"
48 }
51 # Search in packages.list for available pkgs.
53 search_in_packages_list() {
54 _ 'Available packages'; separator '-'
55 num='0'
56 TMPLIST=$(mktemp)
58 for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do
59 [ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
60 BEGIN { IGNORECASE = 1 }
61 index($1 "-" $2, pattern) {
62 printf "%-24s%-18s%s\n", $1, $2, $3;
63 printf "1" >> t
64 }' "$i" | translate_category
65 done
67 for i in $PKGS_DB/extra.list $PKGS_DB/undigest/*/extra.list; do
68 [ -e "$i" ] && awk -F'|' -vpattern="$PATTERN" -vt="$TMPLIST" '
69 BEGIN { IGNORECASE = 1 }
70 index($1 "-" $5, pattern) {
71 printf "%-24s%-18s%s\n", $1 " (extra)", $5, $4;
72 printf "1" >> t
73 }' "$i" | translate_category
74 done
76 if [ ! -f "$PKGS_DB/packages.info" ]; then
77 newline
78 longline "$(_ \
79 "No \"%s\" found to check for mirrored packages. For more results, please run \
80 \"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')"
81 newline
82 fi
84 num=$(wc -m < "$TMPLIST"); rm "$TMPLIST"
85 footer "$(_p \
86 '%s available package found for "%s"' \
87 '%s available packages found for "%s"' "$num" \
88 "$num" "$PATTERN")"
89 }
92 # search --mirror: Search in packages.txt for available pkgs and give more
93 # info than --list or default.
95 search_in_packages_txt() {
96 _ 'Matching packages name with version and desc'; separator '-'
97 num='0'
98 TMPLIST=$(mktemp)
100 for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do
101 [ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
102 BEGIN { IGNORECASE = 1 }
103 index($1 " " $2 " " $4, pattern) {
104 split($7, s, " ");
105 printf "%s\n%s\n%s\n%s (%s installed)\n\n", $1, $2, $4, s[1], s[2];
106 printf "1" >> t;
107 }' "$i"
108 done
110 if [ ! -f "$PKGS_DB/packages.info" ]; then
111 newline
112 longline "$(_ \
113 "No \"%s\" found to check for mirrored packages. For more results, please run \
114 \"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')"
115 newline
116 fi
118 num=$(wc -m < "$TMPLIST"); rm "$TMPLIST"
119 footer "$(_p \
120 '%s available package found for "%s"' \
121 '%s available packages found for "%s"' "$num" \
122 "$num" "$PATTERN")"
123 }
128 case "$1" in
129 pkg)
130 # Search for a package by pattern or name
132 # Input: package_name pattern (part of package name)
133 # Output:
134 # installed: list of installed packages (as info table)
135 # list: list of available packages (installed and installable) (as info table)
136 # mirror: list of available packages (installed and installable) (in special format)
137 # (matching package name, version, or short description)
139 PATTERN="$2"
140 title 'Search result for "%s"' "$PATTERN"
141 [ -n "$installed" ] && search_in_installed_packages
142 [ -n "$list" ] && search_in_packages_list
143 [ -n "$mirror" ] && search_in_packages_txt
144 if [ -z "$installed$list$mirror" ]; then
145 # If none of "--installed", "--list", "--mirror" given
146 search_in_installed_packages
147 search_in_packages_list
148 fi
149 ;;
151 file)
152 # Search for a file by pattern or name
154 # Input: file_name pattern (part of file name)
155 # Output: list of (installed or available) packages with matched filenames by file_name pattern
157 title 'Search result for file "%s"' "$2"
158 TMPLIST=$(mktemp)
160 if [ -n "$mirror" ]; then
161 # Option "--mirror" given: process available packages
162 TMPDIR=$(mktemp -d)
163 for i in $PKGS_DB/files.list.lzma $PKGS_DB/undigest/*/files.list.lzma; do
164 [ -f "$i" ] || continue
165 lzcat "$i" | awk -F: -vtmp="$TMPLIST" -vdir="$TMPDIR" \
166 -vfile="$2" -vcfile="$(colorize 32 "$2")" '
167 BEGIN { efile = gensub("\+", "\\\+", "g", file); }
168 index($2, file) {
169 gsub(efile, cfile, $2);
170 print $2 >> dir"/"$1;
171 printf "1" >> tmp;
172 }'
173 done
175 for pkg in $(cd "$TMPDIR"; ls); do
176 newline
177 emsg "<c 33>$(_ 'Package %s:' $pkg)</c>"
178 cat "$TMPDIR/$pkg"
179 done
181 rm -r "$TMPDIR"
183 else
184 # Option "--mirror" not given: process installed packages
186 # Check all pkg files.list in search match which specify the package
187 # name and the full path to the file(s).
188 for pkg in $INSTALLED/*; do
189 if grep -qs "$2" "$pkg/files.list"; then
190 newline
191 emsg "<c 33>$(_ 'Package %s:' "$pkg")</c>"
192 awk -vtmp="$TMPLIST" -vfile="$2" -vcfile="$(colorize 32 $2)" '
193 BEGIN { efile = gensub("\+", "\\\+", "g", file); }
194 index($0, file) {
195 gsub(efile, cfile);
196 print " "$0;
197 printf "1" >> tmp;
198 }
199 ' "$pkg/files.list"
200 fi
201 done
203 fi
205 num=$(wc -m < "$TMPLIST"); rm "$TMPLIST"
206 footer "$(_p '%s file' '%s files' "$num" \
207 "$(colorize 32 "$num")")"
208 ;;
210 file2)
211 # Search for a package name
213 # Input: file_name pattern (part of file name)
214 # Output: list of available packages with matched filenames by file_name pattern
216 title 'Search result for package "%s"' "$2"
218 # Search for a file on mirror and output only the package name
219 TMPLIST=$(mktemp)
220 for i in $PKGS_DB/files.list.lzma $PKGS_DB/undigest/*/files.list.lzma; do
221 [ -f "$i" ] || continue
222 lzcat "$i" | awk -F: -vT="$TMPLIST" -vterm="$2" '
223 BEGIN { P = "" }
224 index($2, term) {
225 if ($1 != P) {
226 print $1;
227 printf "1" >> T;
228 P = $1
229 }
230 }'
231 done
232 match=$(wc -m < "$TMPLIST")
233 rm "$TMPLIST"
235 footer "$(emsg "$(_p '%s package' '%s packages' "$match" \
236 "<c 32>$match</c>")")"
237 ;;
238 esac