tazpkg annotate modules/install @ rev 855

cache: fix working; install: install official conf.files if destination is absent; tazpkg-notify: change icons
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon Nov 09 04:54:02 2015 +0200 (2015-11-09)
parents 8a73a58ed3cb
children 602ed53fa812
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@855 450 for config_file_official in $(find "fs$config_file" ! -type d | sed 's|^fs||'); do
al@855 451 if [ -e "$root$config_file_official" ]; then
al@855 452 debug " official '$config_file_official' will be skipped"
al@855 453 rm "fs$config_file_official"
al@855 454 else
al@855 455 debug " official '$config_file_official' will be written"
al@855 456 fi
al@855 457 done
al@844 458 done
al@844 459 fi
al@844 460 # always '[ Done ]' status, unless '--newconf' is passed or not
al@844 461 :; status
al@844 462 fi
al@844 463
al@844 464
al@846 465 if [ -n "$(ls fs/* 2>/dev/null)" ]; then
al@845 466 action 'Installing package...'
al@845 467
al@845 468 debug '\n resolving destination links in source'
al@845 469 IFS=$'\n'
al@845 470 for dir in $(find fs -type d | sed 's|^fs||;/^$/d'); do
al@846 471 if ldir=$(readlink -n $root$dir); then
al@845 472 debug " * mv 'fs$dir'\n -> 'fs${dir%/*}/$ldir'"
al@845 473 mkdir -p "fs${dir%/*}/${ldir%/*}"
al@845 474 mv "fs$dir" "fs${dir%/*}/$ldir"
al@845 475 fi
al@845 476 done
al@845 477 unset IFS
al@845 478
al@845 479 debug ' copying folders and files to destination'
al@845 480 cp -af fs/* "$root/"
al@845 481 status
al@845 482 fi
al@844 483
al@844 484
al@844 485 if [ -s files2remove.list ]; then
al@844 486 action 'Removing old files...'
al@844 487 while read file; do
al@844 488 dir="$root$file"
al@844 489 # Remove specified file
al@844 490 rm -f "$dir"
al@844 491 # Recursive remove non-empty up-dirs
al@844 492 while [ "$dir" != "$root/" ]; do
al@844 493 dir=$(dirname "$dir")
al@844 494 rmdir "$dir" 2>/dev/null || break
al@844 495 done
al@844 496 done < files2remove.list
al@844 497 true
al@844 498 status
al@844 499 fi
al@844 500
al@844 501
al@844 502 # Remove the temporary random directory.
al@844 503 action "Removing all tmp files..."
al@844 504 cd ..; rm -rf "$TMP_DIR"
al@844 505 status
al@844 506
al@844 507
al@844 508 # Post install commands
al@844 509 call_post_install "$INSTALLED/$PACKAGE/receipt"
al@844 510
al@844 511
al@844 512
al@844 513
al@844 514 # Update system databases
al@844 515 # Updating DBs is important process, so not to hide such errors (localized):
al@844 516 # chroot: can't execute '/usr/bin/***': No such file or directory
al@844 517
al@844 518 local fl="$INSTALLED/$PACKAGE/files.list" upd=0 ud um ui us uk
al@844 519
al@844 520 fgrep /usr/share/applications/ "$fl" | fgrep -q .desktop && udesk='yes'
al@844 521 fgrep -q /usr/share/mime "$fl" && umime='yes'
al@844 522 fgrep -q /usr/share/icon/hicolor "$fl" && uicon='yes'
al@844 523 fgrep -q /usr/share/glib-2.0/schemas "$fl" && uschm='yes'
al@844 524 fgrep /usr/lib/gdk-pixbuf "$fl" | fgrep -q .so && upixb='yes'
al@844 525 fgrep -q /lib/modules "$fl" && ukrnl='yes'
al@844 526
al@844 527 if [ -n "$udesk$umime$uicon$uschm$upixb$ukrnl" ]; then
al@844 528 action 'Update system databases...'
al@844 529 upd=1
al@844 530 fi
al@844 531
al@844 532 # package 'desktop-file-utils'
al@844 533 [ -n "$udesk" ] && chroot "$root/" /usr/bin/update-desktop-database /usr/share/applications
al@844 534 # package 'shared-mime-info'
al@844 535 [ -n "$umime" ] && chroot "$root/" /usr/bin/update-mime-database /usr/share/mime
al@844 536 # packages 'gtk+', 'gtk+3'
al@844 537 [ -n "$uicon" ] && chroot "$root/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
al@844 538 # package 'glib'
al@844 539 [ -n "$uschm" ] && chroot "$root/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
al@844 540 # package 'gdk-pixbuf'
al@844 541 [ -n "$upixb" ] && chroot "$root/" /usr/bin/gdk-pixbuf-query-loaders --update-cache
al@844 542 # packages 'busybox', 'kmod', 'depmod'
al@844 543 [ -n "$ukrnl" ] && chroot "$root/" /sbin/depmod -a
al@844 544
al@844 545 [ "$upd" -eq 1 ] && status
al@844 546
al@844 547
al@844 548
al@844 549
al@844 550 # Update installed.info
al@844 551 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
al@844 552 # Remove newlines from some receipts
al@844 553 DEPENDS=$(echo $DEPENDS)
al@844 554 PKG_SUM="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$PKGS_DB/installed.$SUM" | cut -d' ' -f1)"
al@844 555 ii="$PKGS_DB/installed.info"
al@844 556 # Remove old entry
al@844 557 sed -i "/^$PACKAGE /d" "$ii"
al@844 558 cat >> "$ii" <<EOT
al@844 559 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $PKG_SUM
al@844 560 EOT
al@844 561 #awk -F$'\t' -vp="$PACKAGE" '$1==p' "$PKGS_DB/packages.info" > $ii
al@844 562 TEMP_FILE="$(mktemp)"
al@844 563 sort "$ii" > "$TEMP_FILE"; mv -f "$TEMP_FILE" "$ii"; chmod a+r "$ii"; unset ii
al@844 564
al@844 565 cd "$CUR_DIR"
al@844 566 footer "$(_ 'Package "%s" (%s) is installed.' "$PACKAGE" "$VERSION$EXTRAVERSION")"
al@844 567
al@844 568 # Log this activity
al@844 569 log_pkg Installed
al@844 570
al@844 571 # Remove package from upgrade list
al@844 572 [ -s "$UP_LIST" ] && sed -i "/^$PACKAGE\$/d" "$UP_LIST"
al@844 573 }
al@844 574
al@844 575
al@844 576
al@844 577
al@844 578 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 579
al@844 580
al@844 581 PACKAGE=$(
al@844 582 tmp_dir=$(mktemp -d); cd "$tmp_dir"
al@844 583 cpio --quiet -i receipt >/dev/null 2>&1
al@844 584 . receipt; echo $PACKAGE
al@844 585 rm -rf "$tmp_dir"
al@844 586 ) < "$1"
al@844 587
al@844 588 if [ -z "$forced" ]; then
al@844 589 # Check if a package is already installed
al@844 590 debug "\ncheck for installed package '$PACKAGE'"
al@844 591
al@844 592 awk -F$'\t' -vpv="$PACKAGE" '$1==pv { exit 1 }' "$PKGS_DB/installed.info"
al@844 593
al@844 594 if [ "$?" -eq 1 ]; then
al@844 595 newline
al@844 596 _ '"%s" package is already installed.' "$(colorize 34 "$PACKAGE")"
al@844 597 longline "$(_ 'You can use the --forced option to force installation.')"
al@844 598 newline
al@844 599 exit 1
al@844 600 fi
al@844 601 fi
al@844 602
al@844 603 install_package "$(realpath "$1")"