todo-server/testdata/migrate.sh

111 lines
2.7 KiB
Bash

#! /bin/bash
function main() {
set -e
set -u
local from_addr="$1"
local to_addr="$2"
log migrating $from_addr to $to_addr
for list in $(get_lists "$from_addr"); do
migrate_tasks "$from_addr" "$to_addr" "$list"
done
}
function log() {
echo "> $@" >&2
}
function CURL() {
curl "$@" 2> /dev/null
}
function get_lists() {
local addr="$1"
CURL "$addr/ajax.php?loadLists" \
| jq -r .list[].id
}
function migrate_tasks() {
local from_addr="$1"
local to_addr="$2"
local from_list="$3"
local to_list=$(lookup_list "$from_addr" "$from_list" "$to_addr")
local has_tasks="$(list_tasks "$to_addr" "$to_list" | base64 --decode | jq .title)"
for task in $(list_tasks "$from_addr" "$from_list"); do
add_task "$to_addr" "$to_list" "$task" "$has_tasks"
done
}
function lookup_list() {
local from_addr="$1"
local from_list="$2"
local to_addr="$3"
local name=$(CURL "$from_addr/ajax.php?loadLists" \
| jq -c .list[] \
| grep "\"$from_list\"" \
| jq -r .name)
if ! CURL "$to_addr/ajax.php?loadLists" \
| jq -c .list[] \
| grep "\"$name\"" \
| jq -r .id \
| grep .; then
CURL \
-X POST \
"$to_addr/ajax.php?addList" \
--data-urlencode "name=$name" \
| jq -r .list[0].id
fi
}
function list_tasks() {
local addr="$1"
local list="$2"
CURL "$addr/ajax.php?loadTasks&list=$list&compl=1" \
| jq -c .list[] | while read -r task; do
printf "%s }\n" "${task%\}}" | base64 | tr -d ' ' | tr -d '\n'
echo ""
done
}
function add_task() {
local addr="$1"
local list="$2"
local task="$(echo -n "$3" | base64 --decode | jq "del(.id, .listId)")"
local has_tasks="$4"
local title="$(echo "$task" | jq -r .title)"
local tags="$(echo "$task" | jq -r .tags)"
if echo "$has_tasks" | grep "\"$title\"" > /dev/null; then
return
fi
log migrating title=$title
local id="$(CURL \
-X POST \
"$addr/ajax.php?newTask" \
--data-urlencode "list=$list" \
--data-urlencode "title=$title /$tags/" \
2> /dev/null \
| jq -r .list[0].id
)"
if echo "$task" | jq -r .compl | grep 1 > /dev/null; then
CURL \
-X POST \
"$addr/ajax.php?completeTask=$id" \
-d "id=$id" \
-d "compl=1" \
> /dev/null
fi
if echo "$task" | jq -r .noteText | grep . > /dev/null; then
local text="$(printf "$task" | jq -r .noteText)"
CURL \
-X POST \
"$addr/ajax.php?editNote=$id" \
-d "id=$id" \
--data-urlencode "note=$text" \
> /dev/null
fi
}
if [ "$0" == "$BASH_SOURCE" ]; then
time main "$@"
fi