sup annotate sup @ rev 49

Tiny edits
author Paul Issott <paul@slitaz.org>
date Fri Mar 10 18:44:59 2017 +0000 (2017-03-10)
parents 9ff1a3400fb1
children 46a8dc676569
rev   line source
pankso@6 1 #!/bin/sh
pankso@6 2 #
pankso@6 3 # SliTaz Users Package - Minimal cmdline tools - README for devel info
pankso@6 4 #
pankso@6 5 # Copyright (C) 2017 SliTaz GNU/Linux - BSD License
pankso@6 6 # Author: Christophe Lincoln <pankso@slitaz.org>
pankso@6 7 #
pankso@27 8
pankso@27 9 # Get system wide libsup.sh or development version if working in Hg folder
pankso@6 10 if [ -f "/usr/lib/slitaz/libsup.sh" ]; then
pankso@18 11 . /usr/lib/slitaz/libsup.sh
pankso@18 12 fi
pankso@18 13 if [ -f "./libsup.sh" ]; then
pankso@17 14 . ./libsup.sh
pankso@6 15 fi
pankso@6 16
pankso@6 17 # Sanity check
pankso@13 18 if ! [ -d "/home/$(id -un)" ]; then
pankso@13 19 gettext "Not a valid user:"; colorize 31 " $(id -un)" && exit 1
pankso@6 20 fi
pankso@44 21 mkdir -p ${cache} ${installed} ${downloads}
pankso@6 22
pankso@6 23 #
pankso@6 24 # Functions
pankso@6 25 #
pankso@6 26
pankso@6 27 help() {
pankso@6 28 cat << EOT
pankso@6 29
pankso@47 30 $(boldify $(gettext "Usage:")) $(basename $0) [command|package] [package|--option]
pankso@6 31
pankso@6 32 $(boldify $(gettext "Commands:"))
pankso@22 33 -i install $(gettext "Install a new package")
pankso@35 34 -u update $(gettext "Update installed package")
pankso@44 35 -r remove $(gettext "Remove an installed package")
pankso@45 36 -c cook $(gettext "Cook a package from the wok")
pankso@45 37 run $(gettext "Run sup_install without installing")
pankso@45 38 -e extract $(gettext "Extract a package to current dir")
pankso@37 39 -n new $(gettext "Create a new SUP package :-)")
pankso@44 40 -l list $(gettext "List packages: installed/wok/db")
pankso@44 41 -s search $(gettext "Search for packages in the database")
pankso@44 42 -d debug $(gettext "Debug info and sup environment")
pankso@6 43
pankso@6 44 $(boldify $(gettext "Options:"))
pankso@37 45 --install update $(gettext "Install all updates from mirror")
pankso@37 46 --force update $(gettext "Force recharging packages database")
pankso@42 47 --db list $(gettext "List all packages in database")
pankso@19 48 --init cook $(gettext "Initialize sup cook environment")
paul@49 49 --list info $(gettext "List files installed by a package")
paul@9 50 --verbose all $(gettext "Display more output messages")
pankso@6 51
pankso@42 52 $(colorize 33 Manual) man sup
pankso@22 53 $(colorize 33 Documentation) http://scn.slitaz.org/?d=en/sup
pankso@22 54
pankso@6 55 EOT
pankso@6 56 exit 0
pankso@6 57 }
pankso@6 58
pankso@6 59 cook_init() {
pankso@6 60 mkdir -p ${wok} ${cooked}
pankso@6 61 if [ ! -d "$supcook/wok" ]; then
pankso@6 62 ln -s ${wok} ${supcook}/wok
pankso@6 63 fi
pankso@6 64 }
pankso@6 65
pankso@22 66 # check_pkg_arg "command"
pankso@22 67 check_pkg_arg() {
pankso@22 68 if [ ! "$pkg" ]; then
pankso@22 69 gettext "Missing package name or file path:"
pankso@22 70 boldify " sup $1 [package|file.sup]" && exit 1
pankso@22 71 fi
pankso@22 72 }
pankso@22 73
pankso@22 74 # new_receip "package"
pankso@15 75 new_receip() {
pankso@22 76 cat > ${wok}/${1}/receip << EOT
pankso@22 77 # SliTaz User Package receip
pankso@15 78
pankso@16 79 PACKAGE="$1"
pankso@15 80 VERSION=""
pankso@15 81 SHORT_DESC=""
pankso@15 82 MAINTAINER=""
pankso@15 83 LICENSE=""
pankso@15 84 WEB_SITE=""
pankso@15 85
pankso@15 86 # Sup dependencies will be automatically downloaded but system wide
pankso@15 87 # deps must be manually installed by root.
pankso@15 88 SUP_DEPS=""
pankso@15 89 DEPENDS=""
pankso@15 90
pankso@15 91 # Here are the optional install rules (download, configure, etc)
pankso@15 92 sup_install() {
pankso@15 93 echo ""
pankso@15 94 }
pankso@15 95
pankso@15 96 EOT
pankso@15 97 }
pankso@15 98
pankso@6 99 #
pankso@6 100 # Commands
pankso@6 101 #
pankso@6 102
pankso@6 103 case "$1" in
pankso@6 104
pankso@6 105 -c|cook)
paul@28 106 # Cook in $cache/cook and mv pkg to a visible dir
pankso@6 107 pkg="$2"
pankso@12 108 receip="$wok/$pkg/receip"
pankso@6 109 cache="$cache/cook"
pankso@6 110
pankso@6 111 # Handle --init
pankso@6 112 if [ "$init" ]; then
pankso@6 113 gettext "Initializing sup cook environment..."
pankso@36 114 cook_init; status; exit 0
pankso@6 115 fi
pankso@6 116
pankso@6 117 # Sanity check
pankso@22 118 check_pkg_arg "$1"
pankso@12 119 if [ ! -f "$receip" ]; then
pankso@36 120 gettext "Can't find receip in wok for:"; colorize 31 " $pkg"; exit 1
pankso@6 121 fi
pankso@6 122
pankso@6 123 newline
pankso@36 124 echo -n "$(colorize 33 $(gettext 'Building package:'))"
pankso@36 125 colorize 35 " $pkg"
pankso@6 126 separator
pankso@6 127 rm -rf ${cache} && mkdir -p ${cache} ${cooked}
pankso@6 128
pankso@12 129 # Check receip
pankso@12 130 [ "$verbose" ] && gettext "Checking receip variables..."
pankso@12 131 . ${receip}
pankso@6 132 for var in PACKAGE VERSION SHORT_DESC MAINTAINER LICENSE WEB_SITE
pankso@6 133 do
pankso@12 134 value="$(. $receip; eval echo \$$var)"
pankso@6 135 case "$var" in
pankso@6 136 PACKAGE|VERSION|SHORT_DESC|MAINTAINER|LICENSE)
pankso@6 137 if [ ! "$value" ]; then
pankso@6 138 gettext "Empty variable:"; colorize 31 " $var=\"\""
pankso@6 139 exit 1
pankso@6 140 fi ;;
pankso@6 141 WEB_SITE)
pankso@6 142 if [ ! "$value" ]; then
pankso@6 143 gettext "Empty variable:"; colorize 31 " $var=\"\""
pankso@6 144 gettext "You can use:"
pankso@6 145 boldify " http://scn.slitaz.org/?sup&pkg=$PACKAGE"
pankso@6 146 exit 1
pankso@6 147 fi ;;
pankso@6 148 esac
pankso@6 149 done
pankso@6 150 [ "$verbose" ] && status
pankso@6 151
pankso@6 152 # Set $PACKAGE-$VERSION.sup and copy pkg to cache
pankso@6 153 supfile="$PACKAGE-$VERSION.sup"
pankso@6 154 cp -rf ${wok}/${pkg} ${cache}/${supfile%.sup}
pankso@6 155 cd ${cache}/${supfile%.sup}
pankso@6 156
pankso@37 157 # Move to hidden dir: ~/.local ~/.config ~./icons
pankso@37 158 for dir in local config icons; do
pankso@37 159 [ -d "files/${dir}" ] && mv files/${dir} files/.${dir}
pankso@6 160 done
pankso@6 161
pankso@39 162 # Add $cook_date
pankso@39 163 sed -i "/^cook_date=/"d receip
pankso@39 164 echo "cook_date=\"$(date "+%Y-%m-%d %H:%M")\"" >> receip
pankso@6 165
pankso@6 166 gettext "Creating compressed archive..."
pankso@6 167 find files | cpio -o -H newc --quiet | lzma e files.lzma -si
pankso@6 168 rm -rf files
pankso@6 169 find . -print | cpio -o -H newc --quiet > ${cooked}/${supfile}
pankso@6 170 status
pankso@6 171
pankso@6 172 size="$(du -sh $cooked/$supfile | cut -d " " -f 1)"
pankso@36 173 echo "$(gettext 'Packages:') $(colorize 035 $supfile) ($size)"
pankso@6 174 rm -rf ${cache} && newline ;;
pankso@6 175
pankso@45 176 run)
pankso@36 177 # Run sup_install() without any installation to help package creation
pankso@36 178 pkg="$2"
pankso@36 179 receip="$wok/$pkg/receip"
pankso@39 180 workdir="$supcook/sup_install"
pankso@36 181
pankso@36 182 # Sanity check
pankso@36 183 check_pkg_arg "$1"
pankso@36 184 if [ ! -f "$receip" ]; then
pankso@36 185 gettext "Can't find receip in wok for:"; colorize 31 " $pkg"; exit 1
pankso@36 186 fi
pankso@36 187
pankso@36 188 newline
pankso@37 189 echo "$(colorize 33 $(gettext 'Running') sup_install\(\):) $(colorize 35 $pkg)"
pankso@36 190 separator
pankso@39 191 [ "$clean" ] && rm -rf ${workdir}
pankso@39 192 mkdir -p ${workdir} && cd ${workdir}
pankso@37 193 . ${wok}/${pkg}/receip
pankso@42 194 gettext "Checking package dependencies"
pankso@42 195 deps="$(echo $DEPENDS | wc -w)"
pankso@42 196 in=$((8 + ${deps}))
pankso@42 197 indent $(($(tty_size) - ${in})) "[ $(colorize 033 $deps) ]"
pankso@42 198 check_sys_deps || exit 1
pankso@37 199 sup_install
pankso@37 200 separator
pankso@39 201 gettext "Working folder:"; echo " $workdir"
pankso@37 202 newline ;;
pankso@36 203
pankso@22 204 -n|new)
pankso@22 205 pkg="$2"
pankso@22 206 if [ ! "$pkg" ]; then
pankso@27 207 newline
pankso@22 208 gettext "New package name:"; echo -n " "; read pkg
pankso@22 209 fi
pankso@27 210 newline
pankso@22 211 [ ! "$pkg" ] && exit 0
pankso@27 212 [ ! -d "$wok" ] && cook_init
pankso@22 213 if [ -d "$wok/$pkg" ]; then
paul@28 214 gettext "Package already exists in wok:"; colorize 35 " $pkg"
pankso@22 215 newline && exit 0
pankso@22 216 fi
pankso@22 217 gettext "Creating new package files and tree..."
pankso@22 218 mkdir -p ${wok}/${pkg}/files
pankso@27 219 new_receip "$pkg"; status
pankso@27 220 gettext "Executing your favorite editor..."
pankso@27 221 editor ${wok}/${pkg}/receip; status
pankso@27 222 gettext "To cook your package:"; colorize 33 " sup cook $pkg"
pankso@27 223 newline ;;
pankso@22 224
pankso@6 225 -e|extract)
pankso@6 226 # Extract package.sup to current dir
pankso@6 227 pkg="$2"
pankso@6 228
pankso@6 229 # Sanity check
pankso@22 230 check_pkg_arg "$1"
pankso@6 231 if [ ! -f "$pkg" ]; then
pankso@36 232 gettext "Can't find package file:"; colorize 31 " $pkg" && exit 1
pankso@6 233 fi
pankso@6 234
pankso@6 235 newline
pankso@36 236 echo -n "$(colorize 33 $(gettext 'Extract package:'))"
pankso@36 237 colorize 36 " $(basename $pkg)"
pankso@6 238 separator
pankso@6 239
pankso@6 240 extract_sup "$pkg"
pankso@6 241
pankso@36 242 echo "$(gettext 'Packages:') $(colorize 036 $pkg) ($size)"
pankso@6 243 newline ;;
pankso@6 244
pankso@6 245 -i|install)
pankso@6 246 # Download/extract run install() in $cache/install
pankso@6 247 pkg="$2"
pankso@22 248 check_pkg_arg "$1"
pankso@39 249 newline
pankso@6 250
pankso@6 251 # Sup pkg in current dir
pankso@6 252 if [ -f "$pkg" ]; then
pankso@6 253 install_sup "$pkg" && exit 0
pankso@6 254 fi
pankso@6 255
pankso@19 256 # Sup cooked from wok
pankso@19 257 if [ -f "$wok/$pkg/receip" ]; then
pankso@19 258 . $wok/$pkg/receip
pankso@19 259 if [ -f "$cooked/$PACKAGE-$VERSION.sup" ]; then
pankso@19 260 install_sup "$cooked/$PACKAGE-$VERSION.sup" && exit 0
pankso@19 261 fi
pankso@19 262 fi
pankso@19 263
pankso@19 264 # Sup on mirror
pankso@34 265 [ ! -f "${pkgsdb}" ] && sup -u
pankso@6 266
pankso@34 267 if sqlite3 ${pkgsdb} "SELECT name FROM pkgs WHERE name = '$pkg'" >/dev/null
pankso@34 268 then
pankso@34 269 vers=$(sqlite3 ${pkgsdb} "SELECT version FROM pkgs WHERE name = '$pkg'")
pankso@34 270 mkdir -p ${cache}/wget && cd ${cache}/wget
pankso@34 271 # Download
pankso@34 272 download "$pkg" "${mirror}/${pkg}-${vers}.sup"
pankso@34 273 install_sup "${pkg}-${vers}.sup"
pankso@34 274 rm -rf ${cache}/wget && exit 0
pankso@34 275 fi
pankso@6 276 gettext "Can't find sup package:"; colorize 31 " $pkg" ;;
pankso@6 277
pankso@27 278 -u|update)
pankso@27 279 # Update packages
pankso@34 280 online=""
pankso@27 281 newline
pankso@27 282 colorize 33 $(gettext "SUP Update")
pankso@27 283 separator
pankso@27 284
pankso@27 285 # Skip HTTP/1.1 404 Not Found: 2>/dev/null
pankso@33 286 if ! wget -q -T 5 --spider ${mirror}/packages.sql 2>/dev/null; then
pankso@31 287 gettext "Mirror is unreachable"; newline
pankso@34 288 else
pankso@34 289 online=0
pankso@27 290 fi
pankso@33 291
pankso@33 292 # Newer packages.sql ?
pankso@34 293 gettext "Checking packages.sql..."
pankso@34 294 db_sum=$(wget -q "${server}?sup=dbsum" -O -)
pankso@34 295 if echo "$db_sum $pkgsdb" | md5sum -s -c -; then
pankso@45 296 info 036 "synced"
pankso@34 297 else
pankso@34 298 [ "$online" ] && rm -f ${pkgsdb}
pankso@45 299 info 035 "update"
pankso@34 300 fi
pankso@33 301
pankso@36 302 # --force
pankso@36 303 [ "$force" ] && rm -f ${pkgsdb}
pankso@36 304
pankso@34 305 # No packages.sql: get latest!
pankso@34 306 if [ ! -f "$pkgsdb" ] && [ "$online" ]; then
pankso@36 307
pankso@36 308 download "db" "${mirror}/packages.sql" "${supdb}"
pankso@34 309
pankso@34 310 timestamp=$(sqlite3 ${pkgsdb} 'SELECT timestamp FROM info' \
pankso@34 311 | awk '{printf $1 " " $2}')
pankso@34 312 gettext "Database timestamp:"
pankso@36 313 indent $(($(tty_size) - 23)) "[ $(colorize 30 $timestamp) ]"
pankso@45 314 log "$(gettext 'Updated packages database:') $timestamp"
pankso@45 315 fi
pankso@45 316
pankso@45 317 # Exit now if no packages.sql
pankso@45 318 if [ ! -f "$pkgsdb" ]; then
pankso@45 319 gettext "Please try later. Missing packages database"; echo; exit 1
pankso@34 320 fi
pankso@33 321
pankso@34 322 # Scan installed packages
pankso@36 323 count="$(ls $installed | wc -l)"
pankso@36 324 char="$(echo $count | wc -L)"
pankso@36 325 in=$((7 + ${char}))
pankso@36 326
pankso@34 327 gettext "Installed packages:"
pankso@45 328 info 033 "$count"; newline
pankso@45 329 echo -n $(boldify $(gettext "Package") $(indent 30 $(gettext "Version")))
pankso@45 330 info 40 $(gettext "Status")
pankso@45 331 separator "-"
pankso@34 332
pankso@34 333 for pkg in $(ls $installed)
pankso@34 334 do
pankso@34 335 . ${installed}/${pkg}/receip
pankso@34 336
pankso@45 337 name=$(sqlite3 ${pkgsdb} \
pankso@45 338 "SELECT name FROM pkgs WHERE name = '$pkg'")
pankso@45 339 if [ ! "$name" ]; then
pankso@45 340 #echo -n "$pkg $(indent 30 $VERSION)"
pankso@45 341 #info 036 "$(gettext "local")"
pankso@45 342 continue
pankso@45 343 else
pankso@45 344 db_sum=$(sqlite3 ${pkgsdb} \
pankso@45 345 "SELECT md5sum FROM pkgs WHERE name = '$pkg'")
pankso@42 346
pankso@45 347 # MD5sum not matching: new version our new build ?
pankso@45 348 if [ "$md5_sum" != "$db_sum" ]; then
pankso@45 349 echo -n "$pkg $(indent 30 $VERSION)"
pankso@45 350 vers=$(sqlite3 ${pkgsdb} \
pankso@45 351 "SELECT version FROM pkgs WHERE name = '$pkg'")
pankso@45 352
pankso@45 353 if [ "$VERSION" != "$vers" ]; then
pankso@45 354 info 032 "$(gettext "$vers")"
pankso@45 355 else
pankso@45 356 info 035 "$(gettext "rebuilt")"
pankso@45 357 fi
pankso@45 358 echo "$pkg" >> ${cache}/updates
pankso@34 359 fi
pankso@34 360 fi
pankso@45 361 unset name db_sum vers
pankso@33 362 done
pankso@27 363
pankso@34 364 if [ -f "$cache/updates" ]; then
pankso@34 365 count=$(cat $cache/updates | wc -l)
pankso@36 366 separator "-"
pankso@34 367 gettext "Available updates:"; colorize 32 " $count"
pankso@36 368 newline
pankso@34 369 # --install
pankso@34 370 if [ "$install" ]; then
pankso@34 371 for pkg in $(cat $cache/updates); do
pankso@34 372 sup -i ${pkg}
pankso@34 373 done
pankso@34 374 fi
pankso@34 375 else
pankso@34 376 gettext "Packages are up-to-date"; echo
pankso@34 377 newline
pankso@34 378 fi
pankso@34 379 rm -f ${cache}/updates ;;
pankso@27 380
pankso@20 381 -r|remove)
pankso@20 382 # Remove a package
pankso@20 383 pkg="$2"
pankso@22 384 check_pkg_arg "$1"
pankso@20 385 if [ -d "$installed/$pkg" ]; then
pankso@20 386 remove_sup "$pkg"
pankso@20 387 else
pankso@20 388 gettext "Can't find installed package:"; colorize 31 " $pkg"
pankso@20 389 exit 1
pankso@20 390 fi ;;
pankso@20 391
pankso@42 392 -s|search)
pankso@42 393 # TODO: better :-)
pankso@42 394 query="$2"
pankso@42 395 newline
pankso@42 396 echo -n "$(colorize 33 $(gettext 'Searching for:'))"
pankso@42 397 boldify " $query"
pankso@42 398 separator
pankso@42 399 sqlite3 ${pkgsdb} << EOT
pankso@42 400 .headers on
pankso@42 401 .mode column
pankso@42 402 SELECT name, version, short_desc FROM pkgs WHERE name = '$2';
pankso@42 403 EOT
pankso@42 404 newline ;;
pankso@42 405
pankso@6 406 -l|list)
pankso@42 407 # only --db
pankso@42 408 if [ "$db" ]; then
pankso@42 409 newline
pankso@42 410 echo -n "$(colorize 33 $(gettext 'SUP packages in database:'))"
pankso@42 411 boldify " $(sqlite3 ${pkgsdb} 'SELECT COUNT(name) FROM pkgs')"
pankso@42 412 separator
pankso@42 413 sqlite3 ${pkgsdb} << EOT
pankso@42 414 .mode column
pankso@42 415 SELECT name, short_desc FROM pkgs;
pankso@42 416 EOT
pankso@42 417 newline; exit 0
pankso@42 418 fi
pankso@42 419
pankso@6 420 installed_nb=$(ls ${installed} | wc -l)
pankso@6 421 newline
pankso@42 422 echo -n "$(colorize 36 $(gettext 'Installed SUP packages:'))"
pankso@6 423 boldify " $installed_nb"
pankso@6 424 separator
pankso@6 425 for pkg in $(ls ${installed}); do
pankso@36 426 . ${installed}/${pkg}/receip
pankso@6 427 echo "$pkg $(indent 26 $VERSION) $(indent 42 $MAINTAINER)"
pankso@6 428 done
pankso@6 429 if [ "$installed_nb" == 0 ]; then
pankso@6 430 gettext "No sup packages installed"; echo
pankso@6 431 fi
pankso@6 432 newline
pankso@6 433 if [ -d "$wok" ]; then
pankso@42 434 echo -n "$(colorize 35 $(gettext 'SUP packages in your wok:'))"
pankso@6 435 boldify " $(ls ${wok} | wc -l)"
pankso@6 436 separator
pankso@6 437 for pkg in $(ls ${wok}); do
pankso@12 438 . ${wok}/${pkg}/receip
pankso@6 439 echo "$pkg $(indent 26 $VERSION) $(indent 42 $MAINTAINER)"
pankso@6 440 done
pankso@44 441 newline
pankso@44 442 fi
pankso@44 443 if [ -d "$cooked" ]; then
pankso@44 444 echo -n "$(colorize 33 $(gettext 'Cooked packages:'))"
pankso@44 445 boldify " $(ls $cooked | wc -l)"
pankso@42 446 fi
pankso@42 447 echo -n "$(colorize 33 $(gettext 'SUP packages in database:'))"
pankso@42 448 boldify " $(sqlite3 ${pkgsdb} 'SELECT COUNT(name) FROM pkgs')"
pankso@42 449 newline ;;
pankso@6 450
pankso@44 451 -d|debug)
pankso@44 452 # Packaging environment and debugger
pankso@44 453 newline
pankso@44 454 echo "$(colorize 35 $(gettext "Cooked packages:")) $cooked"
pankso@44 455 separator "-"
pankso@44 456 ls -1 ${cooked}; newline
pankso@44 457 echo "$(colorize 35 $(gettext "Downloads::")) $downloads"
pankso@44 458 separator "-"
pankso@44 459 ls -1 ${downloads}; newline ;;
pankso@44 460
pankso@6 461 ""|-h|help) help ;;
pankso@6 462
pankso@47 463 *|info)
pankso@6 464 # Display pkg info if installed
pankso@47 465 [ "$1" == "info" ] && shift
pankso@6 466 pkg="$1"
pankso@12 467 if [ -f "$installed/$pkg/receip" ]; then
pankso@12 468 . ${installed}/${pkg}/receip
pankso@6 469 newline
pankso@19 470 gettext "Installed package:"; colorize 36 " $PACKAGE $VERSION"
pankso@6 471 separator
pankso@39 472 echo "$SHORT_DESC"
pankso@39 473 newline
pankso@47 474 if [ "$list" ]; then
pankso@47 475 colorize 036 "$(gettext 'Files list:')"
pankso@47 476 cat ${installed}/${pkg}/files.list
pankso@47 477 separator "-"
pankso@47 478 fi
pankso@47 479 echo -n $(colorize 036 "$(gettext 'Installed size:')")
pankso@47 480 info 033 "$sup_size"
pankso@47 481 echo -n $(colorize 036 "$(gettext 'Installed files:')")
pankso@47 482 info 033 $(cat ${installed}/${pkg}/files.list | wc -l)
pankso@6 483 newline
pankso@6 484 else
pankso@6 485 gettext "Can't find installed package:"; colorize 31 " $pkg"
pankso@6 486 fi ;;
pankso@6 487
pankso@6 488 esac && exit 0