]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - wwwbin/ftp-freshness.py
Separate packages with fractional release in freshness information
[projects/pld-ftp-admin.git] / wwwbin / ftp-freshness.py
1 #!/usr/bin/python
2 # arekm, 2007
3
4 import os
5 import re
6 import rpm
7 import struct
8 import subprocess
9 import sys
10
11 # earlier == more important
12 dirs = [ "/home/ftp/pub/Linux/PLD/dists/th/test/SRPMS/RPMS/",
13                  "/home/ftp/pub/Linux/PLD/dists/th/ready/SRPMS/RPMS/",
14                  "/home/ftp/pub/Linux/PLD/dists/th/PLD/SRPMS/RPMS/" ]
15 #dirs = [ "/home/pld/admins/th/1" ]
16 specsdir = "/home/pld/admins/th/SPECS"
17
18 if os.path.isdir(specsdir):
19     os.chdir(specsdir)
20     cmd = ['git', 'pull']
21 else:
22     cmd = ['git', 'clone', '--depth=1', 'git://git.pld-linux.org/SPECS', specsdir]
23
24 p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
25 (out, err) = p.communicate(None)
26
27 os.chdir(specsdir)
28 class Pkgs(object):
29         def __init__(self):
30                 self.pkg = {}
31                 self.cvs = {}
32                 self.cvs_new_nvr = []
33                 self.cvs_new_nv = []
34                 self.re_n = re.compile('^(.*)-([^-]*)-([^-]*)\.src\.rpm$')
35                 rpm.addMacro('patch', '%{nil}')
36                 rpm.addMacro('requires_eq', '#')
37                 rpm.addMacro('requires_eq_to', '#')
38                 rpm.addMacro('requires_releq', '#')
39                 rpm.addMacro('requires_ge', '#')
40                 rpm.addMacro('requires_ge_to', '#')
41                 self.ts = rpm.ts()
42
43         def __clean_macros(self):
44                 for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']:
45                         rpm.delMacro(macro)
46                 macros = rpm.getMacros()
47                 for macro in macros.iterkeys():
48                         if macro.startswith('with_') or macro.startswith('without_'):
49                                 rpm.delMacro(macro.split()[0])
50
51         def __get_from_rpm(self, file_name):
52                 m = self.re_n.match(file_name)
53                 if not m:
54                         return False
55                 name =  m.group(1).strip()
56                 version = m.group(2).strip()
57                 release = m.group(3).strip()
58                 return (name, version, release)
59
60         def __get_from_cvs(self, name):
61                 spec = os.path.join(specsdir, name + '.spec')
62                 if not os.path.isfile(spec):
63                         print >>sys.stderr, 'Spec file does not exist: %s' % spec
64                         return ('','','')
65                 print >>sys.stderr, 'Processing: %s.spec' % name
66                 self.__clean_macros()
67                 try:
68                         s = self.ts.parseSpec(spec)
69                         headers = s.headers()
70                         name, version, release = headers[0].sprintf('%{name};%{version};%{release}').split(';')
71                         release = release.partition('@')[0]
72                         return (name, version, release)
73                 except rpm.error:
74                         print >>sys.stderr, 'Failed to parse: %s.spec' % name
75                         return ('','','')
76
77         def __update_cvs(self, name):
78                 if not self.cvs.has_key(name):
79                         self.cvs[name] = self.__get_from_cvs(name)
80
81         def __update_new(self, name):
82                 cvs_nvr = self.cvs[name]
83                 pkg_nvr = self.pkg[name]
84
85                 cvs_rpm_vr = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], cvs_nvr[2]), (pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]))
86                 cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], ""))
87                 rpm_cvs_vr = rpm.labelCompare((pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]), (cvs_nvr[0], cvs_nvr[1], cvs_nvr[2]))
88                 rpm_cvs_v = rpm.labelCompare((pkg_nvr[0], pkg_nvr[1], ""), (cvs_nvr[0], cvs_nvr[1], ""))
89
90                 if rpm_cvs_v < 0 and cvs_rpm_v > 0:
91                         self.cvs_new_nv.append(name)
92                 else:
93                         if rpm_cvs_vr < 0 and cvs_rpm_vr > 0 and cvs_nvr[1] == pkg_nvr[1]:
94                                 self.cvs_new_nvr.append(name)
95
96         def prepare(self):
97                 self.cvs_new_nvr.sort()
98                 self.cvs_new_nvr = list(set(self.cvs_new_nvr))
99                 self.cvs_new_nv.sort()
100                 self.cvs_new_nv = list(set(self.cvs_new_nv))
101
102                 pkgs = list(self.pkg) + list(self.cvs)
103
104                 for name in list(set(pkgs)):
105                         self.__update_new(name)
106
107         def add_rpm(self, file_name):
108                 nvr = self.__get_from_rpm(file_name)
109                 if not nvr:
110                         return False
111                 name = nvr[0]
112                 if self.pkg.has_key(name):
113                         if rpm.labelCompare(nvr, self.pkg[name]) > 0:
114                                 del self.pkg[name]
115                                 self.pkg[name] = nvr
116                 else:
117                         self.pkg[name] = nvr
118                 self.__update_cvs(name)
119
120         def print_nvr(self):
121                 ver_int = "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***\n"
122                 ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
123                 for name in self.cvs_new_nvr:
124                         self.cvs_new_nvr.sort()
125                         cvs_nvr = self.cvs[name]
126                         pkg_nvr = self.pkg[name]
127                         msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%\ns" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
128                         if '.' in cvs_nvr[2]:
129                                 ver_frac += msg
130                         else:
131                                 ver_int += msg
132                 print ver_int
133                 print ver_frac
134
135         def print_nv(self):
136                 ver_int = "*** VERSION COMPARE ONLY ***\n"
137                 ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
138                 self.cvs_new_nv.sort()
139                 for name in self.cvs_new_nv:
140                         cvs_nvr = self.cvs[name]
141                         pkg_nvr = self.pkg[name]
142                         msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
143                         if '.' in cvs_nvr[2]:
144                                 ver_frac += msg
145                         else:
146                                 ver_int += msg
147                 print ver_int
148                 print ver_frac
149
150 p = Pkgs()
151
152 for d in dirs:
153         for rpm_file_name in os.listdir(d):
154                 p.add_rpm(rpm_file_name)
155
156 p.prepare()
157
158 p.print_nv()
159 print "\n\n"
160 p.print_nvr()
This page took 0.086437 seconds and 4 git commands to generate.