source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4555

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

Automatic detection of llxsrc packages

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