tazpkg annotate modules/install @ rev 846

Remove "busybox" "prefixes" (thanks llev)
We used "busybox wget", etc. to be sure we called Busybox's "wget", not any other "wget". Workaround already done in "getenv" module.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Oct 09 13:14:01 2015 +0300 (2015-10-09)
parents ce7009ff237b
children 21ac83abe572
rev   line source
al@844 1 #!/bin/sh
al@844 2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
al@844 3 # install - TazPkg module
al@844 4 # Install packages
al@844 5
al@844 6
al@844 7 # Connect function libraries
al@844 8 . /lib/libtaz.sh
al@844 9 . /usr/lib/slitaz/libpkg.sh
al@844 10
al@844 11
al@844 12 # Get TazPkg working environment
al@844 13 . @@MODULES@@/getenv
al@844 14 # $CACHE_DIR will change, it based on unchanged value of $SAVE_CACHE_DIR
al@844 15 SAVE_CACHE_DIR="$CACHE_DIR"
al@844 16
al@844 17
al@844 18 . @@MODULES@@/find-depends
al@844 19
al@844 20
al@844 21
al@844 22
al@844 23 # Log TazPkg activity
al@844 24
al@844 25 log_pkg() {
al@844 26 debug "\nlog_pkg('$1')\n PACKAGE='$PACKAGE'\n VERSION='$VERSION'\n EXTRAVERSION='$EXTRAVERSION'"
al@844 27
al@844 28 local extra
al@844 29
al@844 30 [ "$1" == 'Installed' ] && \
al@844 31 extra=" - $(fgrep " $PACKAGE-$VERSION" "$PKGS_DB/installed.$SUM" | awk '{print $1}')"
al@844 32 debug " extra='$extra'"
al@844 33
al@844 34 [ -w "$LOG" ] &&
al@844 35 echo "$(date +'%F %T') - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG
al@844 36 }
al@844 37
al@844 38
al@844 39 # get an already installed package from packages.equiv
al@844 40
al@844 41 equivalent_pkg() {
al@844 42 # input: $1 = package name (like "nano")
al@844 43 local i rep rules rule out
al@844 44
al@844 45 rules=$(for rep in $PRIORITY; do
al@844 46 grep -hs "^$1=" "$rep/packages.equiv"
al@844 47 done | sed "s|^$1=||")
al@844 48 debug " >rules='$rules'"
al@844 49
al@844 50 for rule in $rules; do
al@844 51 debug " >rule='$rule'"
al@844 52 case $rule in
al@844 53 *:*)
al@844 54 debug '-- x:x'
al@844 55 # format 'alternative:newname'
al@844 56 # if alternative is installed then substitute newname
al@844 57 out="${rule#*:}"
al@844 58 awk -F$'\t' -vp="${rule%:*}" '$1==p{exit 1}' "$PKGS_DB/installed.info" || break
al@844 59 debug '-- x:x /'
al@844 60 ;;
al@844 61 *)
al@844 62 debug '-- x'
al@844 63 # unconditional substitution
al@844 64 out="$rule"
al@844 65 awk -F$'\t' -vp="$rule" '$1==p{exit 1}' "$PKGS_DB/installed.info" || break
al@844 66 debug '-- x /'
al@844 67 ;;
al@844 68 esac
al@844 69 unset out
al@844 70 done
al@844 71 debug '--'
al@844 72 # if not found in packages.equiv then no substitution
al@844 73 echo "${out:-$1}"
al@844 74 }
al@844 75
al@844 76
al@844 77 # Check and install all missing deps.
al@844 78 # Auto install or ask user then install all missing deps from local dir, CD-ROM,
al@844 79 # media or from the mirror.
al@844 80
al@846 81 install_all_deps() {
al@844 82 # input: $1 = package file to check/install missing dependencies
al@844 83 # ROOT READY
al@844 84 # dep: equivalent_pkg.
al@844 85
al@844 86 debug "\ninstall_all_deps('$1')"
al@844 87
al@844 88 local TMP_DIR DEPENDS num missing_packages equiv pkg answer dir found pkgfile
al@844 89
al@844 90 # Check for missing deps listed in a receipt packages.
al@844 91
al@844 92 # Get the receipt's variable DEPENDS
al@844 93 DEPENDS=$(
al@844 94 TMP_DIR=$(mktemp -d); cd "$TMP_DIR"
al@844 95 cpio --quiet -i receipt >/dev/null 2>&1
al@844 96 . receipt; echo $DEPENDS
al@844 97 rm -rf "$TMP_DIR"
al@844 98 ) < "$1"
al@844 99
al@844 100 unset num missing_packages
al@844 101 for depend in $DEPENDS; do
al@844 102 debug " depend='$depend'"
al@844 103 equiv=$(equivalent_pkg $depend)
al@844 104 debug " equiv='$equiv'\n"
al@844 105 if [ ! -d "$INSTALLED/$equiv" ]; then
al@844 106 missing_packages="$missing_packages $equiv"
al@844 107 num=$((num+1))
al@844 108 elif [ ! -f "$INSTALLED/$equiv/receipt" ]; then
al@844 109 _ 'WARNING! Dependency loop between "%s" and "%s".' "$PACKAGE" "$equiv"
al@844 110 fi
al@844 111 done
al@844 112
al@844 113 # Nothing to install, exit function
al@844 114 [ -z "$num" ] && return
al@844 115
al@844 116
al@844 117 title "$(_ 'Tracking dependencies for package "%s"' "$PACKAGE")"
al@844 118
al@844 119 # Individual messages for each missing package
al@844 120 for pkg in $missing_packages; do
al@844 121 _ 'Missing package "%s"' "$pkg"
al@844 122 done
al@844 123
al@844 124 footer "$(_p \
al@844 125 '%s missing package to install.' \
al@844 126 '%s missing packages to install.' "$num" \
al@844 127 "$num")"
al@844 128
al@844 129
al@844 130 if [ "$AUTO_INSTALL_DEPS" == 'yes' ]; then
al@844 131 answer=0
al@844 132 else
al@844 133 newline
al@844 134 confirm "$(_ 'Install all missing dependencies? (y/N)')"
al@844 135 answer=$?
al@844 136 newline
al@844 137 fi
al@844 138 debug " answer='$answer'"
al@844 139
al@844 140 dir="$(dirname "$1")"
al@844 141 debug " dir='$dir'"
al@844 142
al@844 143 # We can install packages from /home/boot/packages at a boot time
al@844 144 # Also we can prefer local packages over mirrored/cached using '--local' option
al@844 145 [ "$dir" == '/home/boot/packages' ] && local='yes'
al@844 146 debug " local='$local'"
al@844 147 [ -n "$local" ] && tazpkg mkdb "$dir" --forced >/dev/null
al@844 148
al@844 149
al@844 150 # "--nodeps" option prevents to install dependencies
al@844 151 if [ "$answer" -eq 0 -a -z "$nodeps" ]; then
al@844 152 debug " let's install missing packages"
al@844 153 for pkg in $missing_packages; do
al@844 154 debug " pkg='$pkg'"
al@844 155 if [ ! -d "$INSTALLED/$pkg" ]; then
al@844 156 # Package not installed
al@844 157
al@844 158 found='0'
al@844 159 # Prefer local packages
al@844 160 if [ -n "$local" ]; then
al@844 161 _ 'Checking if package "%s" exists in local list...' "$pkg"
al@844 162 pkgfile=$(awk -F$'\t' -vp="$pkg" '
al@844 163 $1==p{printf "%s-%s.tazpkg", $1, $2; exit 1}
al@844 164 ' "$dir/packages.info")
al@844 165 if [ -n "$pkgfile" ]; then
al@844 166 found='1'
al@844 167 tazpkg install "$dir/$pkgfile"
al@844 168 fi
al@844 169 fi
al@844 170 debug " found='$found'"
al@844 171
al@844 172 # Install package from the mirror
al@844 173 [ "$found" -eq 0 ] && tazpkg get-install "$pkg"
al@844 174 fi
al@844 175 done
al@844 176 else
al@844 177 # Answered 'No' to install dependencies, or '--nodeps' option given
al@844 178 newline
al@844 179 _ 'Leaving dependencies for package "%s" unresolved.' "$PACKAGE"
al@845 180 _ 'The package will be installed but will probably not work.'
al@844 181 newline
al@844 182 fi
al@844 183 }
al@844 184
al@844 185
al@844 186 # Extract a package with cpio and gzip/lzma.
al@844 187
al@844 188 extract_package() {
al@844 189 # input: $1 - path to package to be extracted; package should be in the current dir
al@844 190 # ROOT INDEPENDENT
al@844 191 action 'Extracting package...'
al@844 192
al@844 193 # Extract "outer layer": cpio; remove the original package file
al@844 194 cpio -idm --quiet < "$1" && rm -f "$1"
al@844 195
al@844 196 # "Inner layer" may vary
al@844 197 if [ -f fs.cpio.lzma ]; then
al@844 198 # "Plain" cpio.lzma
al@844 199 unlzma < fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma
al@844 200 elif [ -f fs.cpio.gz ]; then
al@844 201 # "Fast" cpio.gz (used to pack-then-install process in most of get-packages)
al@844 202 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz
al@844 203 fi
al@844 204
al@844 205 status
al@844 206 }
al@844 207
al@844 208
al@844 209 # Print short package description
al@844 210
al@844 211 print_short_description() {
al@844 212 # TODO: undigest repo support? priority...
al@844 213 # ROOT READY
al@844 214 local short_desc=''
al@844 215
al@844 216 # Try to find localized short description
al@844 217 for LC in $LANG ${LANG%_*}; do
al@844 218 [ -e "$PKGS_DB/packages-desc.$LC" ] &&
al@844 219 short_desc=$(awk -F$'\t' -vp="$1" '$1==p{print $2; exit}' "$PKGS_DB/packages-desc.$LC")
al@844 220 done
al@844 221
al@844 222 # Try to find short description for mirrored package
al@844 223 [ -z "$short_desc" -a -s "$PKGS_DB/packages.info" ] &&
al@844 224 short_desc=$(awk -F$'\t' -vp="$1" '$1==p{print $4; exit}' "$PKGS_DB/packages.info")
al@844 225
al@844 226 [ -z "$short_desc" ] && short_desc="$SHORT_DESC"
al@844 227
al@844 228 longline "$short_desc"
al@844 229 }
al@844 230
al@844 231
al@844 232 grepesc() {
al@844 233 sed 's/\[/\\[/g'
al@844 234 }
al@844 235
al@844 236
al@844 237
al@844 238
al@844 239 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 240
al@844 241 # Block of receipt function callers
al@844 242 # Why? "Bad" receipt sourcing can redefine some vital TazPkg variables.
al@844 243 # Few receipts function should be patched now.
al@844 244
al@844 245 # Input: $1 = path to the receipt to be processed
al@844 246
al@844 247 # Pre-install commands
al@844 248 call_pre_install() {
al@844 249 local tmp
al@844 250 if grep -q '^pre_install()' "$1"; then
al@844 251 action 'Execute pre-install commands...'
al@844 252 tmp="$(mktemp)"
al@844 253 cp "$1" "$tmp"
al@844 254 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp"
al@844 255 ( . "$tmp"; pre_install "$root" )
al@844 256 status
al@844 257 rm "$tmp"
al@844 258 fi
al@844 259
al@844 260 }
al@846 261 # Post-install commands
al@844 262 call_post_install() {
al@844 263 local tmp
al@844 264 if grep -q '^post_install()' "$1"; then
al@844 265 action 'Execute post-install commands...'
al@844 266 tmp="$(mktemp)"
al@844 267 cp "$1" "$tmp"
al@844 268 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp"
al@844 269 ( . "$tmp"; post_install "$root" )
al@844 270 status
al@844 271 rm "$tmp"
al@844 272 fi
al@844 273 }
al@844 274
al@844 275
al@844 276 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 277
al@844 278
al@844 279 # This function installs a package in the rootfs.
al@844 280
al@844 281 install_package() {
al@844 282 # input: $1 = path to package to be installed
al@844 283 # dep: install_all_deps, print_short_description, extract_package, grepesc.
al@844 284
al@844 285 debug "\ninstall_package('$1')"
al@844 286 local dir
al@844 287
al@844 288 PACKAGE_FILE="$1"
al@844 289 TMP_DIR="$(mktemp -d)"
al@844 290
al@844 291 # Get receipt's variables and functions
al@844 292 { cd "$TMP_DIR"; cpio --quiet -i receipt >/dev/null 2>&1; } < "$PACKAGE_FILE"
al@844 293 # Why next code? "Bad" receipt sourcing can redefine some vital TazPkg variables.
al@844 294 (
al@844 295 . "$TMP_DIR/receipt"
al@844 296 cat > "$TMP_DIR/receipt.var" <<EOT
al@844 297 PACKAGE="$PACKAGE"
al@844 298 VERSION="$VERSION"
al@844 299 EXTRAVERSION="$EXTRAVERSION"
al@844 300 CATEGORY="$CATEGORY"
al@844 301 SHORT_DESC="$SHORT_DESC"
al@844 302 WEB_SITE="$WEB_SITE"
al@844 303 TAGS="$TAGS"
al@844 304 DEPENDS="$DEPENDS"
al@844 305 CONFIG_FILES="$CONFIG_FILES"
al@844 306 PACKED_SIZE="$PACKED_SIZE"
al@844 307 UNPACKED_SIZE="$UNPACKED_SIZE"
al@844 308 EOT
al@844 309 rm "$TMP_DIR/receipt"
al@844 310 )
al@844 311 . "$TMP_DIR/receipt.var"
al@844 312
al@844 313
al@844 314 # Make sure folder exists on new installs or upgrades
al@844 315 mkdir -p "$INSTALLED/$PACKAGE"
al@844 316
al@844 317 # Keep "modifiers" and "files.list" on upgrade
al@844 318 find "$INSTALLED/$PACKAGE" -type f \( ! -name modifiers ! -name files.list \) -delete
al@844 319
al@844 320 # Update "installed.md5"
al@844 321 # TODO: discontinue using 'installed.md5'
al@844 322 touch "$PKGS_DB/installed.$SUM"
al@844 323 sed -i "/ $(basename "$PACKAGE_FILE")$/d" "$PKGS_DB/installed.$SUM" 2>/dev/null
al@844 324 cd "$(dirname "$PACKAGE_FILE")"
al@844 325 $CHECKSUM "$(basename "$PACKAGE_FILE")" >> "$PKGS_DB/installed.$SUM"
al@844 326
al@844 327 # Resolve package dependencies before package installation
al@844 328 install_all_deps "$PACKAGE_FILE"
al@844 329
al@844 330
al@844 331 # TODO: why this list-processed in the $PKGS_DB?
al@844 332 #[ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> "$PKGS_DB/$INSTALL_LIST-processed"
al@844 333
al@844 334 if [ -n "$sequence" ]; then
al@844 335 title 'Installation of package "%s" (%s)' "$PACKAGE" "$sequence"
al@844 336 else
al@844 337 title 'Installation of package "%s"' "$PACKAGE"
al@844 338 fi
al@844 339
al@844 340 print_short_description "$PACKAGE"
al@844 341 separator '-'
al@844 342
al@844 343 action 'Copying package...'
al@844 344 cp "$PACKAGE_FILE" "$TMP_DIR"
al@844 345 status
al@844 346
al@844 347 cd "$TMP_DIR"
al@844 348 extract_package "$(basename "$PACKAGE_FILE")"
al@844 349
al@844 350 # Include temporary receipt to get the right variables
al@844 351 . "$TMP_DIR/receipt.var"
al@844 352
al@844 353 cd "$INSTALLED"
al@844 354
al@844 355
al@844 356 # Get files to remove if upgrading
al@844 357 # IFS here modified temporarily for processing filenames with spaces
al@844 358 IFS=$'\n'
al@844 359 if [ -f "$PACKAGE/files.list" ]; then
al@844 360 while read file; do
al@844 361 grep -q "^$(echo "$file" | grepesc)$" "$TMP_DIR/files.list" && continue
al@844 362 for i in $(cat "$PACKAGE/modifiers" 2>/dev/null;
al@844 363 fgrep -sl "$PACKAGE" */modifiers | cut -d/ -f1); do
al@844 364 grep -qs "^$(echo "$file" | grepesc)$" "$i/files.list" && continue 2
al@844 365 done
al@844 366 echo "$file"
al@844 367 done < "$PACKAGE/files.list" > "$TMP_DIR/files2remove.list"
al@844 368 fi
al@844 369 unset IFS
al@844 370
al@844 371
al@844 372 # Remember modified packages
al@844 373 action 'Remember modified packages...'
al@844 374 {
al@844 375 check=false
al@844 376 # TODO: why '[' the special?
al@844 377 # FIXME: we have files with spaces in our packages!
al@844 378 for i in $(fgrep -v [ $TMP_DIR/files.list); do
al@844 379 [ -e "$root$i" ] || continue
al@844 380 [ -d "$root$i" ] && continue
al@844 381 echo "- $i"
al@844 382 check=true
al@844 383 done ;
al@844 384 $check && \
al@844 385 for i in *; do
al@844 386 [ "$i" == "$PACKAGE" ] && continue
al@844 387 [ -s "$i/files.list" ] || continue
al@844 388 awk "{ printf \"$i %s\\n\",\$1 }" < "$i/files.list"
al@844 389 done;
al@844 390 } | awk '
al@844 391 {
al@844 392 if ($1 == "-" || file[$2] != "") {
al@844 393 file[$2] = file[$2] " " $1
al@844 394 if ($1 != "-") {
al@844 395 if (pkg[$1] == "") all = all " " $1
al@844 396 pkg[$1] = pkg[$1] " " $2
al@844 397 }
al@844 398 }
al@844 399 }
al@844 400 END {
al@844 401 for (i = split(all, p, " "); i > 0; i--)
al@844 402 for (j = split(pkg[p[i]], f, " "); j > 0; j--)
al@844 403 printf "%s %s\n",p[i],f[j];
al@844 404 }
al@844 405 ' | while read dir file; do
al@844 406 if grep -qs "^$dir$" "$PACKAGE/modifiers"; then
al@844 407 # Do not overload an overloaded file !
al@844 408 rm "$TMP_DIR/$file" 2>/dev/null
al@844 409 continue
al@844 410 fi
al@844 411 grep -qs "^$PACKAGE$" "$dir/modifiers" && continue
al@844 412 if [ -s "$dir/volatile.cpio.gz" ]; then
al@844 413 # We can modify backed up files without notice
al@844 414 zcat "$dir/volatile.cpio.gz" | cpio -t --quiet | \
al@844 415 grep -q "^${file#/}$" && continue
al@844 416 fi
al@844 417 echo "$PACKAGE" >> "$dir/modifiers"
al@844 418 done
al@844 419 status
al@844 420
al@844 421
al@844 422 cd "$TMP_DIR"
al@844 423 # Copy receipt, etc.
al@844 424 for file in receipt files.list description.txt $CHECKSUM; do
al@844 425 [ -f "$file" ] && cp "$file" "$INSTALLED/$PACKAGE"
al@844 426 done
al@844 427
al@844 428
al@844 429 # Pre-install commands
al@844 430 call_pre_install "$INSTALLED/$PACKAGE/receipt"
al@844 431
al@844 432
al@844 433 if [ -n "$CONFIG_FILES" ]; then
al@844 434 # Save "official" configuration files
al@844 435 action 'Saving configuration files...'
al@844 436 debug "\n"
al@844 437
al@844 438 cd fs
al@844 439 local config_file
al@844 440 for config_file in $CONFIG_FILES; do
al@844 441 debug " config_file: '$config_file'"
al@844 442 find ${config_file#/} -type f 2>/dev/null
al@844 443 done | cpio -o -H newc --quiet | gzip -9 > "$INSTALLED/$PACKAGE/volatile.cpio.gz"
al@844 444 cd ..
al@844 445
al@844 446 if [ -z "$newconf" ]; then
al@844 447 debug " no '--newconf': clean official config files"
al@844 448 # Keep user configuration files: remove "official" from fs tree
al@844 449 for config_file in $CONFIG_FILES; do
al@844 450 debug " remove '$config_file'"
al@844 451 [ -d "fs$config_file" ] && rm -r "fs$config_file"
al@844 452 [ -e "fs$config_file" ] && rm "fs$config_file"
al@844 453 done
al@844 454 fi
al@844 455 # always '[ Done ]' status, unless '--newconf' is passed or not
al@844 456 :; status
al@844 457 fi
al@844 458
al@844 459
al@846 460 if [ -n "$(ls fs/* 2>/dev/null)" ]; then
al@845 461 action 'Installing package...'
al@845 462
al@845 463 debug '\n resolving destination links in source'
al@845 464 IFS=$'\n'
al@845 465 for dir in $(find fs -type d | sed 's|^fs||;/^$/d'); do
al@846 466 if ldir=$(readlink -n $root$dir); then
al@845 467 debug " * mv 'fs$dir'\n -> 'fs${dir%/*}/$ldir'"
al@845 468 mkdir -p "fs${dir%/*}/${ldir%/*}"
al@845 469 mv "fs$dir" "fs${dir%/*}/$ldir"
al@845 470 fi
al@845 471 done
al@845 472 unset IFS
al@845 473
al@845 474 debug ' copying folders and files to destination'
al@845 475 cp -af fs/* "$root/"
al@845 476 status
al@845 477 fi
al@844 478
al@844 479
al@844 480 if [ -s files2remove.list ]; then
al@844 481 action 'Removing old files...'
al@844 482 while read file; do
al@844 483 dir="$root$file"
al@844 484 # Remove specified file
al@844 485 rm -f "$dir"
al@844 486 # Recursive remove non-empty up-dirs
al@844 487 while [ "$dir" != "$root/" ]; do
al@844 488 dir=$(dirname "$dir")
al@844 489 rmdir "$dir" 2>/dev/null || break
al@844 490 done
al@844 491 done < files2remove.list
al@844 492 true
al@844 493 status
al@844 494 fi
al@844 495
al@844 496
al@844 497 # Remove the temporary random directory.
al@844 498 action "Removing all tmp files..."
al@844 499 cd ..; rm -rf "$TMP_DIR"
al@844 500 status
al@844 501
al@844 502
al@844 503 # Post install commands
al@844 504 call_post_install "$INSTALLED/$PACKAGE/receipt"
al@844 505
al@844 506
al@844 507
al@844 508
al@844 509 # Update system databases
al@844 510 # Updating DBs is important process, so not to hide such errors (localized):
al@844 511 # chroot: can't execute '/usr/bin/***': No such file or directory
al@844 512
al@844 513 local fl="$INSTALLED/$PACKAGE/files.list" upd=0 ud um ui us uk
al@844 514
al@844 515 fgrep /usr/share/applications/ "$fl" | fgrep -q .desktop && udesk='yes'
al@844 516 fgrep -q /usr/share/mime "$fl" && umime='yes'
al@844 517 fgrep -q /usr/share/icon/hicolor "$fl" && uicon='yes'
al@844 518 fgrep -q /usr/share/glib-2.0/schemas "$fl" && uschm='yes'
al@844 519 fgrep /usr/lib/gdk-pixbuf "$fl" | fgrep -q .so && upixb='yes'
al@844 520 fgrep -q /lib/modules "$fl" && ukrnl='yes'
al@844 521
al@844 522 if [ -n "$udesk$umime$uicon$uschm$upixb$ukrnl" ]; then
al@844 523 action 'Update system databases...'
al@844 524 upd=1
al@844 525 fi
al@844 526
al@844 527 # package 'desktop-file-utils'
al@844 528 [ -n "$udesk" ] && chroot "$root/" /usr/bin/update-desktop-database /usr/share/applications
al@844 529 # package 'shared-mime-info'
al@844 530 [ -n "$umime" ] && chroot "$root/" /usr/bin/update-mime-database /usr/share/mime
al@844 531 # packages 'gtk+', 'gtk+3'
al@844 532 [ -n "$uicon" ] && chroot "$root/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
al@844 533 # package 'glib'
al@844 534 [ -n "$uschm" ] && chroot "$root/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
al@844 535 # package 'gdk-pixbuf'
al@844 536 [ -n "$upixb" ] && chroot "$root/" /usr/bin/gdk-pixbuf-query-loaders --update-cache
al@844 537 # packages 'busybox', 'kmod', 'depmod'
al@844 538 [ -n "$ukrnl" ] && chroot "$root/" /sbin/depmod -a
al@844 539
al@844 540 [ "$upd" -eq 1 ] && status
al@844 541
al@844 542
al@844 543
al@844 544
al@844 545 # Update installed.info
al@844 546 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
al@844 547 # Remove newlines from some receipts
al@844 548 DEPENDS=$(echo $DEPENDS)
al@844 549 PKG_SUM="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$PKGS_DB/installed.$SUM" | cut -d' ' -f1)"
al@844 550 ii="$PKGS_DB/installed.info"
al@844 551 # Remove old entry
al@844 552 sed -i "/^$PACKAGE /d" "$ii"
al@844 553 cat >> "$ii" <<EOT
al@844 554 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $PKG_SUM
al@844 555 EOT
al@844 556 #awk -F$'\t' -vp="$PACKAGE" '$1==p' "$PKGS_DB/packages.info" > $ii
al@844 557 TEMP_FILE="$(mktemp)"
al@844 558 sort "$ii" > "$TEMP_FILE"; mv -f "$TEMP_FILE" "$ii"; chmod a+r "$ii"; unset ii
al@844 559
al@844 560 cd "$CUR_DIR"
al@844 561 footer "$(_ 'Package "%s" (%s) is installed.' "$PACKAGE" "$VERSION$EXTRAVERSION")"
al@844 562
al@844 563 # Log this activity
al@844 564 log_pkg Installed
al@844 565
al@844 566 # Remove package from upgrade list
al@844 567 [ -s "$UP_LIST" ] && sed -i "/^$PACKAGE\$/d" "$UP_LIST"
al@844 568 }
al@844 569
al@844 570
al@844 571
al@844 572
al@844 573 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 574
al@844 575
al@844 576 PACKAGE=$(
al@844 577 tmp_dir=$(mktemp -d); cd "$tmp_dir"
al@844 578 cpio --quiet -i receipt >/dev/null 2>&1
al@844 579 . receipt; echo $PACKAGE
al@844 580 rm -rf "$tmp_dir"
al@844 581 ) < "$1"
al@844 582
al@844 583 if [ -z "$forced" ]; then
al@844 584 # Check if a package is already installed
al@844 585 debug "\ncheck for installed package '$PACKAGE'"
al@844 586
al@844 587 awk -F$'\t' -vpv="$PACKAGE" '$1==pv { exit 1 }' "$PKGS_DB/installed.info"
al@844 588
al@844 589 if [ "$?" -eq 1 ]; then
al@844 590 newline
al@844 591 _ '"%s" package is already installed.' "$(colorize 34 "$PACKAGE")"
al@844 592 longline "$(_ 'You can use the --forced option to force installation.')"
al@844 593 newline
al@844 594 exit 1
al@844 595 fi
al@844 596 fi
al@844 597
al@844 598 install_package "$(realpath "$1")"