source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4583

Last change on this file since 4583 was 4583, checked in by Juanma, 3 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=$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
179        #Find the desktop file of the application
180        desktopFiles=$(find . -name "*.desktop")
181        printf "$msg_gen_metainfo"
182        for desktopFile in $desktopFiles
183        do
184                cd $rootDir"/"$srcDir
185                printf "Entering $wrkDir\n"
186                cd $wrkDir
187                #If workdir != $1 then it means that the install file has a file and not a dir
188                #In this case we assume that the install is putting the desktop file so metainfoDir becames llx-resources directly
189                if [[ $wrkDir != $1 ]]
190                then
191                        metainfoDir=${rootDir}"/"${srcDir}"/llx-resources/"${appName}
192                else
193                        metainfoDir=`dirname $desktopFile`
194                        metainfoDir=`dirname $metainfoDir`
195                fi
196                metainfoDir=$metainfoDir"/metainfo"
197                mkdir $metainfoDir -p
198                parse_desktop $metainfoDir $desktopFile
199                iconName=$(grep ^Icon= $desktopFile)
200                iconName=${iconName/*=/}
201                iconName=${iconName/.*/}
202                get_icon $iconName
203        done
204}
205
206function parse_desktop
207{
208        metainfoDir=$1
209        shift
210        for desktopFile in $@
211        do
212                printf "$msg_parsing_desktop" $desktopFile
213                item=`basename $desktopFile`
214                awk -v processFile=$item -v metainfoDir=$metainfoDir -F '=' '
215                BEGIN{
216                        split(processFile,array,".",seps)
217        #               revDomainName="net.lliurex."array[1]
218                        outFile="/tmp/"processFile
219                        printf("") > outFile
220                        xmlFile=metainfoDir"/"array[1]".appdata.xml"
221                        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
222                        print "<component type=\"desktop-application\">" >> xmlFile
223        #               print "<id>"revDomainName"</id>" >> xmlFile
224                        print "<id>"array[1]"</id>" >> xmlFile
225                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
226                        execPrinted=0
227                        commentArrayIndex=1
228                        nameArrayIndex=1
229                }
230                {
231                        if ($1~"^Name")
232                        {
233                                if ($1=="Name")
234                                {
235                                        tagName="<name>"
236                                } else {
237                                        lang=$1
238                                        split(lang,array,"[",seps)
239                                        lang=substr(array[2], 1, length(array[2])-1)
240                                        tagName="<name xml:lang=\""lang"\">"
241                                }
242                                tagName=tagName""$2"</name>"
243                                nameArray[nameArrayIndex]=tagName
244                                nameArrayIndex++;
245                        } else if ($1~"Comment") {
246                                if ($1=="Comment")
247                                {
248                                        tagSum="<summary>"
249                                        tagDes="<p>"
250                                } else {
251                                        lang=$1
252                                        split(lang,array,"[",seps)
253                                        lang=substr(array[2], 1, length(array[2])-1)
254                                        tagSum="<summary xml:lang=\""lang"\">"
255                                        tagDes="<p xml:lang=\""lang"\">"
256                                }
257                                sumario=$2
258                                split(sumario,array,".",seps)
259                                $0=$1"="array[1]
260                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
261                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
262                                commentArrayIndex++
263                        } else if ($1=="Categories") {
264                                split($2,array,";",seps)
265                                for (catIndex in array)
266                                {
267                                        if (array[catIndex]!="")
268                                        {
269                                                if (array[catIndex]~"LliureX-")
270                                                {
271                                                        split(array[catIndex],lliurexCats,"-",seps)
272                                                        for (lliurexCatIndex in lliurexCats)
273                                                        {
274                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
275                                                        }
276                                                        categoryArray[catIndex]=lliurexCat
277                                                } else {
278                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
279                                                }
280                                        }
281                                }
282                        } else  if ($1=="Icon") {
283                                arrayItemNames=split($2,array,"/",seps)
284                                arrayItems=split(array[arrayItemNames],array,".",seps)
285                                iconBaseName=array[1]
286                                $0=$1"="iconBaseName
287        #                       split(iconBaseName,array,".",seps)
288                                tagIcon="<icon type=\"cached\">"iconBaseName"</icon>";
289                        } else if ($1=="Exec") {
290                                if (execPrinted==0)
291                                {
292                                        split($2,array," ",seps)
293                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
294                                        execPrinted=1
295                                }
296                        }
297                        print $0>>outFile
298                }
299                END{
300                        for (nameIndex in nameArray)
301                                print nameArray[nameIndex] >> xmlFile
302                        for (summaryIndex in summaryArray)
303                                print summaryArray[summaryIndex] >> xmlFile;
304                        print "<description>" >> xmlFile
305                        for (descriptionIndex in descriptionArray)
306                                print descriptionArray[descriptionIndex] >> xmlFile;
307                        print "</description>" >> xmlFile
308                        print "<categories>" >> xmlFile
309                        for (categoryIndex in categoryArray)
310                                print categoryArray[categoryIndex] >> xmlFile;
311                        print "</categories>" >> xmlFile
312                        print tagIcon >> xmlFile
313                        print tagExec >> xmlFile
314                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
315                        print "</component>" >> xmlFile
316                }
317                ' $desktopFile
318                printf "$msg_metainfo_generated"
319                cp /tmp/${item} $desktopFile
320                printf "$msg_desktop_updated"
321        done
322}
323
324function get_icon
325{
326        iconName=$1
327        #Check if a svg icon exists
328        workDir=$PWD
329        printf "\nSearching for icon ${iconName}.svg in our package\n"
330        #First we'll check the dir for resources
331        resourcesDir=llx-resources/
332        cd $rootDir
333        cd $srcDir
334        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
335        if [[ ! $iconFile ]]
336        then
337                cd $workDir
338                printf "Entering $workDir\n"
339                iconPath=${srcDir}"/"${installDir}
340                iconFile=$(find . -name "$iconName.svg")
341                if [[ ! $iconFile ]]
342                then
343                        printf "Accesing $lliurexArtworkDir\n"
344                        #Look for the svg in lliurex-theme
345                        cd $rootDir
346                        iconPath=$lliurexArtworkDir
347                        cd $lliurexArtworkDir
348                        iconFile=$(find . -name "${iconName}.svg")
349                fi
350                if [[ $iconFile ]]
351                then
352                        cd $rootDir
353                        printf "$msg_icon_found" $iconFile
354                        cd $srcDir
355                        resourcesDir="llx-resources/"${appName}"/icons/apps/"
356                        mkdir $resourcesDir -p
357                        cd $OLDPWD
358                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
359                        cd $OLDPWD
360                else
361                        printf "$msg_icon_not_found" ${iconName} $lliurexArtworkDir $resourcesDir $installDir
362                        printf "$msg_icon_location_info" ${iconName} $lliurexArtworkDir 
363                        exit 1
364                fi
365        else
366                printf "$msg_icon_exists"
367        fi
368        add_llxsrc_helper
369}
370
371function add_llxsrc_helper
372{
373        cd $rootDir
374        cd $debianDir
375        printf "Adding llxsrc to rules"
376        if [[ ! `grep 'llxsrc' rules` ]]
377        then
378                if [[ `grep 'dh \$@' rules` ]]
379                then
380                        if [[ `grep '\-\-with' rules` ]]
381                        then 
382                                sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
383                        else
384                                sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
385                        fi
386                else
387                        printf "$msg_rules_old_format"
388                        sed -i 's/\tdh_installdeb/\tdh_llxsrcinstall\n\tdh_installdeb/' rules
389                fi
390        fi
391}
392
393
394[[ $@ ]] || usage_help
395
396for parm in $@
397do
398        if [ ! -d $parm ]
399        then
400                printf "\n${parm}: $msg_dir_not_found\n"
401                usage_help
402                exit 1
403        fi
404done
405
406for parm in $@
407do
408        debhelper_mode=0
409        analyze_dir $parm
410done
411
412printf "$msg_work_done"
413
414exit 0
415
Note: See TracBrowser for help on using the repository browser.