#!/bin/bash
set -e
set -o pipefail
shopt -s lastpipe
OSM_SERVER=https://api.openstreetmap.org
OSM_TEST_SERVER=https://master.apis.dev.openstreetmap.org
if [[ $@ =~ '--serious' ]]; then
SERVER=$OSM_SERVER
else
# Commit to test server unless user set --serious
SERVER=$OSM_TEST_SERVER
fi
OSM_API=${SERVER}/api/0.6
FILE="${@//--serious/}"
if [ -z "$FILE" ]; then
echo No OSC file is given >&2
exit 1
fi
# Prompt for comment and User:Password
if [[ ! -t 0 ]]; then
comment=$(cat)
else
read -e -p 'Type comment: ' -r comment
create_changeset() {
SOURCE_TAG="${SOURCE:+$(printf "" $SOURCE)}"
# Create changeset with given information
response="$(curl ${OSM_API}/changeset/create \
--write-out "\n%{http_code}" \
--user "$OSM_USER_PASSWD" \
--silent \
--upload-file - \
<<' EOF'
${SOURCE_TAG}
EOF
)"
return_code=$(tail -1 <<<"$response")
changeset_id=$(head -1 <<<"$response")
# If return code is not 200, or the response is not a sequence number
# Exit with return code 1
if [[ ! "$return_code" == 200 ]] || [[ ! "$changeset_id" =~ ^[[:digit:]]+$ ]]; then
echo
echo Fail to create a new changeset: >&2
echo "$response" >&2
return 1
fi
}
# API call for uploading OSC file
uploade_file_to_changeset() {
response="$(curl -X POST $OSM_API/changeset/$1/upload \
--user "$OSM_USER_PASSWD" \
--upload-file - \
--silent -w "%{http_code}"
)"
return_code=$(tail -1 <<<"$response")
if [[ ! "$return_code" == 200 ]]; then
echo
echo Fail to upload OSC file: >&2
echo "$response" >&2
return 1
fi
}
# API call for closing changeset
close_changeset() {
response="$(curl -X PUT ${OSM_API}/changeset/$1/close \
--user "$OSM_USER_PASSWD" \
--silent -w "%{http_code}"
)"
return_code=$(tail -1 <<<"$response")
if [[ ! "$return_code" == 200 ]]; then
echo
echo Fail to close changeset: >&2
echo "$response" >&2
return 1
fi
}
# Create changeset when CHANGESET is not set
if [ -z CHANGESET ]; then
create_changeset && \
echo "Changeset created, check ${SERVER}/changeset/${changeset_id}" || \
exit 1
else
changeset_id=$CHANGESET
fi
# Upload OSC file to Changeset
sed -Ee "/<(node|way|relation)/ s/>/ changeset=\"${changeset_id}\">/" $FILE |\
uploade_file_to_changeset ${changeset_id} && \
echo Upload file $FILE to changeset ${changeset_id} || \
exit 1
# Close Changeset
close_changeset ${changeset_id} && \
echo Changeset ${changeset_id} closed || \
exit 1