Last active
February 22, 2017 05:26
-
-
Save GuillaumeSmaha/5545f6e48b5d3ce35399d6b3727c4a9c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 $@ | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 $@ | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 $@ | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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