source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4589

Last change on this file since 4589 was 4589, checked in by Juanma, 4 years ago

updated README

  • Property svn:executable set to *
File size: 11.1 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\nRemember that the icon must be in SVG format and no in PNG or other image format\nOPERATION ABORTED\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. Checking if 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"
24msg_install_not_found="Install file not found in debian dir. Aborting.\n"
25msg_select_workdir="Select the workdir\n"
26msg_debhelper_enabled="package type llxsrc detected. Setting llx-resources as workdir\n"
27msg_rules_old_format="\n********** WARNING!!!! **********\nrules file has an old format.\nIt's HIGHLY recommended to update it to the new rules format.\n *************************** \n"
28msg_select_pkg="\nSelect the name of the package to process\n"
29
30function usage_help
31{
32        printf "Usage:\n"
33        printf "$0 [svn_package_dir1] [svn_package_dir2]\n\n"
34        printf "$msg_need_svn\n\n"
35        exit 1
36}
37
38function analyze_dir
39{
40        printf "Analyzing $1\n"
41        rootDir=$PWD
42        svnDir=`dirname $1`
43        pkgDir=$1
44        srcDir=${1}"/trunk/fuentes"
45        debianDir=${1}"/trunk/fuentes/debian"
46        lliurexArtworkDir=${svnDir}"/vibrancy-colors/trunk/fuentes/vibrancy-lliurex/apps"
47        if [ ! -d $lliurexArtworkDir ] || [ ! -d $vibrancyArtworkDir ]
48        then
49                printf "$msg_icons_dir_error" $lliurexArtworkDir $vibrancyArtworkDir
50        fi
51       
52        cd $debianDir
53        #Set the package name
54        set_appName
55        #Get the install file. If there're many choose one...
56        declare -a installFiles
57        count=0
58        for i in *install
59        do
60                installFiles[$count]=$i
61                let count++
62        done
63        index=0
64        let count--
65        if [[ ${installFiles[0]} = '*install' ]]
66        then
67                printf "$msg_install_not_found"
68                get_workdir
69                debhelper_mode=1
70        else
71                if [ $count -gt 0 ]
72                then
73                        printf "$msg_select_file"
74                        for i in `seq 0 ${count}`
75                        do
76                                printf "${i}) ${installFiles[$i]}\n"
77                        done
78                        printf "Select file [0]: "
79                        read index
80                        [ -z $index ] && index=0
81                        installFile=${installFiles[$index]}
82                else
83                        installFile=${installFiles[0]}
84                fi
85                printf "$msg_selected_file" $installFile
86                process_installFile ${installFile}
87        fi
88}
89
90function set_appName
91{
92        appName=$(basename $pkgDir)
93        declare -a pkgsArray
94        count=0
95        for pkg in `grep "Package:\ .*" control | cut -f2 -d ' '`
96        do
97                pkgsArray[$count]=$pkg
98                let count++
99        done
100        let count--
101        if [ $count -gt 0 ]
102        then
103                printf "$msg_select_pkg"
104                for i in `seq 0 ${count}`
105                do
106                        printf "$i) ${pkgsArray[$i]}\n"
107                done
108                printf "Select pkg name [0]: "
109                read index
110                [ -z $index ] && index=0
111                appName=${pkgsArray[$index]}
112        else
113                installFile=${pkgsArray[0]}
114        fi
115}
116
117function get_workdir
118{
119                cd $rootDir
120                cd $srcDir
121                if [ -d llx-resources ]
122                then
123                        printf "$msg_debhelper_enabled"
124                        installDir="llx-resources"
125                else
126                        printf "$msg_select_workdir"
127                        count=0
128                        declare -a dirArray
129                        for directory in *
130                        do
131                                dirArray[$count]=$directory
132                                let count++
133                        done
134                        printf "Selected Dir [0]: "
135                        read index
136                        installDir=${dirArray[$index]}
137                fi
138                process_pkg $installDir
139}
140
141function process_installFile
142{
143        installFile=$1
144        if [ `wc -l $installFile  | cut -f1 -d ' '` -gt 1 ]
145        then 
146                printf "$msg_select_dir"
147                count=0
148                declare -a fileLines
149                while read -r dirLine
150                do
151                        fileLines[$count]=$dirLine
152                        printf "$count) $dirLine\n"
153                        let count++
154                done < ${installFile}
155                printf "Selected file [0]: "
156                read index
157                installDir=${fileLines[$index]}
158        else 
159                installDir=`head -n1 $installFile`
160        fi
161        [ -z $index ] && index=0
162        installDir=${installDir/\**/}
163        process_pkg $installDir
164}
165
166function process_pkg
167{
168        cd $rootDir"/"$srcDir
169        wrkDir=`realpath $1`
170        printf "Entering $wrkDir\n"
171        if [ -d $wrkDir ]
172        then
173                cd $wrkDir
174        else
175                wrkDir=`dirname $wrkDir`
176                cd $wrkDir
177        fi
178        #Find the desktop file of the application
179        desktopFiles=$(find . -name "*.desktop")
180        printf "$msg_gen_metainfo"
181        for desktopFile in $desktopFiles
182        do
183                cd $rootDir"/"$srcDir
184                printf "Entering $wrkDir\n"
185                cd $wrkDir
186                #If workdir != $1 then it means that the install file has a file and not a dir
187                #In this case we assume that the install is putting the desktop file so metainfoDir becames llx-resources directly
188                if [[ $wrkDir != `realpath $1` ]]
189                then
190                        metainfoDir=${rootDir}"/"${srcDir}"/llx-resources/"${appName}
191                else
192                        metainfoDir=`dirname $desktopFile`
193                        metainfoDir=`dirname $metainfoDir`
194                fi
195                metainfoDir=$metainfoDir"/metainfo"
196                mkdir $metainfoDir -p
197                parse_desktop $metainfoDir $desktopFile
198                iconName=$(grep ^Icon= $desktopFile)
199                iconName=${iconName/*=/}
200                iconName=${iconName/.*/}
201                get_icon $iconName
202        done
203}
204
205function parse_desktop
206{
207        metainfoDir=$1
208        shift
209        for desktopFile in $@
210        do
211                printf "$msg_parsing_desktop" $desktopFile
212                item=`basename $desktopFile`
213                awk -v processFile=$item -v metainfoDir=$metainfoDir -F '=' '
214                BEGIN{
215                        split(processFile,array,".",seps)
216        #               revDomainName="net.lliurex."array[1]
217                        outFile="/tmp/"processFile
218                        printf("") > outFile
219                        xmlFile=metainfoDir"/"array[1]".appdata.xml"
220                        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
221                        print "<component type=\"desktop-application\">" >> xmlFile
222        #               print "<id>"revDomainName"</id>" >> xmlFile
223                        print "<id>"array[1]"</id>" >> xmlFile
224                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
225                        execPrinted=0
226                        commentArrayIndex=1
227                        nameArrayIndex=1
228                }
229                {
230                        if ($1~"^Name")
231                        {
232                                if ($1=="Name")
233                                {
234                                        tagName="<name>"
235                                } else {
236                                        lang=$1
237                                        split(lang,array,"[",seps)
238                                        lang=substr(array[2], 1, length(array[2])-1)
239                                        tagName="<name xml:lang=\""lang"\">"
240                                }
241                                tagName=tagName""$2"</name>"
242                                nameArray[nameArrayIndex]=tagName
243                                nameArrayIndex++;
244                        } else if ($1~"Comment") {
245                                if ($1=="Comment")
246                                {
247                                        tagSum="<summary>"
248                                        tagDes="<p>"
249                                } else {
250                                        lang=$1
251                                        split(lang,array,"[",seps)
252                                        lang=substr(array[2], 1, length(array[2])-1)
253                                        tagSum="<summary xml:lang=\""lang"\">"
254                                        tagDes="<p xml:lang=\""lang"\">"
255                                }
256                                sumario=$2
257                                split(sumario,array,".",seps)
258                                $0=$1"="array[1]
259                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
260                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
261                                commentArrayIndex++
262                        } else if ($1=="Categories") {
263                                split($2,array,";",seps)
264                                for (catIndex in array)
265                                {
266                                        if (array[catIndex]!="")
267                                        {
268                                                if (array[catIndex]~"LliureX-")
269                                                {
270                                                        split(array[catIndex],lliurexCats,"-",seps)
271                                                        for (lliurexCatIndex in lliurexCats)
272                                                        {
273                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
274                                                        }
275                                                        categoryArray[catIndex]=lliurexCat
276                                                } else {
277                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
278                                                }
279                                        }
280                                }
281                        } else  if ($1=="Icon") {
282                                arrayItemNames=split($2,array,"/",seps)
283                                arrayItems=split(array[arrayItemNames],array,".",seps)
284                                iconBaseName=array[1]
285                                $0=$1"="iconBaseName
286        #                       split(iconBaseName,array,".",seps)
287                                tagIcon="<icon type=\"cached\">"iconBaseName"</icon>";
288                        } else if ($1=="Exec") {
289                                if (execPrinted==0)
290                                {
291                                        split($2,array," ",seps)
292                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
293                                        execPrinted=1
294                                }
295                        }
296                        print $0>>outFile
297                }
298                END{
299                        for (nameIndex in nameArray)
300                                print nameArray[nameIndex] >> xmlFile
301                        for (summaryIndex in summaryArray)
302                                print summaryArray[summaryIndex] >> xmlFile;
303                        print "<description>" >> xmlFile
304                        for (descriptionIndex in descriptionArray)
305                                print descriptionArray[descriptionIndex] >> xmlFile;
306                        print "</description>" >> xmlFile
307                        print "<categories>" >> xmlFile
308                        for (categoryIndex in categoryArray)
309                                print categoryArray[categoryIndex] >> xmlFile;
310                        print "</categories>" >> xmlFile
311                        print tagIcon >> xmlFile
312                        print tagExec >> xmlFile
313                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
314                        print "</component>" >> xmlFile
315                }
316                ' $desktopFile
317                printf "$msg_metainfo_generated"
318                cp /tmp/${item} $desktopFile
319                printf "$msg_desktop_updated"
320        done
321}
322
323function get_icon
324{
325        iconName=$1
326        #Check if a svg icon exists
327        workDir=$PWD
328        printf "\nSearching for icon ${iconName}.svg in our package\n"
329        #First we'll check the dir for resources
330        resourcesDir=llx-resources/
331        cd $rootDir
332        cd $srcDir
333        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
334        if [[ ! $iconFile ]]
335        then
336                cd $workDir
337                printf "Entering $workDir\n"
338                iconPath=${srcDir}"/"${installDir}
339                iconFile=$(find . -name "$iconName.svg")
340                if [[ ! $iconFile ]]
341                then
342                        printf "Accesing $lliurexArtworkDir\n"
343                        #Look for the svg in lliurex-theme
344                        cd $rootDir
345                        iconPath=$lliurexArtworkDir
346                        cd $lliurexArtworkDir
347                        iconFile=$(find . -name "${iconName}.svg")
348                fi
349                if [[ $iconFile ]]
350                then
351                        cd $rootDir
352                        printf "$msg_icon_found" $iconFile
353                        cd $srcDir
354                        resourcesDir="llx-resources/"${appName}"/icons/apps/"
355                        mkdir $resourcesDir -p
356                        cd $OLDPWD
357                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
358                        cd $OLDPWD
359                else
360                        printf "$msg_icon_not_found" ${iconName} $lliurexArtworkDir $resourcesDir $installDir
361                        printf "$msg_icon_location_info" ${iconName} $lliurexArtworkDir 
362                        exit 1
363                fi
364        else
365                printf "$msg_icon_exists"
366        fi
367        add_llxsrc_helper
368}
369
370function add_llxsrc_helper
371{
372        cd $rootDir
373        cd $debianDir
374        printf "Adding llxsrc to rules"
375        if [[ ! `grep 'llxsrc' rules` ]]
376        then
377                if [[ `grep 'dh \$@' rules` ]]
378                then
379                        if [[ `grep '\-\-with' rules` ]]
380                        then 
381                                sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
382                        else
383                                sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
384                        fi
385                else
386                        printf "$msg_rules_old_format"
387                        sed -i 's/\tdh_installdeb/\tdh_llxsrcinstall\n\tdh_installdeb/' rules
388                fi
389        fi
390}
391
392
393[[ $@ ]] || usage_help
394
395for parm in $@
396do
397        if [ ! -d $parm ]
398        then
399                printf "\n${parm}: $msg_dir_not_found\n"
400                usage_help
401                exit 1
402        fi
403done
404
405for parm in $@
406do
407        debhelper_mode=0
408        analyze_dir $parm
409done
410
411printf "$msg_work_done"
412
413exit 0
414
Note: See TracBrowser for help on using the repository browser.