spk view lib/libspk.sh @ rev 72

libspk.sh: Better to check for installed receipt file then just the folder. In chroot sometimes the package folder in $installed still exists. This shouldn't break anything anyways.
author Christopher Rogers <slaxemulator@gmail.com>
date Sat May 19 11:35:38 2012 +0000 (2012-05-19)
parents f6b0c7cd8d16
children ebb6a2a148db
line source
1 #!/bin/sh
2 #
3 # Libspk - The Spk base function and internal variables used by almost all
4 # spk-tools. Read the README before adding or modifing any code in spk!
5 #
6 # Copyright (C) SliTaz GNU/Linux - BSD License
7 # Author: See AUTHORS files
8 #
9 . /lib/libtaz.sh
10 . /usr/lib/slitaz/libpkg.sh
11 . /etc/slitaz/slitaz.conf
13 # Internal variables.
14 mirrorurl="${root}${PKGS_DB}/mirror"
15 mirrors="${root}${PKGS_DB}/mirrors"
16 installed="${root}${PKGS_DB}/installed"
17 pkgsdesc="${root}${PKGS_DB}/packages.desc"
18 pkgsmd5="${root}${PKGS_DB}/packages.$SUM"
19 pkgsequiv="${root}${PKGS_DB}/packages.equiv"
20 blocked="${root}${PKGS_DB}/blocked.list"
21 activity="${root}${PKGS_DB}/activity"
22 logdir="${root}/var/log/spk"
23 extradb="${root}${PKGS_DB}/extra"
24 tmpdir="/tmp/spk/$RANDOM"
26 #
27 # Sanity checks
28 #
30 if [ ! -d "${root}${PKGS_DB}" ]; then
31 gettext "Can't find DB:"; echo " ${root}${PKGS_DB}"
32 exit 1
33 fi
35 #
36 # Functions
37 #
39 # Display receipt information. Expects a receipt to be sourced
40 receipt_info() {
41 cat << EOT
42 $(gettext "Version :") ${VERSION}${EXTRAVERSION}
43 $(gettext "Short desc :") $SHORT_DESC
44 $(gettext "Category :") $CATEGORY
45 EOT
46 }
48 # Display package info from a packages.desc list
49 # Usage: read_pkgsdesc /path/to/packages.desc
50 read_pkgsdesc() {
51 local list="$1"
52 IFS="|"
53 cat $list | while read package version desc category
54 do
55 if [ "$short" ]; then
56 echo -n "$(colorize 32 "$package")"; indent 28 " $version"
57 else
58 newline
59 gettext "Package :"; colorize 32 " $package"
60 gettext "Version :"; echo "$version"
61 gettext "Short desc :"; echo "$desc"
62 fi
63 done && unset IFS
64 }
66 # Extract receipt from tazpkg
67 # Parameters: result_dir package_file
68 extract_receipt() {
69 local dir="$1"
70 local file="$2"
71 cd "$dir"
72 { cpio --quiet -i receipt > /dev/null 2>&1; } < $file
73 cd - >/dev/null
74 }
76 # Extract files.list from tazpkg
77 # Parameters: result_dir package_file
78 extract_fileslist() {
79 local dir="$1"
80 local file="$2"
81 cd "$dir"
82 { cpio --quiet -i files.list > /dev/null 2>&1; } < $file
83 cd - >/dev/null
84 }
86 is_package_installed() {
87 [ -f "$installed/$1/receipt" ]
88 }
90 # Used by: list
91 count_installed() {
92 local count=$(ls $installed | wc -l)
93 gettext "Installed :"; echo " $count"
94 }
96 # Used by: list
97 count_mirrored() {
98 [ -f "$pkgsmd5" ] || return
99 local count=$(cat $pkgsmd5 | wc -l)
100 gettext "Mirrored :"; echo " $count"
101 }
103 # Check if package is on main or extra mirror.
104 mirrored_pkg() {
105 local name=$1
106 #local find=$(grep "^$name |" $pkgsdesc $extradb/*/*.desc 2>/dev/null)
107 for desc in $(find $extradb $pkgsdesc -name packages.desc); do
108 if grep -q "^$name |" $desc; then
109 db=$(dirname $desc)
110 mirrored=$(grep "^$name |" $desc)
111 mirror=$(cat $db/mirror)
112 break
113 fi
114 done
115 }
117 # Check if the download was sane
118 check_download() {
119 debug "check_download: $file"
120 if ! tail -c 2k $file | fgrep -q 00000000TRAILER; then
121 gettext "Continuing download of:"; echo " $file"
122 download "$file" $mirror
123 fi
124 # Check that the package has the correct checksum
125 local msum=$(fgrep " $package_full" $pkgsmd5)
126 local sum=$($CHECKSUM $file)
127 debug "mirror $SUM : $msum"
128 debug "local $SUM : $sum"
129 if [ "$sum" != "$msum" ]; then
130 rm -f $file && download "$file" $mirror
131 fi
132 }
134 # Download a file trying all mirrors
135 # Usage: file [url|path]
136 #
137 # Priority to extra is done by mirrored_pkg wich try first to find the
138 # packages in extra mirror, then on official.
139 #
140 download() {
141 local file=$1
142 local uri="${2%/}"
143 local pwd=$(pwd)
144 [ "$quiet" ] && local quiet="-q"
145 [ "$cache" ] && local pwd=$CACHE_DIR
146 [ "$get" ] || local pwd=$CACHE_DIR
147 [ "$forced" ] && rm -f $pwd/$file
148 debug "download file: $file"
149 debug "DB: $db"
150 # Local mirror ? End by cd to cache, we may be installind. If --get
151 # was used we dl/copy in the current dir.
152 if [ -f "$uri/$file" ]; then
153 [ "$verbose" ] && echo "URI: $uri/"
154 gettext "Using local mirror:"; boldify " $file"
155 [ "$verbose" ] && (gettext "Copying file to:"; colorize 34 " $pwd")
156 cp -f $uri/$file $pwd
157 cd $pwd && return 0
158 fi
159 # In cache ? Root can use --cache to set destdir.
160 if [ -f "$CACHE_DIR/$file" ]; then
161 gettext "Using cache:"; colorize 34 " ${file%.tazpkg}"
162 return 0
163 else
164 [ "$verbose" ] && echo "URL: $uri/"
165 if [ "$db" == "$PKGS_DB" ]; then
166 gettext "Using official mirror:"
167 else
168 gettext "Using extra mirror:"
169 fi
170 boldify " $file"
171 [ "$verbose" ] && (gettext "Destination:"; colorize 34 " $pwd")
172 if [ -f "$pwd/$file" ]; then
173 echo "File exist: $pwd/$file" && return 0
174 fi
175 # TODO: be a spider with wget -s to check if package is on mirror,
176 # if not try all official mirrors ?
177 wget $quiet -c $uri/$file -O $CACHE_DIR/$file
178 cd $CACHE_DIR && check_download
179 fi
180 # Be sure the file was fetched.
181 if [ ! -f "$pwd/$file" ] || [ ! -f "$CACHE_DIR/$file" ]; then
182 gettext "ERROR: Missing file:"; colorize 31 " $file"
183 newline && exit 1
184 fi
185 }
187 # Extract .tazpkg cpio archive into a directory.
188 # Parameters: package_file results_directory
189 extract_package() {
190 local package_file=$1
191 local target_dir=$2
193 # Validate the file
194 check_valid_tazpkg $package_file
196 # Find the package name
197 local package_name=$(package_name $package_file)
199 # Create destination directory
200 local dest_dir=$(pwd)/$package_name
201 [ -n "$target_dir" ] && dest_dir=$target_dir/$package_name
202 mkdir -p $dest_dir
204 newline
205 echo $(boldify $(gettext "Extracting:")) $package_name
206 separator
208 gettext "Copying original package..."
209 cp $package_file $dest_dir
210 status
212 cd $dest_dir
213 size=$(du -sh $package_file | sed s/$package_file//)
214 echo -n $(gettext "Extracting archive"): $size
215 cpio -idm --quiet < ${package_file##*/}
216 rm -f ${package_file##*/}
217 unlzma -c fs.cpio.lzma | cpio -idm --quiet
218 rm fs.cpio.lzma
219 status
220 cd - > /dev/null
222 separator
223 echo -n "$package_name"
224 gettext "is extracted to:"; echo " $dest_dir"
225 newline
226 }
228 # Unser var set by mirrored_pkg
229 unset_mirrored() {
230 unset mirrored mirror db pwd
231 }
233 # Return the full package name, search in all packages.desc and break when
234 # first occurance is found: Usage: full_package pkgname
235 full_package() {
236 for desc in $(find $extradb $pkgsdesc -name packages.desc); do
237 local line="$(grep "^$1 |" $desc)"
238 if grep -q "^$1 |" $desc; then
239 IFS="|"
240 echo $line | busybox awk '{print $1 "-" $2 ".tazpkg"}'
241 unset IFS && break
242 fi
243 done
244 }
246 # Check if a package is already installed.
247 # Usage: check_installed package
248 check_installed() {
249 local name="$1"
250 if [ -d "$installed/$name" ]; then
251 echo $(boldify "$name") $(gettext "package is already installed")
252 [ "$forced" ] || rm -rf $tmpdir
253 continue
254 fi
255 }
257 # get an already installed package from packages.equiv TODO REDO!
258 equivalent_pkg() {
259 for i in $(grep -hs "^$1=" $pkgsequiv $extradb/*/*.equiv | sed "s/^$1=//")
260 do
261 if echo $i | fgrep -q : ; then
262 # format 'alternative:newname'
263 # if alternative is installed then substitute newname
264 if [ -f $installed/${i%:*}/receipt ]; then
265 # substitute package dependancy
266 echo ${i#*:}
267 return
268 fi
269 else
270 # if alternative is installed then nothing to install
271 if [ -f $installed/$i/receipt ]; then
272 # substitute installed package
273 echo $i
274 return
275 fi
276 fi
277 done
278 # if not found in packages.equiv then no substitution
279 echo $1
280 }
282 # Check for missing deps listed in a receipt packages.
283 # Parameters: package dependencies
284 missing_deps() {
285 local package="$1"
286 shift 1
287 local depends="$@"
289 local deps=0
290 local missing
292 # Calculate missing dependencies
293 for pkgorg in $depends; do
294 local pkg=$(equivalent_pkg $pkgorg)
295 if [ ! -d "$installed/$pkg" ]; then
296 gettext "Missing:"; echo " $pkg"
297 deps=$(($deps+1))
298 elif [ ! -f "$installed/$pkg/receipt" ]; then
299 gettext "WARNING: Dependency loop between:"; newline
300 echo " $package --> $pkg"
301 fi
302 done
304 gettext "Missing dependencies:"; echo " $(colorize 34 "$deps")"
306 # Return true if missing deps
307 [ "$deps" != "0" ]
308 }
310 grepesc() {
311 sed 's/\[/\\[/g'
312 }
314 # Check for ELF file
315 is_elf() {
316 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
317 }
319 # Exec functions directly for developement purpose.
320 case $1 in
321 *_*) func=$1 && shift && $func $@ ;;
322 esac