add fixes from whiterussian
[openwrt.git] / root / bin / ipkg
index 2083db0..bf275d8 100755 (executable)
@@ -19,6 +19,18 @@ set -e
 # explicitly enable it first and disable it afterwards.
 set -o noglob
 
+ipkg_is_upgrade () {
+  local A B a b
+  A=$(echo $1 | sed "s/[0-9]*/ & /g")
+  B=$(echo $2 | sed "s/[0-9]*/ & /g")
+  while [ \! -z "$A" ] && [ \! -z "$B" ]; do {
+    set $A; a=$1; shift; A=$*
+    set $B; b=$1; shift; B=$*
+    { [ "$a" -gt "$b" ] 2>&- || [ "$a" ">" "$b" ]; } && { return 0; }
+  }; done
+  return 1;
+}
+
 ipkg_srcs() {
        local srcre="$1"
        sed -ne "s/^src[[:space:]]\+$srcre[[:space:]]\+//p" < $IPKG_CONF
@@ -34,7 +46,7 @@ ipkg_src_byname() {
 }
 
 ipkg_dests() {
-       local destre=`echo $1 | ipkg_protect_slashes`
+       local destre="`echo $1 | ipkg_protect_slashes`"
        sed -ne "/^dest[[:space:]]\+$destre/{
 s/^dest[[:space:]]\+[^[:space:]]\+[[:space:]]\+//
 s/^/`echo $IPKG_OFFLINE_ROOT | ipkg_protect_slashes`/
@@ -80,12 +92,12 @@ ipkg_load_configuration() {
        IPKG_CONF="$IPKG_CONF_DIR/ipkg.conf"
 
        if [ -z "$IPKG_OFFLINE_ROOT" ]; then
-           IPKG_OFFLINE_ROOT=`ipkg_option offline_root`
+           IPKG_OFFLINE_ROOT="`ipkg_option offline_root`"
        fi
        # Export IPKG_OFFLINE_ROOT for use by update-alternatives
        export IPKG_OFFLINE_ROOT
        if [ -n "$DEST_NAME" ]; then
-               IPKG_ROOT=`ipkg_dest_byname $DEST_NAME`
+               IPKG_ROOT="`ipkg_dest_byname $DEST_NAME`"
                if [ -z "$IPKG_ROOT" ]; then
                        if [ -d "$IPKG_OFFLINE_ROOT$DEST_NAME" ]; then
                                IPKG_ROOT="$IPKG_OFFLINE_ROOT$DEST_NAME";
@@ -97,7 +109,7 @@ Valid destinations are directories or one of the dest names from $IPKG_CONF:" >&
                        fi
                fi
        else
-               IPKG_ROOT=`ipkg_dest_default`
+               IPKG_ROOT="`ipkg_dest_default`"
        fi
 
        # Global ipkg state directories
@@ -110,11 +122,11 @@ Valid destinations are directories or one of the dest names from $IPKG_CONF:" >&
        IPKG_STATE_DIR=$IPKG_ROOT/$IPKG_DIR_PREFIX
 
        # Proxy Support
-       IPKG_PROXY_USERNAME=`ipkg_option proxy_username`
-       IPKG_PROXY_PASSWORD=`ipkg_option proxy_password`
-       IPKG_HTTP_PROXY=`ipkg_option http_proxy`
-       IPKG_FTP_PROXY=`ipkg_option ftp_proxy`
-       IPKG_NO_PROXY=`ipkg_option no_proxy`
+       IPKG_PROXY_USERNAME="`ipkg_option proxy_username`"
+       IPKG_PROXY_PASSWORD="`ipkg_option proxy_password`"
+       IPKG_HTTP_PROXY="`ipkg_option http_proxy`"
+       IPKG_FTP_PROXY="`ipkg_option ftp_proxy`"
+       IPKG_NO_PROXY="`ipkg_option no_proxy`"
        if [ -n "$IPKG_HTTP_PROXY" ]; then 
                export http_proxy="$IPKG_HTTP_PROXY"
        fi
@@ -171,7 +183,7 @@ Force Options (use when ipkg is too smart for its own good):
 }
 
 ipkg_dir_part() {
-       local dir=`echo $1 | sed -ne 's/\(.*\/\).*/\1/p'`
+       local dir="`echo $1 | sed -ne 's/\(.*\/\).*/\1/p'`"
        if [ -z "$dir" ]; then
                dir="./"
        fi
@@ -190,13 +202,13 @@ ipkg_download() {
        local src="$1"
        local dest="$2"
 
-       local src_file=`ipkg_file_part $src`
-       local dest_dir=`ipkg_dir_part $dest`
+       local src_file="`ipkg_file_part $src`"
+       local dest_dir="`ipkg_dir_part $dest`"
        if [ -z "$dest_dir" ]; then
                dest_dir="$IPKG_TMP"
        fi
 
-       local dest_file=`ipkg_file_part $dest`
+       local dest_file="`ipkg_file_part $dest`"
        if [ -z "$dest_file" ]; then
                dest_file="$src_file"
        fi
@@ -244,7 +256,7 @@ ipkg_update() {
 
        local err=
        for src_name in `ipkg_src_names`; do
-               local src=`ipkg_src_byname $src_name`
+               local src="`ipkg_src_byname $src_name`"
                if ! ipkg_download $src/Packages $IPKG_LISTS_DIR/$src_name; then
                        echo "ipkg_update: Error downloading $src/Packages to $IPKG_LISTS_DIR/$src_name" >&2
                        err=t
@@ -439,11 +451,11 @@ ipkg_files() {
        if [ -n "$DEST_NAME" ]; then
                dests=$IPKG_ROOT
        else
-               dests=`ipkg_dests_all`
+               dests="`ipkg_dests_all`"
        fi
        for dest in $dests; do
                if [ -f $dest/$IPKG_DIR_PREFIX/info/$pkg.list ]; then
-                       dest_sed=`echo $dest | ipkg_protect_slashes`
+                       dest_sed="`echo $dest | ipkg_protect_slashes`"
                        sed -e "s/^/$dest_sed/" < $dest/$IPKG_DIR_PREFIX/info/$pkg.list
                fi
        done
@@ -453,15 +465,15 @@ ipkg_search() {
        local pattern="$1"
 
        for dest_name in `ipkg_dest_names`; do
-               dest=`ipkg_dest_byname $dest_name`
-               dest_sed=`echo $dest | ipkg_protect_slashes`
+               dest="`ipkg_dest_byname $dest_name`"
+               dest_sed="`echo $dest | ipkg_protect_slashes`"
 
                set +o noglob
-               local list_files=`ls -1 $dest/$IPKG_DIR_PREFIX/info/*.list 2>/dev/null`
+               local list_files="`ls -1 $dest/$IPKG_DIR_PREFIX/info/*.list 2>/dev/null`"
                set -o noglob
                for file in $list_files; do
                        if sed "s/^/$dest_sed/" $file | grep -q $pattern; then
-                               local pkg=`echo $file | sed "s/^.*\/\(.*\)\.list/\1/"`
+                               local pkg="`echo $file | sed "s/^.*\/\(.*\)\.list/\1/"`"
                                [ "$dest_name" != `ipkg_dest_default_name` ] && pkg="$pkg ($dest_name)"
                                sed "s/^/$dest_sed/" $file | grep $pattern | sed "s/^/$pkg: /"
                        fi
@@ -510,10 +522,10 @@ ipkg_status_update() {
 
 ipkg_unsatisfied_dependences() {
     local pkg=$1
-    local deps=`ipkg_get_depends $pkg`
+    local deps="`ipkg_get_depends $pkg`"
     local remaining_deps=
     for dep in $deps; do
-       local installed=`ipkg_get_installed $dep`
+       local installed="`ipkg_get_installed $dep`"
        if [ "$installed" != "installed" ] ; then
            remaining_deps="$remaining_deps $dep"
        fi
@@ -524,35 +536,35 @@ ipkg_unsatisfied_dependences() {
 
 ipkg_safe_pkg_name() {
        local pkg=$1
-       local spkg=`echo pkg_$pkg | sed -e y/-+./___/`
+       local spkg="`echo pkg_$pkg | sed -e y/-+./___/`"
        echo $spkg
 }
 
 ipkg_set_depends() {
        local pkg=$1; shift 
        local new_deps="$*"
-       pkg=`ipkg_safe_pkg_name $pkg`
+       pkg="`ipkg_safe_pkg_name $pkg`"
        ## setvar ${pkg}_depends "$new_deps"
        echo $new_deps > /tmp/ipkg/${pkg}.depends
 }
 
 ipkg_get_depends() {
        local pkg=$1
-       pkg=`ipkg_safe_pkg_name $pkg`
+       pkg="`ipkg_safe_pkg_name $pkg`"
        cat /tmp/ipkg/${pkg}.depends
        ## eval "echo \$${pkg}_depends"
 }
 
 ipkg_set_installed() {
        local pkg=$1
-       pkg=`ipkg_safe_pkg_name $pkg`
+       pkg="`ipkg_safe_pkg_name $pkg`"
        echo installed > /tmp/ipkg/${pkg}.installed
        ## setvar ${pkg}_installed "installed"
 }
 
 ipkg_set_uninstalled() {
        local pkg=$1
-       pkg=`ipkg_safe_pkg_name $pkg`
+       pkg="`ipkg_safe_pkg_name $pkg`"
        ### echo ipkg_set_uninstalled $pkg > /dev/console
        echo uninstalled > /tmp/ipkg/${pkg}.installed
        ## setvar ${pkg}_installed "uninstalled"
@@ -560,7 +572,7 @@ ipkg_set_uninstalled() {
 
 ipkg_get_installed() {
        local pkg=$1
-       pkg=`ipkg_safe_pkg_name $pkg`
+       pkg="`ipkg_safe_pkg_name $pkg`"
        if [ -f /tmp/ipkg/${pkg}.installed ]; then
                cat /tmp/ipkg/${pkg}.installed
        fi
@@ -570,7 +582,7 @@ ipkg_get_installed() {
 ipkg_depends() {
        local new_pkgs="$*"
        local all_deps=
-       local installed_pkgs=`ipkg_status_matching_all 'Status:.*[[:space:]]installed'`
+       local installed_pkgs="`ipkg_status_matching_all 'Status:.*[[:space:]]installed'`"
        for pkg in $installed_pkgs; do
            ipkg_set_installed $pkg
        done
@@ -626,7 +638,7 @@ ipkg_get_install_dest() {
        local info_dir=$sd/info
 
         local requested_pkgs="$*"
-       local pkgs=`ipkg_depends $*`
+       local pkgs="`ipkg_depends $*`"
 
        mkdir -p $info_dir
        for pkg in $pkgs; do
@@ -644,14 +656,14 @@ Status: install ok not-installed" | ipkg_status_update_sd $sd $pkg
                curcheck=0
                ## echo "pkgs to install: {$pkgs}" > /dev/console
                for pkg in $pkgs; do
-                       curcheck=`expr $curcheck + 1`
-                       local is_installed=`ipkg_get_installed $pkg`
+                       curcheck="`expr $curcheck + 1`"
+                       local is_installed="`ipkg_get_installed $pkg`"
                        if [ "$is_installed" = "installed" ]; then
                                echo "$pkg is installed" > /dev/console
                                continue
                        fi
 
-                       local remaining_deps=`ipkg_unsatisfied_dependences $pkg`
+                       local remaining_deps="`ipkg_unsatisfied_dependences $pkg`"
                        if [ -n "$remaining_deps" ]; then
                                new_pkgs="$new_pkgs $pkg"
                                ### echo "Dependences not satisfied for $pkg: $remaining_deps"
@@ -663,7 +675,7 @@ Status: install ok not-installed" | ipkg_status_update_sd $sd $pkg
                        local filename=
                        for src in `ipkg_src_names`; do
                                if ipkg_require_list $src; then
-                                       filename=`ipkg_extract_paragraph $pkg < $IPKG_LISTS_DIR/$src | ipkg_extract_field Filename | ipkg_extract_value`
+                                       filename="`ipkg_extract_paragraph $pkg < $IPKG_LISTS_DIR/$src | ipkg_extract_field Filename | ipkg_extract_value`"
                                        [ -n "$filename" ] && break
                                fi
                        done
@@ -691,7 +703,7 @@ Status: install ok not-installed" | ipkg_status_update_sd $sd $pkg
                        fi
 
                        ipkg_set_installed $pkg
-                       pkgs_installed=`expr $pkgs_installed + 1`
+                       pkgs_installed="`expr $pkgs_installed + 1`"
                        rm $tmp_pkg_file
                done
                ### echo "Installed $pkgs_installed package(s) this round"
@@ -722,8 +734,8 @@ ipkg_install_file_dest() {
                return 1
        fi
 
-       local pkg=`ipkg_file_part $filename | sed 's/\([a-z0-9.+-]\+\)_.*/\1/'`
-       local ext=`echo $filename | sed 's/.*\.//'`
+       local pkg="`ipkg_file_part $filename | sed 's/\([a-z0-9.+-]\+\)_.*/\1/'`"
+       local ext="`echo $filename | sed 's/.*\.//'`"
        local pkg_extract_stdout
        if [ "$ext" = "ipk" ]; then
                pkg_extract_stdout="tar -xzOf"
@@ -735,7 +747,7 @@ ipkg_install_file_dest() {
        fi
 
        # Check dependencies
-       local depends=`ipkg_depends $pkg | sed -e "s/\<$pkg\>//"`
+       local depends="`ipkg_depends $pkg | sed -e "s/\<$pkg\>//"`"
 
        # Don't worry about deps that are scheduled for installation
        local missing_deps=
@@ -784,7 +796,7 @@ Status: install ok pending" | ipkg_status_update_sd $sd $pkg
        echo -n "Unpacking $pkg..."
        set +o noglob
        for file in $IPKG_TMP/$pkg/control/*; do
-               local base_file=`ipkg_file_part $file`
+               local base_file="`ipkg_file_part $file`"
                mv $file $info_dir/$pkg.$base_file
        done
        set -o noglob
@@ -807,7 +819,7 @@ Status: install ok pending" | ipkg_status_update_sd $sd $pkg
                fi
        fi
 
-       local old_conffiles=`ipkg_status_sd $sd $pkg Conffiles | ipkg_extract_value`
+       local old_conffiles="`ipkg_status_sd $sd $pkg Conffiles | ipkg_extract_value`"
        local new_conffiles=
        if [ -f "$info_dir/$pkg.conffiles" ]; then
                for conffile in `cat $info_dir/$pkg.conffiles`; do
@@ -844,20 +856,20 @@ diff -u $dest/$conffile $IPKG_TMP/$pkg/data/$conffile"
                                        done
                                fi
                                if [ -n "$use_maintainers_conffile" ]; then
-                                       local md5sum=`md5sum $IPKG_TMP/$pkg/data/$conffile | sed 's/ .*//'`
+                                       local md5sum="`md5sum $IPKG_TMP/$pkg/data/$conffile | sed 's/ .*//'`"
                                        new_conffiles="$new_conffiles $conffile $md5sum"
                                else
                                        new_conffiles="$new_conffiles $conffile <custom>"
                                        rm $IPKG_TMP/$pkg/data/$conffile
                                fi
                        else
-                               md5sum=`md5sum $IPKG_TMP/$pkg/data/$conffile | sed 's/ .*//'`
+                               md5sum="`md5sum $IPKG_TMP/$pkg/data/$conffile | sed 's/ .*//'`"
                                new_conffiles="$new_conffiles $conffile $md5sum"
                        fi
                done
        fi
 
-       local owd=`pwd`
+       local owd="`pwd`"
        (cd $IPKG_TMP/$pkg/data/; tar cf - . | (cd $owd; cd $dest; tar xf -))
        rm -rf $IPKG_TMP/$pkg/data
        rmdir $IPKG_TMP/$pkg
@@ -870,7 +882,7 @@ diff -u $dest/$conffile $IPKG_TMP/$pkg/data/$conffile"
        if [ -n "$new_conffiles" ]; then
                new_conffiles='Conffiles: '`echo $new_conffiles | ipkg_protect_slashes`
        fi
-       local sed_safe_root=`echo $dest | sed -e "s/^${IPKG_OFFLINE_ROOT}//" | ipkg_protect_slashes`
+       local sed_safe_root="`echo $dest | sed -e "s/^${IPKG_OFFLINE_ROOT}//" | ipkg_protect_slashes`"
        sed -e "s/\(Package:.*\)/\1\\
 Status: install ok installed\\
 Root: ${sed_safe_root}\\
@@ -925,7 +937,7 @@ ipkg_install_pending() {
 
        if [ -d "$IPKG_PENDING_DIR" ]; then
                set +o noglob
-               local pending=`ls -1d $IPKG_PENDING_DIR/*.ipk 2> /dev/null` || true
+               local pending="`ls -1d $IPKG_PENDING_DIR/*.ipk 2> /dev/null`" || true
                set -o noglob
                if [ -n "$pending" ]; then
                        echo "The following packages in $IPKG_PENDING_DIR will now be installed:"
@@ -941,7 +953,7 @@ ipkg_install_pending() {
 }
 
 ipkg_install_wanted() {
-       local wanted=`ipkg_status_matching 'Status:[[:space:]]*install.*not-installed'`
+       local wanted="`ipkg_status_matching 'Status:[[:space:]]*install.*not-installed'`"
 
        if [ -n "$wanted" ]; then
                echo "The following package were previously requested but have not been installed:"
@@ -967,13 +979,13 @@ ipkg_install_wanted() {
 
 ipkg_upgrade_pkg() {
        local pkg="$1"
-       local avail_ver=`ipkg_info $pkg Version | ipkg_extract_value | head -1`
+       local avail_ver="`ipkg_info $pkg Version | ipkg_extract_value | head -1`"
 
        is_installed=
        for dest_name in `ipkg_dest_names`; do
-               local dest=`ipkg_dest_byname $dest_name`
+               local dest="`ipkg_dest_byname $dest_name`"
                local sd=$dest/$IPKG_DIR_PREFIX
-               local inst_ver=`ipkg_status_sd $sd $pkg Version | ipkg_extract_value`
+               local inst_ver="`ipkg_status_sd $sd $pkg Version | ipkg_extract_value`"
                if [ -n "$inst_ver" ]; then
                        is_installed=t
 
@@ -984,7 +996,7 @@ ipkg_upgrade_pkg() {
 
                        if [ "$avail_ver" = "$inst_ver" ]; then 
                                echo "Package $pkg ($inst_ver) installed in $dest_name is up to date"
-                       elif ipkg-compare-versions $avail_ver '>>' $inst_ver; then
+                       elif ipkg_is_upgrade "$avail_ver" "$inst_ver"; then
                                echo "Upgrading $pkg ($dest_name) from $inst_ver to $avail_ver"
                                ipkg_get_install_dest $dest $pkg
                        else
@@ -1002,7 +1014,7 @@ ipkg_upgrade_pkg() {
 
 ipkg_upgrade() {
        if [ $# -lt 1 ]; then
-               local pkgs=`ipkg_status_matching 'Status:.*[[:space:]]installed'`
+               local pkgs="`ipkg_status_matching 'Status:.*[[:space:]]installed'`"
        else
                pkgs="$*"
        fi
@@ -1029,14 +1041,14 @@ ipkg_remove_pkg_dest() {
 
        echo "ipkg_remove: Removing $pkg... "
 
-       local files=`cat $info_dir/$pkg.list`
+       local files="`cat $info_dir/$pkg.list`"
 
        export PKG_ROOT=$dest
        if [ -x "$info_dir/$pkg.prerm" ]; then
                $info_dir/$pkg.prerm remove
        fi
 
-       local conffiles=`ipkg_status_sd $sd $pkg Conffiles | ipkg_extract_value`
+       local conffiles="`ipkg_status_sd $sd $pkg Conffiles | ipkg_extract_value`"
 
        local dirs_to_remove=
        for file in $files; do
This page took 0.033821 seconds and 4 git commands to generate.