#!/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'
ejabberd
XMPP Server with MQTT Broker and SIP Service
Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP Server, MQTT Broker, SIP Service)
2002-11-16
BSD
Linux
macOS
Windows
Erlang
C
EOF
}
write_doap_tail()
{
cat >>"$1" <<-'EOF'
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 " " >>$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 " "
echo " "
echo " "
echo " $versions"
echo " $since"
echo " $status"
echo " $note"
echo " "
echo " "
} >>$out
}
[ $# -eq 1 ] && BASE="$1" || BASE="$PWD"
[ -d $BASE/doc ] || mkdir $BASE/doc
temp=tools/ejabberd.temp
final=ejabberd.doap
write_doap_head $final
grep "\-protocol({rfc" $BASE/src/* | sed "s/,//" | awk '{printf("%04d\n", $2)}' | sort -u | while IFS= read -r x_num
do
write_rfcs $x_num $temp
done
echo "" >>$temp
grep "\-protocol({xep" $BASE/src/* | sed "s/,//" | awk '{printf("%04d\n", $2)}' | sort -u | while IFS= read -r x_num
do
write_xeps $x_num $temp
done
cat $temp >>$final
rm $temp
write_doap_tail $final