tazpkg annotate modules/install @ rev 970

Modules "get" and "install": fix cookmode again
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon Nov 26 18:53:08 2018 +0200 (2018-11-26)
parents ed2904dae9f2
children 9d683c983e2e
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
paul@936 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@945 42 # input: $1 = dependency package name (like "nano");
al@945 43 # $2 = package path/name for which dependency tested
al@844 44 local i rep rules rule out
al@844 45
al@945 46 if [ -n "$local" ]; then
al@945 47 # Search for virtual packages
al@945 48 if [ -n "$cookmode" ]; then
al@970 49 pi="/home/slitaz/packages/packages-$SLITAZ_ARCH.info"
al@970 50 [ -e "$pi" ] || pi='/home/slitaz/packages/packages.info'
al@945 51 else
al@945 52 pi="$(dirname "$2")/packages.info"
al@945 53 fi
al@970 54
al@945 55 [ -f "$pi" ] &&
al@945 56 out=$(awk -F$'\t' -vpkg="$1" '{
al@945 57 # if package name or provided package name matched
al@945 58 if ($1 == pkg || index(" " $10 " ", " " pkg " ")) { print $1 }
al@945 59 }' "$pi")
al@945 60 for i in $out; do
al@945 61 # If package installed
al@945 62 [ -f "$PKGS_DB/installed/$i/receipt" ] && out="$i" && break
al@945 63 unset out
al@945 64 done
al@945 65 else
al@945 66 rules=$(for rep in $PRIORITY; do
al@945 67 grep -hs "^$1=" "$rep/packages.equiv"
al@945 68 done | sed "s|^$1=||")
al@945 69 debug " >rules='$rules'"
al@844 70
al@945 71 for rule in $rules; do
al@945 72 debug " >rule='$rule'"
al@945 73 case $rule in
al@945 74 *:*)
al@945 75 debug '-- x:x'
al@945 76 # format 'alternative:newname'
al@945 77 # if alternative is installed then substitute newname
al@945 78 out="${rule#*:}"
al@945 79 awk -F$'\t' -vp="${rule%:*}" '$1==p{exit 1}' "$PKGS_DB/installed.info" || break
al@945 80 debug '-- x:x /'
al@945 81 ;;
al@945 82 *)
al@945 83 debug '-- x'
al@945 84 # unconditional substitution
al@945 85 out="$rule"
al@945 86 awk -F$'\t' -vp="$rule" '$1==p{exit 1}' "$PKGS_DB/installed.info" || break
al@945 87 debug '-- x /'
al@945 88 ;;
al@945 89 esac
al@945 90 unset out
al@945 91 done
al@945 92 fi
al@844 93 debug '--'
al@844 94 # if not found in packages.equiv then no substitution
al@844 95 echo "${out:-$1}"
al@844 96 }
al@844 97
al@844 98
al@844 99 # Check and install all missing deps.
al@844 100 # Auto install or ask user then install all missing deps from local dir, CD-ROM,
al@844 101 # media or from the mirror.
al@844 102
al@846 103 install_all_deps() {
al@844 104 # input: $1 = package file to check/install missing dependencies
al@844 105 # ROOT READY
al@844 106 # dep: equivalent_pkg.
al@844 107
al@844 108 debug "\ninstall_all_deps('$1')"
al@844 109
al@844 110 local TMP_DIR DEPENDS num missing_packages equiv pkg answer dir found pkgfile
al@844 111
al@844 112 # Check for missing deps listed in a receipt packages.
al@844 113
al@844 114 # Get the receipt's variable DEPENDS
al@844 115 DEPENDS=$(
al@844 116 TMP_DIR=$(mktemp -d); cd "$TMP_DIR"
al@957 117 cpio --quiet -i receipt < "$1" >/dev/null 2>&1
al@950 118 . ./receipt; echo $DEPENDS
al@844 119 rm -rf "$TMP_DIR"
al@957 120 )
al@844 121
al@844 122 unset num missing_packages
al@844 123 for depend in $DEPENDS; do
al@844 124 debug " depend='$depend'"
al@945 125 equiv=$(equivalent_pkg $depend "$1")
al@844 126 debug " equiv='$equiv'\n"
al@844 127 if [ ! -d "$INSTALLED/$equiv" ]; then
al@844 128 missing_packages="$missing_packages $equiv"
al@844 129 num=$((num+1))
al@844 130 elif [ ! -f "$INSTALLED/$equiv/receipt" ]; then
al@880 131 [ -z "$quiet" ] && _ 'WARNING! Dependency loop between "%s" and "%s".' "$PACKAGE" "$equiv"
al@844 132 fi
al@844 133 done
al@844 134
al@844 135 # Nothing to install, exit function
al@844 136 [ -z "$num" ] && return
al@844 137
al@844 138
al@880 139 title "$(_ 'Tracking dependencies for package "%s"' "$PACKAGE")"
al@844 140
al@844 141 # Individual messages for each missing package
al@878 142 [ -z "$quiet" ] && \
al@844 143 for pkg in $missing_packages; do
al@844 144 _ 'Missing package "%s"' "$pkg"
al@844 145 done
al@844 146
al@880 147 footer "$(_p \
al@844 148 '%s missing package to install.' \
al@844 149 '%s missing packages to install.' "$num" \
al@844 150 "$num")"
al@844 151
al@844 152
pascal@916 153 if [ "$AUTO_INSTALL_DEPS" == 'yes' ] || [ -n "$quiet" ]; then
paul@943 154 # Quietly not displaying anything. Assume 'yes' unless '--noconfirm' is provided
al@844 155 answer=0
al@913 156 [ -n "$noconfirm" ] && answer=1
al@844 157 else
al@913 158 # Display question; wait for answer or print auto-answer
al@844 159 newline
al@844 160 confirm "$(_ 'Install all missing dependencies? (y/N)')"
al@844 161 answer=$?
al@844 162 newline
al@844 163 fi
al@844 164 debug " answer='$answer'"
al@844 165
al@844 166 dir="$(dirname "$1")"
al@844 167 debug " dir='$dir'"
al@844 168
paul@943 169 # We can install packages from /home/boot/packages at boot time
al@844 170 # Also we can prefer local packages over mirrored/cached using '--local' option
al@844 171 [ "$dir" == '/home/boot/packages' ] && local='yes'
al@844 172 debug " local='$local'"
al@844 173
al@844 174 # "--nodeps" option prevents to install dependencies
al@844 175 if [ "$answer" -eq 0 -a -z "$nodeps" ]; then
al@844 176 debug " let's install missing packages"
al@844 177 for pkg in $missing_packages; do
al@844 178 debug " pkg='$pkg'"
al@945 179 [ -d "$INSTALLED/$pkg" ] && continue
al@945 180 # Package not installed
al@844 181
al@945 182 found='0'; namever=''; pkgfile=''
al@945 183 # Prefer local packages
al@945 184 if [ -n "$local" ]; then
al@945 185 [ -z "$quiet" ] && _ 'Checking if package "%s" exists in local list...' "$pkg"
al@946 186 [ -n "$cookmode" ] && dir='/home/slitaz/packages'
al@970 187
al@970 188 pi="$dir/packages-$SLITAZ_ARCH.info"
al@970 189 [ -e "$pi" ] || pi="$dir/packages.info"
al@970 190
al@945 191 # Find local package
al@946 192 if [ -f "$pi" ]; then
al@945 193 # Packages database exists (should be everfresh!)
al@963 194
al@963 195 # Find local package
al@945 196 namever=$(awk -F$'\t' -vpkg="$pkg" '{
al@963 197 if ($1 == pkg) { printf("%s-%s", $1, $2); exit; }
al@946 198 }' "$pi") # <namever> = <package_name>-<package_version>
al@963 199
al@963 200 # Find local provided package
al@963 201 [ -n "$namever" ] ||
al@963 202 namever=$(awk -F$'\t' -vpkg="$pkg" '{
al@963 203 if (index(" " $10 " ", " " pkg " ")) { printf("%s-%s", $1, $2); exit; }
al@963 204 }' "$pi") # <namever> = <package_name>-<package_version>
al@963 205
al@970 206 # Package file may be in form <namever>-<arch>.tazpkg or <namever>-any.tazpkg, so find one
al@970 207 if [ -n "$namever" ]; then
al@970 208 pkgfile=$(find "$dir" -name "$namever-$SLITAZ_ARCH.tazpkg")
al@970 209 [ -n "$pkgfile" ] ||
al@970 210 pkgfile=$(find "$dir" -name "$namever-any.tazpkg")
al@970 211 fi
al@970 212
al@945 213 [ -n "$pkgfile" ] && found='1'
al@945 214 else
al@945 215 # Packages DB missing, proceed to sniff packages
al@890 216 tempd="$(mktemp -d)"; cd "$tempd"
al@970 217 for pkgfile in $dir/$pkg-*-$SLITAZ_ARCH.tazpkg $dir/$pkg-*-any.tazpkg; do
al@927 218 [ -e "$pkgfile" ] || continue
al@890 219 # Extract receipt from each matched package
al@890 220 cpio -F "$pkgfile" -i receipt >/dev/null 2>&1
al@950 221 name=$(. ./receipt; echo $PACKAGE)
al@945 222 [ "$name" == "$pkg" ] && found='1' && break
al@945 223 # Install the first matched package: normally there is only one package
al@945 224 # with the $PACKAGE matched in the receipt
al@890 225 rm receipt
al@890 226 done
al@890 227 rm -r "$tempd"
al@844 228 fi
al@945 229 fi
al@945 230 debug " found='$found'"
al@844 231
al@945 232 if [ "$found" -eq 1 ]
al@945 233 then tazpkg install "$pkgfile"
al@945 234 else tazpkg get-install "$pkg"
al@844 235 fi
al@844 236 done
al@844 237 else
al@844 238 # Answered 'No' to install dependencies, or '--nodeps' option given
al@844 239 newline
al@844 240 _ 'Leaving dependencies for package "%s" unresolved.' "$PACKAGE"
al@845 241 _ 'The package will be installed but will probably not work.'
al@844 242 newline
al@844 243 fi
al@844 244 }
al@844 245
al@844 246
al@844 247 # Extract a package with cpio and gzip/lzma.
al@844 248
al@844 249 extract_package() {
al@844 250 # input: $1 - path to package to be extracted; package should be in the current dir
al@844 251 # ROOT INDEPENDENT
al@880 252 action 'Extracting package...'
al@844 253
al@844 254 # Extract "outer layer": cpio; remove the original package file
al@844 255 cpio -idm --quiet < "$1" && rm -f "$1"
al@844 256
al@844 257 # "Inner layer" may vary
al@844 258 if [ -f fs.cpio.lzma ]; then
al@844 259 # "Plain" cpio.lzma
al@844 260 unlzma < fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma
al@844 261 elif [ -f fs.cpio.gz ]; then
al@844 262 # "Fast" cpio.gz (used to pack-then-install process in most of get-packages)
al@844 263 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz
al@844 264 fi
al@844 265
al@880 266 status
al@844 267 }
al@844 268
al@844 269
al@844 270 # Print short package description
al@844 271
al@844 272 print_short_description() {
al@844 273 # TODO: undigest repo support? priority...
al@844 274 # ROOT READY
al@844 275 local short_desc=''
al@844 276
al@844 277 # Try to find localized short description
al@844 278 for LC in $LANG ${LANG%_*}; do
al@844 279 [ -e "$PKGS_DB/packages-desc.$LC" ] &&
al@844 280 short_desc=$(awk -F$'\t' -vp="$1" '$1==p{print $2; exit}' "$PKGS_DB/packages-desc.$LC")
al@844 281 done
al@844 282
al@844 283 # Try to find short description for mirrored package
al@968 284 if [ -z "$short_desc" ]; then
al@970 285 pi="$PKGS_DB/packages-$SLITAZ_ARCH.info"
al@970 286 [ -e "$pi" ] || pi="$PKGS_DB/packages.info"
al@970 287
al@968 288 short_desc=$(awk -F$'\t' -vp="$1" '$1==p{print $4; exit}' "$pi")
al@968 289 fi
al@844 290
al@844 291 [ -z "$short_desc" ] && short_desc="$SHORT_DESC"
al@844 292
al@844 293 longline "$short_desc"
al@844 294 }
al@844 295
al@844 296
al@844 297 grepesc() {
al@844 298 sed 's/\[/\\[/g'
al@844 299 }
al@844 300
al@844 301
al@844 302
al@844 303
al@844 304 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 305
al@844 306 # Block of receipt function callers
al@844 307 # Why? "Bad" receipt sourcing can redefine some vital TazPkg variables.
paul@943 308 # Few receipts functions should be patched now.
al@844 309
al@844 310 # Input: $1 = path to the receipt to be processed
al@844 311
al@844 312 # Pre-install commands
al@844 313 call_pre_install() {
al@844 314 local tmp
al@844 315 if grep -q '^pre_install()' "$1"; then
al@880 316 action 'Execute pre-install commands...'
al@844 317 tmp="$(mktemp)"
al@844 318 cp "$1" "$tmp"
al@844 319 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp"
al@844 320 ( . "$tmp"; pre_install "$root" )
al@880 321 status
al@844 322 rm "$tmp"
al@844 323 fi
al@844 324
al@844 325 }
al@846 326 # Post-install commands
al@844 327 call_post_install() {
al@844 328 local tmp
al@844 329 if grep -q '^post_install()' "$1"; then
al@880 330 action 'Execute post-install commands...'
al@844 331 tmp="$(mktemp)"
al@844 332 cp "$1" "$tmp"
al@844 333 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp"
al@844 334 ( . "$tmp"; post_install "$root" )
al@880 335 status
al@844 336 rm "$tmp"
al@844 337 fi
al@844 338 }
al@844 339
al@844 340
al@844 341 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 342
al@844 343
al@844 344 # This function installs a package in the rootfs.
al@844 345
al@844 346 install_package() {
al@844 347 # input: $1 = path to package to be installed
al@844 348 # dep: install_all_deps, print_short_description, extract_package, grepesc.
al@844 349
al@844 350 debug "\ninstall_package('$1')"
al@844 351 local dir
al@844 352
al@844 353 PACKAGE_FILE="$1"
al@844 354 TMP_DIR="$(mktemp -d)"
al@844 355
al@844 356 # Get receipt's variables and functions
al@957 357 { cd "$TMP_DIR"; cpio --quiet -i receipt < "$PACKAGE_FILE" >/dev/null 2>&1; }
al@844 358 # Why next code? "Bad" receipt sourcing can redefine some vital TazPkg variables.
al@844 359 (
al@844 360 . "$TMP_DIR/receipt"
al@844 361 cat > "$TMP_DIR/receipt.var" <<EOT
al@844 362 PACKAGE="$PACKAGE"
al@844 363 VERSION="$VERSION"
al@844 364 EXTRAVERSION="$EXTRAVERSION"
al@844 365 CATEGORY="$CATEGORY"
al@945 366 SHORT_DESC="${SHORT_DESC//\"/\"}"
al@844 367 WEB_SITE="$WEB_SITE"
al@844 368 TAGS="$TAGS"
al@844 369 DEPENDS="$DEPENDS"
al@844 370 CONFIG_FILES="$CONFIG_FILES"
al@844 371 PACKED_SIZE="$PACKED_SIZE"
al@844 372 UNPACKED_SIZE="$UNPACKED_SIZE"
al@844 373 EOT
al@844 374 rm "$TMP_DIR/receipt"
al@844 375 )
al@844 376 . "$TMP_DIR/receipt.var"
al@844 377
al@844 378
al@844 379 # Make sure folder exists on new installs or upgrades
al@844 380 mkdir -p "$INSTALLED/$PACKAGE"
al@844 381
al@844 382 # Keep "modifiers" and "files.list" on upgrade
al@844 383 find "$INSTALLED/$PACKAGE" -type f \( ! -name modifiers ! -name files.list \) -delete
al@844 384
al@844 385 # Update "installed.md5"
al@844 386 # TODO: discontinue using 'installed.md5'
al@844 387 touch "$PKGS_DB/installed.$SUM"
al@844 388 sed -i "/ $(basename "$PACKAGE_FILE")$/d" "$PKGS_DB/installed.$SUM" 2>/dev/null
al@844 389 cd "$(dirname "$PACKAGE_FILE")"
al@844 390 $CHECKSUM "$(basename "$PACKAGE_FILE")" >> "$PKGS_DB/installed.$SUM"
al@844 391
al@844 392 # Resolve package dependencies before package installation
al@844 393 install_all_deps "$PACKAGE_FILE"
al@844 394
al@844 395
al@844 396 # TODO: why this list-processed in the $PKGS_DB?
al@844 397 #[ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> "$PKGS_DB/$INSTALL_LIST-processed"
al@844 398
paul@943 399 # Special mode for using in cookutils: clearly show whether freshly used package or cached one
al@933 400 if [ -n "$cookmode" ]; then
al@933 401 f=${PACKAGE_FILE%/*}; f=${f%/*}; f=${f##*/}
al@933 402 if [ "$f" == "$(cat /etc/slitaz-release)" ]; then
al@933 403 _ 'Installing (web/cache): %s' "$(basename $PACKAGE_FILE .tazpkg)"
al@933 404 else
al@933 405 _ 'Installing (pkg/local): %s' "$(basename $PACKAGE_FILE .tazpkg)"
al@933 406 fi
al@933 407 fi
al@933 408
al@844 409 if [ -n "$sequence" ]; then
al@880 410 title 'Installation of package "%s" (%s)' "$PACKAGE" "$sequence"
al@844 411 else
al@880 412 title 'Installation of package "%s"' "$PACKAGE"
al@844 413 fi
al@844 414
al@876 415 if [ -z "$quiet" ]; then
al@876 416 print_short_description "$PACKAGE"
al@876 417 separator '-'
al@876 418 fi
al@844 419
al@880 420 action 'Copying package...'
al@844 421 cp "$PACKAGE_FILE" "$TMP_DIR"
al@880 422 status
al@844 423
al@844 424 cd "$TMP_DIR"
al@844 425 extract_package "$(basename "$PACKAGE_FILE")"
al@844 426
al@844 427 # Include temporary receipt to get the right variables
al@844 428 . "$TMP_DIR/receipt.var"
al@844 429
al@844 430 cd "$INSTALLED"
al@844 431
al@844 432
al@844 433 # Get files to remove if upgrading
al@844 434 # IFS here modified temporarily for processing filenames with spaces
al@844 435 IFS=$'\n'
al@844 436 if [ -f "$PACKAGE/files.list" ]; then
al@844 437 while read file; do
al@844 438 grep -q "^$(echo "$file" | grepesc)$" "$TMP_DIR/files.list" && continue
al@844 439 for i in $(cat "$PACKAGE/modifiers" 2>/dev/null;
al@844 440 fgrep -sl "$PACKAGE" */modifiers | cut -d/ -f1); do
al@844 441 grep -qs "^$(echo "$file" | grepesc)$" "$i/files.list" && continue 2
al@844 442 done
al@844 443 echo "$file"
al@844 444 done < "$PACKAGE/files.list" > "$TMP_DIR/files2remove.list"
al@844 445 fi
al@844 446 unset IFS
al@844 447
al@844 448
al@844 449 # Remember modified packages
al@880 450 action 'Remember modified packages...'
al@844 451 {
al@844 452 check=false
al@844 453 # TODO: why '[' the special?
al@844 454 # FIXME: we have files with spaces in our packages!
al@844 455 for i in $(fgrep -v [ $TMP_DIR/files.list); do
al@844 456 [ -e "$root$i" ] || continue
al@844 457 [ -d "$root$i" ] && continue
al@844 458 echo "- $i"
al@844 459 check=true
al@844 460 done ;
al@844 461 $check && \
al@844 462 for i in *; do
al@844 463 [ "$i" == "$PACKAGE" ] && continue
al@844 464 [ -s "$i/files.list" ] || continue
al@844 465 awk "{ printf \"$i %s\\n\",\$1 }" < "$i/files.list"
al@844 466 done;
al@844 467 } | awk '
al@844 468 {
al@844 469 if ($1 == "-" || file[$2] != "") {
al@844 470 file[$2] = file[$2] " " $1
al@844 471 if ($1 != "-") {
al@844 472 if (pkg[$1] == "") all = all " " $1
al@844 473 pkg[$1] = pkg[$1] " " $2
al@844 474 }
al@844 475 }
al@844 476 }
al@844 477 END {
al@844 478 for (i = split(all, p, " "); i > 0; i--)
al@844 479 for (j = split(pkg[p[i]], f, " "); j > 0; j--)
al@844 480 printf "%s %s\n",p[i],f[j];
al@844 481 }
al@844 482 ' | while read dir file; do
al@844 483 if grep -qs "^$dir$" "$PACKAGE/modifiers"; then
al@844 484 # Do not overload an overloaded file !
al@844 485 rm "$TMP_DIR/$file" 2>/dev/null
al@844 486 continue
al@844 487 fi
al@844 488 grep -qs "^$PACKAGE$" "$dir/modifiers" && continue
al@844 489 if [ -s "$dir/volatile.cpio.gz" ]; then
al@844 490 # We can modify backed up files without notice
al@844 491 zcat "$dir/volatile.cpio.gz" | cpio -t --quiet | \
al@844 492 grep -q "^${file#/}$" && continue
al@844 493 fi
al@844 494 echo "$PACKAGE" >> "$dir/modifiers"
al@844 495 done
al@880 496 status
al@844 497
al@844 498
al@844 499 cd "$TMP_DIR"
al@844 500 # Copy receipt, etc.
al@844 501 for file in receipt files.list description.txt $CHECKSUM; do
al@844 502 [ -f "$file" ] && cp "$file" "$INSTALLED/$PACKAGE"
al@844 503 done
al@844 504
al@844 505
al@844 506 # Pre-install commands
al@844 507 call_pre_install "$INSTALLED/$PACKAGE/receipt"
al@844 508
al@844 509
al@844 510 if [ -n "$CONFIG_FILES" ]; then
al@844 511 # Save "official" configuration files
al@880 512 action 'Saving configuration files...'
al@844 513 debug "\n"
al@844 514
al@844 515 cd fs
al@844 516 local config_file
al@844 517 for config_file in $CONFIG_FILES; do
al@844 518 debug " config_file: '$config_file'"
al@844 519 find ${config_file#/} -type f 2>/dev/null
al@844 520 done | cpio -o -H newc --quiet | gzip -9 > "$INSTALLED/$PACKAGE/volatile.cpio.gz"
al@844 521 cd ..
al@844 522
al@844 523 if [ -z "$newconf" ]; then
al@844 524 debug " no '--newconf': clean official config files"
al@844 525 # Keep user configuration files: remove "official" from fs tree
al@844 526 for config_file in $CONFIG_FILES; do
al@888 527 for config_file_official in $(find "fs$config_file" ! -type d 2>/dev/null | sed 's|^fs||'); do
al@855 528 if [ -e "$root$config_file_official" ]; then
al@855 529 debug " official '$config_file_official' will be skipped"
al@855 530 rm "fs$config_file_official"
al@855 531 else
al@855 532 debug " official '$config_file_official' will be written"
al@855 533 fi
al@855 534 done
al@844 535 done
al@844 536 fi
al@844 537 # always '[ Done ]' status, unless '--newconf' is passed or not
al@880 538 :; status
al@844 539 fi
al@844 540
al@844 541
al@846 542 if [ -n "$(ls fs/* 2>/dev/null)" ]; then
al@880 543 action 'Installing package...'
al@845 544
al@845 545 debug '\n resolving destination links in source'
al@845 546 IFS=$'\n'
al@845 547 for dir in $(find fs -type d | sed 's|^fs||;/^$/d'); do
al@846 548 if ldir=$(readlink -n $root$dir); then
al@845 549 debug " * mv 'fs$dir'\n -> 'fs${dir%/*}/$ldir'"
al@845 550 mkdir -p "fs${dir%/*}/${ldir%/*}"
al@845 551 mv "fs$dir" "fs${dir%/*}/$ldir"
al@845 552 fi
al@845 553 done
al@845 554 unset IFS
al@845 555
al@845 556 debug ' copying folders and files to destination'
al@845 557 cp -af fs/* "$root/"
al@880 558 status
al@845 559 fi
al@844 560
al@844 561
al@844 562 if [ -s files2remove.list ]; then
al@880 563 action 'Removing old files...'
al@844 564 while read file; do
al@844 565 dir="$root$file"
al@844 566 # Remove specified file
al@844 567 rm -f "$dir"
al@844 568 # Recursive remove non-empty up-dirs
al@844 569 while [ "$dir" != "$root/" ]; do
al@844 570 dir=$(dirname "$dir")
al@844 571 rmdir "$dir" 2>/dev/null || break
al@844 572 done
al@844 573 done < files2remove.list
al@880 574 :; status
al@844 575 fi
al@844 576
al@844 577
al@844 578 # Remove the temporary random directory.
al@880 579 action "Removing all tmp files..."
al@844 580 cd ..; rm -rf "$TMP_DIR"
al@880 581 status
al@844 582
al@844 583
al@844 584 # Post install commands
al@844 585 call_post_install "$INSTALLED/$PACKAGE/receipt"
al@844 586
al@844 587
al@844 588
al@844 589
al@844 590 # Update system databases
al@844 591 # Updating DBs is important process, so not to hide such errors (localized):
al@844 592 # chroot: can't execute '/usr/bin/***': No such file or directory
al@844 593
al@929 594 local fl="$INSTALLED/$PACKAGE/files.list" upd=0 udesk umime uicon uschm ukrnl ukrnlfs
al@844 595
al@929 596 fgrep /usr/share/applications/ "$fl" | fgrep -q .desktop && udesk='yes'
al@929 597 fgrep -q /usr/share/mime "$fl" && umime='yes'
al@929 598 fgrep -q /usr/share/icon/hicolor "$fl" && uicon='yes'
al@929 599 fgrep /usr/share/glib-2.0/schemas "$fl" | fgrep -q .xml && uschm='yes'
al@929 600 fgrep /usr/lib/gdk-pixbuf "$fl" | fgrep -q .so && upixb='yes'
al@929 601 if fgrep -q /lib/modules "$fl"; then
al@929 602 ukrnl='yes'
al@929 603 if fgrep -q /kernel/fs/ "$fl"; then
al@929 604 ukrnlfs='yes'
al@929 605 fi
al@929 606 fi
al@844 607
al@844 608 if [ -n "$udesk$umime$uicon$uschm$upixb$ukrnl" ]; then
al@880 609 action 'Update system databases...'
al@844 610 upd=1
al@844 611 fi
al@844 612
al@844 613 # package 'desktop-file-utils'
al@862 614 [ -n "$udesk" ] && chroot "$root/" /usr/bin/update-desktop-database /usr/share/applications 2>/dev/null
al@844 615 # package 'shared-mime-info'
al@844 616 [ -n "$umime" ] && chroot "$root/" /usr/bin/update-mime-database /usr/share/mime
al@844 617 # packages 'gtk+', 'gtk+3'
al@844 618 [ -n "$uicon" ] && chroot "$root/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
al@844 619 # package 'glib'
al@897 620 # hide messages like next because they are unresolved (we may to patch glib to hide them, almost the same)
al@897 621 # warning: Schema '*' has path '*'. Paths starting with '/apps/', '/desktop/' or '/system/' are deprecated.
al@897 622 [ -n "$uschm" ] && chroot "$root/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas 2>&1 | fgrep -v '/apps/'
al@844 623 # package 'gdk-pixbuf'
al@844 624 [ -n "$upixb" ] && chroot "$root/" /usr/bin/gdk-pixbuf-query-loaders --update-cache
al@929 625
al@929 626 if [ -n "$ukrnlfs" ]; then
al@929 627 for i in $(awk -F/ '{if($6=="fs" && $8~$7)print $7}' "$fl" | sort -u); do
al@929 628 touch "$root/etc/filesystems"
al@939 629 grep -q "^$i\$" "$root/etc/filesystems" || echo "$i" >> "$root/etc/filesystems"
al@929 630 done
al@929 631 fi
al@844 632 # packages 'busybox', 'kmod', 'depmod'
al@865 633 [ -n "$ukrnl" ] && grep '/lib/modules' "$fl" | cut -d'/' -f4 | uniq | xargs chroot "$root/" /sbin/depmod -a
al@844 634
al@880 635 [ "$upd" -eq 1 ] && status
al@844 636
al@844 637
al@844 638
al@844 639
al@949 640 # Update installed.info ----------------------------------------------------
al@844 641 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
al@949 642
al@844 643 # Remove newlines from some receipts
al@844 644 DEPENDS=$(echo $DEPENDS)
mojo@954 645 PKG_SUM="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$PKGS_DB/installed.$SUM" | cut -d' ' -f1)"
mojo@954 646
al@949 647 # Calculate "release checksum": md5sum of file containing md5sums of:
al@949 648 # a) all files, b) receipt, and c) description.txt.
al@949 649 rsumf=$(mktemp)
al@949 650 cp $INSTALLED/$PACKAGE/md5sum $rsumf
al@949 651 md5sum $INSTALLED/$PACKAGE/receipt | sed 's| [^ ]*/| |' >> $rsumf
al@949 652 [ -e "$INSTALLED/$PACKAGE/description.txt" ] &&
al@949 653 md5sum $INSTALLED/$PACKAGE/description.txt | sed 's| [^ ]*/| |' >> $rsumf
al@949 654 RSUM=$(md5sum $rsumf | awk '{print $1}')
al@949 655 rm $rsumf
al@949 656
al@844 657 ii="$PKGS_DB/installed.info"
al@949 658
al@844 659 # Remove old entry
al@844 660 sed -i "/^$PACKAGE /d" "$ii"
al@949 661
al@844 662 cat >> "$ii" <<EOT
mojo@954 663 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $PKG_SUM
al@844 664 EOT
al@949 665
al@844 666 TEMP_FILE="$(mktemp)"
al@844 667 sort "$ii" > "$TEMP_FILE"; mv -f "$TEMP_FILE" "$ii"; chmod a+r "$ii"; unset ii
al@949 668 # --------------------------------------------------------------------------
al@844 669
al@844 670 cd "$CUR_DIR"
al@880 671 footer "$(_ 'Package "%s" (%s) is installed.' "$PACKAGE" "$VERSION$EXTRAVERSION")"
al@844 672
al@844 673 # Log this activity
al@844 674 log_pkg Installed
al@844 675
al@844 676 # Remove package from upgrade list
al@844 677 [ -s "$UP_LIST" ] && sed -i "/^$PACKAGE\$/d" "$UP_LIST"
al@844 678 }
al@844 679
al@844 680
al@844 681
al@844 682
al@844 683 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
al@844 684
al@844 685
al@844 686 PACKAGE=$(
al@844 687 tmp_dir=$(mktemp -d); cd "$tmp_dir"
al@957 688 cpio --quiet -i receipt < "$1" >/dev/null 2>&1
al@950 689 . ./receipt; echo $PACKAGE
al@844 690 rm -rf "$tmp_dir"
al@957 691 )
al@844 692
al@866 693 if grep -qs "^$PACKAGE$" "$BLOCKED"; then
al@866 694 _ 'Package "%s" blocked.' "$PACKAGE"
al@866 695 exit 1
al@866 696 fi
al@866 697
al@844 698 if [ -z "$forced" ]; then
al@844 699 # Check if a package is already installed
al@844 700 debug "\ncheck for installed package '$PACKAGE'"
al@844 701
al@844 702 awk -F$'\t' -vpv="$PACKAGE" '$1==pv { exit 1 }' "$PKGS_DB/installed.info"
al@844 703
al@844 704 if [ "$?" -eq 1 ]; then
al@881 705 if [ -z "$quiet" ]; then
al@881 706 newline
al@881 707 _ '"%s" package is already installed.' "$(colorize 34 "$PACKAGE")"
al@881 708 longline "$(_ 'You can use the --forced option to force installation.')"
al@881 709 newline
al@881 710 fi
al@844 711 exit 1
al@844 712 fi
al@844 713 fi
al@844 714
al@844 715 install_package "$(realpath "$1")"