summaryrefslogtreecommitdiff
path: root/tools/generate-doap.sh
blob: d6706396aeb69c15c39e3cb5fedda5d2a8d9fb65 (plain) (blame)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash

# Erlang modules in ejabberd use a custom module attribute [1]
# named -protocol to define what XEPs and RFCs that module implements.
# General protocols are defined in ejabberd.erl
#
# The supported syntax is:
#   -protocol({rfc, RFC-NUMBER}).
#   -protocol({xep, XEP-NUMBER, XEP-VERSION}).
#   -protocol({xep, XEP-NUMBER, XEP-VERSION, EJABBERD-VERSION, STATUS, COMMENTS}).
# Where
#   RFC-NUMBER, XEP-NUMBER :: integer()
#   XEP-VERSION, EJABBERD-VERSION :: atom()
#   STATUS, COMMENTS :: string()
# For example:
#   -protocol({rfc, 5766}).
#   -protocol({xep, 111, '0.2'}).
#   -protocol({xep, 222, '1.2.0', '17.09', "", ""}).
#   -protocol({xep, 333, '1.11.2', '21.09', "complete", ""}).
#   -protocol({xep, 333, '0.2.0', '21.09', "partial", "Only client X is supported"}).
#
# [1] https://www.erlang.org/doc/reference_manual/modules.html#module-attributes

write_doap_head()
{
    cat >"$1" <<-'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns="http://usefulinc.com/ns/doap#"
         xmlns:xmpp="https://linkmauve.fr/ns/xmpp-doap#"
         xmlns:schema="https://schema.org/">
  <Project>
    <name>ejabberd</name>
    <shortdesc>XMPP Server with MQTT Broker and SIP Service</shortdesc>
    <description>Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP Server, MQTT Broker, SIP Service)</description>
    <created>2002-11-16</created>
    <os>BSD</os>
    <os>Linux</os>
    <os>macOS</os>
    <os>Windows</os>
    <programming-langauge>Erlang</programming-langauge>
    <programming-langauge>C</programming-langauge>
    <category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-jabber"/>
    <category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-server"/>
    <category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-xmpp"/>

    <homepage rdf:resource="https://www.ejabberd.im"/>
    <download-page rdf:resource="https://www.process-one.net/en/ejabberd/downloads/"/>
    <download-mirror rdf:resource="https://github.com/processone/ejabberd/tags"/>
    <license rdf:resource="https://raw.githubusercontent.com/processone/ejabberd/master/COPYING"/>
    <schema:logo rdf:resource="https://docs.ejabberd.im/static/shared/images/footer_logo_e@2x.png"/>
    <bug-database rdf:resource="https://github.com/processone/ejabberd/issues"/>
    <support-forum rdf:resource="xmpp:ejabberd@conference.process-one.net?join"/>
    <repository>
      <GitRepository>
        <location rdf:resource="https://github.com/processone/ejabberd.git"/>
        <browse rdf:resource="https://github.com/processone/ejabberd"/>
      </GitRepository>
    </repository>

EOF
}

write_doap_tail()
{
    cat >>"$1" <<-'EOF'
  </Project>
</rdf:RDF>
EOF
}

write_rfcs()
{
    rfc=rfc$1
    out=$2
    int=$(echo $1 | sed 's/^0*//')

    imp=$(grep "\-protocol({rfc, $int," $BASE/src/* | sed "s/.*src\/\(.*\).erl.*'\([0-9.-]*\)'.*/\1 \2/")
    [ "$imp" == "" ] && imp="NA 0.0"

    echo "    <implements rdf:resource=\"https://www.rfc-editor.org/info/$rfc\"/>" >>$out
}

write_xeps()
{
    xep=xep-$1
    out=$2
    comments2=""
    int=$(echo $1 | sed 's/^0*//')
    imp=$(grep "\-protocol({xep, $int," $BASE/src/* | sed "s/.*src\/\(.*\).erl.*'\([0-9.-]*\)'.*/\1 \2/")
    [ "$imp" == "" ] && imp="NA 0.0"

    sourcefiles=$(grep "\-protocol({xep, $int," $BASE/src/* | sed "s/.*src\/\(.*\).erl.*'\([0-9.-]*\)'.*/\1/" | tr '\012' ',' | sed 's|,$||' | sed 's|,|, |g' | sed 's|^ejabberd$||')

    versionsold=$(grep "\-protocol({xep, $int, .*'})\." $BASE/src/* | sed "s/.*'\([0-9.-]*\)'.*/\1/" | head -1)
    versionsnew=$(grep "\-protocol({xep, $int, .*\"})\." $BASE/src/* | sed "s/.*'\([0-9.-]*\)', '.*/\1/" | head -1)
    versions="$versionsold$versionsnew"

    since=$(grep "\-protocol({xep, $int, .*\"})\." $BASE/src/* | sed "s/.*', '\([0-9.-]*\)',.*/\1/" | head -1)
    status=$(grep "\-protocol({xep, $int, .*\"})\." $BASE/src/* | sed "s/.*', \"\([a-z]*\)\", \".*/\1/" | head -1)

    comments=$(grep "\-protocol({xep, $int, .*\"})\." $BASE/src/* | sed "s/.*\", \"\(.*\)\"}.*/\1/" | head -1)
    [ -n "$comments" ] && comments2=", $comments"
    note="$sourcefiles$comments2"

    echo "    <implements>" >>$out
    echo "      <xmpp:SupportedXep>" >>$out
    echo "        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/$xep.html\"/>" >>$out
    echo "        <xmpp:version>$versions</xmpp:version>" >>$out
    echo "        <xmpp:since>$since</xmpp:since>" >>$out
    echo "        <xmpp:status>$status</xmpp:status>" >>$out
    echo "        <xmpp:note>$note</xmpp:note>" >>$out
    echo "      </xmpp:SupportedXep>" >>$out
    echo "    </implements>" >>$out
}

[ $# -eq 1 ] && BASE="$1" || BASE="$PWD"
[ -d $BASE/doc ] || mkdir $BASE/doc
temp=tools/ejabberd.temp
final=ejabberd.doap

write_doap_head $final

for x_num in $(grep "\-protocol({rfc" $BASE/src/* | sed "s/,//" | awk '{printf("%04d\n", $2)}' | sort -u)
do
    write_rfcs $x_num $temp
done
echo "" >>$temp

for x_num in $(grep "\-protocol({xep" $BASE/src/* | sed "s/,//" | awk '{printf("%04d\n", $2)}' | sort -u)
do
    write_xeps $x_num $temp
done

cat $temp >>$final
rm $temp

write_doap_tail $final