source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4617

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

Adds build dep llxsrchelper to control file when not present

  • Property svn:executable set to *
File size: 11.6 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                        } else if ($1~"Comment") {
252                                if ($1=="Comment")
253                                {
254                                        tagSum="<summary>"
255                                        tagDes="<p>"
256                                } else {
257                                        lang=$1
258                                        split(lang,array,"[",seps)
259                                        lang=substr(array[2], 1, length(array[2])-1)
260                                        tagSum="<summary xml:lang=\""lang"\">"
261                                        tagDes="<p xml:lang=\""lang"\">"
262                                }
263                                sumario=$2
264                                split(sumario,array,".",seps)
265                                $0=$1"="array[1]
266                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
267                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
268                                commentArrayIndex++
269                        } else if ($1=="Categories") {
270                                customCat=0
271                                countCat=0
272                                split($2,array,";",seps)
273                                for (catIndex in array)
274                                {
275                                        if (array[catIndex]!="")
276                                        {
277                                                if (array[catIndex]~"-")
278                                                {
279                                                        customCat=1
280                                                        split(array[catIndex],lliurexCats,"-",seps)
281                                                        for (lliurexCatIndex in lliurexCats)
282                                                        {
283                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
284                                                        }
285                                                        categoryArray[catIndex]=lliurexCat
286                                                } else {
287                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
288                                                }
289                                                countCat++
290                                        }
291                                }
292                                if (customCat==1 && countCat==1)
293                                {
294                                        if (substr($0,length($0),1)==";")
295                                                $0=$0"GTK"
296                                        else
297                                                $0=$0;"GTK"
298                                }
299                        } else  if ($1=="Icon") {
300                                arrayItemNames=split($2,array,"/",seps)
301                                arrayItems=split(array[arrayItemNames],array,".",seps)
302                                iconBaseName=array[1]
303                                $0=$1"="iconBaseName
304        #                       split(iconBaseName,array,".",seps)
305                                tagIcon="<icon type=\"stock\">"iconBaseName"</icon>";
306                        } else if ($1=="Exec") {
307                                if (execPrinted==0)
308                                {
309                                        split($2,array," ",seps)
310                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
311                                        execPrinted=1
312                                }
313                        }
314                        print $0>>outFile
315                }
316                END{
317                        for (nameIndex in nameArray)
318                                print nameArray[nameIndex] >> xmlFile
319                        for (summaryIndex in summaryArray)
320                                print summaryArray[summaryIndex] >> xmlFile;
321                        print "<description>" >> xmlFile
322                        for (descriptionIndex in descriptionArray)
323                                print descriptionArray[descriptionIndex] >> xmlFile;
324                        print "</description>" >> xmlFile
325                        print "<categories>" >> xmlFile
326                        for (categoryIndex in categoryArray)
327                                print categoryArray[categoryIndex] >> xmlFile;
328                        print "</categories>" >> xmlFile
329                        print tagIcon >> xmlFile
330                        print tagExec >> xmlFile
331                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
332                        print "</component>" >> xmlFile
333                }
334                ' $desktopFile
335                printf "$msg_metainfo_generated"
336                cp /tmp/${item} $desktopFile
337                printf "$msg_desktop_updated"
338        done
339}
340
341function get_icon
342{
343        iconName=$1
344        #Check if a svg icon exists
345        workDir=$PWD
346        printf "\nSearching for icon ${iconName}.svg in our package\n"
347        #First we'll check the dir for resources
348        resourcesDir=llx-resources/
349        cd $rootDir
350        cd $srcDir
351        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
352        if [[ ! $iconFile ]]
353        then
354                cd $workDir
355                printf "Entering $workDir\n"
356                iconPath=${srcDir}"/"${installDir}
357                iconFile=$(find . -name "$iconName.svg")
358                if [[ ! $iconFile ]]
359                then
360                        printf "Accesing %s" `realpath $lliurexArtworkDir`
361                        #Look for the svg in lliurex-theme
362                        cd $rootDir
363                        iconPath=$lliurexArtworkDir
364                        cd $lliurexArtworkDir
365                        iconFile=$(find . -name "${iconName}.svg")
366                fi
367                if [[ $iconFile ]]
368                then
369                        cd $rootDir
370                        printf "$msg_icon_found" $iconFile
371                        cd $srcDir
372                        resourcesDir="llx-resources/"${appName}"/icons/apps/"
373                        mkdir $resourcesDir -p
374                        cd $OLDPWD
375                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
376                        cd $OLDPWD
377                else
378                        printf "$msg_icon_not_found" ${iconName} $lliurexArtworkDir $resourcesDir $installDir
379                        printf "$msg_icon_location_info" ${iconName} $lliurexArtworkDir 
380                        exit 1
381                fi
382        else
383                printf "$msg_icon_exists"
384        fi
385        add_llxsrc_helper
386}
387
388function add_llxsrc_helper
389{
390        cd $rootDir
391        cd $debianDir
392        printf "Adding llxsrc to rules"
393        if [[ ! `grep 'llxsrc' rules` ]]
394        then
395                if [[ `grep 'dh \$@' rules` ]]
396                then
397                        if [[ `grep '\-\-with' rules` ]]
398                        then 
399                                sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
400                        else
401                                sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
402                        fi
403                else
404                        printf "$msg_rules_old_format"
405                        sed -i 's/\tdh_installdeb/\tdh_llxsrcinstall\n\tdh_installdeb/' rules
406                fi
407        fi
408
409        if [[ ! `grep 'llxsrchelper' control` ]]
410        then
411                sed -i 's/\(Build-Depends:\ \)/\0llxsrchelper,/' control
412        fi
413}
414
415
416[[ $@ ]] || usage_help
417
418for parm in $@
419do
420        if [ ! -d $parm ]
421        then
422                printf "\n${parm}: $msg_dir_not_found\n"
423                usage_help
424                exit 1
425        fi
426done
427
428for parm in $@
429do
430        debhelper_mode=0
431        analyze_dir $parm
432done
433
434printf "$msg_work_done"
435
436exit 0
437
Note: See TracBrowser for help on using the repository browser.