new genpxml.sh from sebt3 with slight modifications
[pandora-libraries.git] / testdata / scripts / genpxml.sh
1 #!/bin/bash
2
3 help(){
4 cat >&2 <<ENDHELP
5 $0 [args] :
6 -s|--src <src dir>      : Define source directory (default: $SRCDIR)
7 -n|--name <name>        : Define the pnd base name (default: $PND_NAME)
8 -d|--dest <dest dir>    : Define destination directory (default: $DESTDIR)
9 -a|--author <name>      : programmers names (default: $AUTHOR)
10 -v|--version <version>  : Define the version (default: $VERSION)
11 -w|--website <url>      : Define the url (default: $WEBSITE)
12 -b|--build <build id>   : Define the build number (default: $BUILD)
13 -f|--force              : overide PXML.xml file if found
14 -h|--help               : show this screen
15 ENDHELP
16 }
17
18 DEBUG(){
19         echo $*>&2
20 }
21
22 buildApplicationList(){
23         #output "<appname> [<desktopfile>]" lines
24         cd $DESTDIR
25         DESTLST=$(find $SRCDIR -name "*desktop";find $DESTDIR -name "*desktop")
26         if [ ! -z "$DESTLST" ];then
27                 {
28                 for d in $DESTLST;do
29                         EXE=$(awk -F= '/Exec/{print $2}'<$d|awk '{print $1}'|head -1)
30                         if [[ "x$EXE" != "x" ]];then
31                                 BIN=$(find . -executable -type f -name $(basename $EXE)|head -1)
32                                 echo ${BIN:-$EXE} $d
33                         fi
34                 done
35                 }|sort|awk 'BEGIN{P=""}$1!=P{print}{P=$1}'
36         else
37                 find . -executable -type f \! -name "*sh"
38         fi
39 }
40
41 getPATH(){
42         cd $DESTDIR
43         L=$(find . -type d -name bin)
44         echo $L|sed "s#\./#$(pwd)/#g;s# #:#g"
45 }
46 getLIBPATH(){
47         cd $DESTDIR
48         L=$(find . -type d -name lib)
49         echo $L|sed "s#\./#$(pwd)/#g;s# #:#g"
50 }
51
52 genLaunchScript() {
53         S="$DESTDIR/scripts/$(basename $1).sh"
54         if [ -e $S ];then
55                 mv $S ${S}.old
56         fi
57         cat>$S<<ENDSCRIPT
58 #!/bin/sh
59 export PATH="$(getPATH):\${PATH:-"/usr/bin:/bin:/usr/local/bin"}"
60 export LD_LIBRARY_PATH="$(getLIBPATH):\${LD_LIBRARY_PATH:-"/usr/lib:/lib"}"
61 export HOME="/mnt/utmp/$PND_NAME" XDG_CONFIG_HOME="/mnt/utmp/$PND_NAME"
62
63 if [ -d /mnt/utmp/$PND_NAME/share ];then
64         export XDG_DATA_DIRS=/mnt/utmp/$PND_NAME/share:\$XDG_DATA_DIRS:/usr/share
65 fi
66 export SDL_AUDIODRIVER="alsa"
67 cd \$HOME
68 [ -e "\$HOME/scripts/pre_script.sh" ] && . \$HOME/scripts/pre_script.sh
69 if [ -e "\$HOME/scripts/post_script.sh" ];then
70         $1 \$*
71         . \$HOME/scripts/post_script.sh
72 else
73         exec $1 \$*
74 fi
75 ENDSCRIPT
76         chmod 755 $S
77 }
78
79 desktop2application(){ #generate PXML application info out of a desktop file passed as parameter
80         DESK=$1
81         if [ ! -z "$DESK" ];then
82                 DVERSION=$(awk -F= '$1=="Version"{print $2}'<$1)
83                 if [ -z "$DVERSION" ] || [[ "$DVERSION" = "1.0" ]];then
84                         DVERSION=$VERSION
85                 fi
86         else
87                 DVERSION=$VERSION
88         fi
89         MAJOR=$(echo $DVERSION|awk -F. '{print $1}')
90         MINOR=$(echo $DVERSION|awk -F. '{print $2}')
91         REL=$(echo $DVERSION|awk -F. '{print $3}')
92         MINOR=${MINOR:-"0"}
93         REL=${REL:-"0"}
94
95         # Exec --------------------------
96         echo "    <exec command=\"scripts/${BASEB}.sh\"/>"
97
98         # title -------------------------
99         if [ ! -z "$DESK" ];then
100                 #awk -F= '($1~/^Name/)||$1=="Name"{print $1" "$2}'<$1|while read DN DNV;do
101                 awk -F= '($1~/^Name/&&/en_US/)||$1=="Name"{print $1" "$2}'<$1|while read DN DNV;do
102                         l=$(echo $DN|sed 's/Name//;s/\[//;s/\]//')
103                         echo "    <title lang=\"${l:-"en_US"}\">$DNV</title>"
104                 done
105         else
106                 echo "    <title lang=\"en_US\">$PND_NAME</title>"
107         fi
108         echo
109
110         # Author ------------------------
111         echo "    <author name=\"$AUTHOR\" website=\"$WEBSITE\"/>"
112
113         # Version -----------------------
114         echo "    <version major=\"$MAJOR\" minor=\"$MINOR\" release=\"$REL\" build=\"$BUILD\"/>              <!--This programs version-->"
115
116         # OS Version --------------------
117         echo "    <osversion major=\"1\" minor=\"0\" release=\"0\" build=\"0\"/>                <!--The minimum OS version required-->"
118         echo
119
120         # Description -------------------
121         if [ ! -z "$DESK" ];then
122                 #awk -F= '($1~/^Comment/)||$1=="Comment"{print $1" "$2}'<$1|while read DN DNV;do
123                 awk -F= '($1~/^Comment/&&/en_US/)||$1=="Comment"{print $1" "$2}'<$1|while read DN DNV;do
124                         l=$(echo $DN|sed 's/Comment//;s/\[//;s/\]//')
125                         echo "    <description lang=\"${l:-"en_US"}\">$DNV</description>"
126                 done
127         else
128                 echo "    <description lang=\"en_US\">Automatically generated description from $(pwd) for PND=$PND_NAME</description>"
129         fi
130         echo
131
132         # Icon --------------------------
133         ICON=""
134         if [ ! -z "$DESK" ];then
135                 ICON=$(awk -F= '$1~/^Icon/{print $2}'<$1)
136         fi
137         if [ ! -z "$ICON" ];then
138                 F=$(find $DESTDIR -name ${ICON}.png|head -1)
139                 if [ -z "$F" ];then
140                         F=$DESTDIR/icon.png
141                 fi
142                 echo "    <icon src="'"'$F'"/>'
143                 if [ ! -e "$DESTDIR/icon.png" ] && [ ! -z "$(find $DESTDIR -name ${ICON}.png|head -1)" ];then
144                         cp $(find $DESTDIR -name ${ICON}.png|head -1) $DESTDIR/icon.png
145                 fi
146         elif [ -e "$DESTDIR/icon.png" ];then
147                 echo "    <icon src=\"$DESTDIR/icon.png\"/>"
148         else
149                 echo "    <!--<icon src=\"path/to/icon.pnd\"/>-->"
150         fi
151         echo
152
153         # Preview pics ------------------
154         if [ ! -z "$(find $DESTDIR/previews -name "$BASEB*")" ];then
155                 echo "    <previewpics>"
156                 for i in $(find $DESTDIR/previews -name "$BASEB*");do
157                         echo "      <pic src=\"previews/$(basename $i)\"/>"
158                 done
159                 echo "    </previewpics>"
160         else
161                 cat <<ENDASSO
162 <!--
163     <previewpics>
164       <pic src="previews/${BASEB}.png"/>
165     </previewpics>
166 -->
167 ENDASSO
168         fi
169         echo
170
171         # Documentation -----------------
172         HTML=$(find $DESTDIR -type d -name index.html|head -1)
173         DOC=$DESTDIR/readme.txt
174         if [ ! -z "$HTML" ];then
175                 for i in $(find $DESTDIR -type d -name index.html);do
176                         echo "    <info name=\"${BASEB} documentation\" type=\"text/html\" src=\"$i\"/>"
177                 done
178         elif [ -e "$DOC" ];then
179                 echo "    <info name=\"${BASEB} documentation\" type=\"text/plain\" src=\"$DOC\"/>"
180         else
181                 echo "    <!--<info name=\"${BASEB} documentation\" type=\"text/plain\" src=\"$DOC\"/>-->"
182         fi
183
184         # Categories --------------------
185         cat <<ENDCATEGORIES
186
187     <categories>
188       <!-- http://standards.freedesktop.org/menu-spec/latest/apa.html -->
189 ENDCATEGORIES
190
191         if [ ! -z "$DESK" ];then
192                 DCAT=$(awk -F= '$1=="Categories"{print $2}'<$1)
193         else
194                 DCAT=""
195         fi
196         CATCNT=$(($(echo $DCAT|sed "s/;/ /g"|wc -w) / 2))
197         if [ $CATCNT -gt 0 ];then
198                 for i in $(seq 1 $CATCNT);do
199                         DCATMAJ=$(echo $DCAT|awk -F\; "{print \$$(($i*2-1))}")
200                         DCATMIN=$(echo $DCAT|awk -F\; "{print \$$(($i*2))}")
201                         cat <<ENDCATEGORIES
202       <category name="$DCATMAJ">
203         <subcategory name="$DCATMIN"/>
204       </category>
205 ENDCATEGORIES
206                 done
207         else
208                 cat <<ENDCATEGORIES
209       <category name="Game">
210         <subcategory name="ArcadeGame"/>
211       </category>
212 ENDCATEGORIES
213         fi
214         cat <<ENDCATEGORIES
215     </categories>
216
217 ENDCATEGORIES
218
219         # Associations ------------------
220         cat <<ENDASSO
221 <!--
222     <associations>
223       <association name="Deinterlaced Bitmap Image" filetype="image/bmp" exec="-f %s"/>
224       <association name="Style sheet system crasher" filetype="text/css" exec="-f %s"/>
225     </associations>
226 -->
227 ENDASSO
228
229         # ClockSpeed --------------------
230         echo "    <!--<clockspeed frequency=\"600\"/>-->"
231 }
232
233 genPxml(){
234         # output the PXML.xml file
235         if [ -e $DESTDIR/PXML.xml ];then
236                 mv $DESTDIR/PXML.xml $DESTDIR/PXML.xml.old
237         fi
238         cat >$DESTDIR/PXML.xml <<ENDHEAD
239 <?xml version="1.0" encoding="UTF-8"?>
240 <PXML xmlns="http://openpandora.org/namespaces/PXML">
241 <!-- please see http://pandorawiki.org/PXML_specification for more information before editing, and remember the order does matter -->
242
243 ENDHEAD
244         if [ ! -d $DESTDIR/previews ];then
245                 mkdir -p $DESTDIR/previews
246         fi
247         if [ ! -d $DESTDIR/scripts ];then
248                 mkdir $DESTDIR/scripts
249         fi
250         buildApplicationList|while read BIN DESK;do
251                 BASEB=$(basename $BIN)
252                 genLaunchScript $BIN
253                 cat >>$DESTDIR/PXML.xml <<ENDAPP
254   <application id="$PND_NAME-$(basename $BIN)-$RND" appdata="$PND_NAME">
255 ENDAPP
256                 desktop2application $DESK >>$DESTDIR/PXML.xml
257                 cat >>$DESTDIR/PXML.xml <<ENDINFO
258   </application>
259
260 ENDINFO
261         done
262         echo "</PXML>" >>$DESTDIR/PXML.xml
263 }
264
265
266 #####################
267 ### Script main :
268 ##
269
270 FORCE=0
271 BUILD=1
272 AUTHOR=sebt3
273 WEBSITE=${WEBSITE:-"http://www..openpandora.org"}
274 SRCDIR=${SRCDIR:-$(pwd)}
275 PND_NAME=$PRJ
276 PND_NAME=${PND_NAME:-$(basename $SRCDIR|awk -F- '{print $1}')}
277 VERSION=${VERSION:-$(basename $SRCDIR|awk -F- '{print $2}')}
278 DESTDIR=${DESTDIR:-"/mnt/utmp/$PND_NAME"}
279 RND=$RANDOM
280 # Parse arguments
281 while [ $# -gt 0 ];do
282         case $1 in
283         -s|--src)       SRCDIR=$2;shift;;
284         -d|--dest)      DESTDIR=$2;shift;;
285         -b|--build)     BUILD=$2;shift;;
286         -a|--author)    AUTHOR=$2;shift;;
287         -n|--name)      PND_NAME=$2;shift;;
288         -v|--version)   VERSION=$2;shift;;
289         -w|--website)   WEBSITE=$2;shift;;
290         -f|--force)     FORCE=1;;
291         -h|--help)      help;exit 1;;
292         *)            echo "'$1' unknown argument">&2;help;exit 2;;
293         esac
294         shift;
295 done
296
297 # Validate arguments
298 if [ ! -d $SRCDIR ];then
299         echo "$SRCDIR don't exist" >&2
300         help
301         exit 3
302 fi
303 if [ ! -d $DESTDIR ] && [ $FORCE -eq 0 ];then
304         echo "$DESTDIR don't exist" >&2
305         help
306         exit 4
307 elif [ ! -d $DESTDIR ];then
308         mkdir -p $DESTDIR
309         if [ $? -ne 0 ];then
310                 echo "$DESTDIR don\'t exist and cannot be created" >&2
311                 help
312                 exit 5
313         fi
314 fi
315 if [ $(buildApplicationList|wc -l) -le 0 ];then
316         echo "No applications found">&2
317         help
318         exit 6
319 fi
320 if [ -e $DESTDIR/PXML.xml ] && [ $FORCE -eq 0 ];then
321         echo "PXML file exist and force disabled." >&2
322         help 
323         exit 7
324 fi
325 genPxml
326