Skip to content

Instantly share code, notes, and snippets.

@GuillaumeSmaha
Last active February 22, 2017 05:26
Show Gist options
  • Save GuillaumeSmaha/5545f6e48b5d3ce35399d6b3727c4a9c to your computer and use it in GitHub Desktop.
Save GuillaumeSmaha/5545f6e48b5d3ce35399d6b3727c4a9c to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
function getMakefileVarRawValue {
local varName=$1
local packageDir=$2
local value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+(?=(\s*#))" $ROOT"/"$packageDir"/Makefile")
if [ -z "$value" ]; then
value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+" $ROOT"/"$packageDir"/Makefile")
fi
echo $value
}
function getMakefileSpeficCall {
local call=$1
local MAKE_DIR=$(mktemp -d)
echo "all:" > $MAKE_DIR"/Makefile"
echo -e "\t@echo \$("$call")" >> $MAKE_DIR"/Makefile"
echo $(make -f $MAKE_DIR"/Makefile")
rm -fr $MAKE_DIR
}
function getMakefileVarValueReplacement {
local packageDir=$1
shift
local values=$@
OLDIFS=$IFS
IFS=$'\n'
local vars=$(echo $values | grep -oP "\\$\(\K\w+(?=\))")
if [ ! -z "$vars" ]; then
local newValues=
local tempValues=$values
for v in $vars ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\$($v)/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
local vars2=$(echo $values | grep -oP "\\$\{\K\w+(?=\})")
if [ ! -z "$vars2" ]; then
local newValues=
local tempValues=$values
for v in $vars2 ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\${$v}/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
IFS=$ODIFS
if [ ! -z "$vars" ] || [ ! -z "$vars2" ]; then
values=$(getMakefileVarValueReplacement $packageDir $values)
fi
echo $values
}
function getMakefileVarValue {
local varName=$1
local packageDir=$2
local version=$3
local versionMajor=$4
local versionMinor=$5
local values=$(getMakefileVarRawValue $varName $packageDir)
if [ ! -z "$values" ]; then
if [ ! -z "$version" ]; then
values=$(echo $values | sed "s/\$(PKG_VERS)/$version/g")
fi
if [ ! -z "$versionMajor" ]; then
values=$(echo $values | sed "s/\$(PKG_VERS_MAJOR)/$versionMajor/g")
fi
if [ ! -z "$versionMinor" ]; then
values=$(echo $values | sed "s/\$(PKG_VERS_MINOR)/$versionMinor/g")
fi
local values=$(getMakefileVarValueReplacement $packageDir $values)
values=$(echo -e $values | sort | uniq | sed '/^$/d')
local specificCalls=$(echo $values | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCalls" ]; then
OLDIFS=$IFS
IFS=$'\n'
local newValues=
for e in $values ; do
local specificCall=$(echo $e | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCall" ]; then
val=$(getMakefileSpeficCall $specificCall)
newValues=$(echo $newValues"\n"$e | sed "s/\$($specificCall)/$val/g")
fi
done
IFS=$ODIFS
values=$(echo -e $newValues | sort | uniq | sed '/^$/d')
fi
echo $values
fi
}
function getUrlPackage {
local packageDir=$1
local version=$2
local versionMajor=$3
local versionMinor=$4
local distSite=$(getMakefileVarValue PKG_DIST_SITE $packageDir)
local distName=$(getMakefileVarValue PKG_DIST_NAME $packageDir $version $versionMajor $versionMinor)
if [ -z "$distName" ]; then
echo $distSite
else
echo $distSite"/"$distName
fi
}
function checkUrlAvailability {
local url=$1
curl --output /dev/null --silent --head --fail $url
if [ ! $? -eq 0 ]; then
curl --output /dev/null --silent --fail -r 0-0 $url
fi
echo $?
}
function checkPackageAvailability {
local packageDir=$1
local path=$ROOT"/"$packageDir
if [ ! -d $path ]; then
>&2 echo "The package $packageDir can't be found"
exit
fi
local name=$(getMakefileVarValue PKG_NAME $packageDir)
local version=$(getMakefileVarValue PKG_VERS $packageDir)
local url=$(getUrlPackage $packageDir)
echo -en "\r\033[K";
echo -en "$packageDir";
if [ ! $(checkUrlAvailability $url) -eq 0 ]; then
echo " -> Not Available: "$url;
fi
}
function getListPackages {
local OLDPWD=$(pwd)
cd $ROOT
ls -d cross/* | tr " " "\n" > $TMP_DIR/list.txt
ls -d native/* | tr " " "\n" >> $TMP_DIR/list.txt
cd $OLDPWD
cat $TMP_DIR/list.txt
}
function help {
echo -e "$0 -h : This help";
echo -e "$0 -d [spksrc_dir] : spksrc directory (default: ..)";
echo -e "$0 -c [cross package] : Search new version for the cross package";
echo -e "$0 -n [native package] : Search new version for the native package";
}
function readArgs {
ROOT=..
CROSS_NAME=
NATIVE_NAME=
while getopts "d:c:n:h" flag; do
case $flag in
h)
help
exit
;;
d)
ROOT=$OPTARG
;;
c)
CROSS_NAME=$OPTARG
;;
n)
NATIVE_NAME=$OPTARG
;;
?)
echo "Invalid option: -$OPTARG" >&2
exit;
;;
esac
done
shift $(( OPTIND - 1 ));
}
function main {
readArgs $@
if [ ! -d $ROOT/cross ] || [ ! -d $ROOT/native ] || [ ! -d $ROOT/spk ]; then
>&2 echo "Bad spksrc directory";
help
exit
fi
TMP_DIR=$(mktemp -d)
echo "Check package availability :"
if [ ! -z "$CROSS_NAME" ]; then
checkPackageAvailability "cross/"$CROSS_NAME
elif [ ! -z "$NATIVE_NAME" ]; then
checkPackageAvailability "native/"$NATIVE_NAME
else
for packageDir in $(getListPackages) ; do
checkPackageAvailability $packageDir
done
fi
echo
rm -fr $TMP_DIR
}
main $@
#!/usr/bin/env bash
function getMakefileVarRawValue {
local varName=$1
local packageDir=$2
local value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+(?=(\s*#))" $ROOT"/"$packageDir"/Makefile")
if [ -z "$value" ]; then
value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+" $ROOT"/"$packageDir"/Makefile")
fi
echo $value
}
function getMakefileSpeficCall {
local call=$1
local MAKE_DIR=$(mktemp -d)
echo "all:" > $MAKE_DIR"/Makefile"
echo -e "\t@echo \$("$call")" >> $MAKE_DIR"/Makefile"
echo $(make -f $MAKE_DIR"/Makefile")
rm -fr $MAKE_DIR
}
function getMakefileVarValueReplacement {
local packageDir=$1
shift
local values=$@
OLDIFS=$IFS
IFS=$'\n'
local vars=$(echo $values | grep -oP "\\$\(\K\w+(?=\))")
if [ ! -z "$vars" ]; then
local newValues=
local tempValues=$values
for v in $vars ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\$($v)/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
local vars2=$(echo $values | grep -oP "\\$\{\K\w+(?=\})")
if [ ! -z "$vars2" ]; then
local newValues=
local tempValues=$values
for v in $vars2 ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\${$v}/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
IFS=$ODIFS
if [ ! -z "$vars" ] || [ ! -z "$vars2" ]; then
values=$(getMakefileVarValueReplacement $packageDir $values)
fi
echo $values
}
function getMakefileVarValue {
local varName=$1
local packageDir=$2
local values=$(getMakefileVarRawValue $varName $packageDir)
if [ ! -z "$values" ]; then
local values=$(getMakefileVarValueReplacement $packageDir $values)
values=$(echo -e $values | sort | uniq | sed '/^$/d')
local specificCalls=$(echo $values | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCalls" ]; then
OLDIFS=$IFS
IFS=$'\n'
local newValues=
for e in $values ; do
local specificCall=$(echo $e | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCall" ]; then
val=$(getMakefileSpeficCall $specificCall)
newValues=$(echo $newValues"\n"$e | sed "s/\$($specificCall)/$val/g")
fi
done
IFS=$ODIFS
values=$(echo -e $newValues | sort | uniq | sed '/^$/d')
fi
echo $values
fi
}
function getSpkName {
getMakefileVarValue SPK_NAME $1
}
function getDepends {
getMakefileVarValue DEPENDS $1
}
function getBuildDepends {
getMakefileVarValue BUILD_DEPENDS $1
}
function geSpkList {
ls $ROOT"/spk"
}
function generePackageDotFile {
local name=$1
local packageDir=$2
local path=$ROOT"/"$packageDir
if [ ! -d $path ]; then
>&2 echo "$name: The package $packageDir can't be found"
else
local depends=$(getDepends $packageDir)
if [ ! -z "$depends" ]; then
for depend in $depends ; do
writeDotDiagram $name "\"$packageDir\" -> \"$depend\";"
generePackageDotFile $name $depend
done
fi
if [ ! -z "$USE_BUILD_DEPENDS" ]; then
local buildDepends=$(getBuildDepends $packageDir)
if [ ! -z "$buildDepends" ]; then
for depend in $buildDepends ; do
writeDotDiagram $name "\"$depend\" [color=\"0.355 0.563 1.000\"];"
writeDotDiagram $name "\"$packageDir\" -> \"$depend\";"
generePackageDotFile $name $depend
done
fi
fi
fi
}
function cleanDotDiagram {
rm -f $TMP_DIR/$1.dot
}
function writeDotDiagram {
echo $2 >> $TMP_DIR/$1.dot
}
function uniqArrowDotDiagram {
head -n 3 $TMP_DIR/$1.dot > $TMP_DIR/$1.dot.tmp
sed -e '1,3d' -e '$d' $TMP_DIR/$1.dot | sort | uniq >> $TMP_DIR/$1.dot.tmp
echo "}" >> $TMP_DIR/$1.dot.tmp
mv $TMP_DIR/$1.dot.tmp $TMP_DIR/$1.dot
}
function drawGraph {
dot -Tpng -o ./$GRAPHS_DIR/$1.png $TMP_DIR/$1.dot
}
function genereSpkDotFile {
local packageDir="spk/"$1
local path=$ROOT"/"$packageDir
if [ ! -d $path ]; then
>&2 echo "The spk $packageDir can't be found"
exit
fi
local name=$(getSpkName $packageDir)
local depends=$(getDepends $packageDir)
local buildDepends=$(getBuildDepends $packageDir)
echo -en "\r\033[K";
echo -en "$packageDir";
if [ ! -z "$depends" ] || [ ! -z "$buildDepends" ]; then
cleanDotDiagram $name
writeDotDiagram $name "digraph \"$name\" {"
writeDotDiagram $name "node [style=filled];"
writeDotDiagram $name "\"SPK $name\" [color=\"0.408 0.498 1.000\"];"
if [ ! -z "$depends" ]; then
for depend in $depends ; do
writeDotDiagram $name "\"SPK $name\" -> \"$depend\";"
generePackageDotFile $name $depend
done
fi
if [ ! -z "$USE_BUILD_DEPENDS" ]; then
if [ ! -z "$buildDepends" ]; then
for depend in $buildDepends ; do
writeDotDiagram $name "\"SPK $name\" -> \"$depend\";"
writeDotDiagram $name "\"$depend\" [color=\"0.355 0.563 1.000\"];"
generePackageDotFile $name $depend
done
fi
fi
writeDotDiagram $name "}"
uniqArrowDotDiagram $name
drawGraph $name
fi
}
function help {
echo -e "$0 -h : This help";
echo -e "$0 -d [spksrc_dir] : spksrc directory (default: ..)";
echo -e "$0 -o [output_dir] : Output directory (default: ./graphs)";
echo -e "$0 -s [spk package] : Generate the graph only for the package in parameter";
echo -e "$0 -b : Include BUILD_DEPENDS value. Will be draw in green deps";
}
function readArgs {
ROOT=..
GRAPHS_DIR=./graphs
SPK_NAME=
USE_BUILD_DEPENDS=
while getopts "o:d:s:hb" flag; do
case $flag in
h)
help
exit
;;
d)
ROOT=$OPTARG
;;
o)
GRAPHS_DIR=$OPTARG
;;
s)
SPK_NAME=$OPTARG
;;
b)
USE_BUILD_DEPENDS=1
;;
?)
echo "Invalid option: -$OPTARG" >&2
exit;
;;
esac
done
shift $(( OPTIND - 1 ));
}
function main {
readArgs $@
if [ ! -d $ROOT/cross ] || [ ! -d $ROOT/native ] || [ ! -d $ROOT/spk ]; then
>&2 echo "Bad spksrc directory";
help
exit
fi
TMP_DIR=$(mktemp -d)
mkdir -p $GRAPHS_DIR
echo "Generate graph for spk package :"
if [ ! -z "$SPK_NAME" ]; then
genereSpkDotFile $SPK_NAME
else
for spkName in $(geSpkList) ; do
genereSpkDotFile $spkName
done
fi
echo
rm -fr $TMP_DIR
}
main $@
#!/usr/bin/env bash
function getMakefileVarRawValue {
local varName=$1
local packageDir=$2
local value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+(?=(\s*#))" $ROOT"/"$packageDir"/Makefile")
if [ -z "$value" ]; then
value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+" $ROOT"/"$packageDir"/Makefile")
fi
echo $value
}
function getMakefileSpeficCall {
local call=$1
local MAKE_DIR=$(mktemp -d)
echo "all:" > $MAKE_DIR"/Makefile"
echo -e "\t@echo \$("$call")" >> $MAKE_DIR"/Makefile"
echo $(make -f $MAKE_DIR"/Makefile")
rm -fr $MAKE_DIR
}
function getMakefileVarValueReplacement {
local packageDir=$1
shift
local values=$@
OLDIFS=$IFS
IFS=$'\n'
local vars=$(echo $values | grep -oP "\\$\(\K\w+(?=\))")
if [ ! -z "$vars" ]; then
local newValues=
local tempValues=$values
for v in $vars ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\$($v)/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
local vars2=$(echo $values | grep -oP "\\$\{\K\w+(?=\})")
if [ ! -z "$vars2" ]; then
local newValues=
local tempValues=$values
for v in $vars2 ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\${$v}/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
IFS=$ODIFS
if [ ! -z "$vars" ] || [ ! -z "$vars2" ]; then
values=$(getMakefileVarValueReplacement $packageDir $values)
fi
echo $values
}
function getMakefileVarValue {
local varName=$1
local packageDir=$2
local values=$(getMakefileVarRawValue $varName $packageDir)
if [ ! -z "$values" ]; then
local values=$(getMakefileVarValueReplacement $packageDir $values)
values=$(echo -e $values | sort | uniq | sed '/^$/d')
local specificCalls=$(echo $values | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCalls" ]; then
OLDIFS=$IFS
IFS=$'\n'
local newValues=
for e in $values ; do
local specificCall=$(echo $e | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCall" ]; then
val=$(getMakefileSpeficCall $specificCall)
newValues=$(echo $newValues"\n"$e | sed "s/\$($specificCall)/$val/g")
fi
done
IFS=$ODIFS
values=$(echo -e $newValues | sort | uniq | sed '/^$/d')
fi
echo $values
fi
}
function getSpkName {
getMakefileVarValue SPK_NAME $1
}
function getDepends {
getMakefileVarValue DEPENDS $1
}
function getBuildDepends {
getMakefileVarValue BUILD_DEPENDS $1
}
function geSpkList {
ls $ROOT"/spk"
}
function generatePackageDeps {
local packageDir=$1
local path=$ROOT/$packageDir
if [ ! -d $path ]; then
>&2 echo "$name: The package $packageDir can't be found"
else
local depends=$(getDepends $packageDir)
if [ ! -z "$depends" ]; then
for depend in $depends ; do
writeTmpList $depend
generatePackageDeps $depend
done
fi
if [ ! -z "$USE_BUILD_DEPENDS" ]; then
local buildDepends=$(getBuildDepends $packageDir)
if [ ! -z "$buildDepends" ]; then
for depend in $buildDepends ; do
writeTmpList $depend
generatePackageDeps $depend
done
fi
fi
fi
}
function cleanTmpList {
rm -f $TMP_DIR/list.used.txt
}
function writeTmpList {
echo $@ >> $TMP_DIR/list.used.txt
}
function uniqTmpList {
cat $TMP_DIR/list.used.txt | sort | uniq > $TMP_DIR/list.used.txt.tmp
mv $TMP_DIR/list.used.txt.tmp $TMP_DIR/list.used.txt
}
function generateSpkDeps {
local packageDir="spk/"$1
local path=$ROOT"/"$packageDir
if [ ! -d $path ]; then
>&2 echo "The spk $packageDir can't be found"
exit
fi
local name=$(getSpkName $packageDir)
local depends=$(getDepends $packageDir)
local buildDepends=$(getBuildDepends $packageDir)
echo -en "\r\033[K";
echo -en "$packageDir";
if [ ! -z "$depends" ] || [ ! -z "$buildDepends" ]; then
if [ ! -z "$depends" ]; then
for depend in $depends ; do
writeTmpList $depend
generatePackageDeps $depend
done
fi
if [ ! -z "$USE_BUILD_DEPENDS" ]; then
if [ ! -z "$buildDepends" ]; then
for depend in $buildDepends ; do
writeTmpList $depend
generatePackageDeps $depend
done
fi
fi
fi
}
function getListPackages {
local OLDPWD=$(pwd)
cd $ROOT
ls -d cross/* | tr " " "\n" > $TMP_DIR/list.txt
ls -d native/* | tr " " "\n" >> $TMP_DIR/list.txt
cd $OLDPWD
}
function help {
echo -e "$0 -h : This help";
echo -e "$0 -d [spksrc_dir] : spksrc directory (default: ..)";
echo -e "$0 -b : Include BUILD_DEPENDS value.";
}
function readArgs {
ROOT=..
USE_BUILD_DEPENDS=
while getopts "d:hb" flag; do
case $flag in
h)
help
exit
;;
d)
ROOT=$OPTARG
;;
b)
USE_BUILD_DEPENDS=1
;;
?)
echo "Invalid option: -$OPTARG" >&2
exit;
;;
esac
done
shift $(( OPTIND - 1 ));
}
function main {
readArgs $@
if [ ! -d $ROOT/cross ] || [ ! -d $ROOT/native ] || [ ! -d $ROOT/spk ]; then
>&2 echo "Bad spksrc directory";
help
exit
fi
TMP_DIR=$(mktemp -d)
echo "Parse used packages :"
cleanTmpList
for packageDir in $(geSpkList) ; do
generateSpkDeps $packageDir
done
uniqTmpList
getListPackages
echo
echo "Not Used packages :"
awk 'NR==FNR{a[$0]=1;next}!a[$0]' $TMP_DIR/list.used.txt $TMP_DIR/list.txt
rm -fr $TMP_DIR
}
main $@
#!/usr/bin/env bash
function getMakefileVarRawValue {
local varName=$1
local packageDir=$2
local value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+(?=(\s*#))" $ROOT"/"$packageDir"/Makefile")
if [ -z "$value" ]; then
value=$(grep -oP "^$varName\s*(\+?)=\s*\K.+" $ROOT"/"$packageDir"/Makefile")
fi
echo $value
}
function getMakefileSpeficCall {
local call=$1
local MAKE_DIR=$(mktemp -d)
echo "all:" > $MAKE_DIR"/Makefile"
echo -e "\t@echo \$("$call")" >> $MAKE_DIR"/Makefile"
echo $(make -f $MAKE_DIR"/Makefile")
rm -fr $MAKE_DIR
}
function getMakefileVarValueReplacement {
local packageDir=$1
shift
local values=$@
OLDIFS=$IFS
IFS=$'\n'
local vars=$(echo $values | grep -oP "\\$\(\K\w+(?=\))")
if [ ! -z "$vars" ]; then
local newValues=
local tempValues=$values
for v in $vars ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\$($v)/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
local vars2=$(echo $values | grep -oP "\\$\{\K\w+(?=\})")
if [ ! -z "$vars2" ]; then
local newValues=
local tempValues=$values
for v in $vars2 ; do
local varValues=$(getMakefileVarRawValue $v $packageDir | tr " " "\n")
for val in $varValues ; do
newValues=$(echo $newValues"\n"$tempValues | sed "s/\${$v}/$val/g")
done
tempValues=$newValues
done
values=$newValues
fi
IFS=$ODIFS
if [ ! -z "$vars" ] || [ ! -z "$vars2" ]; then
values=$(getMakefileVarValueReplacement $packageDir $values)
fi
echo $values
}
function getMakefileVarValue {
local varName=$1
local packageDir=$2
local version=$3
local versionMajor=$4
local versionMinor=$5
local values=$(getMakefileVarRawValue $varName $packageDir)
if [ ! -z "$values" ]; then
if [ ! -z "$version" ]; then
values=$(echo $values | sed "s/\$(PKG_VERS)/$version/g")
fi
if [ ! -z "$versionMajor" ]; then
values=$(echo $values | sed "s/\$(PKG_VERS_MAJOR)/$versionMajor/g")
fi
if [ ! -z "$versionMinor" ]; then
values=$(echo $values | sed "s/\$(PKG_VERS_MINOR)/$versionMinor/g")
fi
local values=$(getMakefileVarValueReplacement $packageDir $values)
values=$(echo -e $values | sort | uniq | sed '/^$/d')
local specificCalls=$(echo $values | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCalls" ]; then
OLDIFS=$IFS
IFS=$'\n'
local newValues=
for e in $values ; do
local specificCall=$(echo $e | grep -oP "\\$\(\K.+(?=\))")
if [ ! -z "$specificCall" ]; then
val=$(getMakefileSpeficCall $specificCall)
newValues=$(echo $newValues"\n"$e | sed "s/\$($specificCall)/$val/g")
fi
done
IFS=$ODIFS
values=$(echo -e $newValues | sort | uniq | sed '/^$/d')
fi
echo $values
fi
}
function getUrlPackage {
local packageDir=$1
local version=$2
local versionMajor=$3
local versionMinor=$4
local distSite=$(getMakefileVarValue PKG_DIST_SITE $packageDir)
local distName=$(getMakefileVarValue PKG_DIST_NAME $packageDir $version $versionMajor $versionMinor)
if [ -z "$distName" ]; then
echo $distSite
else
echo $distSite"/"$distName
fi
}
function searchPackageUpdateSvn {
local packageDir=$1
local url=$(getUrlPackage $packageDir)
local rev=$(getMakefileVarValue PKG_SVN_REV $packageDir)
if [ ! -f $WORK_DIR"/"$packageDir"/.svn_checkout" ]; then
rm -fr $WORK_DIR"/"$packageDir"/svn"
>2& svn checkout $url $WORK_DIR"/"$packageDir"/svn"
if [ ! $? -eq 0 ]; then
>&2 echo " : Error checkout SVN $url"
exit
fi
touch $WORK_DIR"/"$packageDir"/.svn_checkout"
fi
cd $WORK_DIR"/"$packageDir"/svn"
>2& svn up
if [ ! $? -eq 0 ]; then
>&2 echo " : Error update SVN $url"
exit
fi
svn log -q --limit 1 ^/tags -r HEAD:$rev | grep -oP "^r\K\d+"
cd $OLDPWD
}
function searchPackageUpdateGit {
local packageDir=$1
local url=$(getUrlPackage $packageDir)
local hash=$(getMakefileVarValue PKG_GIT_HASH $packageDir)
if [ ! -f $WORK_DIR"/"$packageDir"/.git_clone" ]; then
rm -fr $WORK_DIR"/"$packageDir"/git"
>2& git clone $url $WORK_DIR"/"$packageDir"/git"
if [ ! $? -eq 0 ]; then
>&2 echo " : Error checkout GIT $url"
exit
fi
touch $WORK_DIR"/"$packageDir"/.git_clone"
fi
cd $WORK_DIR"/"$packageDir"/git"
if [ ! $? -eq 0 ]; then
>&2 echo " : Error fetch GIT $url"
exit
fi
>2& git fetch
git rev-list $hash..HEAD | xargs -n1 git tag -l --points-at 2> /dev/null
cd $OLDPWD
}
function getPackageVersion {
local packageDir=$1
local version=$(getMakefileVarValue PKG_VERS $packageDir)
if [ -z "$version" ]; then
version=$(getMakefileVarValue PKG_VERS_MAJOR $packageDir)
local versionMinor=$(getMakefileVarValue PKG_VERS_MINOR $packageDir)
local versionPatch=$(getMakefileVarValue PKG_VERS_PATCH $packageDir)
if [ ! -z "$versionMinor" ]; then
version=$version"."$versionMinor
fi
if [ ! -z "$versionPatch" ]; then
version=$version"."$versionPatch
fi
fi
if [ -z "$version" ]; then
local method=$(getMakefileVarValue PKG_DOWNLOAD_METHOD $packageDir)
if [ "$method" == "svn" ]; then
version=$(getMakefileVarValue PKG_SVN_REV $packageDir)
elif [ "$method" == "git" ]; then
version=$(getMakefileVarValue PKG_GIT_HASH $packageDir)
fi
fi
echo $version
}
function searchPackageUpdateHost_IncrementVersion {
echo s
}
function searchPackageUpdateHost {
local packageDir=$1
local url=$(getUrlPackage $packageDir)
local parentUrl=${url%/*}"/"
local filename=${url##*/}
local version=$(getPackageVersion $packageDir)
local extension=$(getMakefileVarValue PKG_EXT $packageDir)
curl --output $WORK_DIR"/"$packageDir"/"list.html --silent --fail $parentUrl
if [ $? -eq 0 ] && [ -f $WORK_DIR"/"$packageDir"/"list.html ]; then
if grep -q $filename $WORK_DIR"/"$packageDir"/"list.html; then
# Found filename: package listing
local regexVersionPackageVersion=$(echo $version | sed -e 's/\./\\./g' -e 's/[0-9]\+/(\\\\d+)/g' -e 's/-\w\+$/(-[\\\\w]+)?/')
local regexVersionPackage=$(echo $filename | sed "s/$version/\\\K$regexVersionPackageVersion(?=/g")")"
grep -oP "$regexVersionPackage" $WORK_DIR"/"$packageDir"/"list.html | sort -r -V | uniq | sed -n -e "0,/^$version$/p" | sed -e '$d'
exit
elif grep -q $version $WORK_DIR"/"$packageDir"/"list.html; then
# Found version: try finding other version
local regexVersionPackage=$(echo $version | sed -e 's/\./\\./g' -e 's/[0-9]\+/(\\d+)/g' -e 's/-.\+$/(-[\\w]+)?/')
local versionToCheck=$(grep -oP "$regexVersionPackage" $WORK_DIR"/"$packageDir"/"list.html | sort -r -V | uniq | sed -n -e "0,/^$version$/p" | sed -e '$d')
for v in $versionToCheck; do
local urlVersion=$(echo $url | sed -e "s/$version/$v/g")
if [ $(checkUrlAvailability $urlVersion) -eq 0 ]; then
echo $v
fi
done
exit
fi
fi
# Try different version to find a new version
>&2 echo -e "\tNot implemented"
exit
}
function checkUrlAvailability {
local url=$1
>&2 echo curl $url
curl --output /dev/null --silent --head --fail $url
if [ ! $? -eq 0 ]; then
curl --output /dev/null --silent --fail -r 0-0 $url
fi
echo $?
}
function searchPackageUpdate {
local packageDir=$1
local path=$ROOT"/"$packageDir
if [ ! -d $path ]; then
>&2 echo "The package $packageDir can't be found"
exit
fi
local name=$(getMakefileVarValue PKG_NAME $packageDir)
local version=$(getPackageVersion $packageDir)
local method=$(getMakefileVarValue PKG_DOWNLOAD_METHOD $packageDir)
echo
echo -e "$packageDir ($method":"$version)";
mkdir -p $WORK_DIR"/"$packageDir
local newVersion=
if [ "$method" == "svn" ]; then
newVersion=$(searchPackageUpdateSvn $packageDir)
elif [ "$method" == "git" ]; then
newVersion=$(searchPackageUpdateGit $packageDir)
else
newVersion=$(searchPackageUpdateHost $packageDir)
fi
if [ ! -z "$newVersion" ]; then
echo " -> New version available :"
echo $newVersion | tr " " "\n"
else
echo "None new version"
fi
}
function getListPackages {
cd $ROOT
ls -d cross/* | tr " " "\n" > $TMP_DIR/list.txt
ls -d native/* | tr " " "\n" >> $TMP_DIR/list.txt
cd $OLDPWD
cat $TMP_DIR/list.txt
}
function help {
echo -e "$0 -h : This help";
echo -e "$0 -d [spksrc_dir] : spksrc directory (default: ..)";
echo -e "$0 -c [cross package] : Search new version for the cross package";
echo -e "$0 -n [native package] : Search new version for the native package";
}
function readArgs {
ROOT=..
CROSS_NAME=
NATIVE_NAME=
while getopts "d:c:n:h" flag; do
case $flag in
h)
help
exit
;;
d)
ROOT=$OPTARG
;;
c)
CROSS_NAME=$OPTARG
;;
n)
NATIVE_NAME=$OPTARG
;;
?)
echo "Invalid option: -$OPTARG" >&2
exit;
;;
esac
done
shift $(( OPTIND - 1 ));
}
function main {
readArgs $@
if [ ! -d $ROOT/cross ] || [ ! -d $ROOT/native ] || [ ! -d $ROOT/spk ]; then
>&2 echo "Bad spksrc directory";
help
exit
fi
BASEDIR=$(dirname $0)
OLDPWD=$(pwd)
TMP_DIR=$(mktemp -d)
WORK_DIR=$BASEDIR"/work"
mkdir -p $WORK_DIR"/cross"
mkdir -p $WORK_DIR"/native"
echo "Check package update :"
if [ ! -z "$CROSS_NAME" ]; then
searchPackageUpdate "cross/"$CROSS_NAME
elif [ ! -z "$NATIVE_NAME" ]; then
searchPackageUpdate "native/"$NATIVE_NAME
else
for packageDir in $(getListPackages) ; do
searchPackageUpdate $packageDir
done
fi
echo
rm -fr $TMP_DIR
}
main $@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment