source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4847

Last change on this file since 4847 was 4847, checked in by Juanma, 2 years ago

Added zomandos.app support

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