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.
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")" |