spk view lib/libspk.sh @ rev 65

Less verbose on extract but show package size, add comments to download() and enbale --quiet mode
author Christophe Lincoln <pankso@slitaz.org>
date Fri May 18 03:48:08 2012 +0200 (2012-05-18)
parents d0fa46ea46bd
children 63fb720dc777
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 "$package" 32)"; indent 28 " $version"
57 else
58 newline
59 gettext "Package :"; colorize " $package" 32
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 # Used by: list
87 count_installed() {
88 local count=$(ls $installed | wc -l)
89 gettext "Installed :"; echo " $count"
90 }
92 # Used by: list
93 count_mirrored() {
94 [ -f "$pkgsmd5" ] || return
95 local count=$(cat $pkgsmd5 | wc -l)
96 gettext "Mirrored :"; echo " $count"
97 }
99 # Check if package is on main or extra mirror.
100 mirrored_pkg() {
101 local name=$1
102 local occurance=$(grep "^$name |" $pkgsdesc)
103 [ -n "$occurance" ]
104 }
106 # Download a file trying all mirrors
107 # Parameters: package/file
108 #
109 # We should do much better here, give priority to extra, then try
110 # main mirror, then try others official mirrors. The case $file is
111 # not needed since we use same URL for list or packages.
112 #
113 download() {
114 local file=$1
115 local mirror="$(cat $mirrorurl)"
116 [ "$quiet" ] && local quiet="-q"
117 case "$file" in
118 *.tazpkg)
119 [ "$quiet" ] || echo "URL: ${mirror%/}/"
120 gettext "Downloading:"; boldify " $file"
121 wget $quiet -c ${mirror%/}/$file
122 if [ ! -f "$file" ]; then
123 gettext "ERROR: Missing package:"; boldify "$package"
124 newline && exit 1
125 fi ;;
126 ID|packages.*|files.list.lzma)
127 echo "TODO" ;;
128 esac
129 }
131 # Assume package name is valid
132 full_package() {
133 IFS="|"
134 local line="$(grep "^$1 |" $pkgsdesc)"
135 echo $line | busybox awk '{print $1 "-" $2}'
136 unset IFS
137 }
139 # Check if a package is already installed.
140 # Usage: check_installed package
141 check_installed() {
142 local name="$1"
143 if [ -d "$installed/$name" ]; then
144 echo $(boldify "$name") $(gettext "package is already installed")
145 [ "$forced" ] || rm -rf $tmpdir
146 continue
147 fi
148 }
150 # get an already installed package from packages.equiv TODO REDO!
151 equivalent_pkg() {
152 for i in $(grep -hs "^$1=" $pkgsequiv \
153 $extradb/*/packages.equiv | sed "s/^$1=//")
154 do
155 if echo $i | fgrep -q : ; then
156 # format 'alternative:newname'
157 # if alternative is installed then substitute newname
158 if [ -f $installed/${i%:*}/receipt ]; then
159 # substitute package dependancy
160 echo ${i#*:}
161 return
162 fi
163 else
164 # if alternative is installed then nothing to install
165 if [ -f $installed/$i/receipt ]; then
166 # substitute installed package
167 echo $i
168 return
169 fi
170 fi
171 done
172 # if not found in packages.equiv then no substitution
173 echo $1
174 }
176 # Check for missing deps listed in a receipt packages.
177 # Parameters: package dependencies
178 missing_deps() {
179 local package="$1"
180 shift 1
181 local depends="$@"
183 local deps=0
184 local missing
186 # Calculate missing dependencies
187 for pkgorg in $depends; do
188 local pkg=$(equivalent_pkg $pkgorg)
189 if [ ! -d "$installed/$pkg" ]; then
190 gettext "Missing:"; echo " $pkg"
191 deps=$(($deps+1))
192 elif [ ! -f "$installed/$pkg/receipt" ]; then
193 gettext "WARNING: Dependency loop between:"; newline
194 echo " $package --> $pkg"
195 fi
196 done
198 gettext "Missing dependencies:"; echo " $(colorize "$deps" 34)"
200 # Return true if missing deps
201 [ "$deps" != "0" ]
202 }
204 grepesc() {
205 sed 's/\[/\\[/g'
206 }
208 # Check for ELF file
209 is_elf() {
210 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
211 }