cookutils annotate modules/pkgdb @ rev 860
cook: changed the algorithm for determining the free memory: Busybox-1.26.1 has different output of the `free` command.
I believe with /proc/meminfo it will be more consistent result.
I believe with /proc/meminfo it will be more consistent result.
| author | Aleksej Bobylev <al.bobylev@gmail.com> |
|---|---|
| date | Sun Jan 08 01:50:38 2017 +0200 (2017-01-08) |
| parents | |
| children | 1520231a65c2 |
| rev | line source |
|---|---|
| al@857 | 1 #!/bin/sh |
| al@857 | 2 # |
| al@857 | 3 # pkgdb - module of the SliTaz Cook |
| al@857 | 4 # Copyright (C) SliTaz GNU/Linux - GNU GPL v3 |
| al@857 | 5 # |
| al@857 | 6 |
| al@857 | 7 . /usr/lib/slitaz/libcook.sh |
| al@857 | 8 |
| al@857 | 9 export output=raw |
| al@857 | 10 |
| al@857 | 11 echo "flavors='$flavors' rmpkg='$rmpkg' 1='$1' 2='$2'" |
| al@857 | 12 |
| al@857 | 13 # Internationalization. |
| al@857 | 14 |
| al@857 | 15 export TEXTDOMAIN='cook' |
| al@857 | 16 |
| al@857 | 17 |
| al@857 | 18 # |
| al@857 | 19 # Functions |
| al@857 | 20 # |
| al@857 | 21 |
| al@857 | 22 dblog() { tee -a $LOGS/pkgdb.log; } |
| al@857 | 23 |
| al@857 | 24 |
| al@857 | 25 # Return size of file in human readible format |
| al@857 | 26 # Note, "du" in opposite returns size occupied by file on disk (4KB multiple in most cases) |
| al@857 | 27 |
| al@857 | 28 filesize() { busybox ls -lh "$1" | awk '{print $5 "B"}'; } |
| al@857 | 29 |
| al@857 | 30 |
| al@857 | 31 |
| al@857 | 32 |
| al@857 | 33 |
| al@857 | 34 # Create suitable packages list for TazPkg and only for built packages |
| al@857 | 35 # as well as flavors files for TazLiTo. We don't need logs since we do it |
| al@857 | 36 # manually to ensure everything is fine before syncing the mirror. |
| al@857 | 37 |
| al@857 | 38 rm $LOGS/pkgdb.log 2>/dev/null |
| al@857 | 39 |
| al@857 | 40 case "$1" in |
| al@857 | 41 --flavors|--rmpkg) ;; |
| al@857 | 42 *) |
| al@857 | 43 [ -n "$1" ] && PKGS="$1" |
| al@857 | 44 if [ ! -d "$PKGS" ]; then |
| al@857 | 45 { newline; _ "Packages directory \"%s\" doesn't exist" "$PKGS"; newline; } | dblog |
| al@857 | 46 exit 1 |
| al@857 | 47 fi ;; |
| al@857 | 48 esac |
| al@857 | 49 |
| al@857 | 50 time=$(date +%s) |
| al@857 | 51 flavors="$SLITAZ/flavors" |
| al@857 | 52 live="$SLITAZ/live" |
| al@857 | 53 |
| al@857 | 54 echo 'cook:pkgdb' > $command |
| al@857 | 55 _ 'Cook pkgdb: Creating all packages lists' | log |
| al@857 | 56 newline; { _ 'Creating lists for "%s"' "$PKGS"; separator; } | dblog |
| al@857 | 57 |
| al@857 | 58 { _ 'Cook pkgdb started: %s' "$(date "$(_ '+%%F %%R')")"; newline; } | dblog |
| al@857 | 59 |
| al@857 | 60 cd $PKGS |
| al@857 | 61 rm -f packages.* extra.list |
| al@857 | 62 touch packages.equiv |
| al@857 | 63 |
| al@857 | 64 _n 'Creating file "%s"' 'packages.list' | dblog |
| al@857 | 65 ls -1 *.tazpkg | sed s'/.tazpkg//' > $PKGS/packages.list |
| al@857 | 66 echo " ($(filesize $PKGS/packages.list))" | dblog |
| al@857 | 67 |
| al@857 | 68 _n 'Creating file "%s"' 'packages.md5' | dblog |
| al@857 | 69 md5sum *.tazpkg > $PKGS/packages.md5 |
| al@857 | 70 echo " ($(filesize $PKGS/packages.md5))" | dblog |
| al@857 | 71 cp $PKGS/packages.md5 $PKGS/packages.toremove # list of duplicates |
| al@857 | 72 |
| al@857 | 73 md5sum packages.md5 | cut -d' ' -f1 > ID |
| al@857 | 74 ( cat ./ID | tr $'\n' ' '; date -ur ./ID +%s ) > IDs # md5 and timestamp |
| al@857 | 75 |
| al@857 | 76 _n 'Creating file "%s"' 'descriptions.txt' | dblog |
| al@857 | 77 rm $PKGS/descriptions.txt 2>/dev/null |
| al@857 | 78 for i in $(ls $WOK | sort); do |
| al@857 | 79 if [ -e "$WOK/$i/description.txt" ]; then |
| al@857 | 80 echo "$i" >> descriptions.txt |
| al@857 | 81 cat "$WOK/$i/description.txt" | sed 's|^$| |' >> descriptions.txt |
| al@857 | 82 echo >> descriptions.txt |
| al@857 | 83 fi |
| al@857 | 84 done |
| al@857 | 85 echo " ($(filesize $PKGS/descriptions.txt))" | dblog |
| al@857 | 86 |
| al@857 | 87 |
| al@857 | 88 _ 'Creating lists from "%s"' "$WOK" | dblog |
| al@857 | 89 cd $WOK |
| al@857 | 90 for pkg in *; do |
| al@857 | 91 unset_receipt |
| al@857 | 92 . $pkg/receipt |
| al@857 | 93 # PACKED_SIZE and UNPACKED_SIZE are only in built receipt |
| al@857 | 94 [ -s $pkg/taz/*/receipt ] && . $pkg/taz/*/receipt |
| al@857 | 95 |
| al@857 | 96 if [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" ] || \ |
| al@857 | 97 [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION-$ARCH.tazpkg" ]; then |
| al@857 | 98 |
| al@857 | 99 # packages.desc lets us search easily in DB |
| al@857 | 100 cat >> $PKGS/packages.desc <<EOT |
| al@857 | 101 $PACKAGE | $VERSION$EXTRAVERSION | $SHORT_DESC | $CATEGORY | $WEB_SITE |
| al@857 | 102 EOT |
| al@857 | 103 |
| al@857 | 104 # packages.txt used by tazpkg and tazpkg-web also to provide |
| al@857 | 105 # a human readable package list with version and description. |
| al@857 | 106 cat >> $PKGS/packages.txt <<EOT |
| al@857 | 107 $PACKAGE |
| al@857 | 108 $VERSION$EXTRAVERSION |
| al@857 | 109 $SHORT_DESC |
| al@857 | 110 $PACKED_SIZE ($UNPACKED_SIZE installed) |
| al@857 | 111 |
| al@857 | 112 EOT |
| al@857 | 113 |
| al@857 | 114 # packages.info combines TazPkg separate files |
| al@857 | 115 # and will substitute them all |
| al@857 | 116 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g') |
| al@857 | 117 DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts |
| al@857 | 118 MD5="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" $PKGS/packages.md5 | awk '{print $1}')" |
| al@857 | 119 cat >> $PKGS/packages.info <<EOT |
| al@857 | 120 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $MD5 |
| al@857 | 121 EOT |
| al@857 | 122 |
| al@857 | 123 # packages.equiv is used by tazpkg install to check depends. |
| al@857 | 124 for i in $PROVIDE; do |
| al@857 | 125 DEST='' |
| al@857 | 126 echo $i | fgrep -q : && DEST="${i#*:}:" |
| al@857 | 127 if grep -qs ^${i%:*}= $PKGS/packages.equiv; then |
| al@857 | 128 sed -i "s/^${i%:*}=/${i%:*}=$DEST$PACKAGE /" \ |
| al@857 | 129 $PKGS/packages.equiv |
| al@857 | 130 else |
| al@857 | 131 echo "${i%:*}=$DEST$PACKAGE" >> $PKGS/packages.equiv |
| al@857 | 132 fi |
| al@857 | 133 done |
| al@857 | 134 |
| al@857 | 135 # files.list provides a list of all packages files. |
| al@857 | 136 cat $pkg/taz/*/files.list | sed s/^/"$pkg: \0"/ >> \ |
| al@857 | 137 $PKGS/files.list |
| al@857 | 138 |
| al@857 | 139 # list of duplicates |
| al@857 | 140 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION.tazpkg/d" $PKGS/packages.toremove |
| al@857 | 141 else |
| al@857 | 142 # if receipt variable HOST_ARCH absent/empty or contains ARCH |
| al@857 | 143 if [ -z "$HOST_ARCH" -o "${HOST_ARCH/$ARCH/}" != "$HOST_ARCH" ]; then |
| al@857 | 144 _ ' - absent: %s (%s)' "$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$ARCH" | dblog |
| al@857 | 145 fi |
| al@857 | 146 fi |
| al@857 | 147 done |
| al@857 | 148 |
| al@857 | 149 # Display list size. |
| al@857 | 150 _ 'Done: %s (%s)' 'packages.desc' "$(filesize $PKGS/packages.desc)" | dblog |
| al@857 | 151 _ 'Done: %s (%s)' 'packages.txt' "$(filesize $PKGS/packages.txt)" | dblog |
| al@857 | 152 _ 'Done: %s (%s)' 'packages.info' "$(filesize $PKGS/packages.info)" | dblog |
| al@857 | 153 _ 'Done: %s (%s)' 'packages.equiv' "$(filesize $PKGS/packages.equiv)" | dblog |
| al@857 | 154 |
| al@857 | 155 cd $PKGS |
| al@857 | 156 |
| al@857 | 157 |
| al@857 | 158 # Check package duplicates |
| al@857 | 159 if [ -s "$PKGS/packages.toremove" ]; then |
| al@857 | 160 newline | dblog |
| al@857 | 161 _ 'Removing duplicates:' | dblog |
| al@857 | 162 while read pkgsum pkgfile; do |
| al@857 | 163 echo " - $pkgfile" | dblog |
| al@857 | 164 sed -i "/${pkgfile%.tazpkg}/d" $PKGS/packages.list |
| al@857 | 165 sed -i "/ $pkgfile/d" $PKGS/packages.md5 |
| al@857 | 166 [ -n "$rmpkg" ] && rm $PKGS/$pkgfile # remove packages only with --rmpkg |
| al@857 | 167 done < $PKGS/packages.toremove |
| al@857 | 168 newline | dblog |
| al@857 | 169 fi |
| al@857 | 170 rm $PKGS/packages.toremove |
| al@857 | 171 |
| al@857 | 172 |
| al@857 | 173 # files.list.lzma |
| al@857 | 174 _n 'Creating file "%s"' 'files.list.lzma' | dblog |
| al@857 | 175 touch files.list |
| al@857 | 176 # pkgs.slitaz.org strongly depends on list sorted by packages names |
| al@857 | 177 lzma e files.list files.list.lzma |
| al@857 | 178 echo " ($(filesize $PKGS/files.list.lzma))" | dblog |
| al@857 | 179 |
| al@857 | 180 # Pre-sorting filenames causes 10% smaller resulting lzma file |
| al@857 | 181 _n 'Creating file "%s"' 'files-list.lzma' | dblog |
| al@857 | 182 cat files.list | sort -k2 -o files.list.sorted |
| al@857 | 183 lzma e files.list.sorted files-list.lzma |
| al@857 | 184 rm -f files.list files.list.sorted |
| al@857 | 185 echo " ($(filesize $PKGS/files-list.lzma))" | dblog |
| al@857 | 186 |
| al@857 | 187 [ -e files.list.md5 ] && rm files.list.md5 |
| al@857 | 188 md5sum files-list.lzma | cut -d' ' -f1 | tr -d $'\n' > files-list.md5 |
| al@857 | 189 |
| al@857 | 190 # packages.info.lzma |
| al@857 | 191 PI=packages.info |
| al@857 | 192 _n 'Creating file "%s"' 'packages.info.lzma' | dblog |
| al@857 | 193 touch $PI |
| al@857 | 194 lzma e $PI $PI.lzma |
| al@857 | 195 echo " ($(filesize $PKGS/packages.info.lzma))" | dblog |
| al@857 | 196 |
| al@857 | 197 # Make bundle to fast recharge |
| al@857 | 198 _n 'Creating file "%s"' 'bundle.tar.lzma' | dblog |
| al@857 | 199 [ -f bundle.tar.lzma ] && rm bundle.tar.lzma |
| al@857 | 200 # Make sure to get "mirrors" file |
| al@857 | 201 until [ -e 'mirrors' ]; do |
| al@857 | 202 wget -q http://mirror1.slitaz.org/mirrors |
| al@857 | 203 echo -n '.' | dblog; sleep 5 |
| al@857 | 204 done |
| al@857 | 205 # Make sure to get "extra.list" file |
| al@857 | 206 until [ -e 'extra.list' ]; do |
| al@857 | 207 wget -q -O extra.list http://mirror1.slitaz.org/packages/get.list |
| al@857 | 208 echo -n '.' | dblog; sleep 5 |
| al@857 | 209 done |
| al@857 | 210 busybox tar -chaf bundle.tar.lzma \ |
| al@857 | 211 mirrors extra.list files-list.md5 packages.info descriptions.txt \ |
| al@857 | 212 packages.desc packages.md5 packages.txt packages.list packages.equiv |
| al@857 | 213 rm ./mirrors |
| al@857 | 214 echo " ($(filesize $PKGS/bundle.tar.lzma))" | dblog |
| al@857 | 215 |
| al@857 | 216 # Display some info. |
| al@857 | 217 separator | dblog |
| al@857 | 218 nb=$(ls $PKGS/*.tazpkg | wc -l) |
| al@857 | 219 time=$(($(date +%s) - $time)) |
| al@857 | 220 # L10n: 's' is for seconds (cooking time) |
| al@857 | 221 { _ 'Packages: %s - Time: %ss' "$nb" "$time"; newline; } | dblog |
| al@857 | 222 |
| al@857 | 223 |
| al@857 | 224 # Create all flavors files at once. Do we really need code to monitor |
| al@857 | 225 # flavors changes? Let's just build them with packages lists before |
| al@857 | 226 # syncing the mirror. |
| al@857 | 227 [ "$1" != '--flavors' ] && exit 1 |
| al@857 | 228 |
| al@857 | 229 if [ ! -d "$flavors" ]; then |
| al@857 | 230 { _ 'Missing flavors folder "%s"' "$flavors"; newline; } | dblog |
| al@857 | 231 exit 1 |
| al@857 | 232 fi |
| al@857 | 233 |
| al@857 | 234 [ ! -d "$live" ] && mkdir -p $live |
| al@857 | 235 _ 'Creating flavors files in "%s"' "$live" | dblog |
| al@857 | 236 _ 'Cook pkgdb: Creating all flavors' | log |
| al@857 | 237 separator | dblog |
| al@857 | 238 |
| al@857 | 239 _ 'Recharging lists to use latest packages...' | dblog |
| al@857 | 240 tazpkg recharge >/dev/null 2>/dev/null |
| al@857 | 241 |
| al@857 | 242 # We need a custom tazlito config to set working dir to /home/slitaz. |
| al@857 | 243 if [ ! -f "$live/tazlito.conf" ]; then |
| al@857 | 244 _ 'Creating configuration file "%s"' 'tazlito.conf' | dblog |
| al@857 | 245 cp /etc/tazlito/tazlito.conf $live |
| al@857 | 246 sed -i s@WORK_DIR=.*@WORK_DIR=\"/home/slitaz\"@ \ |
| al@857 | 247 $live/tazlito.conf |
| al@857 | 248 fi |
| al@857 | 249 |
| al@857 | 250 # Update Hg flavors repo and pack. |
| al@857 | 251 if [ -d "$flavors/.hg" ]; then |
| al@857 | 252 cd $flavors; hg pull -u |
| al@857 | 253 fi |
| al@857 | 254 |
| al@857 | 255 cd $live |
| al@857 | 256 _ 'Starting to generate flavors...' | dblog |
| al@857 | 257 rm -f flavors.list *.flavor |
| al@857 | 258 for i in $flavors/*; do |
| al@857 | 259 fl=$(basename $i) |
| al@857 | 260 _ 'Packing flavor "%s"' "$fl" | dblog |
| al@857 | 261 tazlito pack-flavor $fl >/dev/null || exit 1 |
| al@857 | 262 tazlito show-flavor $fl --brief --noheader 2>/dev/null >> flavors.list |
| al@857 | 263 done |
| al@857 | 264 cp -f $live/*.flavor $live/flavors.list $PKGS |
| al@857 | 265 separator | dblog |
| al@857 | 266 { _ 'Total flavors size: %s' "$(du -sh $live | awk '{print $1}')"; newline; } | dblog |
| al@857 | 267 rm -f $command |
| al@857 | 268 separator | dblog |
| al@857 | 269 _ 'Cook pkgdb end: %s' "$(date "$(_ '+%%F %%R')")" | dblog |
| al@857 | 270 |
| al@857 | 271 |
| al@857 | 272 exit 0 |