source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4831

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

Added zomandos support

  • Property svn:executable set to *
File size: 16.4 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...\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                                        }
384                                        tagIcon="<icon type=\"stock\">"iconBaseName"</icon>";
385                                } else if ($1=="Exec") {
386                                        if (execPrinted==0)
387                                        {
388                                                split($2,array," ",seps)
389                                                tagExec="<provides><binary>"array[1]"</binary></provides>"
390                                                execPrinted=1
391                                        }
392                                } else if ($1=="NoDisplay" || $1=="Terminal") {
393                                        if ($2 == "true" || $2=="TRUE" || $2=="True")
394                                        {
395                                                noGenerate=1
396                                        }
397                                }
398                        }
399                        print $0>>outFile
400                }
401                END{
402                        if (noGenerate==1)
403                        {
404                                print xmlFile" not generated as is a terminal app"
405                                exit 1
406                        }
407                        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
408                        print "<component type=\"desktop-application\">" >> xmlFile
409                        print tagId >> xmlFile
410                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
411                        for (nameIndex in nameArray)
412                                print nameArray[nameIndex] >> xmlFile
413                        for (summaryIndex in summaryArray)
414                                print summaryArray[summaryIndex] >> xmlFile;
415                        print "<description>" >> xmlFile
416                        for (descriptionIndex in descriptionArray)
417                                print descriptionArray[descriptionIndex] >> xmlFile;
418                        print "</description>" >> xmlFile
419                        print "<categories>" >> xmlFile
420                        for (categoryIndex in categoryArray)
421                        {
422                                print categoryArray[categoryIndex] >> xmlFile;
423                        }
424                        if (zomando)
425                        {
426                                print "<category>Zomando</category>" >> xmlFile
427                        }
428                        if (categoryIndex==0)
429                                print "<category>Utility</category>" >> xmlFile
430                        print "</categories>" >> xmlFile
431                        print tagIcon >> xmlFile
432                        print tagExec >> xmlFile
433                        print "<keywords>" >> xmlFile
434                        print tagKeywords >> xmlFile
435                        print "</keywords>" >> xmlFile
436                        if ( screenshot != 0 )
437                        {
438                                print "<screenshots>" >> xmlFile
439                                print "<screenshot type=\"default\">" >> xmlFile
440                                print "<caption>Main window.</caption>" >> xmlFile
441                                print "<image type=\"source\" width=\"800\" height=\"450\">"screenshot"</image>" >> xmlFile
442                                print "</screenshot>" >> xmlFile
443                                print "</screenshots>" >> xmlFile
444                        }
445#                       print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
446                        print "</component>" >> xmlFile
447                }
448                ' $desktopFile
449                [ $? -eq 0 ] && printf "$msg_metainfo_generated"
450                if [ -z $no_copy_desktop ]
451                then
452                        cp /tmp/${item} $desktopFile
453                        printf "$msg_desktop_updated"
454                fi
455        done
456}
457
458function get_screenshot
459{
460        printf "$msg_searching_img" "debian"
461        imageFound=0
462        pkgName=${1/.desktop/}
463        url="https://screenshots.debian.net/packages?page=1&search=${pkgName}&utf8=✓"
464        get_screenshot_from $url $pkgName
465#       if [[ $imageFound == 0 ]]
466#       then
467#               printf "$msg_searching_img" "ubuntu"
468#               url="http://screenshots.ubuntu.com/packages?page=1&search=${pkgName}&utf8=✓"
469#               get_screenshot_from $url $pkgName
470#       fi
471        if [[ $imageFound ==  'https://screenshots.debian.net/' || $imageFound == ' https://screenshots.ubuntu.com/' ]]
472        then
473                printf "Discarting image...\n"
474                imageFound=0
475        fi
476
477}
478
479function get_screenshot_from
480{
481        url=$1
482        baseUrl=${url/packages*/}
483        pkgName=$2
484        outFile=$(mktemp)
485        wget $url -t 2 -T 10 -o /dev/null -O $outFile
486        if [ $? -eq 0 ]
487        then
488                searchResult=$(grep  -P -o  "href=\"\/package\/".*?\" $outFile | head -n1)
489                if [ $searchResult ]
490                then
491                        searchResult=${searchResult/href=\"\//}
492                        searchResult=${searchResult/\"/}
493                        url=${baseUrl}${searchResult}
494                        wget $url -t 2 -T 10 -o /tmp/wget_desktop.log -O $outFile
495                        if [ $? -eq 0 ]
496                        then
497                                imageFound=$(grep  -P -o  "href=\"\/screenshots\/".*?\" $outFile | head -n1)
498                                imageFound=${imageFound/href=\"\//}
499                                imageFound=${imageFound/\"/}
500                                imageFound=${baseUrl}${imageFound}
501                                printf "$msg_image_found" $imageFound $pkgName
502                        fi
503                fi
504        fi
505}
506
507function get_icon
508{
509        [ -z ${1} ] && echo "No icon selected" && return
510        iconName=$(basename $1)
511        #Check if a svg icon exists
512        workDir=$PWD
513        printf "\nSearching for icon ${iconName}.svg in our package\n"
514        #First we'll check the dir for resources
515        resourcesDir=llx-resources/
516        cd $rootDir
517        cd $srcDir
518        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
519        if [[ ! $iconFile ]]
520        then
521                cd $workDir
522                printf "Entering $workDir\n"
523                iconPath=${srcDir}"/"${installDir}
524                iconFile=$(find . -name "$iconName.svg")
525                if [[ ! $iconFile ]]
526                then
527                        printf "Accesing %s" `realpath $lliurexArtworkDir`
528                        #Look for the svg in lliurex-theme
529                        cd $rootDir
530                        iconPath=$lliurexArtworkDir
531                        cd $lliurexArtworkDir
532                        iconFile=$(find . -name "${iconName}.svg")
533                fi
534                if [[ $iconFile ]]
535                then
536                        iconFile=$(realpath $iconFile)
537                        cd $rootDir
538                        printf "$msg_icon_found" $iconFile
539                        cd $srcDir
540                        resourcesDir="llx-resources/"${appName}"/icons/apps/"
541                        mkdir $resourcesDir -p
542                        cd $OLDPWD
543                        cp ${iconFile} ${srcDir}"/"${resourcesDir}
544                        cd $OLDPWD
545                else
546                        printf "$msg_icon_not_found" ${iconName} "$lliurexArtworkDir" "$resourcesDir" "$installDir"
547                        printf "$msg_icon_location_info" ${iconName} "$lliurexArtworkDir"
548                fi
549        else
550                printf "$msg_icon_exists"
551        fi
552}
553
554function add_llxsrc_helper
555{
556        cd $rootDir
557        cd $debianDir
558        printf "Adding llxsrc to rules"
559        if [[ ! `grep 'llxsrc' rules` ]]
560        then
561                if [[ `grep 'dh \$@' rules` ]]
562                then
563                        if [[ `grep '\-\-with' rules` ]]
564                        then
565                                sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
566                        else
567                                sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
568                        fi
569                else
570                        printf "$msg_rules_old_format"
571                        sed -i 's/\tdh_installdeb/\tdh_llxsrcinstall\n\tdh_installdeb/' rules
572                fi
573        fi
574
575        if [[ ! `grep 'llxsrchelper' control` ]]
576        then
577                sed -i 's/\(Build-Depends:\ \)/\0llxsrchelper,/' control
578        fi
579}
580
581function get_package_type
582{
583        cd $srcDir
584        ls *zmds 1>/dev/null 2>&1
585        if [ $? -eq 0 ]
586        then
587                echo "deb"
588        else
589                echo "zmd"
590        fi
591}
592
593### MAIN PROGRAM ###
594
595[[ $@ ]] || usage_help
596
597for parm in $@
598do
599        if [ ! -d $parm ]
600        then
601                printf "\n${parm}: $msg_dir_not_found\n"
602                usage_help
603                exit 1
604        fi
605done
606
607launchDir=`realpath $PWD`
608
609for parm in $@
610do
611        cd $launchDir
612        rootDir=$launchDir
613        svnDir=`realpath $parm`
614        pkgDir=`realpath $parm`
615        srcDir=${parm}"/trunk/fuentes"
616        debianDir=${parm}"/trunk/fuentes/debian"
617        lliurexArtworkDir=${svnDir}"/../vibrancy-colors/trunk/fuentes/vibrancy-lliurex/apps"
618        no_copy_desktop=""
619        sw_zomando=0
620        [[ $(get_package_type) == 'zmd' ]] && analyze_zmd_dir $parm || analyze_desktop_dir $parm
621done
622
623printf "$msg_work_done"
624
625exit 0
626
Note: See TracBrowser for help on using the repository browser.