Entry 6369

get last digital version number, like sort -v

   

Submitted by gnuk on Aug. 25, 2010 at 4:07 p.m.
Language: Bash. Code size: 4.3 KB.

#!/bin/bash
# -*- coding: UTF8 -*-
# get last digital version number, like sort -v

# use strong printf
printf='printf --'
VERBOSE=0

versions_0=(
      # test with dupplicated values that
      # does not match the last version
      '0.1.0'
      '0.1.0'
	  '0.2.0'
	  '0.3.0'
	  '0.4.0'
	  '0.5.0'
      )

versions_1=(
	  '0.0.1'
	  '5.0.1'
	  '10.20.735'
	  '10.20.3'
	  '10.20.35'
	  '0.0.2'
	  '10.2.3'
	  '0.0.20'
	  '0.0.3'
	  '0.30.3'
	  '10.2.35'
	  '1.2.3'
	 )

versions_2=(
      '0.1.0'
	  '0.2.0'
	  '0.3.0'
	  '0.4.0'
	  '0.5.0'
      )

versions_3=(
      '0.0.1'
	  '0.0.2'
	  '0.0.3'
	  '0.0.4'
	  '0.0.5'
      )

versions_4=(
      '1.0.0'
	  '2.0.0'
	  '3.0.0'
	  '4.0.0'
	  '5.0.0'
      )

versions_5=(
      # test with dupplicated values that
      # does match the last version
      '0.1.0'
	  '0.2.0'
	  '0.3.0'
	  '0.4.0'
	  '0.5.0'
	  '0.5.0'
      )

versions_6=(
      # test with long name version
	  '0.2.0.9.0'
      '0.1.0.7.8'
	  '0.3.0.1.1'
	  '0.4.0.0.0'
      '0.1.0.4.2'
	  '0.5.0.5.5'
      )

versions_7=(
      # try to resolve this case
      # test with long and short name version
	  '2'
      '0.1.8'
	  '0.3'
	  '0.4.0.0.0'
      '2.1.0'
	  '0.5.0.5'
      )

function greater_than_ref() {
    # $1 : value
    # $2 : ref
    local lvalue=$1
    local lref=$2
    local state=0
    if [ ${lvalue} -gt ${lref} ]
        then
            # if value is larger than reference
            # so reference become same value as value
            state=0
    elif [ ${lvalue} -eq ${lref} ]
        then
            # if value is equal to reference we kept the value
            # the reference do not need to be updating
            state=1
    else
            # if value is lesser than reference, we forget value and we kept reference
            state=2
    fi
return ${state}
}

# uggly hack for different tests
nv=${1:-1}
eval "versions=( $(echo \${versions_$nv[@]}) )"
# print actual used version list
$printf "%s\n" "---"
for v in ${versions[@]}
    do
	$printf "%s\n" "$v"
done
$printf "%s\n" "---"
# separator character for version number
SEP='.'
version_list=( ${versions[@]} )
# number of fields
NumberOfFields=$($printf "%s\n" "${version_list}" | awk -F''${SEP}'' '{print NF}')
for field in $(seq 1 ${NumberOfFields})
    do
        ref=0
        unset tmpversions
        [ ${VERBOSE} == 1 ] && $printf "%s\n" "next cycle with : $(declare -p version_list)"
        for (( v=0 ; v < ${#version_list[@]} ; v++ ))
            do
                element=$($printf "%s\n" "${version_list[$v]}" | awk -F''${SEP}'' '{print $'${field}'}')
                [ ${VERBOSE} == 1 ] && $printf "value : %-3s | ref : %-3s - " "${element}" "${ref}"
                return_test=$(greater_than_ref "${element}" "${ref}")
                case $? in
                    0)
                        # it resets the table as if the values are
                        # lower than they do not interrest us
                        tmpversions=( ${version_list[$v]} )
                        ref=$element
                        [ ${VERBOSE} == 1 ] && $printf "%-7s > %s\n" "greater" "$(declare -p tmpversions)"
                    ;;
                    1)
                        # the value is added to the table if it is equal to ref
                        tmpversions=( ${tmpversions[@]} ${version_list[$v]} )
                        [ ${VERBOSE} == 1 ] && $printf "%-7s > %s\n" "equal" "$(declare -p tmpversions)"
                    ;;
                    2)
                        # lesser values are uninterrsting
                        [ ${VERBOSE} == 1 ] && $printf "%-7s > %s\n" "lesser" "$(declare -p tmpversions)"
                        continue
                    ;;
                esac
        done
        # check just the first field for now
        version_list=( ${tmpversions[@]} )
        last_version=( ${version_list[@]} )
        if [ ${#version_list[@]} -eq 1 ]
            then
                break
        fi
done
if [ ${#last_version[@]} -gt 1 ]
    then
        $printf "%s\n" "Error : dupplicated entry found for last version :"
        $printf "%s\n" ${last_version[@]}
        state=2
elif [ ${#last_version[@]} -lt 1 ]
    then
        $printf "%s\n" "Internal error :/"
        state=1
else
    $printf "Last version : %s\n" "${last_version}"
    state=0
fi
# exit with correct status
exit ${state}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).