spk view lib/libspk.sh @ rev 52

libspk.sh: full_package can be more efficient
author Christophe Lincoln <pankso@slitaz.org>
date Thu May 17 10:07:40 2012 +0200 (2012-05-17)
parents e7b29fd4da64
children 917a909ee92b
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 installed="${root}${PKGS_DB}/installed"
16 pkgsdesc="${root}${PKGS_DB}/packages.desc"
17 pkgsmd5="${root}${PKGS_DB}/packages.$SUM"
18 # ????do we need packages.equiv????
19 blocked="${root}${PKGS_DB}/blocked.list"
20 activity="${root}${PKGS_DB}/activity"
22 #
23 # Sanity checks
24 #
26 if [ ! -d "${root}${PKGS_DB}" ]; then
27 gettext "Can't find DB:"; echo " ${root}${PKGS_DB}"
28 exit 1
29 fi
31 #
32 # Functions
33 #
35 # Display receipt information. Expects a receipt to be sourced
36 receipt_info() {
37 cat << EOT
38 $(gettext "Version :") ${VERSION}${EXTRAVERSION}
39 $(gettext "Short desc :") $SHORT_DESC
40 $(gettext "Category :") $CATEGORY
41 EOT
42 }
44 # Extract receipt from tazpkg
45 # Parameters: result_dir package_file
46 extract_receipt() {
47 local dir="$1"
48 local file="$2"
49 cd "$dir"
50 { cpio --quiet -i receipt > /dev/null 2>&1; } < $file
51 cd - >/dev/null
52 }
54 # Used by: list
55 count_installed() {
56 local count=$(ls $installed | wc -l)
57 gettext "Installed :"; echo " $count"
58 }
60 # Used by: list
61 count_mirrored() {
62 local count=$(cat $pkgsmd5 | wc -l)
63 gettext "Mirrored :"; echo " $count"
64 }
66 is_package_mirrored() {
67 local name=$1
68 local occurance=$(fgrep "$name |" $pkgsdesc)
69 [ -n "$occurance" ]
70 }
72 # Download a file trying all mirrors
73 # Parameters: package/file
74 download() {
75 local package=$1
76 local mirror="$(cat $mirrorurl)"
77 case "$package" in
78 *.tazpkg)
79 echo "${mirror%/}/$package"
80 wget -c ${mirror%/}/$package ;;
81 esac
82 if [ ! -f "$package" ]; then
83 gettext "ERROR: Missing package $package"; newline
84 newline && exit 1
85 fi
86 }
88 # Assume package name is valid
89 full_package() {
90 IFS="|"
91 local line="$(grep "^$1 |" $pkgsdesc)"
92 echo $line | busybox awk '{print $1 "-" $2}'
93 unset IFS
94 }
96 # Check if a package is already installed.
97 # Usage: check_installed package
98 check_installed() {
99 local name="$1"
100 if [ -d "$installed/$name" ]; then
101 echo $(boldify "$name") $(gettext "package is already installed")
102 continue
103 fi
104 }
106 # get an already installed package from packages.equiv TODO REDO!
107 equivalent_pkg() {
108 for i in $(grep -hs "^$1=" ${root}${PKGS_DB}/packages.equiv \
109 ${root}${PKGS_DB}/undigest/*/packages.equiv | sed "s/^$1=//")
110 do
111 if echo $i | fgrep -q : ; then
112 # format 'alternative:newname'
113 # if alternative is installed then substitute newname
114 if [ -f $installed/${i%:*}/receipt ]; then
115 # substitute package dependancy
116 echo ${i#*:}
117 return
118 fi
119 else
120 # if alternative is installed then nothing to install
121 if [ -f $installed/$i/receipt ]; then
122 # substitute installed package
123 echo $i
124 return
125 fi
126 fi
127 done
128 # if not found in packages.equiv then no substitution
129 echo $1
130 }
132 # Check for missing deps listed in a receipt packages.
133 # Parameters: package dependencies
134 missing_deps() {
135 local package="$1"
136 shift 1
137 local depends="$@"
139 local deps=0
140 local missing
142 # Calculate missing dependencies
143 for pkgorg in $depends; do
144 local pkg=$(equivalent_pkg $pkgorg)
145 if [ ! -d "$installed/$pkg" ]; then
146 gettext "Missing:"; echo " $pkg"
147 deps=$(($deps+1))
148 elif [ ! -f "$installed/$pkg/receipt" ]; then
149 gettext "WARNING: Dependency loop between \$package and \$pkg."; newline
150 fi
151 done
153 gettext "Missing dependendcies:"; echo " $(colorize "$deps" 34)"
155 # Return true if missing deps
156 [ "$deps" != "0" ]
157 }
159 grepesc() {
160 sed 's/\[/\\[/g'
161 }
163 # Check for ELF file
164 is_elf() {
165 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
166 }