#!/bin/zsh
#FGDIR=$HOME/scripts/flightgear
#FGADDON=$HOME/.fgfs/flightgear-fgaddon
function fgfs () {
local fgfs_source=$FGDIR/source
local fgfs_build=$FGDIR/build
local fgfs_install=$FGDIR/install
function update_fg () {
case $1 in
fgaddon)
DB=$FGADDON/fgaddon.db $HOME/.fgfs/fgaddon
;;
data)
typeset -A control_system_data=(
git pull
svn up
)
for control_system update_command in ${(kv)control_system_data}; do
find $FGADDON \
-maxdepth 3 \
-mindepth 1 \
-type d \
-name .${control_system} \
-printf "\n[ %h ]\n" \
-execdir ${control_system} ${update_command} \;
done
unset control_system_data control_system update_command
;;
source)
typeset -A control_system_data=(
git pull
svn up
)
for control_system update_command in ${(kv)control_system_data}; do
find $fgfs_source \
-maxdepth 2 \
-mindepth 1 \
-type d \
-name .${control_system} \
-printf "\n[ %h ]\n" \
-execdir ${control_system} ${update_command} \;
done
unset control_system_data control_system update_command
;;
check)
typeset -A revision builtstatus
for component in simgear flightgear; do
cd $fgfs_source/$component
revision[$component]=$(git rev-parse HEAD)
cd - > /dev/null 2>&1
done
xmlgetnext () {
local IFS='>'
read -d '<' TAG VALUE
}
unset entryid
wget -qO- http://build.flightgear.org:8080/job/fgfs/rssAll | while xmlgetnext; do
case "$TAG" in
"entry")
let entryid++
unset stable jenkins_id updated
;;
"title")
test -n "$entryid" && stable=$(sed -r 's/^.*\((.+)\)/\1/' <<< "$VALUE")
;;
"id")
test -n "$entryid" && jenkins_id="${VALUE##*:}"
;;
"updated")
test -n "$entryid" && updated="$VALUE"
;;
"/entry")
joburl=http://build.flightgear.org:8080/job/fgfs/$jenkins_id
regex='s|^.+Revision: (.+)$|\1|p'
if test "$(wget -qO- $joburl/git-2/ | sed -rn $regex)" = ${revision[simgear]} -a \
"$(wget -qO- $joburl/git-3/ | sed -rn $regex)" = ${revision[flightgear]}; then
echo $(date +"$stable (#$jenkins_id, updated %d %B, %H:%M)" -d "$updated")
unset revision builtstatus entryid
return 0
elif test $entryid -eq 5; then
echo $(date +"no build info found (last %d %B, %H:%M)" -d "$updated")
unset revision builtstatus entryid
return 1
fi
;;
esac
done
;;
build)
local simultaneous=$(nproc)
local previously_installed=()
mkdir -p $fgfs_install
for component in $(<$fgfs_source/ordre); do
# TODO: prendre en compte les cas sans cmake
title="*** $component:u ***"
printf "\n%s\n%s\n%s\n" "${(l:${#title}::*:)}" "$title" "${(l:${#title}::*:)}"
local cmake_options=("-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_PREFIX=$fgfs_install/$component")
[[ ${#previously_installed[@]} -gt 0 ]] \
&& cmake_options+=(${(j. .)${:--DCMAKE_PREFIX_PATH=$fgfs_install/${^previously_installed}}})
cmake_options+=("-j$simultaneous")
test -e $fgfs_source/${component}.specific && source $fgfs_source/${component}.specific
mkdir -p $fgfs_build/$component
cd $fgfs_build/$component
echo cmake ${cmake_options[@]} $fgfs_source/$component
cmake ${cmake_options[@]} $fgfs_source/$component > /dev/null \
&& make -j$simultaneous > /dev/null \
&& make install \
|| {
echo "erreur construction $component"
return
}
previously_installed+=($component)
cd -
done
unset component
;;
esac
}
function ld_library_path () {
IFS_=$IFS
IFS=$'\n'
for lib in $(ls -d $FGDIR/install/*/lib); do
egrep -q "(^|:)$lib(:|$)" <<< "${LD_LIBRARY_PATH}" || LD_LIBRARY_PATH="${lib}${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"
done
IFS=$IFS_
export LD_LIBRARY_PATH
}
local aircrafts="$FGADDON/Aircraft"
local fgfs_args=("--fg-root=$FGDIR/source/fgdata")
local aircraft=
local airport=
if [[ -o BASH_REMATCH ]]; then
local bash_rematch_set=1
fi
for fgfs_arg in $@; do
if test ${fgfs_arg#--} = ${fgfs_arg}; then
############ APPAREIL DANS FGADDON ?
if test -n "$(find $aircrafts -maxdepth 2 -type f -name ${fgfs_arg}-set.xml -print -quit)"; then
fgfs_args+=("--aircraft=$fgfs_arg")
fgfs_args+=("--fg-aircraft=$FGADDON/Aircraft")
############ APPAREIL DANS FGDIR/source/fgdata ?
elif official_aircraft=$(find "$fgfs_source/fgdata/Aircraft" -maxdepth 2 -type f -name ${fgfs_arg}-set.xml -printf "%h" -quit) && test -n "$official_aircraft"; then
fgfs_args+=("--aircraft=$fgfs_arg")
fgfs_args+=("--aircraft-dir=$official_aircraft")
unset official_aircraft
############ APPAREIL DANS FGADDON ?
elif which sqlite3 > /dev/null 2>&1 \
&& test -r $FGADDON/fgaddon.db \
&& test $(sqlite3 $FGADDON/fgaddon.db <<< "select count(file) from setxml where file is '${fgfs_arg}'") -eq 1; then
model=$(sqlite3 $FGADDON/fgaddon.db <<< "select name from aircrafts inner join setxml on aircrafts.id = setxml.variantof where setxml.file is '${fgfs_arg}'")
read -q "REPLY?download $model ? (y/N) "
if test -n "$REPLY" && test ${REPLY:l} = "y"; then
svn co https://svn.code.sf.net/p/flightgear/fgaddon/trunk/Aircraft/$model $FGADDON/Aircraft/$model
fgfs_args+=("--aircraft=$fgfs_arg")
else
echo "aircraft $fgfs_arg isn't installed"
return
fi
############ SERVEUR MULTIPLAY ?
elif set -o BASH_REMATCH && [[ $fgfs_arg =~ "^mp([0-9]+)$" ]]; then
fgfs_args+=("--multiplay=out,10,mpserver${BASH_REMATCH[2]}.flightgear.org,5000")
fgfs_args+=("--callsign=f-zakh")
test -z "$bash_rematch_set" && set +o BASH_REMATCH
############ DEMANDE DE TRACE DE VOL ?
elif [[ $fgfs_arg == "log" ]]; then
# option construite plus tard avec nom de l'appareil
local log_requested=1
############ AEROPORT ?
else
local candidate_airport=${fgfs_arg%:*}; [[ $candidate_airport == $fgfs_arg ]] && candidate_airport=${fgfs_arg%+*}
local candidate_parking=${fgfs_arg#*:}; [[ $candidate_parking == $fgfs_arg ]] && unset candidate_parking
local candidate_runway=${fgfs_arg#*+}; [[ $candidate_runway == $fgfs_arg ]] && unset candidate_runway
local terrafs=${candidate_airport#-}
if [[ $terrafs != $candidate_airport && -x $HOME/.fgfs/terrafs && -d $HOME/.fgfs/terrafs.d ]]; then
candidate_airport=$terrafs
$HOME/.fgfs/terrafs $HOME/.fgfs/terrafs.d
fgfs_args+=(--fg-scenery=$HOME/.fgfs/terrafs.d)
fgfs_args+=(--disable-terrasync)
local scenes_dir=$HOME/.fgfs/terrafs.d
else
fgfs_args+=(--terrasync-dir=$HOME/.fgfs/TerraSync)
fgfs_args+=(--enable-terrasync)
local scenes_dir=$HOME/.fgfs/TerraSync
fi
local airport_data="$scenes_dir/Airports/$candidate_airport[1]:u/$candidate_airport[2]:u/$candidate_airport[3]:u/${candidate_airport:u}"
if [[ -a "${airport_data}.threshold.xml" ]]; then
fgfs_args+=(--airport=$candidate_airport)
if [[ -a "${airport_data}.groundnet.xml" && -n "$candidate_parking" ]]; then
if test $candidate_parking = '?'; then
echo "Parkings ${candidate_airport:u}:"
sed -rn "//s/^.* name=\"([^\"]+).*$/\1/p" ${airport_data}.groundnet.xml
return
elif sed -rn "//p" ${airport_data}.groundnet.xml | grep -q "name=\"${candidate_parking}\""; then
fgfs_args+=("--parkpos='$candidate_parking'")
fi
elif test -n "$candidate_runway"; then
if test $candidate_runway = '?'; then
echo "Runways ${candidate_airport:u}:"
sed -rn 's|^.*(.+).*$|\1|p' ${airport_data}.threshold.xml
return
elif grep -q "${candidate_runway}" ${airport_data}.threshold.xml; then
fgfs_args+=("--runway=$candidate_runway")
fi
fi
fi
fi
######## AUTRE OPTION
else
case $fgfs_arg in
--update(-data|-source|-build|-fgaddon|-check|))
for up in ${${=${fgfs_arg#--update}:-data source build}#-}; do
update_fg $up
done
unset up
return
;;
--(show-aircraft|help))
local -A complement=(
--show-aircraft --fg-aircraft=$FGADDON/Aircraft
--help --verbose
)
ld_library_path
$FGDIR/install/flightgear/bin/fgfs $fgfs_arg ${complement[$fgfs_arg]} 2>/dev/null | pager
return
;;
*)
fgfs_args+=($fgfs_arg);;
esac
fi
done
unset fgfs_arg
if [[ -n "$log_requested" && -z "${fgfs_args[(r)--igc=*]}" ]]; then
fgfs_args+=(--igc=file,out,1,$(date +%Y%m%d-%H%M-${${${fgfs_args[(r)--aircraft=*]}#--aircraft=}:-$(sed -rn 's|^.+aircraft>(.+)