spk annotate 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
rev   line source
pankso@5 1 #!/bin/sh
pankso@5 2 #
paul@12 3 # Libspk - The Spk base function and internal variables used by almost all
pankso@5 4 # spk-tools. Read the README before adding or modifing any code in spk!
pankso@5 5 #
pankso@5 6 # Copyright (C) SliTaz GNU/Linux - BSD License
pankso@5 7 # Author: See AUTHORS files
pankso@5 8 #
pankso@5 9 . /lib/libtaz.sh
pankso@5 10 . /usr/lib/slitaz/libpkg.sh
pankso@5 11 . /etc/slitaz/slitaz.conf
pankso@5 12
pankso@5 13 # Internal variables.
pankso@17 14 mirrorurl="${root}${PKGS_DB}/mirror"
pankso@17 15 installed="${root}${PKGS_DB}/installed"
pankso@17 16 pkgsdesc="${root}${PKGS_DB}/packages.desc"
pankso@32 17 pkgsmd5="${root}${PKGS_DB}/packages.$SUM"
meshca@11 18 # ????do we need packages.equiv????
pankso@19 19 blocked="${root}${PKGS_DB}/blocked.list"
pankso@17 20 activity="${root}${PKGS_DB}/activity"
pankso@5 21
pankso@5 22 #
pankso@19 23 # Sanity checks
pankso@19 24 #
pankso@19 25
pankso@19 26 if [ ! -d "${root}${PKGS_DB}" ]; then
pankso@19 27 gettext "Can't find DB:"; echo " ${root}${PKGS_DB}"
pankso@19 28 exit 1
pankso@19 29 fi
pankso@19 30
pankso@19 31 #
pankso@5 32 # Functions
pankso@18 33 #
meshca@11 34
pankso@14 35 # Display receipt information. Expects a receipt to be sourced
pankso@5 36 receipt_info() {
pankso@5 37 cat << EOT
pankso@5 38 $(gettext "Version :") ${VERSION}${EXTRAVERSION}
pankso@5 39 $(gettext "Short desc :") $SHORT_DESC
pankso@5 40 $(gettext "Category :") $CATEGORY
pankso@5 41 EOT
pankso@5 42 }
pankso@5 43
meshca@9 44 # Extract receipt from tazpkg
meshca@9 45 # Parameters: result_dir package_file
meshca@9 46 extract_receipt() {
meshca@9 47 local dir="$1"
meshca@9 48 local file="$2"
pankso@26 49 cd "$dir"
meshca@9 50 { cpio --quiet -i receipt > /dev/null 2>&1; } < $file
pankso@26 51 cd - >/dev/null
meshca@9 52 }
meshca@9 53
pankso@5 54 # Used by: list
pankso@5 55 count_installed() {
pankso@18 56 local count=$(ls $installed | wc -l)
pankso@19 57 gettext "Installed :"; echo " $count"
pankso@5 58 }
pankso@5 59
pankso@5 60 # Used by: list
pankso@5 61 count_mirrored() {
meshca@9 62 local count=$(cat $pkgsmd5 | wc -l)
pankso@19 63 gettext "Mirrored :"; echo " $count"
pankso@5 64 }
meshca@9 65
meshca@11 66 is_package_mirrored() {
pankso@14 67 local name=$1
pankso@52 68 local occurance=$(fgrep "$name |" $pkgsdesc)
meshca@11 69 [ -n "$occurance" ]
meshca@11 70 }
meshca@11 71
meshca@11 72 # Download a file trying all mirrors
meshca@11 73 # Parameters: package/file
meshca@11 74 download() {
meshca@11 75 local package=$1
meshca@11 76 local mirror="$(cat $mirrorurl)"
meshca@11 77 case "$package" in
meshca@11 78 *.tazpkg)
meshca@11 79 echo "${mirror%/}/$package"
pankso@14 80 wget -c ${mirror%/}/$package ;;
meshca@11 81 esac
pankso@50 82 if [ ! -f "$package" ]; then
pankso@52 83 gettext "ERROR: Missing package $package"; newline
pankso@52 84 newline && exit 1
pankso@50 85 fi
meshca@11 86 }
meshca@11 87
pankso@19 88 # Assume package name is valid
meshca@11 89 full_package() {
pankso@52 90 IFS="|"
pankso@52 91 local line="$(grep "^$1 |" $pkgsdesc)"
pankso@52 92 echo $line | busybox awk '{print $1 "-" $2}'
pankso@52 93 unset IFS
meshca@11 94 }
meshca@11 95
meshca@11 96 # Check if a package is already installed.
pankso@27 97 # Usage: check_installed package
pankso@27 98 check_installed() {
pankso@14 99 local name="$1"
pankso@18 100 if [ -d "$installed/$name" ]; then
pankso@30 101 echo $(boldify "$name") $(gettext "package is already installed")
pankso@28 102 continue
meshca@11 103 fi
meshca@11 104 }
meshca@11 105
meshca@11 106 # get an already installed package from packages.equiv TODO REDO!
meshca@9 107 equivalent_pkg() {
pankso@14 108 for i in $(grep -hs "^$1=" ${root}${PKGS_DB}/packages.equiv \
pankso@14 109 ${root}${PKGS_DB}/undigest/*/packages.equiv | sed "s/^$1=//")
meshca@9 110 do
meshca@9 111 if echo $i | fgrep -q : ; then
meshca@9 112 # format 'alternative:newname'
meshca@9 113 # if alternative is installed then substitute newname
pankso@18 114 if [ -f $installed/${i%:*}/receipt ]; then
meshca@9 115 # substitute package dependancy
meshca@9 116 echo ${i#*:}
meshca@9 117 return
meshca@9 118 fi
meshca@9 119 else
meshca@9 120 # if alternative is installed then nothing to install
pankso@18 121 if [ -f $installed/$i/receipt ]; then
meshca@9 122 # substitute installed package
meshca@9 123 echo $i
meshca@9 124 return
meshca@9 125 fi
meshca@9 126 fi
meshca@9 127 done
meshca@9 128 # if not found in packages.equiv then no substitution
meshca@9 129 echo $1
meshca@9 130 }
meshca@9 131
meshca@9 132 # Check for missing deps listed in a receipt packages.
meshca@9 133 # Parameters: package dependencies
meshca@9 134 missing_deps() {
meshca@9 135 local package="$1"
meshca@9 136 shift 1
meshca@9 137 local depends="$@"
pankso@10 138
meshca@9 139 local deps=0
meshca@9 140 local missing
pankso@10 141
paul@12 142 # Calculate missing dependencies
meshca@9 143 for pkgorg in $depends; do
meshca@9 144 local pkg=$(equivalent_pkg $pkgorg)
pankso@18 145 if [ ! -d "$installed/$pkg" ]; then
pankso@30 146 gettext "Missing:"; echo " $pkg"
meshca@9 147 deps=$(($deps+1))
pankso@18 148 elif [ ! -f "$installed/$pkg/receipt" ]; then
pankso@39 149 gettext "WARNING: Dependency loop between \$package and \$pkg."; newline
meshca@9 150 fi
meshca@9 151 done
pankso@14 152
pankso@39 153 gettext "Missing dependendcies:"; echo " $(colorize "$deps" 34)"
pankso@10 154
meshca@9 155 # Return true if missing deps
meshca@9 156 [ "$deps" != "0" ]
meshca@9 157 }
meshca@11 158
meshca@11 159 grepesc() {
meshca@11 160 sed 's/\[/\\[/g'
meshca@11 161 }
meshca@11 162
pankso@27 163 # Check for ELF file
pankso@27 164 is_elf() {
pankso@27 165 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
pankso@27 166 }