aboutsummaryrefslogtreecommitdiffhomepage
path: root/bin/osm/osm.api.changeset.commit
blob: d7f57fc0b2c8e65184d66509978bc2b32539fcd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/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 </dev/tty
fi
if [ -z "${OSM_USER_PASSWD}" ]; then
  read -e -p 'Type USER:PASSWD: ' -r OSM_USER_PASSWD </dev/tty
fi

# API call for changeset create
# If env SOURCE is set, add it as part of changeset:
# <tag k='source' v='$SOURCE'/>
create_changeset() {
  SOURCE_TAG="${SOURCE:+$(printf "<tag k='source' v='%s'/>" $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'
    <osm>
      <changeset>
        ${SOURCE_TAG}
        <tag k='comment' v='${comment}'/>
        <tag k='created_by' v='bash script'/>
        <tag k='bot' v='yes'/>
      </changeset>
    </osm>
    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