source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4678

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

Discards screenshots when debian or ubuntu return no-found-screenshot

  • Property svn:executable set to *
File size: 14.0 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 2>/dev/null`
173        if [ $? -ne 0 ]
174        then
175                #Dir doesn't seems to exists. Find tie desktop on $svnDir and ask about the action
176                wrkDir='.'
177                installDir='.'
178        fi
179        printf "Entering %s\n" $wrkDir
180        if [ -d $wrkDir ]
181        then
182                cd $wrkDir
183        else
184                wrkDir=`dirname $wrkDir`
185                cd $wrkDir
186        fi
187        #Find the desktop file of the application
188        desktopFiles=$(find . -name "*.desktop")
189        if [[ ! $desktopFiles ]]
190        then
191                printf "$msg_desktop_not_found" $wrkDir
192                exit 1
193        fi
194        for desktopFile in $desktopFiles
195        do
196                cd $rootDir"/"$srcDir
197                printf "Entering $wrkDir\n"
198                cd $wrkDir
199                #If workdir != $1 then it means that the install file has a file and not a dir
200                #In this case we assume that the install is putting the desktop file so metainfoDir becames llx-resources directly
201                if [[ $wrkDir != `realpath $1` ]]
202                then
203                        metainfoDir=${rootDir}"/"${srcDir}"/llx-resources/"${appName}
204                else
205                        metainfoDir=`dirname $desktopFile`
206                        metainfoDir=`dirname $metainfoDir`
207                fi
208                metainfoDir=$metainfoDir"/metainfo"
209                printf "$msg_gen_metainfo" $metainfoDir
210                mkdir $metainfoDir -p
211                parse_desktop $metainfoDir $desktopFile
212                iconName=$(grep ^Icon= $desktopFile)
213                iconName=${iconName/*=/}
214                iconName=${iconName/.*/}
215                get_icon $iconName
216        done
217}
218
219function parse_desktop
220{
221        metainfoDir=$1
222        shift
223        for desktopFile in $@
224        do
225                printf "$msg_parsing_desktop" $desktopFile
226                item=`basename $desktopFile`
227                get_screenshot $item
228                awk -v processFile=$item -v metainfoDir=$metainfoDir -v screenshot=$imageFound -F '=' '
229                BEGIN{
230                        split(processFile,array,".",seps)
231        #               revDomainName="net.lliurex."array[1]
232                        outFile="/tmp/"processFile
233                        printf("") > outFile
234                        xmlFile=metainfoDir"/"array[1]".appdata.xml"
235                        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
236                        print "<component type=\"desktop-application\">" >> xmlFile
237        #               print "<id>"revDomainName"</id>" >> xmlFile
238                        print "<id>"array[1]"</id>" >> xmlFile
239                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
240                        execPrinted=0
241                        commentArrayIndex=1
242                        nameArrayIndex=1
243                }
244                {
245                        if ($1~"^Name")
246                        {
247                                if ($1=="Name")
248                                {
249                                        tagName="<name>"
250                                } else {
251                                        lang=$1
252                                        split(lang,array,"[",seps)
253                                        lang=substr(array[2], 1, length(array[2])-1)
254                                        tagName="<name xml:lang=\""lang"\">"
255                                }
256                                tagName=tagName""$2"</name>"
257                                nameArray[nameArrayIndex]=tagName
258                                nameArrayIndex++;
259                                split($2,array," ",seps)
260                                for (nameIndex in array)
261                                {
262                                        if (length(array[nameIndex])>=3)
263                                        {
264                                                if (tagKeywords!~">"array[nameIndex]"<")
265                                                        tagKeywords=tagKeywords"<keyword>"array[nameIndex]"</keyword>\n";
266                                        }
267                                }
268                        } else if ($1~"Comment") {
269                                if ($1=="Comment")
270                                {
271                                        tagSum="<summary>"
272                                        tagDes="<p>"
273                                } else {
274                                        lang=$1
275                                        split(lang,array,"[",seps)
276                                        lang=substr(array[2], 1, length(array[2])-1)
277                                        tagSum="<summary xml:lang=\""lang"\">"
278                                        tagDes="<p xml:lang=\""lang"\">"
279                                }
280                                sumario=$2
281                                split(sumario,array,".",seps)
282                                $0=$1"="array[1]
283                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
284                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
285                                commentArrayIndex++
286                        } else if ($1=="Categories") {
287                                customCat=0
288                                countCat=0
289                                split($2,array,";",seps)
290                                for (catIndex in array)
291                                {
292                                        if (array[catIndex]!="")
293                                        {
294                                                if (array[catIndex]~"-")
295                                                {
296                                                        customCat=1
297                                                        split(array[catIndex],lliurexCats,"-",seps)
298                                                        for (lliurexCatIndex in lliurexCats)
299                                                        {
300                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
301                                                        }
302                                                        categoryArray[catIndex]=lliurexCat
303                                                } else {
304                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
305                                                }
306                                                countCat++
307                                        }
308                                }
309                                if (customCat==1 && countCat==1)
310                                {
311                                        if (substr($0,length($0),1)==";")
312                                                $0=$0"GTK"
313                                        else
314                                                $0=$0;"GTK"
315                                }
316                        } else  if ($1=="Icon") {
317                                arrayItemNames=split($2,array,"/",seps)
318                                arrayItems=split(array[arrayItemNames],array,".",seps)
319                                iconBaseName=array[1]
320                                $0=$1"="iconBaseName
321        #                       split(iconBaseName,array,".",seps)
322                                tagIcon="<icon type=\"stock\">"iconBaseName"</icon>";
323                        } else if ($1=="Exec") {
324                                if (execPrinted==0)
325                                {
326                                        split($2,array," ",seps)
327                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
328                                        execPrinted=1
329                                }
330                        }
331                        print $0>>outFile
332                }
333                END{
334                        for (nameIndex in nameArray)
335                                print nameArray[nameIndex] >> xmlFile
336                        for (summaryIndex in summaryArray)
337                                print summaryArray[summaryIndex] >> xmlFile;
338                        print "<description>" >> xmlFile
339                        for (descriptionIndex in descriptionArray)
340                                print descriptionArray[descriptionIndex] >> xmlFile;
341                        print "</description>" >> xmlFile
342                        print "<categories>" >> xmlFile
343                        for (categoryIndex in categoryArray)
344                                print categoryArray[categoryIndex] >> xmlFile;
345                        print "</categories>" >> xmlFile
346                        print tagIcon >> xmlFile
347                        print tagExec >> xmlFile
348                        print "<keywords>" >> xmlFile
349                        print tagKeywords >> xmlFile
350                        print "</keywords>" >> xmlFile
351                        if ( screenshot != 0 )
352                        {
353                                print "<screenshots>" >> xmlFile
354                                print "<screenshot type=\"default\">" >> xmlFile
355                                print "<caption>Main window.</caption>" >> xmlFile
356                                print "<image type=\"source\" width=\"800\" height=\"450\">"screenshot"</image>" >> xmlFile
357                                print "</screenshot>" >> xmlFile
358                                print "</screenshots>" >> xmlFile
359                        }
360                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
361                        print "</component>" >> xmlFile
362                }
363                ' $desktopFile
364                printf "$msg_metainfo_generated"
365                cp /tmp/${item} $desktopFile
366                printf "$msg_desktop_updated"
367        done
368}
369
370function get_screenshot
371{
372        printf "$msg_searching_img" "debian"
373        imageFound=0
374        pkgName=${1/.desktop/}
375        url="https://screenshots.debian.net/packages?page=1&search=${pkgName}&utf8=✓"
376        get_screenshot_from $url $pkgName
377        if [[ $imageFound == 0 ]]
378        then
379                printf "$msg_searching_img" "ubuntu"
380                url="http://screenshots.ubuntu.com/packages?page=1&search=${pkgName}&utf8=✓"
381                get_screenshot_from $url $pkgName
382        fi
383        if [[ $imageFound ==  'https://screenshots.debian.net/' || $imageFound == ' https://screenshots.ubuntu.com/' ]]
384        then
385                printf "Discarting image...\n"
386                imageFound=0
387        fi
388
389}
390
391function get_screenshot_from
392{
393        url=$1
394        baseUrl=${url/packages*/}
395        pkgName=$2
396        outFile=$(mktemp)
397        wget $url -t 2 -T 10 -o /dev/null -O $outFile
398        if [ $? -eq 0 ]
399        then
400                searchResult=$(grep  -P -o  "href=\"\/package\/".*?\" $outFile | head -n1)
401                if [ $searchResult ]
402                then
403                        searchResult=${searchResult/href=\"\//}
404                        searchResult=${searchResult/\"/}
405                        url=${baseUrl}${searchResult}
406                        wget $url -t 2 -T 10 -o /tmp/log -O $outFile
407                        if [ $? -eq 0 ]
408                        then
409                                imageFound=$(grep  -P -o  "href=\"\/screenshots\/".*?\" $outFile | head -n1)
410                                imageFound=${imageFound/href=\"\//}
411                                imageFound=${imageFound/\"/}
412                                imageFound=${baseUrl}${imageFound}
413                                printf "$msg_image_found" $imageFound $pkgName
414                        fi
415                fi
416        fi
417}
418
419function get_icon
420{
421        iconName=$1
422        #Check if a svg icon exists
423        workDir=$PWD
424        printf "\nSearching for icon ${iconName}.svg in our package\n"
425        #First we'll check the dir for resources
426        resourcesDir=llx-resources/
427        cd $rootDir
428        cd $srcDir
429        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
430        if [[ ! $iconFile ]]
431        then
432                cd $workDir
433                printf "Entering $workDir\n"
434                iconPath=${srcDir}"/"${installDir}
435                iconFile=$(find . -name "$iconName.svg")
436                if [[ ! $iconFile ]]
437                then
438                        printf "Accesing %s" `realpath $lliurexArtworkDir`
439                        #Look for the svg in lliurex-theme
440                        cd $rootDir
441                        iconPath=$lliurexArtworkDir
442                        cd $lliurexArtworkDir
443                        iconFile=$(find . -name "${iconName}.svg")
444                fi
445                if [[ $iconFile ]]
446                then
447                        cd $rootDir
448                        printf "$msg_icon_found" $iconFile
449                        cd $srcDir
450                        resourcesDir="llx-resources/"${appName}"/icons/apps/"
451                        mkdir $resourcesDir -p
452                        cd $OLDPWD
453                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
454                        cd $OLDPWD
455                else
456                        printf "$msg_icon_not_found" ${iconName} "$lliurexArtworkDir" "$resourcesDir" "$installDir"
457                        printf "$msg_icon_location_info" ${iconName} "$lliurexArtworkDir" 
458                fi
459        else
460                printf "$msg_icon_exists"
461        fi
462        add_llxsrc_helper
463}
464
465function add_llxsrc_helper
466{
467        cd $rootDir
468        cd $debianDir
469        printf "Adding llxsrc to rules"
470        if [[ ! `grep 'llxsrc' rules` ]]
471        then
472                if [[ `grep 'dh \$@' rules` ]]
473                then
474                        if [[ `grep '\-\-with' rules` ]]
475                        then 
476                                sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
477                        else
478                                sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
479                        fi
480                else
481                        printf "$msg_rules_old_format"
482                        sed -i 's/\tdh_installdeb/\tdh_llxsrcinstall\n\tdh_installdeb/' rules
483                fi
484        fi
485
486        if [[ ! `grep 'llxsrchelper' control` ]]
487        then
488                sed -i 's/\(Build-Depends:\ \)/\0llxsrchelper,/' control
489        fi
490}
491
492
493[[ $@ ]] || usage_help
494
495for parm in $@
496do
497        if [ ! -d $parm ]
498        then
499                printf "\n${parm}: $msg_dir_not_found\n"
500                usage_help
501                exit 1
502        fi
503done
504
505launchDir=`realpath $PWD`
506
507for parm in $@
508do
509        cd $launchDir
510        debhelper_mode=0
511        analyze_dir $parm
512done
513
514printf "$msg_work_done"
515
516exit 0
517
Note: See TracBrowser for help on using the repository browser.