]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - wwwbin/ftp-freshness.py
Switch to Python 3 for rpm.org rpm
[projects/pld-ftp-admin.git] / wwwbin / ftp-freshness.py
1 #!/usr/bin/python3
2 # arekm, 2007
3
4 from __future__ import print_function
5
6 import os
7 import rpm
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         rpm.addMacro('patch', '%{nil}')
35         rpm.addMacro('requires_eq', '#')
36         rpm.addMacro('requires_eq_to', '#')
37         rpm.addMacro('requires_releq', '#')
38         rpm.addMacro('requires_ge', '#')
39         rpm.addMacro('requires_ge_to', '#')
40         rpm.setVerbosity(rpm.RPMLOG_ERR)
41         if sys.version_info[0] == 2:
42             self.ts = rpm.ts()
43
44     def __print_stderr(self, msg):
45         if sys.version_info[0] == 3:
46             print(msg, file=sys.stderr, flush=True)
47         else:
48             print(msg, file=sys.stderr)
49
50     def __clean_macros(self):
51         if sys.version_info[0] == 3:
52             rpm.reloadConfig()
53         for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']:
54             rpm.delMacro(macro)
55         if sys.version_info[0] == 2:
56             macros = rpm.getMacros()
57             for macro in iter(macros.keys()):
58                 if macro[:5] == 'with_' or macro[:8] == 'without_':
59                     rpm.delMacro(macro.split()[0])
60
61     def __get_from_cvs(self, name):
62         spec = os.path.join(specsdir, name + '.spec')
63         if not os.path.isfile(spec):
64             self.__print_stderr('Spec file does not exist: %s' % spec)
65             return ('','','')
66         self.__print_stderr('Processing: %s.spec' % name)
67         self.__clean_macros()
68         try:
69             if sys.version_info[0] == 2:
70                 s = self.ts.parseSpec(spec)
71                 header = s.headers()[0]
72             else:
73                 s = rpm.spec(spec)
74                 header = s.sourceHeader
75             name = header[rpm.RPMTAG_NAME]
76             version = header[rpm.RPMTAG_VERSION]
77             release = header[rpm.RPMTAG_RELEASE].partition('@')[0]
78             return (name, version, release)
79         except (ValueError, rpm.error):
80             self.__print_stderr('Failed to parse: %s.spec' % name)
81             return ('','','')
82
83     def __update_cvs(self, name):
84         if name not in self.cvs:
85             self.cvs[name] = self.__get_from_cvs(name)
86
87     def __update_new(self, name):
88         cvs_nvr = self.cvs[name]
89         pkg_nvr = self.pkg[name]
90
91         try:
92             cvs_rpm_vr = rpm.labelCompare(cvs_nvr, pkg_nvr)
93         except ValueError:
94             cvs_rpm_vr = -1
95         try:
96             cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], ""))
97         except ValueError:
98             cvs_rpm_v = -1
99
100         if cvs_rpm_v > 0:
101             self.cvs_new_nv.append(name)
102             return
103         if cvs_rpm_vr > 0:
104             self.cvs_new_nvr.append(name)
105
106     def prepare(self):
107         self.cvs_new_nvr.sort()
108         self.cvs_new_nvr = list(set(self.cvs_new_nvr))
109         self.cvs_new_nv.sort()
110         self.cvs_new_nv = list(set(self.cvs_new_nv))
111
112         pkgs = list(self.pkg) + list(self.cvs)
113
114         for name in list(set(pkgs)):
115             self.__update_new(name)
116
117     def add_rpm(self, file_name):
118         nvr = tuple(file_name.rsplit('-', 2))
119         name = nvr[0]
120         if name in self.pkg:
121             try:
122                 if rpm.labelCompare(nvr, self.pkg[name]) > 0:
123                     self.pkg[name] = nvr
124             except ValueError:
125                 pass
126         else:
127             self.pkg[name] = nvr
128         self.__update_cvs(name)
129
130     def print_nvr(self):
131         ver_int = "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***\n"
132         ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
133         for name in self.cvs_new_nvr:
134             self.cvs_new_nvr.sort()
135             cvs_nvr = self.cvs[name]
136             pkg_nvr = self.pkg[name]
137             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])
138             if '.' in cvs_nvr[2]:
139                 ver_frac += msg
140             else:
141                 ver_int += msg
142         print(ver_int)
143         print(ver_frac)
144
145     def print_nv(self):
146         ver_int = "*** VERSION COMPARE ONLY ***\n"
147         ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
148         self.cvs_new_nv.sort()
149         for name in self.cvs_new_nv:
150             cvs_nvr = self.cvs[name]
151             pkg_nvr = self.pkg[name]
152             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])
153             if '.' in cvs_nvr[2]:
154                 ver_frac += msg
155             else:
156                 ver_int += msg
157         print(ver_int)
158         print(ver_frac)
159
160 p = Pkgs()
161
162 for d in dirs:
163     rpm_files = [f for f in os.listdir(d) if f[-8:] == '.src.rpm']
164     for rpm_file_name in rpm_files:
165         p.add_rpm(rpm_file_name[:-8])
166
167 p.prepare()
168
169 p.print_nv()
170 print("\n\n")
171 p.print_nvr()
This page took 0.095118 seconds and 3 git commands to generate.