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