source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4693

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

When desktop not found in installDir searches whole svn directory

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