source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4668

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

Added ubuntu screenshots

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