#!/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 ;; check) test -r $HOME/.fgfs/jenkins-status && bash $HOME/.fgfs/jenkins-status ;; rss) test -r $HOME/.fgfs/fgcoderss && bash $HOME/.fgfs/fgcoderss ;; data) 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 ;; source) for component in $(<$fgfs_source/.$2); do for control_system update_command in ${(kv)control_system_data}; do find $fgfs_source/$component \ -maxdepth 1 \ -type d \ -name .${control_system} \ -printf "\n[ %h ]\n" \ -execdir ${control_system} ${update_command} \; done done ;; build) local simultaneous=$(nproc) local previously_installed=() mkdir -p $fgfs_install for component in $(<$fgfs_source/.$2); do if test -d $fgfs_source/$component/.git; then local branch=$(git -C $fgfs_source/$component name-rev --name-only --no-undefined --always HEAD) elif test -d $fgfs_source/${component}/.svn; then local branch=${${(s:/:)$(svn info --show-item relative-url $fgfs_source/$component)}[2]} fi title="*** ${component:u}${branch:+ [$branch]} ***" printf "\n%s\n%s\n%s\n" "${(l:${#title}::*:)}" "$title" "${(l:${#title}::*:)}" # TODO: prendre en compte les cas sans cmake if test -r $fgfs_source/$component/CMakeLists.txt; then local cmake_options=("-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_PREFIX=$fgfs_install/$component") test -e $fgfs_source/${component}.specific && source $fgfs_source/${component}.specific if test ${#previously_installed[@]} -gt 0; then cmake_options+=(${(j. .)${:--DCMAKE_PREFIX_PATH=$fgfs_install/${^previously_installed}}}) cmake_options+=(${(j. .)${:--DCMAKE_INCLUDE_PATH=$fgfs_install/${^previously_installed}/include}}) fi cmake_options+=("-j$simultaneous") 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" cd $FGDIR return } fi previously_installed+=($component) cd - done unset component ;; esac } function ld_library_path () { local 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 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|)) if test -z "$2" || test ! -r $fgfs_source/.$2; then echo "${2:+unknown set $2\n}usage: --update|--update-data|--update-source|--update-build " echo "available sets :" ${$(find $fgfs_source -maxdepth 1 -type f -name ".*" -printf "%f ")//#.} return 1 fi for component in $(<$fgfs_source/.$2); do if ! test -d $fgfs_source/$component; then echo component $component not found return 1 fi done typeset -A control_system_data=( git pull svn up ) for up in ${${=${fgfs_arg#--update}:-data source build}#-}; do update_fg $up ${2:-flightgear} done unset control_system_data control_system update_command up return ;; --update-(fgaddon|check|rss)) update_fg ${fgfs_arg#--update-} 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 ;; --search) command -v sqlite3 > /dev/null || return sqlite3 $FGADDON/fgaddon.db <<< "select file from setxml where file like '%$2%'" return ;; --mp-list) local mplist=$(mktemp --dry-run /dev/shm/XXXXXXXXX) declare -A installed_model fgaddon_model unknown_model local ac_name= telnet mpserver01.flightgear.org 5001 2>/dev/null > $mplist grep 'pilot(s) online' $mplist echo for model in $(awk '/@/{a[$NF]++}END{for (i in a) print i}' $mplist); do if test -r $FGADDON/$model \ -o -r $FGDIR/source/fgdata/$model; then installed_model[${${(s:/:)model}[2]}]=1 elif test -r $FGDIR/source/fgdata/AI/$model; then installed_model[*${${(s:/:)model}[2]}]=1 elif test -n "$(command -v sqlite3)" -a -r $FGADDON/fgaddon.db; then ac_name=$(sqlite3 $FGADDON/fgaddon.db <<< 'select printf("%s/%s", aircrafts.name, setxml.file) from aircrafts inner join setxml where aircrafts.id = setxml.variantof and setxml.`/sim/model/path` = "'$model'" limit 1') if test -n "$ac_name"; then fgaddon_model[${ac_name}]=1 else unknown_model[${model}]=1 fi else unknown_model[${model}]=1 fi done if test ${#installed_model[@]} -gt 0; then echo "${(j:\n:)${(Ok)installed_model[@]}}" > $mplist echo -e "${#installed_model[@]} models installed (*AI model only):\n$(column -c$(tput cols) $mplist)\n" fi if test ${#fgaddon_model[@]} -gt 0; then echo "${(j:\n:)${(Ok)fgaddon_model[@]}}" > $mplist echo -e "${#fgaddon_model[@]} models available in FGADDON:\n$(column -c$(tput cols) $mplist)\n" fi if test ${#unknown_model[@]} -gt 0; then echo "${(j:\n:)${(Ok)unknown_model[@]}}" > $mplist echo -e "${#unknown_model[@]} unknown models:\n$(column -c$(tput cols) $mplist)" fi unset installed_model unknown_model fgaddon_model rm $mplist 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>(.+)