aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xbin/osm/osm.api.changeset.commit121
1 files changed, 83 insertions, 38 deletions
diff --git a/bin/osm/osm.api.changeset.commit b/bin/osm/osm.api.changeset.commit
index 6b67833..d7f57fc 100755
--- a/bin/osm/osm.api.changeset.commit
+++ b/bin/osm/osm.api.changeset.commit
@@ -1,18 +1,26 @@
1#!/bin/bash 1#!/bin/bash
2 2
3set -e 3set -e
4set -o pipefail
4shopt -s lastpipe 5shopt -s lastpipe
5 6
6OSM_SERVER=https://api.openstreetmap.org 7OSM_SERVER=https://api.openstreetmap.org
7OSM_TEST_SERVER=https://master.apis.dev.openstreetmap.org 8OSM_TEST_SERVER=https://master.apis.dev.openstreetmap.org
9
8if [[ $@ =~ '--serious' ]]; then 10if [[ $@ =~ '--serious' ]]; then
9 SERVER=$OSM_SERVER 11 SERVER=$OSM_SERVER
10else 12else
13# Commit to test server unless user set --serious
11 SERVER=$OSM_TEST_SERVER 14 SERVER=$OSM_TEST_SERVER
12fi 15fi
13 16
14OSM_API=${SERVER}/api/0.6 17OSM_API=${SERVER}/api/0.6
15FILE=${@//--serious/} 18FILE="${@//--serious/}"
19
20if [ -z "$FILE" ]; then
21 echo No OSC file is given >&2
22 exit 1
23fi
16 24
17# Prompt for comment and User:Password 25# Prompt for comment and User:Password
18if [[ ! -t 0 ]]; then 26if [[ ! -t 0 ]]; then
@@ -20,61 +28,98 @@ if [[ ! -t 0 ]]; then
20else 28else
21 read -e -p 'Type comment: ' -r comment </dev/tty 29 read -e -p 'Type comment: ' -r comment </dev/tty
22fi 30fi
23if [ -z ${OSM_USER_PASSWD} ]; then 31if [ -z "${OSM_USER_PASSWD}" ]; then
24 read -e -p 'Type USER:PASSWD: ' -r OSM_USER_PASSWD </dev/tty 32 read -e -p 'Type USER:PASSWD: ' -r OSM_USER_PASSWD </dev/tty
25fi 33fi
26 34
35# API call for changeset create
36# If env SOURCE is set, add it as part of changeset:
37# <tag k='source' v='$SOURCE'/>
27create_changeset() { 38create_changeset() {
28 SOURCE_TAG="${SOURCE:+$(printf "<tag k='source' v='%s'/>" $SOURCE)}" 39 SOURCE_TAG="${SOURCE:+$(printf "<tag k='source' v='%s'/>" $SOURCE)}"
29 40
30 curl ${OSM_API}/changeset/create \ 41 # Create changeset with given information
31 --user ${OSM_USER_PASSWD} \ 42 response="$(curl ${OSM_API}/changeset/create \
32 --upload-file - \ 43 --write-out "\n%{http_code}" \
44 --user "$OSM_USER_PASSWD" \
33 --silent \ 45 --silent \
34 <<EOF | tail -1 46 --upload-file - \
35<osm> 47 <<' EOF'
36 <changeset> 48 <osm>
37 ${SOURCE_TAG} 49 <changeset>
38 <tag k='comment' v='${comment}'/> 50 ${SOURCE_TAG}
39 <tag k='created_by' v='bash script'/> 51 <tag k='comment' v='${comment}'/>
40 <tag k='bot' v='yes'/> 52 <tag k='created_by' v='bash script'/>
41 </changeset> 53 <tag k='bot' v='yes'/>
42</osm> 54 </changeset>
43EOF 55 </osm>
56 EOF
57 )"
58
59 return_code=$(tail -1 <<<"$response")
60 changeset_id=$(head -1 <<<"$response")
61
62 # If return code is not 200, or the response is not a sequence number
63 # Exit with return code 1
64 if [[ ! "$return_code" == 200 ]] || [[ ! "$changeset_id" =~ ^[[:digit:]]+$ ]]; then
65 echo
66 echo Fail to create a new changeset: >&2
67 echo "$response" >&2
68 return 1
69 fi
44} 70}
45 71
46# Return http code after uploading a file 72# API call for uploading OSC file
47uploade_file_to_changeset() { 73uploade_file_to_changeset() {
48 curl -X POST $OSM_API/changeset/${changeset_id}/upload \ 74 response="$(curl -X POST $OSM_API/changeset/$1/upload \
49 --user ${OSM_USER_PASSWD} -i \ 75 --user "$OSM_USER_PASSWD" \
50 --upload-file - \ 76 --upload-file - \
51 --silent -o /dev/null -w "%{http_code}" 77 --silent -w "%{http_code}"
78 )"
79
80 return_code=$(tail -1 <<<"$response")
81
82 if [[ ! "$return_code" == 200 ]]; then
83 echo
84 echo Fail to upload OSC file: >&2
85 echo "$response" >&2
86 return 1
87 fi
52} 88}
53 89
90# API call for closing changeset
54close_changeset() { 91close_changeset() {
55 curl -X PUT ${OSM_API}/changeset/${changeset_id}/close \ 92 response="$(curl -X PUT ${OSM_API}/changeset/$1/close \
56 --user ${OSM_USER_PASSWD} -i \ 93 --user "$OSM_USER_PASSWD" \
57 --silent -o /dev/null -w "%{http_code}" 94 --silent -w "%{http_code}"
58} 95 )"
59 96
60# Create changeset with given information 97 return_code=$(tail -1 <<<"$response")
61changeset_id=$(create_changeset)
62 98
63# Print created changeset id 99 if [[ ! "$return_code" == 200 ]]; then
64echo "Changeset created, check ${SERVER}/changeset/${changeset_id}" >/dev/tty 100 echo
65echo ${changeset_id} 101 echo Fail to close changeset: >&2
102 echo "$response" >&2
103 return 1
104 fi
105}
66 106
67# Upload OSC file to Changeset 107# Create changeset when CHANGESET is not set
68sed -Ee "/<(node|way|relation)/ s/>/ changeset=\"${changeset_id}\">/" $FILE |\ 108if [ -z CHANGESET ]; then
69uploade_file_to_changeset | if [[ $(cat) == '200' ]]; then 109 create_changeset && \
70 echo Upload file $FILE to changeset ${changeset_id} >/dev/tty 110 echo "Changeset created, check ${SERVER}/changeset/${changeset_id}" || \
71else
72 exit 1 111 exit 1
112else
113 changeset_id=$CHANGESET
73fi 114fi
74 115
116# Upload OSC file to Changeset
117sed -Ee "/<(node|way|relation)/ s/>/ changeset=\"${changeset_id}\">/" $FILE |\
118uploade_file_to_changeset ${changeset_id} && \
119echo Upload file $FILE to changeset ${changeset_id} || \
120exit 1
121
75# Close Changeset 122# Close Changeset
76close_changeset | if [[ $(cat) == '200' ]]; then 123close_changeset ${changeset_id} && \
77 echo Changeset ${changeset_id} closed >/dev/tty 124echo Changeset ${changeset_id} closed || \
78else 125exit 1
79 exit 1
80fi