source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4630

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

Generates preliminary keywords

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