source: devtools/desktop_to_xml/desktop_to_xml.sh @ 4554

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

fixed no install file

  • Property svn:executable set to *
File size: 9.1 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\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="\nNo icon named %s found on dirs %s, %s or %s\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. Assuming 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="\nNo install file present in debian dir. Aborting.\n"
25function usage_help
26{
27        printf "Usage:\n"
28        printf "$0 [svn_package_dir1] [svn_package_dir2]\n\n"
29        printf "$msg_need_svn\n\n"
30        exit 1
31}
32
33function analyze_dir
34{
35        printf "Analyzing $1\n"
36        rootDir=$PWD
37        svnDir=`dirname $1`
38        pkgDir=$1
39        srcDir=${1}"/trunk/fuentes"
40        debianDir=${1}"/trunk/fuentes/debian"
41
42        lliurexArtworkDir=${svnDir}"/vibrancy-colors/trunk/fuentes/vibrancy-lliurex/apps"
43#vibrancyArtworkDir=${svnDir}"/vibrancy-colors/trunk/fuentes/vibrancy-colors/Vibrancy-Dark-Orange/apps/scalable"
44        if [ ! -d $lliurexArtworkDir ] || [ ! -d $vibrancyArtworkDir ]
45        then
46                printf "$msg_icons_dir_error" $lliurexArtworkDir $vibrancyArtworkDir
47        fi
48       
49        #Get the install file. If there're many choose one...
50        cd $debianDir
51        declare -a installFiles
52        count=0
53        for i in *install
54        do
55                installFiles[$count]=$i
56                let count++
57        done
58        index=0
59        let count--
60        if [ $count -gt 0 ]
61        then
62                printf "$msg_select_file"
63                for i in `seq 0 ${count}`
64                do
65                        printf "${i}) ${installFiles[$i]}\n"
66                done
67                printf "Select file [0]: "
68                read index
69        elif [[ $installFiles[0]=='*install' ]]
70        then
71                printf "$msg_install_not_found"
72                exit 1
73        fi
74        [ -z $index ] && index=0
75        installFile=${installFiles[$index]}
76        printf "$msg_selected_file" $installFile
77        process_metainfo ${installFile}
78}
79
80function process_metainfo
81{
82        installFile=$1
83        if [ `wc -l $installFile  | cut -f1 -d ' '` -gt 1 ]
84        then 
85                printf "$msg_select_dir"
86                count=0
87                declare -a fileLines
88                while read -r dirLine
89                do
90                        fileLines[$count]=$dirLine
91                        printf "$count) $dirLine\n"
92                        let count++
93                done < ${installFile}
94                printf "Selected file [0]: "
95                read index
96                installDir=${fileLines[$index]}
97        else 
98                installDir=`head -n1 $installFile`
99        fi
100        [ -z $index ] && index=0
101        installDir=${installDir/\**/}
102        process_pkg $installDir
103}
104
105function process_pkg
106{
107        cd $rootDir"/"$srcDir
108        printf "Entering $1\n"
109        cd $1
110        #Find the desktop file of the application
111        desktopFiles=$(find . -name "*.desktop")
112        printf "$msg_gen_metainfo"
113        for desktopFile in $desktopFiles
114        do
115                cd $rootDir"/"$srcDir
116                printf "Entering $1\n"
117                cd $1
118                metainfoDir=`dirname $desktopFile`
119                metainfoDir=`dirname $metainfoDir`"/metainfo"
120                mkdir $metainfoDir -p
121                parse_desktop $metainfoDir $desktopFile
122                iconName=$(grep ^Icon= $desktopFile)
123                iconName=${iconName/*=/}
124                iconName=${iconName/.*/}
125                get_icon $iconName
126        done
127}
128
129function parse_desktop
130{
131        metainfoDir=$1
132        shift
133        for desktopFile in $@
134        do
135                printf "$msg_parsing_desktop" $desktopFile
136                item=`basename $desktopFile`
137                awk -v processFile=$item -v metainfoDir=$metainfoDir -F '=' '
138                BEGIN{
139                        split(processFile,array,".",seps)
140        #               revDomainName="net.lliurex."array[1]
141                        outFile="/tmp/"processFile
142                        printf("") > outFile
143                        xmlFile=metainfoDir"/"array[1]".appdata.xml"
144                        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > xmlFile
145                        print "<component type=\"desktop-application\">" >> xmlFile
146        #               print "<id>"revDomainName"</id>" >> xmlFile
147                        print "<id>"array[1]"</id>" >> xmlFile
148                        print "<metadata_license>CC0-1.0</metadata_license>" >> xmlFile
149                        execPrinted=0
150                        commentArrayIndex=1
151                        nameArrayIndex=1
152                }
153                {
154                        if ($1~"^Name")
155                        {
156                                if ($1=="Name")
157                                {
158                                        tagName="<name>"
159                                } else {
160                                        lang=$1
161                                        split(lang,array,"[",seps)
162                                        lang=substr(array[2], 1, length(array[2])-1)
163                                        tagName="<name xml:lang=\""lang"\">"
164                                }
165                                tagName=tagName""$2"</name>"
166                                nameArray[nameArrayIndex]=tagName
167                                nameArrayIndex++;
168                        } else if ($1~"Comment") {
169                                if ($1=="Comment")
170                                {
171                                        tagSum="<summary>"
172                                        tagDes="<p>"
173                                } else {
174                                        lang=$1
175                                        split(lang,array,"[",seps)
176                                        lang=substr(array[2], 1, length(array[2])-1)
177                                        tagSum="<summary xml:lang=\""lang"\">"
178                                        tagDes="<p xml:lang=\""lang"\">"
179                                }
180                                sumario=$2
181                                split(sumario,array,".",seps)
182                                $0=$1"="array[1]
183                                summaryArray[commentArrayIndex]=tagSum""array[1]"</summary>"
184                                descriptionArray[commentArrayIndex]=tagDes""sumario"</p>"
185                                commentArrayIndex++
186                        } else if ($1=="Categories") {
187                                split($2,array,";",seps)
188                                for (catIndex in array)
189                                {
190                                        if (array[catIndex]!="")
191                                        {
192                                                if (array[catIndex]~"LliureX-")
193                                                {
194                                                        split(array[catIndex],lliurexCats,"-",seps)
195                                                        for (lliurexCatIndex in lliurexCats)
196                                                        {
197                                                                lliurexCat="<category>"lliurexCats[lliurexCatIndex]"</category>\n"lliurexCat
198                                                        }
199                                                        categoryArray[catIndex]=lliurexCat
200                                                } else {
201                                                        categoryArray[catIndex]="<category>"array[catIndex]"</category>"
202                                                }
203                                        }
204                                }
205                        } else  if ($1=="Icon") {
206                                arrayItemNames=split($2,array,"/",seps)
207                                arrayItems=split(array[arrayItemNames],array,".",seps)
208                                iconBaseName=array[1]
209                                $0=$1"="iconBaseName
210        #                       split(iconBaseName,array,".",seps)
211                                tagIcon="<icon type=\"cached\">"iconBaseName"</icon>";
212                        } else if ($1=="Exec") {
213                                if (execPrinted==0)
214                                {
215                                        split($2,array," ",seps)
216                                        tagExec="<provides><binary>"array[1]"</binary></provides>"
217                                        execPrinted=1
218                                }
219                        }
220                        print $0>>outFile
221                }
222                END{
223                        for (nameIndex in nameArray)
224                                print nameArray[nameIndex] >> xmlFile
225                        for (summaryIndex in summaryArray)
226                                print summaryArray[summaryIndex] >> xmlFile;
227                        print "<description>" >> xmlFile
228                        for (descriptionIndex in descriptionArray)
229                                print descriptionArray[descriptionIndex] >> xmlFile;
230                        print "</description>" >> xmlFile
231                        print "<categories>" >> xmlFile
232                        for (categoryIndex in categoryArray)
233                                print categoryArray[categoryIndex] >> xmlFile;
234                        print "</categories>" >> xmlFile
235                        print tagIcon >> xmlFile
236                        print tagExec >> xmlFile
237                        print "<developer_name>Lliurex Team</developer_name>" >> xmlFile
238                        print "</component>" >> xmlFile
239                }
240                ' $desktopFile
241                printf "$msg_metainfo_generated"
242                cp /tmp/${item} $desktopFile
243                printf "$msg_desktop_updated"
244        done
245}
246
247function get_icon
248{
249        iconName=$1
250        #Check if a svg icon exists
251        workDir=$PWD
252        printf "\nSearching for icon ${iconName}.svg in our package\n"
253        #First we'll check the dir for resources
254        resourcesDir=llx-resources/
255        cd $rootDir
256        cd $srcDir
257        iconFile=$(find ${resourcesDir} -name "$iconName.svg" | grep icons)
258        if [[ ! $iconFile ]]
259        then
260                cd $workDir
261                printf "Entering $workDir\n"
262                iconPath=${srcDir}"/"${installDir}
263                iconFile=$(find . -name "$iconName.svg")
264                if [[ ! $iconFile ]]
265                then
266                        printf "Accesing $lliurexArtworkDir\n"
267                        #Look for the svg in lliurex-theme
268                        cd $rootDir
269                        iconPath=$lliurexArtworkDir
270                        cd $lliurexArtworkDir
271                        iconFile=$(find . -name "${iconName}.svg")
272                fi
273                if [[ $iconFile ]]
274                then
275                        cd $rootDir
276                        printf "$msg_icon_found" $iconFile
277                        cd $srcDir
278                        appName=$(basename $pkgDir)
279                        resourcesDir="llx-resources/"${appName}"/icons/"
280                        mkdir $resourcesDir -p
281                        cd $OLDPWD
282                        cp ${iconPath}"/"${iconFile} ${srcDir}"/"${resourcesDir}
283                        cd $OLDPWD
284                        add_llxsrc_helper
285                else
286                        printf "$msg_icon_not_found" ${iconName} $lliurexArtworkDir $resourcesDir $installDir
287                        printf "$msg_icon_location_info" ${iconName} $lliurexArtworkDir 
288                fi
289        else
290                printf "$msg_icon_exists"
291        fi
292}
293
294function add_llxsrc_helper
295{
296        cd $rootDir
297        cd $debianDir
298        printf "Adding llxsrc to rules"
299        if [[ ! `grep 'llxsrc' rules` ]]
300        then
301                if [[ `grep '\-\-with' rules` ]]
302                then 
303                        sed -i 's/\(dh $@\ --with\ \)/\0llxsrc,/' rules
304                else
305                        sed -i 's/\(dh $@\ \)/\0 --with\ llxsrc\ /' rules
306                fi
307        fi
308}
309
310
311[[ $@ ]] || usage_help
312
313for parm in $@
314do
315        if [ ! -d $parm ]
316        then
317                printf "\n${parm}: $msg_dir_not_found\n"
318                usage_help
319                exit 1
320        fi
321done
322
323for parm in $@
324do
325        analyze_dir $parm
326done
327
328printf "$msg_work_done"
329
330exit 0
331
Note: See TracBrowser for help on using the repository browser.