source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4648

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

Adds screenshots from debian

  • Property svn:executable set to *
File size: 13.3 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...\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 version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
230                        print "<component type=\"desktop-application\">" >> xmlFile
231        #               print "<id>"revDomainName"</id>" >> xmlFile
232                        print "<id>"array[1]"</id>" >> xmlFile
233                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
234                        execPrinted=0
235                        commentArrayIndex=1
236                        nameArrayIndex=1
237                }
238                {
239                        if ($1~"^Name")
240                        {
241                                if ($1=="Name")
242                                {
243                                        tagName="<name>"
244                                } else {
245                                        lang=$1
246                                        split(lang,array,"[",seps)
247                                        lang=substr(array[2], 1, length(array[2])-1)
248                                        tagName="<name xml:lang=\""lang"\">"
249                                }
250                                tagName=tagName""$2"</name>"
251                                nameArray[nameArrayIndex]=tagName
252                                nameArrayIndex++;
253                                split($2,array," ",seps)
254                                for (nameIndex in array)
255                                {
256                                        if (length(array[nameIndex])>=3)
257                                        {
258                                                if (tagKeywords!~">"array[nameIndex]"<")
259                                                        tagKeywords=tagKeywords"<keyword>"array[nameIndex]"</keyword>\n";
260                                        }
261                                }
262                        } else if ($1~"Comment") {
263                                if ($1=="Comment")
264                                {
265                                        tagSum="<summary>"
266                                        tagDes="<p>"
267                                } else {
268                                        lang=$1
269                                        split(lang,array,"[",seps)
270                                        lang=substr(array[2], 1, length(array[2])-1)
271                                        tagSum="<summary xml:lang=\""lang"\">"
272                                        tagDes="<p xml:lang=\""lang"\">"
273                                }
274                                sumario=$2
275                                split(sumario,array,".",seps)
276                                $0=$1"="array[1]
277                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
278                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
279                                commentArrayIndex++
280                        } else if ($1=="Categories") {
281                                customCat=0
282                                countCat=0
283                                split($2,array,";",seps)
284                                for (catIndex in array)
285                                {
286                                        if (array[catIndex]!="")
287                                        {
288                                                if (array[catIndex]~"-")
289                                                {
290                                                        customCat=1
291                                                        split(array[catIndex],lliurexCats,"-",seps)
292                                                        for (lliurexCatIndex in lliurexCats)
293                                                        {
294                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
295                                                        }
296                                                        categoryArray[catIndex]=lliurexCat
297                                                } else {
298                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
299                                                }
300                                                countCat++
301                                        }
302                                }
303                                if (customCat==1 && countCat==1)
304                                {
305                                        if (substr($0,length($0),1)==";")
306                                                $0=$0"GTK"
307                                        else
308                                                $0=$0;"GTK"
309                                }
310                        } else  if ($1=="Icon") {
311                                arrayItemNames=split($2,array,"/",seps)
312                                arrayItems=split(array[arrayItemNames],array,".",seps)
313                                iconBaseName=array[1]
314                                $0=$1"="iconBaseName
315        #                       split(iconBaseName,array,".",seps)
316                                tagIcon="<icon type=\"stock\">"iconBaseName"</icon>";
317                        } else if ($1=="Exec") {
318                                if (execPrinted==0)
319                                {
320                                        split($2,array," ",seps)
321                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
322                                        execPrinted=1
323                                }
324                        }
325                        print $0>>outFile
326                }
327                END{
328                        for (nameIndex in nameArray)
329                                print nameArray[nameIndex] >> xmlFile
330                        for (summaryIndex in summaryArray)
331                                print summaryArray[summaryIndex] >> xmlFile;
332                        print "<description>" >> xmlFile
333                        for (descriptionIndex in descriptionArray)
334                                print descriptionArray[descriptionIndex] >> xmlFile;
335                        print "</description>" >> xmlFile
336                        print "<categories>" >> xmlFile
337                        for (categoryIndex in categoryArray)
338                                print categoryArray[categoryIndex] >> xmlFile;
339                        print "</categories>" >> xmlFile
340                        print tagIcon >> xmlFile
341                        print tagExec >> xmlFile
342                        print "<keywords>" >> xmlFile
343                        print tagKeywords >> xmlFile
344                        print "</keywords>" >> xmlFile
345                        if ( screenshot != 0 )
346                        {
347                                print "<screenshots>" >> xmlFile
348                                print "<screenshot type=\"default\">" >> xmlFile
349                                print "<caption>Main window.</caption>" >> xmlFile
350                                print "<image type=\"source\" width=\"800\" height=\"450\">"screenshot"</image>" >> xmlFile
351                                print "</screenshot>" >> xmlFile
352                                print "</screenshots>" >> xmlFile
353                        }
354                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
355                        print "</component>" >> xmlFile
356                }
357                ' $desktopFile
358                printf "$msg_metainfo_generated"
359                cp /tmp/${item} $desktopFile
360                printf "$msg_desktop_updated"
361        done
362}
363
364function get_screenshot
365{
366        printf "$msg_searching_img"
367        imageFound=0
368        pkgName=${1/.desktop/}
369        url="https://screenshots.debian.net/packages?page=1&search=${pkgName}&utf8=✓"
370        outFile=$(mktemp)
371        wget  $url -o /dev/null -O $outFile
372        if [ $? -eq 0 ]
373        then
374                searchResult=$(grep  -P -o  "href=\"\/package\/".*?\" $outFile | head -n1)
375                if [ $searchResult ]
376                then
377                        searchResult=${searchResult/href=\"\//}
378                        searchResult=${searchResult/\"/}
379                        url="https://screenshots.debian.net/${searchResult}"
380                        wget  $url -o /tmp/log -O $outFile
381                        if [ $? -eq 0 ]
382                        then
383                                imageFound=$(grep  -P -o  "href=\"\/screenshots\/".*?\" $outFile | head -n1)
384                                imageFound=${imageFound/href=\"\//}
385                                imageFound=${imageFound/\"/}
386                                imageFound="https://screenshots.debian.net/${imageFound}"
387                                printf "$msg_image_found" $imageFound $pkgName
388                        fi
389                fi
390        fi
391}
392
393function get_icon
394{
395        iconName=$1
396        #Check if a svg icon exists
397        workDir=$PWD
398        printf "\nSearching for icon ${iconName}.svg in our package\n"
399        #First we'll check the dir for resources
400        resourcesDir=llx-resources/
401        cd $rootDir
402        cd $srcDir
403        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
404        if [[ ! $iconFile ]]
405        then
406                cd $workDir
407                printf "Entering $workDir\n"
408                iconPath=${srcDir}"/"${installDir}
409                iconFile=$(find . -name "$iconName.svg")
410                if [[ ! $iconFile ]]
411                then
412                        printf "Accesing %s" `realpath $lliurexArtworkDir`
413                        #Look for the svg in lliurex-theme
414                        cd $rootDir
415                        iconPath=$lliurexArtworkDir
416                        cd $lliurexArtworkDir
417                        iconFile=$(find . -name "${iconName}.svg")
418                fi
419                if [[ $iconFile ]]
420                then
421                        cd $rootDir
422                        printf "$msg_icon_found" $iconFile
423                        cd $srcDir
424                        resourcesDir="llx-resources/"${appName}"/icons/apps/"
425                        mkdir $resourcesDir -p
426                        cd $OLDPWD
427                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
428                        cd $OLDPWD
429                else
430                        printf "$msg_icon_not_found" ${iconName} "$lliurexArtworkDir" "$resourcesDir" "$installDir"
431                        printf "$msg_icon_location_info" ${iconName} "$lliurexArtworkDir" 
432                fi
433        else
434                printf "$msg_icon_exists"
435        fi
436        add_llxsrc_helper
437}
438
439function add_llxsrc_helper
440{
441        cd $rootDir
442        cd $debianDir
443        printf "Adding llxsrc to rules"
444        if [[ ! `grep 'llxsrc' rules` ]]
445        then
446                if [[ `grep 'dh \$@' rules` ]]
447                then
448                        if [[ `grep '\-\-with' rules` ]]
449                        then 
450                                sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
451                        else
452                                sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
453                        fi
454                else
455                        printf "$msg_rules_old_format"
456                        sed -i 's/\tdh_installdeb/\tdh_llxsrcinstall\n\tdh_installdeb/' rules
457                fi
458        fi
459
460        if [[ ! `grep 'llxsrchelper' control` ]]
461        then
462                sed -i 's/\(Build-Depends:\ \)/\0llxsrchelper,/' control
463        fi
464}
465
466
467[[ $@ ]] || usage_help
468
469for parm in $@
470do
471        if [ ! -d $parm ]
472        then
473                printf "\n${parm}: $msg_dir_not_found\n"
474                usage_help
475                exit 1
476        fi
477done
478
479launchDir=`realpath $PWD`
480
481for parm in $@
482do
483        cd $launchDir
484        debhelper_mode=0
485        analyze_dir $parm
486done
487
488printf "$msg_work_done"
489
490exit 0
491
Note: See TracBrowser for help on using the repository browser.