wok-next rev 941
xarchive: enhance tar and cpio support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Tue Jun 24 13:47:32 2008 +0000 (2008-06-24) |
parents | 942d5b5c8ec1 |
children | 19e156dfc1af |
files | xarchive/stuff/slitaz-wrap.sh |
line diff
1.1 --- a/xarchive/stuff/slitaz-wrap.sh Mon Jun 23 20:33:44 2008 +0000 1.2 +++ b/xarchive/stuff/slitaz-wrap.sh Tue Jun 24 13:47:32 2008 +0000 1.3 @@ -57,7 +57,6 @@ 1.4 lc_archive="$(echo $archive|tr [:upper:] [:lower:])" 1.5 DECOMPRESS="cat" 1.6 COMPRESS="cat" 1.7 -COMPRESS2="" 1.8 TAR_COMPRESS_OPT="" 1.9 for ext in $GZIP_EXTS $CPIOGZ_EXTS; do 1.10 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.11 @@ -76,8 +75,7 @@ 1.12 for ext in $LZMA_EXTS; do 1.13 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.14 DECOMPRESS="unlzma -c" 1.15 - COMPRESS="lzma e" 1.16 - COMPRESS2=" -so" 1.17 + COMPRESS="lzma e -si -so" 1.18 TAR_COMPRESS_OPT="a" 1.19 fi 1.20 done 1.21 @@ -108,7 +106,7 @@ 1.22 { 1.23 if [ "$COMPRESS" ] && [ "$oldarch" ]; then 1.24 [ -f "$oldarch" ] && rm "$oldarch" 1.25 - if $COMPRESS "$archive" $COMPRESS2 > "$oldarch"; then 1.26 + if $COMPRESS < "$archive" > "$oldarch"; then 1.27 rm "$archive" 1.28 fi 1.29 fi 1.30 @@ -122,6 +120,94 @@ 1.31 return 0 1.32 } 1.33 1.34 +add_file() 1.35 +{ 1.36 + ( cd $2 ; tar -cf - $1 ) | tar -xf - 1.37 +} 1.38 + 1.39 +remove_file() 1.40 +{ 1.41 + rm -rf ./$1 1.42 +} 1.43 + 1.44 +update_tar_cpio() 1.45 +{ 1.46 + action=$1 1.47 + shift 1.48 + tardir="$(dirname "$archive")" 1.49 + for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do 1.50 + if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.51 + if [ "$action" = "new_archive" ]; then 1.52 + decompress_func 1.53 + cd "$tardir" 1.54 + tar -cf "$archive" "${1#$tardir/}" 1.55 + status=$? 1.56 + compress_func 1.57 + exit $status 1.58 + fi 1.59 + if not_busybox tar; then 1.60 + decompress_func 1.61 + case "$action" in 1.62 + remove_file) 1.63 + tar --delete -f "$archive" "$@";; 1.64 + add_file) 1.65 + cd "$tardir" 1.66 + tar -rf "$archive" "${1#$tardir/}";; 1.67 + *) false;; 1.68 + esac 1.69 + status=$? 1.70 + compress_func 1.71 + exit $status 1.72 + fi 1.73 + tmptar="$(mktemp -d -t tartmp.XXXXXX)" 1.74 + here="$(pwd)" 1.75 + cd $tmptar 1.76 + $DECOMPRESS < "$archive" | tar -xf - 1.77 + status=$? 1.78 + if [ $status -eq 0 -a -n "$1" ]; then 1.79 + while [ "$1" ]; do 1.80 + $action "${1#$tardir/}" $here 1.81 + shift 1.82 + done 1.83 + tar -cf - $(ls -a | grep -v ^\.$ | grep -v ^\.\.$) | \ 1.84 + $COMPRESS > "$archive" 1.85 + status=$? 1.86 + fi 1.87 + cd $here 1.88 + rm -rf $tmptar 1.89 + exit $status 1.90 + fi 1.91 + done 1.92 + for ext in $CPIO_EXTS $CPIOGZ_EXTS; do 1.93 + if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.94 + if [ "$action" = "new_archive" ]; then 1.95 + decompress_func 1.96 + cd "$tardir" 1.97 + echo "${1#$tardir/}" | cpio -o -H newc > "$archive" 1.98 + status=$? 1.99 + compress_func 1.100 + exit $status 1.101 + fi 1.102 + tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)" 1.103 + here="$(pwd)" 1.104 + cd $tmpcpio 1.105 + $DECOMPRESS "$archive" | cpio -id > /dev/null 1.106 + status=$? 1.107 + if [ $status -eq 0 -a -n "$1" ]; then 1.108 + while [ "$1" ]; do 1.109 + $action "${1#$tardir/}" $here 1.110 + shift 1.111 + done 1.112 + find . | cpio -o -H newc | $COMPRESS > "$archive" 1.113 + status=$? 1.114 + fi 1.115 + cd $here 1.116 + rm -rf $tmpcpio 1.117 + exit $status 1.118 + fi 1.119 + done 1.120 +} 1.121 + 1.122 # the option switches 1.123 case "$opt" in 1.124 -i) # info: output supported extentions for progs that exist 1.125 @@ -132,9 +218,6 @@ 1.126 if [ "$ext" = "zip" -a ! "$(which zip)" ]; then 1.127 echo warning: zip not found, extract only >/dev/stderr 1.128 fi 1.129 - if [ "$ext" = "tar" ] && ! not_busybox tar; then 1.130 - echo warning: gnu/tar not found, extract only >/dev/stderr 1.131 - fi 1.132 done 1.133 printf "\n" 1.134 exit 1.135 @@ -366,22 +449,7 @@ 1.136 ;; 1.137 1.138 -a) # add to archive passed files 1.139 - not_busybox tar && \ 1.140 - for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do 1.141 - if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.142 - # we only want to add the file's basename, not 1.143 - # the full path so... 1.144 - decompress_func 1.145 - while [ "$1" ]; do 1.146 - cd "$(dirname "$1")" 1.147 - tar -rf "$archive" "$(basename "$1")" 1.148 - wrapper_status=$? 1.149 - shift 1 1.150 - done 1.151 - compress_func 1.152 - exit $wrapper_status 1.153 - fi 1.154 - done 1.155 + update_tar_cpio add_file "$@" 1.156 which zip >/dev/null && for ext in $ZIP_EXTS; do 1.157 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.158 # we only want to add the file's basename, not 1.159 @@ -399,19 +467,7 @@ 1.160 ;; 1.161 1.162 -n) # new: create new archive with passed files 1.163 - not_busybox tar && \ 1.164 - for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do 1.165 - if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.166 - # create will only be passed the first file, the 1.167 - # rest will be "added" to the new archive 1.168 - decompress_func 1.169 - cd "$(dirname "$1")" 1.170 - tar -cf "$archive" "$(basename "$1")" 1.171 - wrapper_status=$? 1.172 - compress_func 1.173 - exit $wrapper_status 1.174 - fi 1.175 - done 1.176 + update_tar_cpio new_archive "$@" 1.177 which zip >/dev/null && for ext in $ZIP_EXTS; do 1.178 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.179 # create will only be passed the first file, the 1.180 @@ -424,16 +480,7 @@ 1.181 ;; 1.182 1.183 -r) # remove: from archive passed files 1.184 - not_busybox tar && \ 1.185 - for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do 1.186 - if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.187 - decompress_func 1.188 - tar --delete -f "$archive" "$@" 1.189 - wrapper_status=$? 1.190 - compress_func 1.191 - exit $wrapper_status 1.192 - fi 1.193 - done 1.194 + update_tar_cpio remove_file "$@" 1.195 which zip >/dev/null && for ext in $ZIP_EXTS; do 1.196 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.197 zip -d "$archive" "$@" 1.198 @@ -447,7 +494,7 @@ 1.199 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then 1.200 # xarchive will put is the right extract dir 1.201 # so we just have to extract. 1.202 - tar -x${TAR_COMPRESS_OPT}f "$archive" "$@" 1.203 + $DECOMPRESS < "$archive" | tar -xf - "$@" 1.204 exit $? 1.205 fi 1.206 done