summaryrefslogtreecommitdiff
path: root/carddav-to-alpine
blob: 1f852b9e582e486cde6b9da31e8d379af4bda07a (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
#!/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}