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