spk annotate lib/libspk.sh @ rev 30

spk-add: some colors, improvments, usage
author Christophe Lincoln <pankso@slitaz.org>
date Tue May 15 19:35:44 2012 +0200 (2012-05-15)
parents 19f1b93fd7d8
children bb5a37f13ad6
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@17 17 pkgsmd5="${root}${PKGS_DB}/packages.md5"
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@14 68 local occurance=$(cat $pkgsdesc | grep "$name ")
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
meshca@11 82 }
meshca@11 83
pankso@19 84 # Assume package name is valid
meshca@11 85 # There may be a more efficient way to do this...
meshca@11 86 full_package() {
pankso@14 87 local name=$1
pankso@14 88 local occurance=$(cat $pkgsdesc | grep "$name ")
meshca@11 89 local count=0
meshca@11 90 for i in $(echo $occurance | tr "|" "\n"); do
meshca@11 91 if [ $count -eq 1 ]; then
pankso@14 92 echo $name-$i && return
meshca@11 93 fi
meshca@11 94 count=$(($count+1))
meshca@11 95 done
meshca@11 96 }
meshca@11 97
meshca@11 98 # Check if a package is already installed.
pankso@27 99 # Usage: check_installed package
pankso@27 100 check_installed() {
pankso@14 101 local name="$1"
pankso@18 102 if [ -d "$installed/$name" ]; then
pankso@30 103 echo $(boldify "$name") $(gettext "package is already installed")
pankso@28 104 continue
meshca@11 105 fi
meshca@11 106 }
meshca@11 107
meshca@11 108 # get an already installed package from packages.equiv TODO REDO!
meshca@9 109 equivalent_pkg() {
pankso@14 110 for i in $(grep -hs "^$1=" ${root}${PKGS_DB}/packages.equiv \
pankso@14 111 ${root}${PKGS_DB}/undigest/*/packages.equiv | sed "s/^$1=//")
meshca@9 112 do
meshca@9 113 if echo $i | fgrep -q : ; then
meshca@9 114 # format 'alternative:newname'
meshca@9 115 # if alternative is installed then substitute newname
pankso@18 116 if [ -f $installed/${i%:*}/receipt ]; then
meshca@9 117 # substitute package dependancy
meshca@9 118 echo ${i#*:}
meshca@9 119 return
meshca@9 120 fi
meshca@9 121 else
meshca@9 122 # if alternative is installed then nothing to install
pankso@18 123 if [ -f $installed/$i/receipt ]; then
meshca@9 124 # substitute installed package
meshca@9 125 echo $i
meshca@9 126 return
meshca@9 127 fi
meshca@9 128 fi
meshca@9 129 done
meshca@9 130 # if not found in packages.equiv then no substitution
meshca@9 131 echo $1
meshca@9 132 }
meshca@9 133
meshca@9 134 # Check for missing deps listed in a receipt packages.
meshca@9 135 # Parameters: package dependencies
meshca@9 136 missing_deps() {
meshca@9 137 local package="$1"
meshca@9 138 shift 1
meshca@9 139 local depends="$@"
pankso@10 140
meshca@9 141 local deps=0
meshca@9 142 local missing
pankso@10 143
paul@12 144 # Calculate missing dependencies
meshca@9 145 for pkgorg in $depends; do
meshca@9 146 local pkg=$(equivalent_pkg $pkgorg)
pankso@18 147 if [ ! -d "$installed/$pkg" ]; then
pankso@30 148 gettext "Missing:"; echo " $pkg"
meshca@9 149 deps=$(($deps+1))
pankso@18 150 elif [ ! -f "$installed/$pkg/receipt" ]; then
meshca@9 151 gettext "WARNING Dependency loop between \$package and \$pkg."; newline
meshca@9 152 fi
meshca@9 153 done
meshca@11 154 if [ $deps -gt 0 ]; then
meshca@11 155 echo $deps $(gettext "missing package(s) to install.")
meshca@11 156 fi
pankso@14 157
pankso@30 158 echo -n "$(colorize "$deps" 34) "
pankso@30 159 gettext "missing dep(s) to install."; newline
pankso@10 160
meshca@9 161 # Return true if missing deps
meshca@9 162 [ "$deps" != "0" ]
meshca@9 163 }
meshca@11 164
meshca@11 165 grepesc() {
meshca@11 166 sed 's/\[/\\[/g'
meshca@11 167 }
meshca@11 168
pankso@27 169 # Check for ELF file
pankso@27 170 is_elf() {
pankso@27 171 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
pankso@27 172 }