summaryrefslogtreecommitdiff
path: root/carddav-to-alpine
diff options
context:
space:
mode:
Diffstat (limited to 'carddav-to-alpine')
-rwxr-xr-xcarddav-to-alpine77
1 files changed, 77 insertions, 0 deletions
diff --git a/carddav-to-alpine b/carddav-to-alpine
new file mode 100755
index 0000000..1f852b9
--- /dev/null
+++ b/carddav-to-alpine
@@ -0,0 +1,77 @@
+#!/bin/bash
+
+. "${0%/*}/common"
+
+error=0
+
+keys=(
+ 'UID'
+ 'EMAIL'
+ 'FN'
+ 'NICKNAME'
+ 'FCC'
+ 'COMMENT'
+ 'REV'
+)
+
+touch "${git_dir}"'/uids'
+
+find "${git_dir}" \
+ -name '.git' \
+ -prune \
+ , \
+ -type f \
+ -name '*.vcs' \
+ -printf '%p\n' \
+| while read -r f; do
+ uid="${f##*/}"
+ uid="${uid%.vcs}"
+
+ for key in "${keys[@]}"; do
+ eval 'unset _'"${key}"
+ done
+
+ while read -r key value; do
+ eval '_'"${key}"'="${value}"'
+ done < <(
+ sed -n '
+ s@\t@ @g
+ s@\r$@@
+ /^BEGIN:VCARD$/,/END:VCARD$/ {
+ /^\('"$(printf '%s\\|' "${keys[@]}" | sed 's@\\|$@@')"'\):/ {
+ s@:@ @
+ p
+ }
+ }
+ ' "$f"
+ )
+
+ if [ "${_UID}" != "${uid}" ]; then
+ >&2 printf 'uids differ: "%s" != "%s"\n' "${uid}" "${_UID}"
+ error=1
+ continue
+ fi
+
+ sed -i '
+ /^'"${uid}"' /d
+ ' "${git_dir}"'/uids'
+
+ printf '%s\t' \
+ "${_UID}" \
+ "${_NICKNAME}" \
+ "${_FN}" \
+ "${_EMAIL}" \
+ "${_FCC}" \
+ "${_COMMENT}" \
+ | sed '
+ s@\t@ @
+ s@\t$@\n@
+ ' >>"${git_dir}"'/uids'
+done
+
+sed '
+ s@^\S\+ @@
+' "${git_dir}"'/uids' \
+>"${git_dir}"'/addressbook'
+
+exit ${error}