source: debtools/desktop_to_xml/desktop_to_xml.sh @ 4549

Last change on this file since 4549 was 4549, checked in by Juanma, 3 years ago

Added desktop_to_xml tool

  • Property svn:executable set to *
File size: 8.9 KB
Line 
1#!/bin/bash
2#Script that generates xml info file from a desktop file
3#Usage:
4#Download lliurex-artwork-default from svn
5#Download the sources of the package(s)
6#Execute this script adding the dirs of sources to analyze as parameters
7#Profit
8
9msg_need_svn="In order to add the right icons you need to download lliurex-artwork-default from svn to the same dir as the source packages"
10msg_dir_not_found="dir not found"
11msg_icons_dir_error="Can't access %s or %s.\nSome icons may be missing.\n"
12msg_select_file="Select one install file:\n"
13msg_selected_file="\nSelected file: %s\n\n"
14msg_select_dir="\nSelect the dir containing the desktop file:\n"
15msg_gen_metainfo="Generating metainfo data path\n"
16msg_parsing_desktop="Parsing %s\n"
17msg_metainfo_generated="\nMetainfo file generated.\n"
18msg_desktop_updated="\nDesktop file updated.\n"
19msg_icon_found="Icon %s found.\nGenerating llx-resources dir\n"
20msg_icon_not_found="\nNo icon named %s found on dirs %s, %s or %s\n"
21msg_icon_location_info="\nPlease add %s as svg to %s and relaunch this program or  use the llxsrc debhelper. Until then the app will not be included in our software store.\n"
22msg_icon_exists="\nIcon package found on the right location. Assuming llxsrc helper exists in rules\n"
23msg_work_done="\n----------\n\nWork done. If the process has no errors please check that the appfile.xml is right and that the rules file has the llxsrc helper. Also check that the icon is present in llx-resources.\nIn other case correct the errors and relaunch the script.\n\nRemember that the generated appfile.xml isn't a full one and is missing some fields like the screenshots. Take a cup of coffee and fulfill the empty fields following the specs at https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Application.html\n\n"
24
25function usage_help
26{
27        printf "Usage:\n"
28        printf "$0 [svn_package_dir1] [svn_package_dir2]\n\n"
29        printf "$msg_need_svn\n\n"
30        exit 1
31}
32
33function analyze_dir
34{
35        printf "Analyzing $1\n"
36        rootDir=$PWD
37        svnDir=`dirname $1`
38        pkgDir=$1
39        srcDir=${1}"/trunk/fuentes"
40        debianDir=${1}"/trunk/fuentes/debian"
41
42        lliurexArtworkDir=${svnDir}"/vibrancy-colors/trunk/fuentes/vibrancy-lliurex/apps"
43#vibrancyArtworkDir=${svnDir}"/vibrancy-colors/trunk/fuentes/vibrancy-colors/Vibrancy-Dark-Orange/apps/scalable"
44        if [ ! -d $lliurexArtworkDir ] || [ ! -d $vibrancyArtworkDir ]
45        then
46                printf "$msg_icons_dir_error" $lliurexArtworkDir $vibrancyArtworkDir
47        fi
48       
49        #Get the install file. If there're many choose one...
50        cd $debianDir
51        declare -a installFiles
52        count=0
53        for i in *install
54        do
55                installFiles[$count]=$i
56                let count++
57        done
58        index=0
59        let count--
60        if [ $count -gt 0 ]
61        then
62                printf "$msg_select_file"
63                for i in `seq 0 ${count}`
64                do
65                        printf "${i}) ${installFiles[$i]}\n"
66                done
67                printf "Select file [0]: "
68                read index
69        fi
70        [ -z $index ] && index=0
71        installFile=${installFiles[$index]}
72        printf "$msg_selected_file" $installFile
73        process_metainfo ${installFile}
74}
75
76function process_metainfo
77{
78        installFile=$1
79        if [ `wc -l $installFile  | cut -f1 -d ' '` -gt 1 ]
80        then 
81                printf "$msg_select_dir"
82                count=0
83                declare -a fileLines
84                while read -r dirLine
85                do
86                        fileLines[$count]=$dirLine
87                        printf "$count) $dirLine\n"
88                        let count++
89                done < ${installFile}
90                printf "Selected file [0]: "
91                read index
92                installDir=${fileLines[$index]}
93        else 
94                installDir=`head -n1 $installFile`
95        fi
96        [ -z $index ] && index=0
97        installDir=${installDir/\**/}
98        process_pkg $installDir
99}
100
101function process_pkg
102{
103        cd $rootDir"/"$srcDir
104        printf "Entering $1\n"
105        cd $1
106        #Find the desktop file of the application
107        desktopFiles=$(find . -name "*.desktop")
108        printf "$msg_gen_metainfo"
109        for desktopFile in $desktopFiles
110        do
111                cd $rootDir"/"$srcDir
112                printf "Entering $1\n"
113                cd $1
114                metainfoDir=`dirname $desktopFile`
115                metainfoDir=`dirname $metainfoDir`"/metainfo"
116                mkdir $metainfoDir -p
117                parse_desktop $metainfoDir $desktopFile
118                iconName=$(grep ^Icon= $desktopFile)
119                iconName=${iconName/*=/}
120                iconName=${iconName/.*/}
121                get_icon $iconName
122        done
123}
124
125function parse_desktop
126{
127        metainfoDir=$1
128        shift
129        for desktopFile in $@
130        do
131                printf "$msg_parsing_desktop" $desktopFile
132                item=`basename $desktopFile`
133                awk -v processFile=$item -v metainfoDir=$metainfoDir -F '=' '
134                BEGIN{
135                        split(processFile,array,".",seps)
136        #               revDomainName="net.lliurex."array[1]
137                        outFile="/tmp/"processFile
138                        printf("") > outFile
139                        xmlFile=metainfoDir"/"array[1]".appdata.xml"
140                        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
141                        print "<component type=\"desktop-application\">" >> xmlFile
142        #               print "<id>"revDomainName"</id>" >> xmlFile
143                        print "<id>"array[1]"</id>" >> xmlFile
144                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
145                        execPrinted=0
146                        commentArrayIndex=1
147                        nameArrayIndex=1
148                }
149                {
150                        if ($1~"^Name")
151                        {
152                                if ($1=="Name")
153                                {
154                                        tagName="<name>"
155                                } else {
156                                        lang=$1
157                                        split(lang,array,"[",seps)
158                                        lang=substr(array[2], 1, length(array[2])-1)
159                                        tagName="<name xml:lang=\""lang"\">"
160                                }
161                                tagName=tagName""$2"</name>"
162                                nameArray[nameArrayIndex]=tagName
163                                nameArrayIndex++;
164                        } else if ($1~"Comment") {
165                                if ($1=="Comment")
166                                {
167                                        tagSum="<summary>"
168                                        tagDes="<p>"
169                                } else {
170                                        lang=$1
171                                        split(lang,array,"[",seps)
172                                        lang=substr(array[2], 1, length(array[2])-1)
173                                        tagSum="<summary xml:lang=\""lang"\">"
174                                        tagDes="<p xml:lang=\""lang"\">"
175                                }
176                                sumario=$2
177                                split(sumario,array,".",seps)
178                                $0=$1"="array[1]
179                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
180                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
181                                commentArrayIndex++
182                        } else if ($1=="Categories") {
183                                split($2,array,";",seps)
184                                for (catIndex in array)
185                                {
186                                        if (array[catIndex]!="")
187                                        {
188                                                if (array[catIndex]~"LliureX-")
189                                                {
190                                                        split(array[catIndex],lliurexCats,"-",seps)
191                                                        for (lliurexCatIndex in lliurexCats)
192                                                        {
193                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
194                                                        }
195                                                        categoryArray[catIndex]=lliurexCat
196                                                } else {
197                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
198                                                }
199                                        }
200                                }
201                        } else  if ($1=="Icon") {
202                                arrayItemNames=split($2,array,"/",seps)
203                                arrayItems=split(array[arrayItemNames],array,".",seps)
204                                iconBaseName=array[1]
205                                $0=$1"="iconBaseName
206        #                       split(iconBaseName,array,".",seps)
207                                tagIcon="<icon type=\"cached\">"iconBaseName"</icon>";
208                        } else if ($1=="Exec") {
209                                if (execPrinted==0)
210                                {
211                                        split($2,array," ",seps)
212                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
213                                        execPrinted=1
214                                }
215                        }
216                        print $0>>outFile
217                }
218                END{
219                        for (nameIndex in nameArray)
220                                print nameArray[nameIndex] >> xmlFile
221                        for (summaryIndex in summaryArray)
222                                print summaryArray[summaryIndex] >> xmlFile;
223                        print "<description>" >> xmlFile
224                        for (descriptionIndex in descriptionArray)
225                                print descriptionArray[descriptionIndex] >> xmlFile;
226                        print "</description>" >> xmlFile
227                        print "<categories>" >> xmlFile
228                        for (categoryIndex in categoryArray)
229                                print categoryArray[categoryIndex] >> xmlFile;
230                        print "</categories>" >> xmlFile
231                        print tagIcon >> xmlFile
232                        print tagExec >> xmlFile
233                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
234                        print "</component>" >> xmlFile
235                }
236                ' $desktopFile
237                printf "$msg_metainfo_generated"
238                cp /tmp/${item} $desktopFile
239                printf "$msg_desktop_updated"
240        done
241}
242
243function get_icon
244{
245        iconName=$1
246        #Check if a svg icon exists
247        workDir=$PWD
248        printf "\nSearching for icon ${iconName}.svg in our package\n"
249        #First we'll check the dir for resources
250        resourcesDir=llx-resources/
251        cd $rootDir
252        cd $srcDir
253        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
254        if [[ ! $iconFile ]]
255        then
256                cd $workDir
257                printf "Entering $workDir\n"
258                iconPath=${srcDir}"/"${installDir}
259                iconFile=$(find . -name "$iconName.svg")
260                if [[ ! $iconFile ]]
261                then
262                        printf "Accesing $lliurexArtworkDir\n"
263                        #Look for the svg in lliurex-theme
264                        cd $rootDir
265                        iconPath=$lliurexArtworkDir
266                        cd $lliurexArtworkDir
267                        iconFile=$(find . -name "${iconName}.svg")
268                fi
269                if [[ $iconFile ]]
270                then
271                        cd $rootDir
272                        printf "$msg_icon_found" $iconFile
273                        cd $srcDir
274                        appName=$(basename $pkgDir)
275                        resourcesDir="llx-resources/"${appName}"/icons/"
276                        mkdir $resourcesDir -p
277                        cd $OLDPWD
278                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
279                        cd $OLDPWD
280                        add_llxsrc_helper
281                else
282                        printf "$msg_icon_not_found" ${iconName} $lliurexArtworkDir $resourcesDir $installDir
283                        printf "$msg_icon_location_info" ${iconName} $lliurexArtworkDir 
284                fi
285        else
286                printf "$msg_icon_exists"
287        fi
288}
289
290function add_llxsrc_helper
291{
292        cd $rootDir
293        cd $debianDir
294        printf "Adding llxsrc to rules"
295        if [[ ! `grep 'llxsrc' rules` ]]
296        then
297                if [[ `grep '\-\-with' rules` ]]
298                then 
299                        sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
300                else
301                        sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
302                fi
303        fi
304}
305
306
307[[ $@ ]] || usage_help
308
309for parm in $@
310do
311        if [ ! -d $parm ]
312        then
313                printf "\n${parm}: $msg_dir_not_found\n"
314                usage_help
315                exit 1
316        fi
317done
318
319for parm in $@
320do
321        analyze_dir $parm
322done
323
324printf "$msg_work_done"
325
326exit 0
327
Note: See TracBrowser for help on using the repository browser.