new genpxml.sh from sebt3 with slight modifications
authorNils Kneuper <crazy-ivanovic@gmx.net>
Wed, 9 Mar 2011 23:28:59 +0000 (00:28 +0100)
committerNils Kneuper <crazy-ivanovic@gmx.net>
Wed, 9 Mar 2011 23:28:59 +0000 (00:28 +0100)
this script does not generate pxml files that can be validated with the
schema (yet), but at least it *does* generate some sane stuff...

testdata/scripts/genpxml.sh

index f859bfa..1ccf191 100755 (executable)
 #!/bin/bash
-if [ $1 ]; then cd $1; fi
-for x in $(pwd)/*
-do
-if [ -x $x ] && [ ! -d $x ] && [ ! $(echo $x | cut -d . -f 2 -s) ] ; then exe=$x; break; fi
-done
-BASENAMEnoex=$(basename "$exe" | cut -d'.' -f1)
-BASENAME=$(basename "$exe")
-rnd=$RANDOM;
-loc=$(dirname "$0")
-echo '
-<?xml version="1.0" encoding="UTF-8"?>
-<PXML xmlns="http://openpandora.org/namespaces/PXML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PXML_schema.xsd">
-
-  <application id="'$BASENAME-$rnd'">
-    <exec command="'$BASENAME'"/>
-
-    <title lang="en_US">'$BASENAMEnoex'</title>
-    <title lang="de_DE">'$BASENAMEnoex' - German (lol!)</title><!--optional, only one title tag required-->
-    <author name="'$USERNAME'" website="http://www.openpandora.org"/><!--Optional email and website, name required-->
-    <version major="1" minor="1" release="1" build="2"/><!--This programs version-->
-    <osversion major="1" minor="0" release="0" build="0"/><!--The minimum OS version required, optional-->
-    <description lang="en_US">en_US Automatically generated pxml from'$(pwd)' exe='$BASENAME'</description>
-    <description lang="de_DE">de_DE Automatisch generiertes pxml aus'$(pwd)' exe='$BASENAME'</description>
-    <!-- if you want to provide an icon, uncomment the following line and set correct filename! -->
-    <!-- <icon src="icon.png"/> -->
-    <previewpics>'
-#add all images in the folder as preview pics
-for image in $(file -i -0 * | grep -a image | cut -d" " -f1)
-do
-echo "      <pic src="$image"/>"
-done
-echo '    </previewpics>
-    <!-- if you want to provide a manual, uncomment the following line and set correct values! -->
-    <!-- <info name="'$BASENAMEnoex' manual" type="text/html" src="manual.html"/> -->
+
+help(){
+cat >&2 <<ENDHELP
+$0 [args] :
+-s|--src <src dir>      : Define source directory (default: $SRCDIR)
+-n|--name <name>        : Define the pnd base name (default: $PND_NAME)
+-d|--dest <dest dir>    : Define destination directory (default: $DESTDIR)
+-a|--author <name>      : programmers names (default: $AUTHOR)
+-v|--version <version>  : Define the version (default: $VERSION)
+-w|--website <url>      : Define the url (default: $WEBSITE)
+-b|--build <build id>   : Define the build number (default: $BUILD)
+-f|--force              : overide PXML.xml file if found
+-h|--help               : show this screen
+ENDHELP
+}
+
+DEBUG(){
+       echo $*>&2
+}
+
+buildApplicationList(){
+       #output "<appname> [<desktopfile>]" lines
+       cd $DESTDIR
+       DESTLST=$(find $SRCDIR -name "*desktop";find $DESTDIR -name "*desktop")
+       if [ ! -z "$DESTLST" ];then
+               {
+               for d in $DESTLST;do
+                       EXE=$(awk -F= '/Exec/{print $2}'<$d|awk '{print $1}'|head -1)
+                       if [[ "x$EXE" != "x" ]];then
+                               BIN=$(find . -executable -type f -name $(basename $EXE)|head -1)
+                               echo ${BIN:-$EXE} $d
+                       fi
+               done
+               }|sort|awk 'BEGIN{P=""}$1!=P{print}{P=$1}'
+       else
+               find . -executable -type f \! -name "*sh"
+       fi
+}
+
+getPATH(){
+       cd $DESTDIR
+       L=$(find . -type d -name bin)
+       echo $L|sed "s#\./#$(pwd)/#g;s# #:#g"
+}
+getLIBPATH(){
+       cd $DESTDIR
+       L=$(find . -type d -name lib)
+       echo $L|sed "s#\./#$(pwd)/#g;s# #:#g"
+}
+
+genLaunchScript() {
+       S="$DESTDIR/scripts/$(basename $1).sh"
+       if [ -e $S ];then
+               mv $S ${S}.old
+       fi
+       cat>$S<<ENDSCRIPT
+#!/bin/sh
+export PATH="$(getPATH):\${PATH:-"/usr/bin:/bin:/usr/local/bin"}"
+export LD_LIBRARY_PATH="$(getLIBPATH):\${LD_LIBRARY_PATH:-"/usr/lib:/lib"}"
+export HOME="/mnt/utmp/$PND_NAME" XDG_CONFIG_HOME="/mnt/utmp/$PND_NAME"
+
+if [ -d /mnt/utmp/$PND_NAME/share ];then
+       export XDG_DATA_DIRS=/mnt/utmp/$PND_NAME/share:\$XDG_DATA_DIRS:/usr/share
+fi
+export SDL_AUDIODRIVER="alsa"
+cd \$HOME
+[ -e "\$HOME/scripts/pre_script.sh" ] && . \$HOME/scripts/pre_script.sh
+if [ -e "\$HOME/scripts/post_script.sh" ];then
+       $1 \$*
+       . \$HOME/scripts/post_script.sh
+else
+       exec $1 \$*
+fi
+ENDSCRIPT
+       chmod 755 $S
+}
+
+desktop2application(){ #generate PXML application info out of a desktop file passed as parameter
+       DESK=$1
+       if [ ! -z "$DESK" ];then
+               DVERSION=$(awk -F= '$1=="Version"{print $2}'<$1)
+               if [ -z "$DVERSION" ] || [[ "$DVERSION" = "1.0" ]];then
+                       DVERSION=$VERSION
+               fi
+       else
+               DVERSION=$VERSION
+       fi
+       MAJOR=$(echo $DVERSION|awk -F. '{print $1}')
+       MINOR=$(echo $DVERSION|awk -F. '{print $2}')
+       REL=$(echo $DVERSION|awk -F. '{print $3}')
+       MINOR=${MINOR:-"0"}
+       REL=${REL:-"0"}
+
+       # Exec --------------------------
+       echo "    <exec command=\"scripts/${BASEB}.sh\"/>"
+
+       # title -------------------------
+       if [ ! -z "$DESK" ];then
+               #awk -F= '($1~/^Name/)||$1=="Name"{print $1" "$2}'<$1|while read DN DNV;do
+               awk -F= '($1~/^Name/&&/en_US/)||$1=="Name"{print $1" "$2}'<$1|while read DN DNV;do
+                       l=$(echo $DN|sed 's/Name//;s/\[//;s/\]//')
+                       echo "    <title lang=\"${l:-"en_US"}\">$DNV</title>"
+               done
+       else
+               echo "    <title lang=\"en_US\">$PND_NAME</title>"
+       fi
+       echo
+
+       # Author ------------------------
+       echo "    <author name=\"$AUTHOR\" website=\"$WEBSITE\"/>"
+
+       # Version -----------------------
+       echo "    <version major=\"$MAJOR\" minor=\"$MINOR\" release=\"$REL\" build=\"$BUILD\"/>              <!--This programs version-->"
+
+       # OS Version --------------------
+       echo "    <osversion major=\"1\" minor=\"0\" release=\"0\" build=\"0\"/>                <!--The minimum OS version required-->"
+       echo
+
+       # Description -------------------
+       if [ ! -z "$DESK" ];then
+               #awk -F= '($1~/^Comment/)||$1=="Comment"{print $1" "$2}'<$1|while read DN DNV;do
+               awk -F= '($1~/^Comment/&&/en_US/)||$1=="Comment"{print $1" "$2}'<$1|while read DN DNV;do
+                       l=$(echo $DN|sed 's/Comment//;s/\[//;s/\]//')
+                       echo "    <description lang=\"${l:-"en_US"}\">$DNV</description>"
+               done
+       else
+               echo "    <description lang=\"en_US\">Automatically generated description from $(pwd) for PND=$PND_NAME</description>"
+       fi
+       echo
+
+       # Icon --------------------------
+       ICON=""
+       if [ ! -z "$DESK" ];then
+               ICON=$(awk -F= '$1~/^Icon/{print $2}'<$1)
+       fi
+       if [ ! -z "$ICON" ];then
+               F=$(find $DESTDIR -name ${ICON}.png|head -1)
+               if [ -z "$F" ];then
+                       F=$DESTDIR/icon.png
+               fi
+               echo "    <icon src="'"'$F'"/>'
+               if [ ! -e "$DESTDIR/icon.png" ] && [ ! -z "$(find $DESTDIR -name ${ICON}.png|head -1)" ];then
+                       cp $(find $DESTDIR -name ${ICON}.png|head -1) $DESTDIR/icon.png
+               fi
+       elif [ -e "$DESTDIR/icon.png" ];then
+               echo "    <icon src=\"$DESTDIR/icon.png\"/>"
+       else
+               echo "    <!--<icon src=\"path/to/icon.pnd\"/>-->"
+       fi
+       echo
+
+       # Preview pics ------------------
+       if [ ! -z "$(find $DESTDIR/previews -name "$BASEB*")" ];then
+               echo "    <previewpics>"
+               for i in $(find $DESTDIR/previews -name "$BASEB*");do
+                       echo "      <pic src=\"previews/$(basename $i)\"/>"
+               done
+               echo "    </previewpics>"
+       else
+               cat <<ENDASSO
+<!--
+    <previewpics>
+      <pic src="previews/${BASEB}.png"/>
+    </previewpics>
+-->
+ENDASSO
+       fi
+       echo
+
+       # Documentation -----------------
+       HTML=$(find $DESTDIR -type d -name index.html|head -1)
+       DOC=$DESTDIR/readme.txt
+       if [ ! -z "$HTML" ];then
+               for i in $(find $DESTDIR -type d -name index.html);do
+                       echo "    <info name=\"${BASEB} documentation\" type=\"text/html\" src=\"$i\"/>"
+               done
+       elif [ -e "$DOC" ];then
+               echo "    <info name=\"${BASEB} documentation\" type=\"text/plain\" src=\"$DOC\"/>"
+       else
+               echo "    <!--<info name=\"${BASEB} documentation\" type=\"text/plain\" src=\"$DOC\"/>-->"
+       fi
+
+       # Categories --------------------
+       cat <<ENDCATEGORIES
+
     <categories>
-    <!-- for information about valid categories and explainations of them, please have a look at this website:
-         http://standards.freedesktop.org/menu-spec/menu-spec-latest.html#category-registry
-         entries with invalid category/subcategory combinations will appear under "others" in the menus! -->
-      <category name="Main category">
-      <!--valid values for "Main category": "AudioVideo", "Audio", "Video", "Development", "Education", "Game", "Graphics", "Network", "Office", "Settings", "System", "Utility"-->
-        <subcategory name="Main Subcategory"/>
-        <!--valid Values for "Subcategory": "Building", "Debugger", "IDE", "GUIDesigner", "Profiling", "RevisionControl", "Translation", "Calendar", "ContactManagement", "Database", "Dictionary", "Chart", "Email", "Finance", "FlowChart", "PDA", "ProjectManagement", "Presentation", "Spreadsheet", "WordProcessor", "2DGraphics", "VectorGraphics", "RasterGraphics", "3DGraphics", "Scanning", "OCR", "Photography", "Publishing", "Viewer", "TextTools", "DesktopSettings", "HardwareSettings", "Printing", "PackageManager", "Dialup", "InstantMessaging", "Chat", "IRCClient", "FileTransfer", "HamRadio", "News", "P2P", "RemoteAccess", "Telephony", "TelephonyTools", "VideoConference", "WebBrowser", "WebDevelopment", "Midi", "Mixer", "Sequencer", "Tuner", "TV", "AudioVideoEditing", "Player", "Recorder", "DiscBurning", "ActionGame", "AdventureGame", "ArcadeGame", "BoardGame", "BlocksGame", "CardGame", "KidsGame", "LogicGame", "RolePlaying", "Simulation", "SportsGame", "StrategyGame", "Art", "Construction", "Music", "Languages", "Science", "ArtificialIntelligence", "Astronomy", "Biology", "Chemistry", "ComputerScience", "DataVisualization", "Economy", "Electricity", "Geography", "Geology", "Geoscience", "History", "ImageProcessing", "Literature", "Math", "NumericalAnalysis", "MedicalSoftware", "Physics", "Robotics", "Sports", "ParallelComputing", "Amusement", "Archiving", "Compression", "Electronics", "Emulator", "Engineering", "FileTools", "FileManager", "TerminalEmulator", "Filesystem", "Monitor", "Security", "Accessibility", "Calculator", "Clock", "TextEditor", "Documentation", "Core", "KDE", "GNOME", "GTK", "Qt", "Motif", "Java", "ConsoleOnly"-->
-        <subcategory name="Subcategory 2"/>
+      <!-- http://standards.freedesktop.org/menu-spec/latest/apa.html -->
+ENDCATEGORIES
+
+       if [ ! -z "$DESK" ];then
+               DCAT=$(awk -F= '$1=="Categories"{print $2}'<$1)
+       else
+               DCAT=""
+       fi
+       CATCNT=$(($(echo $DCAT|sed "s/;/ /g"|wc -w) / 2))
+       if [ $CATCNT -gt 0 ];then
+               for i in $(seq 1 $CATCNT);do
+                       DCATMAJ=$(echo $DCAT|awk -F\; "{print \$$(($i*2-1))}")
+                       DCATMIN=$(echo $DCAT|awk -F\; "{print \$$(($i*2))}")
+                       cat <<ENDCATEGORIES
+      <category name="$DCATMAJ">
+       <subcategory name="$DCATMIN"/>
       </category>
-      <category name="Alternative category">
-        <subcategory name="Alternative Subcategory 1"/>
+ENDCATEGORIES
+               done
+       else
+               cat <<ENDCATEGORIES
+      <category name="Game">
+       <subcategory name="ArcadeGame"/>
       </category>
+ENDCATEGORIES
+       fi
+       cat <<ENDCATEGORIES
     </categories>
-    <!-- if you want to set a fixed clockrate differening from the default (500MHz), uncomment the following line and set it to the value you want (in MHz) -->
-    <!-- <clockspeed frequency="600"/> -->
 
+ENDCATEGORIES
+
+       # Associations ------------------
+       cat <<ENDASSO
+<!--
+    <associations>
+      <association name="Deinterlaced Bitmap Image" filetype="image/bmp" exec="-f %s"/>
+      <association name="Style sheet system crasher" filetype="text/css" exec="-f %s"/>
+    </associations>
+-->
+ENDASSO
+
+       # ClockSpeed --------------------
+       echo "    <!--<clockspeed frequency=\"600\"/>-->"
+}
+
+genPxml(){
+       # output the PXML.xml file
+       if [ -e $DESTDIR/PXML.xml ];then
+               mv $DESTDIR/PXML.xml $DESTDIR/PXML.xml.old
+       fi
+       cat >$DESTDIR/PXML.xml <<ENDHEAD
+<?xml version="1.0" encoding="UTF-8"?>
+<PXML xmlns="http://openpandora.org/namespaces/PXML">
+<!-- please see http://pandorawiki.org/PXML_specification for more information before editing, and remember the order does matter -->
+
+ENDHEAD
+       if [ ! -d $DESTDIR/previews ];then
+               mkdir -p $DESTDIR/previews
+       fi
+       if [ ! -d $DESTDIR/scripts ];then
+               mkdir $DESTDIR/scripts
+       fi
+       buildApplicationList|while read BIN DESK;do
+               BASEB=$(basename $BIN)
+               genLaunchScript $BIN
+               cat >>$DESTDIR/PXML.xml <<ENDAPP
+  <application id="$PND_NAME-$(basename $BIN)-$RND" appdata="$PND_NAME">
+ENDAPP
+               desktop2application $DESK >>$DESTDIR/PXML.xml
+               cat >>$DESTDIR/PXML.xml <<ENDINFO
   </application>
 
-</PXML>
-'
+ENDINFO
+       done
+       echo "</PXML>" >>$DESTDIR/PXML.xml
+}
+
+
+#####################
+### Script main :
+##
+
+FORCE=0
+BUILD=1
+AUTHOR=sebt3
+WEBSITE=${WEBSITE:-"http://www..openpandora.org"}
+SRCDIR=${SRCDIR:-$(pwd)}
+PND_NAME=$PRJ
+PND_NAME=${PND_NAME:-$(basename $SRCDIR|awk -F- '{print $1}')}
+VERSION=${VERSION:-$(basename $SRCDIR|awk -F- '{print $2}')}
+DESTDIR=${DESTDIR:-"/mnt/utmp/$PND_NAME"}
+RND=$RANDOM
+# Parse arguments
+while [ $# -gt 0 ];do
+       case $1 in
+       -s|--src)       SRCDIR=$2;shift;;
+       -d|--dest)      DESTDIR=$2;shift;;
+       -b|--build)     BUILD=$2;shift;;
+       -a|--author)    AUTHOR=$2;shift;;
+       -n|--name)      PND_NAME=$2;shift;;
+       -v|--version)   VERSION=$2;shift;;
+       -w|--website)   WEBSITE=$2;shift;;
+       -f|--force)     FORCE=1;;
+       -h|--help)      help;exit 1;;
+       *)            echo "'$1' unknown argument">&2;help;exit 2;;
+       esac
+       shift;
+done
+
+# Validate arguments
+if [ ! -d $SRCDIR ];then
+       echo "$SRCDIR don't exist" >&2
+       help
+       exit 3
+fi
+if [ ! -d $DESTDIR ] && [ $FORCE -eq 0 ];then
+       echo "$DESTDIR don't exist" >&2
+       help
+       exit 4
+elif [ ! -d $DESTDIR ];then
+       mkdir -p $DESTDIR
+       if [ $? -ne 0 ];then
+               echo "$DESTDIR don\'t exist and cannot be created" >&2
+               help
+               exit 5
+       fi
+fi
+if [ $(buildApplicationList|wc -l) -le 0 ];then
+       echo "No applications found">&2
+       help
+       exit 6
+fi
+if [ -e $DESTDIR/PXML.xml ] && [ $FORCE -eq 0 ];then
+       echo "PXML file exist and force disabled." >&2
+       help 
+       exit 7
+fi
+genPxml
+