diff options
| author | davidovski <david@davidovski.xyz> | 2022-02-16 16:58:36 +0000 | 
|---|---|---|
| committer | davidovski <david@davidovski.xyz> | 2022-02-16 16:58:36 +0000 | 
| commit | 1117f2bef50ec65aa6bfe55e8e22beb5be092275 (patch) | |
| tree | aca60d8297c9a99e551664df931ed36ef4f49164 | |
| parent | 5e31b33fbe30f7b1775b89fc23abd6c96675cf99 (diff) | |
added dependency resolving
| -rwxr-xr-x | src/get.sh | 121 | ||||
| -rwxr-xr-x | src/profile.sh | 14 | ||||
| -rwxr-xr-x | src/sync.sh (renamed from src/xisync.sh) | 24 | ||||
| -rwxr-xr-x | src/xi.sh | 44 | ||||
| -rw-r--r-- | src/xiget.sh | 12 | 
5 files changed, 182 insertions, 33 deletions
| diff --git a/src/get.sh b/src/get.sh new file mode 100755 index 0000000..3e0be79 --- /dev/null +++ b/src/get.sh @@ -0,0 +1,121 @@ +#!/bin/sh + + +# list all direct dependencies of a package +# +list_deps() { +    local name=$1 +    local tree_file="${DEP_DIR}/$name" +    [ -f $tree_file ] && +        for dep in $(cat "$tree_file"); do +            echo $dep +        done | sort -u +} + +# list all dependencies and sub dependencies of a package +# +resolve_deps () { +    local deps=() +    local to_check=($@) +    if ${RESOLVE_DEPS}; then +        while [ "${#to_check[@]}" != "0" ]; do +            local package=${to_check[-1]} +            unset to_check[-1] + +            deps+=($package) +            for dep in $(list_deps $package); do +                # if not already checked +                if echo ${deps[*]} | grep -qv "\b$dep\b"; then +                    to_check+=($dep) +                fi +            done +        done +        echo ${deps[@]} +    else +        echo $@ +    fi + +} + +get_package_download_info() { +    tail -1 ${PACKAGES_DIR}/*/$1 +} + +get_available_version () { +    echo "${info[1]}" +} + +is_installed() { +    [ -f "${INSTALLED_DIR}/$1/checksum" ] +} + +get_installed_version () { +    local name=$1 +    local file="${INSTALLED_DIR}/$name/checksum" +    [ -f $file ] && +        cat $file +} + +# bad implementation +exists () { +    [ "$(find ${PACKAGES_DIR} -mindepth 2 -name "$1" | wc -l)" != "0" ] +} + +download () { +    local requested=($@) + +    local missing=() +    local install=() +    local update=() +    local urls=() + +    local total_download=0 + +    for package in $(resolve_deps $@); do +        if exists $package; then +            info=($(get_package_download_info $package)) +            url=${info[0]} +            checksum=${info[1]} +            size=${info[2]} +            files=${info[3]} +             +            if is_installed $package; then +                if [ "$(get_installed_version $package)" != "$(get_available_version $package)" ]; then +                    update+=($package) +                    total_download=$((total_download+size)) +                fi +            else +                install+=($package) +                total_download=$((total_download+size)) +            fi +        else +            missing+=($package) +        fi +    done + +    if [ "${#missing[@]}" != "0" ]; then +        printf "${LIGHT_RED}The following packages could not be located:" +        for package in ${missing[*]}; do +            printf "${RED} $package" +        done +        printf "${RESET}\n" +    fi +    if [ "${#update[@]}" != "0" ]; then +        printf "${LIGHT_GREEN}The following packages will be updated:\n\t" +        for package in ${update[*]}; do +            printf "${GREEN} $package" +        done +        printf "${RESET}\n" +    fi +    if [ "${#install[@]}" != "0" ]; then +        printf "${LIGHT_BLUE}The following packages will be updated:\n\t" +        for package in ${install[*]}; do +            printf "${BLUE} $package" +        done +        printf "${RESET}\n" +    fi + +    echo "total download size: ${total_download} bytes" +} + + diff --git a/src/profile.sh b/src/profile.sh new file mode 100755 index 0000000..12bd41c --- /dev/null +++ b/src/profile.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +. /usr/lib/colors.sh +export CONF_FILE="/etc/xipkg.conf" + +export CURL_OPTS="-SsL" + +export DEP_DIR=$(parseconf -v dir.deps) +export REPOS=($(parseconf -v repos)) +export SOURCES=($(parseconf sources.*)) +export PACKAGES_DIR=$(parseconf -v dir.packages) +export INSTALLED_DIR=$(parseconf -v dir.installed) + +export TMP_DIR="/tmp/xi" diff --git a/src/xisync.sh b/src/sync.sh index 5349dd2..9589c43 100755 --- a/src/xisync.sh +++ b/src/sync.sh @@ -1,21 +1,5 @@  #!/bin/bash -export CONF_FILE="/etc/xipkg.conf" - -CURL_OPTS="-SsL" - -REPOS=($(parseconf -v repos)) -SOURCES=($(parseconf sources.*)) -PACKAGES_DIR=$(parseconf -v dir.packages) -DEP_GRAPH=$(parseconf -v dir.deps) - -TMP_DIR="/tmp/xi" - -get_deps() { -    local name=$1 -    [ -f $DEP_GRAPH ] && sed -rn "s/^$name: (.*)/\1/p" $DEP_GRAPH || echo  -} -  download_file() {      curl ${CURL_OPTS} -o $1 -w "%{http_code}" $2 2> /dev/null  } @@ -81,7 +65,7 @@ dep_graph () {          while IFS= read -r line; do              local package=$(echo $line | cut -d: -f1)              local new=$(echo $line | cut -d: -f2-) -            echo $new >> $DEP_GRAPH/$package +            echo $new >> $DEP_DIR/$package          done < "$tmp_file"      fi  } @@ -139,8 +123,8 @@ sync () {      # prepare the file structure for the sync      mkdir -pv $TMP_DIR      rm -r $PACKAGES_DIR/* -    rm -r $DEP_GRAPH -    mkdir $DEP_GRAPH +    rm -r $DEP_DIR +    mkdir $DEP_DIR      # create padding spaces for each hbar       for repo in ${REPOS[*]}; do  @@ -162,5 +146,3 @@ sync () {      hbar      popularity_contest  } - -sync diff --git a/src/xi.sh b/src/xi.sh new file mode 100755 index 0000000..aaad140 --- /dev/null +++ b/src/xi.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +[ -z "${LIBDIR}" ] && LIBDIR=/usr/lib/xipkg +. ${LIBDIR}/profile.sh +. ${LIBDIR}/sync.sh +. ${LIBDIR}/get.sh + +export SYSROOT=/ +export CONF_FILE="/etc/xipkg.conf" +export VERBOSE=false +export RESOLVE_DEPS=true +export DO_SYNC=true +export UNSAFE=false +export NOCONFIRM=false + +while getopts ":r:c:nluyv" opt; do +    case "${opt}" in +        r) +            SYSROOT="${OPTARG}" +            ;; +        c) +            CONF_FILE="${OPTARG}" +            ;; +        n) +            RESOLVE_DEPS=false +            ;; +        l) +            DO_SYNC=false +            ;; +        u) +            UNSAFE=true +            ;; +        y) +            NOCONFIRM=true +            ;; +        v) +            VERBOSE=true +            ;; +    esac +done + +shift $((OPTIND-1)) + +download $@ diff --git a/src/xiget.sh b/src/xiget.sh deleted file mode 100644 index 815c47f..0000000 --- a/src/xiget.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -export CONF_FILE="/etc/xipkg.conf" - -CURL_OPTS="-SsL" - -DEP_GRAPH=$(parseconf -v dir.deps) - -get_deps() { -    local name=$1 -    [ -f $DEP_GRAPH ] && sed -rn "s/^$name: (.*)/\1/p" $DEP_GRAPH || echo  -} | 
