diff options
-rwxr-xr-x | bin/osm/osm.api.changeset.commit | 121 |
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 | ||
3 | set -e | 3 | set -e |
4 | set -o pipefail | ||
4 | shopt -s lastpipe | 5 | shopt -s lastpipe |
5 | 6 | ||
6 | OSM_SERVER=https://api.openstreetmap.org | 7 | OSM_SERVER=https://api.openstreetmap.org |
7 | OSM_TEST_SERVER=https://master.apis.dev.openstreetmap.org | 8 | OSM_TEST_SERVER=https://master.apis.dev.openstreetmap.org |
9 | |||
8 | if [[ $@ =~ '--serious' ]]; then | 10 | if [[ $@ =~ '--serious' ]]; then |
9 | SERVER=$OSM_SERVER | 11 | SERVER=$OSM_SERVER |
10 | else | 12 | else |
13 | # Commit to test server unless user set --serious | ||
11 | SERVER=$OSM_TEST_SERVER | 14 | SERVER=$OSM_TEST_SERVER |
12 | fi | 15 | fi |
13 | 16 | ||
14 | OSM_API=${SERVER}/api/0.6 | 17 | OSM_API=${SERVER}/api/0.6 |
15 | FILE=${@//--serious/} | 18 | FILE="${@//--serious/}" |
19 | |||
20 | if [ -z "$FILE" ]; then | ||
21 | echo No OSC file is given >&2 | ||
22 | exit 1 | ||
23 | fi | ||
16 | 24 | ||
17 | # Prompt for comment and User:Password | 25 | # Prompt for comment and User:Password |
18 | if [[ ! -t 0 ]]; then | 26 | if [[ ! -t 0 ]]; then |
@@ -20,61 +28,98 @@ if [[ ! -t 0 ]]; then | |||
20 | else | 28 | else |
21 | read -e -p 'Type comment: ' -r comment </dev/tty | 29 | read -e -p 'Type comment: ' -r comment </dev/tty |
22 | fi | 30 | fi |
23 | if [ -z ${OSM_USER_PASSWD} ]; then | 31 | if [ -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 |
25 | fi | 33 | fi |
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'/> | ||
27 | create_changeset() { | 38 | create_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> |
43 | EOF | 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 |
47 | uploade_file_to_changeset() { | 73 | uploade_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 | ||
54 | close_changeset() { | 91 | close_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") |
61 | changeset_id=$(create_changeset) | ||
62 | 98 | ||
63 | # Print created changeset id | 99 | if [[ ! "$return_code" == 200 ]]; then |
64 | echo "Changeset created, check ${SERVER}/changeset/${changeset_id}" >/dev/tty | 100 | echo |
65 | echo ${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 |
68 | sed -Ee "/<(node|way|relation)/ s/>/ changeset=\"${changeset_id}\">/" $FILE |\ | 108 | if [ -z CHANGESET ]; then |
69 | uploade_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}" || \ |
71 | else | ||
72 | exit 1 | 111 | exit 1 |
112 | else | ||
113 | changeset_id=$CHANGESET | ||
73 | fi | 114 | fi |
74 | 115 | ||
116 | # Upload OSC file to Changeset | ||
117 | sed -Ee "/<(node|way|relation)/ s/>/ changeset=\"${changeset_id}\">/" $FILE |\ | ||
118 | uploade_file_to_changeset ${changeset_id} && \ | ||
119 | echo Upload file $FILE to changeset ${changeset_id} || \ | ||
120 | exit 1 | ||
121 | |||
75 | # Close Changeset | 122 | # Close Changeset |
76 | close_changeset | if [[ $(cat) == '200' ]]; then | 123 | close_changeset ${changeset_id} && \ |
77 | echo Changeset ${changeset_id} closed >/dev/tty | 124 | echo Changeset ${changeset_id} closed || \ |
78 | else | 125 | exit 1 |
79 | exit 1 | ||
80 | fi | ||