#!/bin/bash APP_SVNID='$HeadURL$ $LastChangedRevision$' . $(ade-config ade_share_prefix)/include/ade.sh || { echo "${0##*/}: INTERNAL ERROR: failed to load ade.sh" >&2; exit 3; } GPXSPLIT_UNBUNDLE_DEFINED_ERRORS=( "KEY=GPXSPLIT_UNBUNDLE_MISC; FMT=\"%s\"" ) # Other globals gpxsplit_unbundle() { local ERRSTACK_REF="$1"; shift local -a DOLLARAT local INPUT_GPX_FILE # Register application-specific errors ade_register_error_types GPXSPLIT_UNBUNDLE_DEFINED_ERRORS # Defaults for options # Register gpxsplit-unbundle's options ade_register_options "$ERRSTACK_REF" -o '' --longoptions= --callback-template="gpxsplit_unbundle_opt_handler_%s" || return $? ade_set_callbacks "$ERRSTACK_REF" gpxsplit_unbundle_usage_help gpxsplit_unbundle_version gpxsplit_unbundle_paths || return $? # Process options ade_process_options "$ERRSTACK_REF" NEW_DOLLAR_AT "$@" || return $? set -- "${NEW_DOLLAR_AT[@]}" # Process arguments [ $# = 1 ] || ade_show_bad_usage INPUT_GPX_FILE=$1 # Sanity checks and derivations if [ ! -f $INPUT_GPX_FILE ]; then ade_error "$ERRSTACK_REF" GPXSPLIT_UNBUNDLE_MISC "$INPUT_GPX_FILE: not accessible" return $ADE_FAIL fi ROUTE_COUNT=$(grep -o '' $INPUT_GPX_FILE | wc -l) TRACK_COUNT=$(grep -o '' $INPUT_GPX_FILE | wc -l) WAYPOINT_COUNT=$(grep -o '' $INPUT_GPX_FILE | wc -l) if [ $ROUTE_COUNT = 0 -o $TRACK_COUNT != 0 -o $WAYPOINT_COUNT != 0 ]; then ade_error "$ERRSTACK_REF" GPXSPLIT_UNBUNDLE_MISC "$INPUT_GPX_FILE: contains $ROUTE_COUNT route(s), $TRACK_COUNT track(s), $WAYPOINT_COUNT waypoint(s) (hint: expected 1 or more routes, 0 tracks, 0 waypoints)" return $ADE_FAIL fi # Guts ade_debug "$ERRSTACK_REF" 10 "gpxsplit_unbundle: initialising ..." rm -f xx* ade_info "$ERRSTACK_REF" "splitting $INPUT_GPX_FILE into individual routes ..." csplit -qk $INPUT_GPX_FILE '//' '{1000}' 2>/dev/null || true ade_debug "$ERRSTACK_REF" 10 "gpxsplit_unbundle: fixing up prolog and epilog ..." mv xx00 prolog.gpx LAST_ROUTE_FILE=$(ls -r xx* | head -1) grep -v '^$' $LAST_ROUTE_FILE > $LAST_ROUTE_FILE.new mv $LAST_ROUTE_FILE.new $LAST_ROUTE_FILE echo '' > epilog.gpx BADLY_FORMATTED_ROUTE_SHORTNAME_INDEX=0 for X in xx*; do ade_debug "$ERRSTACK_REF" 10 "gpxsplit_unbundle: X=$X" ROUTE_FULLNAME=$(sed -n 2p $X | sed 's/.*>\(.*\)<.*/\1/') # Change all '/' to '-' to allow them to be written to filesystem. FS_COMPLIANT_ROUTE_FULLNAME=${ROUTE_FULLNAME//\//-} { cat prolog.gpx; cat $X; cat epilog.gpx; } > "$FS_COMPLIANT_ROUTE_FULLNAME".gpx done ade_debug "$ERRSTACK_REF" 10 "gpxsplit_unbundle: cleaning up ..." rm xx* prolog.gpx epilog.gpx } gpxsplit_unbundle_usage_help() { local ERRSTACK_REF="$1"; shift local USAGE_TEXT_SHORT_REF="$1"; shift local USAGE_TEXT_LONG_REF="$1"; shift eval "$USAGE_TEXT_SHORT_REF=\"\"" eval "$USAGE_TEXT_LONG_REF=" return $ADE_OK } gpxsplit_unbundle_paths() { local ERRSTACK_REF="$1"; shift local PATHLIST_REF=$1; shift eval "$PATHLIST_REF=\"\"" return $ADE_OK } gpxsplit_unbundle_version() { local ERRSTACK_REF="$1"; shift local VERSION_REF=$1; shift ade_extract_version "$ERRSTACK_REF" "$APP_SVNID" "$VERSION_REF" return $ADE_OK } ade_main gpxsplit_unbundle "$@"