spk annotate spk-archive @ rev 26

spk-add: make id busybox ash compatible and fix libspk.sh as well
author Christophe Lincoln <pankso@slitaz.org>
date Tue May 15 18:17:27 2012 +0200 (2012-05-15)
parents db99af6fac70
children bb5a37f13ad6
rev   line source
pankso@26 1 #!/bin/bash
meshca@11 2 #
meshca@11 3 # Spk-Archive - SliTaz Package Archive Manager
meshca@11 4 #
meshca@11 5 # NOT COMPLETE: Still need to re-write (just what was grabbed from tazpkg)
meshca@11 6 # UNSURE: Should Pack and Repack be here?
meshca@11 7 #
meshca@11 8 # Authors : See the AUTHORS files
meshca@11 9
meshca@11 10 source /usr/lib/slitaz/libspk.sh
meshca@11 11
meshca@11 12 usage() {
meshca@11 13 name=$(basename $0)
pankso@26 14 cat << EOT
meshca@11 15
meshca@11 16 $(boldify $(gettext "Usage:")) $name [command] package
meshca@11 17
meshca@11 18 $(boldify $(gettext "Commands:"))
meshca@11 19 pack
meshca@11 20 repack [--config]
meshca@11 21 extract
meshca@11 22 recompress
meshca@11 23
meshca@11 24 $(boldify "$(gettext "Example:")")
meshca@11 25 $name extract clex
meshca@11 26
meshca@11 27 EOT
meshca@11 28 exit 0
meshca@11 29 }
meshca@11 30
meshca@11 31 # Extract a package with cpio and gzip/lzma to the current directory.
meshca@11 32 # Parameters: package_file
meshca@11 33 extract_package() {
meshca@11 34 local package_file=$1
meshca@11 35 local package_name=$(package_name $package_file)
pankso@26 36
meshca@11 37 eval_gettext "Extracting \$package_name... "
meshca@11 38 cpio -idm --quiet < ${package_file##*/} && rm -f ${package_file##*/}
meshca@11 39 status
pankso@26 40
meshca@11 41 gettext "Extracting the pseudo fs... "
meshca@11 42 if [ -f fs.cpio.lzma ]; then
meshca@11 43 echo -n "(lzma) "
meshca@11 44 unlzma -c fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma
meshca@11 45 elif [ -f fs.cpio.gz ]; then
meshca@11 46 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz
meshca@11 47 fi
meshca@11 48 status
meshca@11 49 }
meshca@11 50
meshca@11 51 # Extract .tazpkg cpio archive into a directory.
meshca@11 52 # Parameters: package_file results_directory
meshca@11 53 extract() {
meshca@11 54 local package_file=$1
meshca@11 55 local target_dir=$2
pankso@26 56
meshca@11 57 # validate the file
meshca@11 58 check_valid_tazpkg $package_file
pankso@26 59
meshca@11 60 # find the package name
meshca@11 61 local package_name=$(package_name $package_file)
meshca@11 62
meshca@11 63 # Create destination directory
meshca@11 64 local dest_dir=$(pwd)/$package_name
meshca@11 65 [ -n "$target_dir" ] && dest_dir=$target_dir/$package_name
meshca@11 66 mkdir -p $dest_dir
pankso@26 67
meshca@11 68 newline
meshca@11 69 echo $(boldify $(gettext "Extracting:")) $package_name
meshca@11 70 separator
pankso@26 71
meshca@11 72 gettext "Copying original package..."
meshca@11 73 cp $package_file $dest_dir
meshca@11 74 status
meshca@11 75 pushd $dest_dir > /dev/null
meshca@11 76 extract_package $package $package_file
meshca@11 77 popd > /dev/null
meshca@11 78 separator
meshca@11 79 eval_gettext "\$package_name is extracted to: \$dest_dir"; newline
meshca@11 80 newline
meshca@11 81 }
meshca@11 82
meshca@11 83 # Recompress .tazpkg cpio archive with lzma.
meshca@11 84 # Parameters: package_file
meshca@11 85 recompress() {
pankso@26 86 local package_file=$1
meshca@11 87 valid_tazpkg $package_file
pankso@26 88
meshca@11 89 local package_name=$(package_name $package_file)
pankso@26 90
meshca@11 91 newline
meshca@11 92 echo $(boldify $(gettext "Recompressing:")) $package_name
meshca@11 93 separator
pankso@26 94
meshca@11 95 mkdir -p $TMP_DIR
pankso@26 96
meshca@11 97 gettext "Copying original package..."
meshca@11 98 cp $package_file $TMP_DIR
meshca@11 99 status
pankso@26 100
meshca@11 101 pushd $TMP_DIR > /dev/null
meshca@11 102 extract_package $package_file
pankso@26 103
meshca@11 104 gettext "Recompressing the fs... "
meshca@11 105 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
meshca@11 106 rm -rf fs
meshca@11 107 status
meshca@11 108 popd > /dev/null
pankso@26 109
meshca@11 110 gettext "Creating new package... "
meshca@11 111 find $TMP_DIR -print | cpio -o -H newc --quiet > \
meshca@11 112 $(basename $package_file).$$ && mv -f \
meshca@11 113 $(basename $package_file).$$ \
meshca@11 114 $(basename $package_file)
meshca@11 115 status
pankso@26 116
meshca@11 117 rm -rf $TMP_DIR
meshca@11 118 }
meshca@11 119
meshca@11 120 # Create SliTaz package archive from an installed package.
meshca@11 121 # Parameters: package
meshca@11 122 repack() {
meshca@11 123 local package=$1
meshca@11 124 unset EXTRAVERSION
meshca@11 125 source $INSTALLED/$package/receipt
meshca@11 126 newline
meshca@11 127 echo -e "$(bold Repacking :) $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
meshca@11 128 separator
meshca@11 129 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
meshca@11 130 eval_gettext "Can't repack \$PACKAGE"; newline
meshca@11 131 exit 1
meshca@11 132 fi
meshca@11 133 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
meshca@11 134 eval_gettext "Can't repack, \$PACKAGE files have been modified by:"; newline
meshca@11 135 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
meshca@11 136 echo " $i"
meshca@11 137 done
meshca@11 138 exit 1
meshca@11 139 fi
meshca@11 140 unset MISSING
meshca@11 141 while read i; do
meshca@11 142 [ -e "$i" ] && continue
meshca@11 143 [ -L "$i" ] || MISSING="$MISSING\n $i"
meshca@11 144 done < $INSTALLED/$PACKAGE/files.list
meshca@11 145 if [ -n "$MISSING" ]; then
meshca@11 146 gettext "Can't repack, the following files are lost:"
meshca@11 147 echo -e "$MISSING"
meshca@11 148 exit 1
meshca@11 149 fi
pankso@26 150 mkdir -p $TMP_DIR
meshca@11 151 pushd $TMP_DIR > /dev/null
meshca@11 152 FILES="fs.cpio.lzma\n"
meshca@11 153 for i in $(ls $INSTALLED/$PACKAGE) ; do
meshca@11 154 [ "$i" = "volatile.cpio.gz" ] && continue
meshca@11 155 [ "$i" = "modifiers" ] && continue
meshca@11 156 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
meshca@11 157 done
meshca@11 158 ln -s / rootfs
meshca@11 159 mkdir tmp
meshca@11 160 sed 's/^/rootfs/' < files.list | cpio -o -H newc --quiet |\
meshca@11 161 { cd tmp ; cpio -idm --quiet >/dev/null; cd ..; }
meshca@11 162 mv tmp/rootfs fs
meshca@11 163 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
meshca@11 164 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
meshca@11 165 { cd fs; cpio -idm --quiet; cd ..; }
meshca@11 166 fi
meshca@11 167 if fgrep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
meshca@11 168 . $INSTALLED/$PACKAGE/receipt
meshca@11 169 repack_cleanup fs
meshca@11 170 fi
meshca@11 171 if [ -f $INSTALLED/$PACKAGE/$CHECKSUM ]; then
meshca@11 172 sed 's, , fs,' < $INSTALLED/$PACKAGE/$CHECKSUM | \
meshca@11 173 $CHECKSUM -s -c || {
meshca@11 174 gettext "Can't repack, $CHECKSUM error."; newline
meshca@11 175 popd
meshca@11 176 rm -rf $TMP_DIR
meshca@11 177 exit 1
meshca@11 178 }
meshca@11 179 fi
meshca@11 180 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
meshca@11 181 echo -e "$FILES" | cpio -o -H newc --quiet > $PACKAGE-$VERSION$EXTRAVERSION.tazpkg
meshca@11 182 popd > /dev/null
meshca@11 183 mv $TMP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg .
meshca@11 184 rm -R $TMP_DIR
meshca@11 185 eval_gettext "Package \$PACKAGE repacked successfully."; newline
meshca@11 186 echo $(gettext "Size") : $(du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg)
meshca@11 187 newline
meshca@11 188 }
meshca@11 189
meshca@11 190 # Create SliTaz package archive from configuration files.
meshca@11 191 repack_config() {
meshca@11 192 mkdir -p $TMP_DIR
meshca@11 193 pushd $TMP_DIR > /dev/null
meshca@11 194 CONFIG_VERSION=1.0
meshca@11 195 mkdir config-$CONFIG_VERSION
meshca@11 196 pushd config-$CONFIG_VERSION
meshca@11 197 for i in $INSTALLED/*/volatile.cpio.gz; do
meshca@11 198 zcat $i | cpio -t --quiet
meshca@11 199 done > files.list
meshca@11 200 mkdir fs
meshca@11 201 pushd fs
meshca@11 202 ( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null
meshca@11 203 mkdir -p etc/tazlito
meshca@11 204 for i in $INSTALLED/*/receipt; do
meshca@11 205 unset EXTRAVERSION
meshca@11 206 source $i
meshca@11 207 echo "$PACKAGE-$VERSION$EXTRAVERSION"
meshca@11 208 done > etc/tazlito/config-packages.list
meshca@11 209 popd > /dev/null
meshca@11 210 echo "etc/tazlito/config-packages.list" >> files.list
meshca@11 211 cat > receipt <<EOT
meshca@11 212 # SliTaz package receipt.
meshca@11 213
meshca@11 214 PACKAGE="config"
meshca@11 215 VERSION="$CONFIG_VERSION"
meshca@11 216 CATEGORY="base-system"
meshca@11 217 SHORT_DESC="$(gettext "User configuration backup on ")$(date)"
meshca@11 218 DEPENDS="$(ls $INSTALLED)"
meshca@11 219 EOT
meshca@11 220 popd
meshca@11 221 tazpkg pack config-$CONFIG_VERSION
meshca@11 222 popd
meshca@11 223 cp $TMP_DIR/config-$CONFIG_VERSION.tazpkg .
meshca@11 224 rm -rf $TMP_DIR
meshca@11 225 }
meshca@11 226
meshca@11 227 # Create SliTaz package archive using cpio and gzip.
meshca@11 228 # Parameters: package
meshca@11 229 pack() {
meshca@11 230 local package="$1"
meshca@11 231 cd $PACKAGE
meshca@11 232 if [ ! -f "receipt" ]; then
meshca@11 233 gettext "Receipt is missing. Please read the documentation."; newline
meshca@11 234 exit 0
meshca@11 235 else
meshca@11 236 newline
meshca@11 237 echo "$(bold Packing :) $PACKAGE"
meshca@11 238 separator
meshca@11 239 # Create files.list with redirecting find outpout.
pankso@26 240 gettext "Creating the list of files..."
meshca@11 241 pushd fs
meshca@11 242 find . -type f -print > ../files.list
meshca@11 243 find . -type l -print >> ../files.list
meshca@11 244 popd
meshca@11 245 sed -i s/'^.'/''/ files.list
meshca@11 246 status
meshca@11 247 gettext "Creating $CHECKSUM of files..."
meshca@11 248 while read file; do
meshca@11 249 [ -L "fs$file" ] && continue
meshca@11 250 [ -f "fs$file" ] || continue
meshca@11 251 case "$file" in
meshca@11 252 /lib/modules/*/modules.*|*.pyc) continue;;
meshca@11 253 esac
meshca@11 254 $CHECKSUM "fs$file" | sed 's/ fs/ /'
meshca@11 255 done < files.list > $CHECKSUM
meshca@11 256 status
meshca@11 257 UNPACKED_SIZE=$(du -chs fs receipt files.list $CHECKSUM \
meshca@11 258 description.txt 2> /dev/null | awk \
meshca@11 259 '{ sz=$1 } END { print sz }')
meshca@11 260 # Build cpio archives.
meshca@11 261 gettext "Compressing the fs... "
meshca@11 262 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
meshca@11 263 rm -rf fs
meshca@11 264 status
meshca@11 265 PACKED_SIZE=$(du -chs fs.cpio.lzma receipt files.list \
meshca@11 266 $CHECKSUM description.txt 2> /dev/null | awk \
meshca@11 267 '{ sz=$1 } END { print sz }')
meshca@11 268 gettext "Updating receipt sizes..."
meshca@11 269 sed -i s/^PACKED_SIZE.*$// receipt
meshca@11 270 sed -i s/^UNPACKED_SIZE.*$// receipt
meshca@11 271 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
meshca@11 272 status
meshca@11 273 gettext "Creating full cpio archive... "
meshca@11 274 find . -print | cpio -o -H newc --quiet > ../$PACKAGE.tazpkg
meshca@11 275 status
meshca@11 276 gettext "Restoring original package tree... "
meshca@11 277 unlzma -c fs.cpio.lzma | cpio -idm --quiet
meshca@11 278 status
meshca@11 279 rm fs.cpio.lzma && cd ..
meshca@11 280 separator
meshca@11 281 eval_gettext "Package \$PACKAGE compressed successfully."; newline
meshca@11 282 echo $(gettext "Size") : $(du -sh $PACKAGE.tazpkg)
meshca@11 283 newline
meshca@11 284 fi
meshca@11 285 }
meshca@11 286
meshca@11 287 case $1 in
meshca@11 288 pack|-p)
meshca@11 289 pack $2 ;;
meshca@11 290 extract|-e)
meshca@11 291 extract_package $2 $3 ;;
meshca@11 292 recompress|-r)
meshca@11 293 recompress $2 ;;
meshca@11 294 *)
meshca@11 295 usage ;;
meshca@11 296 esac