sup annotate sup @ rev 39

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