]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - pldnotify.awk
- added "-n" option to treat version numbers as numerical "float"
[packages/rpm-build-tools.git] / pldnotify.awk
1 #!/bin/awk -f
2 # $Revision$, $Date$
3 function fixedsub(s1,s2,t,      ind) {
4 # substitutes fixed strings (not regexps)
5         if (ind = index(t,s1)) {
6                 t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1))
7         }
8         return t
9 }
10
11 function compare_ver(v1,v2) {
12 # compares version numbers
13         while (match(v1,/[a-zA-Z][0-9]|[0-9][a-zA-Z]/))
14                 v1=(substr(v1,1,RSTART) "." substr(v1,RSTART+RLENGTH-1))
15         while (match(v2,/[a-zA-Z][0-9]|[0-9][a-zA-Z]/))
16                 v2=(substr(v2,1,RSTART) "." substr(v2,RSTART+RLENGTH-1))
17         sub("^0*","",v1)
18         sub("^0*","",v2)
19         if (DEBUG) print "v1 == " v1
20         if (DEBUG) print "v2 == " v2
21         count=split(v1,v1a,"\.")
22         count2=split(v2,v2a,"\.")
23         
24         if (count<count2) mincount=count 
25         else mincount=count2
26         
27         for (i=1; i<=mincount; i++) {
28                 if (v1a[i]=="") v1a[i]=0
29                 if (v2a[i]=="") v2a[i]=0
30                 if (DEBUG) print "i == " i
31                 if (DEBUG) print "v1[i] == " v1a[i]
32                 if (DEBUG) print "v2[i] == " v2a[i]
33                 if ((v1a[i]~/[0-9]/)&&(v2a[i]~/[0-9]/)) {
34                         if (length(v2a[i])>length(v1a[i]))
35                                 return 1
36                         else if (v2a[i]>v1a[i])
37                                 return 1
38                         else if (length(v1a[i])>length(v2a[i]))
39                                 return 0
40                         else if (v1a[i]>v2a[i])
41                                 return 0
42                 } else if ((v1a[i]~/[A-Za-z]/)&&(v2a[i]~/[A-Za-z]/)) {
43                         if (v2a[i]>v1a[i])
44                                 return 1
45                         else if (v1a[i]>v2a[i])
46                                 return 0
47                 } else if ((v1a[i]~"pre")||(v1a[i]~"beta")||(v1a[i]~"alpha"))
48                         return 1
49                 else
50                         return 0
51         }
52         if ((count2==mincount)&&(count!=count2)) {
53                 for (i=count2+1; i<=count; i++)
54                         if ((v1a[i]~"pre")||(v1a[i]~"beta")||(v1a[i]~"alpha")) 
55                                 return 1
56                 return 0
57         } else if (count!=count2) {
58                 for (i=count+1; i<=count2; i++)
59                         if ((v2a[i]~"pre")||(v2a[i]~"beta")||(v2a[i]~"alpha"))
60                                 return 0
61                 return 1
62         }
63         return 0
64 }
65
66 function compare_ver_dec(v1,v2) {
67 # compares version numbers
68         while (match(v1,/[0-9][a-zA-Z]/))
69                 v1=(substr(v1,1,RSTART) "." substr(v1,RSTART+RLENGTH-1))
70         while (match(v2,/[0-9][a-zA-Z]/))
71                 v2=(substr(v2,1,RSTART) "." substr(v2,RSTART+RLENGTH-1))
72         sub("^0*","",v1)
73         sub("^0*","",v2)
74         if (DEBUG) print "v1 == " v1
75         if (DEBUG) print "v2 == " v2
76         count=split(v1,v1a,"\.")
77         count2=split(v2,v2a,"\.")
78         
79         if (count<count2) mincount=count 
80         else mincount=count2
81         
82         for (i=1; i<=mincount; i++) {
83                 if (v1a[i]=="") v1a[i]=0
84                 if (v2a[i]=="") v2a[i]=0
85                 if (DEBUG) print "i == " i
86                 if (DEBUG) print "v1[i] == " v1a[i]
87                 if (DEBUG) print "v2[i] == " v2a[i]
88                 if ((v1a[i]~/[0-9]/)&&(v2a[i]~/[0-9]/)) {
89                         if (i==2) {
90                                 if (0+("." v2a[i])>0+("." v1a[i]))
91                                         return 1
92                                 else if (0+("." v1a[i])>0+("." v2a[i]))
93                                         return 0
94                         } else {
95                                 if (length(v2a[i])>length(v1a[i]))
96                                         return 1
97                                 else if (v2a[i]>v1a[i])
98                                         return 1
99                                 else if (length(v1a[i])>length(v2a[i]))
100                                         return 0
101                                 else if (v1a[i]>v2a[i])
102                                         return 0
103                         }
104                 } else if ((v1a[i]~/[A-Za-z]/)&&(v2a[i]~/[A-Za-z]/)) {
105                         if (v2a[i]>v1a[i])
106                                 return 1
107                         else if (v1a[i]>v2a[i])
108                                 return 0
109                 } else if ((v1a[i]~"pre")||(v1a[i]~"beta")||(v1a[i]~"alpha"))
110                         return 1
111                 else
112                         return 0
113         }
114         if ((count2==mincount)&&(count!=count2)) {
115                 for (i=count2+1; i<=count; i++)
116                         if ((v1a[i]~"pre")||(v1a[i]~"beta")||(v1a[i]~"alpha")) 
117                                 return 1
118                 return 0
119         } else if (count!=count2) {
120                 for (i=count+1; i<=count2; i++)
121                         if ((v2a[i]~"pre")||(v2a[i]~"beta")||(v2a[i]~"alpha"))
122                                 return 0
123                 return 1
124         }
125         return 0
126 }
127
128 function get_links(url, errno,link,oneline,retval,odp,tmpfile) {
129 # get all <A HREF=..> tags from specified URL
130         "mktemp /tmp/XXXXXX" | getline tmpfile
131         close("mktemp /tmp/XXXXXX")
132         
133         if (DEBUG) print "Retrieving: " url
134         errno=system("wget -O - \"" url "\" -t 3 -T 300 --passive-ftp > " tmpfile " 2>/dev/null" )
135         
136         if (errno==0) {
137                 while (getline oneline < tmpfile)
138                         odp=(odp " " oneline)
139                 if ( DEBUG ) print "Odpowiedz: " odp
140         }
141         
142         close(tmpfile)
143         system("rm -f " tmpfile)
144         urldir=url;
145         sub(/[^\/]+$/,"",urldir)
146         if ( errno==0) {
147                 while ((tolower(odp) ~ /<frame[ \t]/)||(tolower(odp) ~ /href=/)) {
148                         if (tolower(odp) ~ /<frame[ \t]/) {
149                                 match(tolower(odp),/<frame[ \t][^>]*>/)
150                                 ramka=substr(odp,RSTART,RLENGTH)
151                                 odp=substr(odp,RSTART+RLENGTH)
152                                 sub(/[sS][rR][cC]=[ \t]+/,"src=",ramka);
153                                 match(tolower(ramka),/src="[^"]+"/)
154                                 newurl=substr(ramka,RSTART+5,RLENGTH-6)
155                                 if (DEBUG) print "Ramka: " newurl
156                                 if (newurl !~ /\//) {
157                                         newurl=(urldir newurl)
158                                         if (DEBUG) print "Ramka->: " newurl
159                                 }
160                                 retval=(retval " " get_links(newurl))
161                         } else if (tolower(odp) ~ /href=[ \t]*"[^"]+"/) {
162                                 sub(/[hH][rR][eE][fF]=[ \t]+/,"href=",odp)
163                                 match(tolower(odp),/href="[^"]+"/)
164                                 link=substr(odp,RSTART,RLENGTH)
165                                 odp=substr(odp,RSTART+RLENGTH)
166                                 link=substr(link,7,length(link)-7)
167                                 retval=(retval " " link)
168                         } else if (tolower(odp) ~ /href=[ \t]*[^ \t>]+/) {
169                                 sub(/[hH][rR][eE][fF]=[ \t]+/,"href=",odp)
170                                 match(tolower(odp),/href=[^ \t>]+/)
171                                 link=substr(odp,RSTART,RLENGTH)
172                                 odp=substr(odp,RSTART+RLENGTH)
173                                 link=substr(link,6,length(link)-5)
174                                 retval=(retval " " link)
175                         } else {
176                                 retval=(retval " INTERNAL_ERROR")
177                                 break
178                         }
179                 }
180         } else {
181                 retval=("WGET ERROR: " errno)
182         }
183         
184         
185         if (DEBUG) print "Zwracane: " retval
186         return retval
187 }
188
189 function subst_defines(var,defs) {
190 # substitute all possible RPM macros
191         while ((var ~ /%{.*}/) || (var ~ /%[A-Za-z0-9_]+/)) {
192                 oldvar=var
193                 for (j in defs) {
194                         gsub("%{" j "}", defs[j], var)
195                         gsub("%" j , defs[j], var)
196                 }
197                 if (var==oldvar) {
198                         if ( DEBUG ) for (i in defs) print i " == " defs[i]
199                         return var
200                 }
201         }
202         return var
203 }
204
205 function find_mirror(url) {
206
207         while (succ = (getline line < "mirrors")) {
208             if (succ==-1) { return url }
209                 nf=split(line,fields,"|")
210                 if (nf>1){
211                         origin=fields[1]
212                         mirror=fields[2]
213                         mname=fields[3]
214                         prefix=substr(url,1,length(origin))
215                         if (prefix==origin){
216                                 if ( DEBUG ) print "Mirror znaleziony na " mname
217                                 close("mirrors")
218                                 return mirror substr(url,length(origin))
219                         }
220                 }
221         }
222
223         return url
224 }
225
226 function process_source(number,lurl,name,version) {
227 # fetches file list, and compares version numbers
228         if ( DEBUG ) print "Przetwarzam " lurl
229
230         if ( index(lurl,version)==0 ) {
231                 if (DEBUG) print "Nie ma numeru wersji."
232                 return 0
233         }
234
235         sub("://",":",lurl)
236         sub("/",":/",lurl)
237         gsub("[^/]*$",":&",lurl)
238         split(lurl,url,":")
239         acc=url[1]
240         host=url[2]
241         dir=url[3]
242         filename=url[4]
243
244         if (index(dir,version)) {
245                 dir=substr(dir,1,index(dir,version)-1)
246                 sub("[^/]*$","",dir)
247                 sub("(\.tar\.(bz|bz2|gz)|zip)$","",filename)
248                 if ( DEBUG ) print "Sprawdze katalog: " dir
249                 if ( DEBUG ) print "i plik: " filename
250         }
251
252         filenameexp=filename
253         gsub("\+","\\+",filenameexp)
254         sub(version,"[A-Za-z0-9\\.]+",filenameexp)
255         if ( DEBUG ) print "Wzorzec: " filenameexp
256         match(filename,version)
257         prever=substr(filename,1,RSTART-1)
258         postver=substr(filename,RSTART+RLENGTH)
259         if ( DEBUG ) print "Przed numerkiem: " prever
260         if ( DEBUG ) print "i po: " postver
261         newurl=find_mirror(acc "://" host dir)  
262         #print acc "://" host dir
263         #newurl=url[1]"://"url[2]url[3]url[4]
264         #newurl=acc "://" host dir filename
265         if ( DEBUG ) print "ZaglĀ±dam na " newurl 
266         
267         references=0
268         finished=0
269         oldversion=version
270         odp=get_links(newurl)
271         if( odp ~ "ERROR: ") {
272                 print name "(" number ") " odp
273         } else {
274                 if (DEBUG) print "Sciagnieta strona"
275                 c=split(odp,linki)
276                 for (nr=1; nr<=c; nr++) {
277                         addr=linki[nr]
278                         if (DEBUG) print "Znaleziony link: " addr
279                         if (addr ~ filenameexp) {
280                                 match(addr,filenameexp)
281                                 newfilename=substr(addr,RSTART,RLENGTH)
282                                 if (DEBUG) print "Hipotetyczny nowy: " newfilename
283                                 newfilename=fixedsub(prever,"",newfilename)
284                                 newfilename=fixedsub(postver,"",newfilename)
285                                 if (DEBUG) print "Wersja: " newfilename
286                                 if (NUMERIC) {
287                                         if ( compare_ver_dec(version, newfilename)==1 ) {
288                                                 if (DEBUG) print "Tak, jest nowa"
289                                                 version=newfilename
290                                                 finished=1
291                                         }
292                                 } else if ( compare_ver(version, newfilename)==1 ) {
293                                         if (DEBUG) print "Tak, jest nowa"
294                                         version=newfilename
295                                         finished=1
296                                 }
297                         }
298                 }
299                 if (finished==0)
300                         print name "(" number ") seems ok: " oldversion
301                 else
302                         print name "(" number ") [OLD] " oldversion " [NEW] " version
303         }
304 }
305         
306 function process_data(name,ver,rel,src) {
307 # this function checks if substitutions were valid, and if true:
308 # processes each URL and tries to get current file list
309         for (i in src) {
310                 if ( src[i] !~ /%{.*}/ && src[i] !~ /%[A-Za-z0-9_]/ )  {
311                         if ( DEBUG ) print "Zrodlo: " src[i]
312                         process_source(i,src[i],name,ver)
313                 } else {
314                         print FNAME ":" i ": niemozliwe podstawienie: " src[i]
315                 }
316         }
317 }
318
319 BEGIN {
320         # if U want to use DEBUG, run script with "-v DEBUG=1"
321         # or uncomment the line below
322         # DEBUG = 1
323
324         errno=system("wget --help > /dev/null 2>&1")
325         if (errno) {
326                 print "No wget installed!"
327                 exit 1
328         }
329         if (ARGC>=3 && ARGV[2]=="-n") {
330                 NUMERIC=1
331                 for (i=3; i<ARGC; i++) ARGV[i-1]=ARGV[i] 
332                 ARGC=ARGC-1
333         }
334 }
335
336 FNR==1 {
337         if ( ARGIND != 1 ) {
338                 process_data(NAME,VER,REL,SRC)
339                 NAME="" ; VER="" ; REL=""
340                 for (i in DEFS) delete DEFS[i]
341                 for (i in SRC) delete SRC[i]
342         }
343         FNAME=FILENAME
344 }
345
346 /^[Uu][Rr][Ll]:/&&(URL=="") { URL=subst_defines($2,DEFS) ; DEFS["url"]=URL }
347 /^[Nn]ame:/&&(NAME=="") { NAME=subst_defines($2,DEFS) ; DEFS["name"]=NAME }
348 /^[Vv]ersion:/&&(VER=="") { VER=subst_defines($2,DEFS) ; DEFS["version"]=VER }
349 /^[Rr]elease:/&&(REL=="") { REL=subst_defines($2,DEFS) ; DEFS["release"]=REL }
350 /^[Ss]ource[0-9]*:/ { if (/(ftp|http):\/\//) SRC[FNR]=subst_defines($2,DEFS) }
351 /%define/ { DEFS[$2]=subst_defines($3,DEFS) }
352
353 END {
354         process_data(NAME,VER,REL,SRC)
355 }
This page took 0.06313 seconds and 4 git commands to generate.