]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - wwwbin/ftp-freshness.py
Switch to Python 3 for rpm.org rpm
[projects/pld-ftp-admin.git] / wwwbin / ftp-freshness.py
CommitLineData
a1e62e44 1#!/usr/bin/python3
ed1ec331
ER
2# arekm, 2007
3
94960bbc
JR
4from __future__ import print_function
5
ed1ec331 6import os
ed1ec331
ER
7import rpm
8import subprocess
4fa927db 9import sys
ed1ec331
ER
10
11# earlier == more important
12dirs = [ "/home/ftp/pub/Linux/PLD/dists/th/test/SRPMS/RPMS/",
6148027d
JR
13 "/home/ftp/pub/Linux/PLD/dists/th/ready/SRPMS/RPMS/",
14 "/home/ftp/pub/Linux/PLD/dists/th/PLD/SRPMS/RPMS/" ]
ed1ec331 15#dirs = [ "/home/pld/admins/th/1" ]
c8ce29df
KK
16specsdir = "/home/pld/admins/th/SPECS"
17
18if os.path.isdir(specsdir):
3a72e9a1 19 os.chdir(specsdir)
c8ce29df
KK
20 cmd = ['git', 'pull']
21else:
22 cmd = ['git', 'clone', '--depth=1', 'git://git.pld-linux.org/SPECS', specsdir]
ed1ec331 23
ed1ec331
ER
24p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
25(out, err) = p.communicate(None)
ed1ec331 26
c8ce29df 27os.chdir(specsdir)
ed1ec331 28class Pkgs(object):
6148027d
JR
29 def __init__(self):
30 self.pkg = {}
31 self.cvs = {}
32 self.cvs_new_nvr = []
33 self.cvs_new_nv = []
6148027d
JR
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', '#')
6fb44dac
JR
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)
6148027d
JR
49
50 def __clean_macros(self):
6fb44dac
JR
51 if sys.version_info[0] == 3:
52 rpm.reloadConfig()
6148027d
JR
53 for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']:
54 rpm.delMacro(macro)
6fb44dac
JR
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])
6148027d 60
6148027d
JR
61 def __get_from_cvs(self, name):
62 spec = os.path.join(specsdir, name + '.spec')
63 if not os.path.isfile(spec):
6fb44dac 64 self.__print_stderr('Spec file does not exist: %s' % spec)
6148027d 65 return ('','','')
6fb44dac 66 self.__print_stderr('Processing: %s.spec' % name)
6148027d
JR
67 self.__clean_macros()
68 try:
6fb44dac
JR
69 if sys.version_info[0] == 2:
70 s = self.ts.parseSpec(spec)
62e0054a 71 header = s.headers()[0]
6fb44dac
JR
72 else:
73 s = rpm.spec(spec)
74 header = s.sourceHeader
473a62fc
JR
75 name = header[rpm.RPMTAG_NAME]
76 version = header[rpm.RPMTAG_VERSION]
77 release = header[rpm.RPMTAG_RELEASE].partition('@')[0]
6148027d 78 return (name, version, release)
6fb44dac
JR
79 except (ValueError, rpm.error):
80 self.__print_stderr('Failed to parse: %s.spec' % name)
6148027d
JR
81 return ('','','')
82
83 def __update_cvs(self, name):
57e1c0c3 84 if name not in self.cvs:
6148027d
JR
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
6fb44dac
JR
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
6148027d 99
0edb3c55 100 if cvs_rpm_v > 0:
6148027d 101 self.cvs_new_nv.append(name)
0edb3c55
JR
102 return
103 if cvs_rpm_vr > 0:
104 self.cvs_new_nvr.append(name)
6148027d
JR
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):
57e1c0c3 118 nvr = tuple(file_name.rsplit('-', 2))
6148027d 119 name = nvr[0]
57e1c0c3 120 if name in self.pkg:
6fb44dac
JR
121 try:
122 if rpm.labelCompare(nvr, self.pkg[name]) > 0:
123 self.pkg[name] = nvr
124 except ValueError:
125 pass
6148027d
JR
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]
30919785 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])
6148027d
JR
138 if '.' in cvs_nvr[2]:
139 ver_frac += msg
140 else:
141 ver_int += msg
94960bbc
JR
142 print(ver_int)
143 print(ver_frac)
6148027d
JR
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
94960bbc
JR
157 print(ver_int)
158 print(ver_frac)
ed1ec331
ER
159
160p = Pkgs()
161
162for d in dirs:
57e1c0c3
JR
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])
ed1ec331
ER
166
167p.prepare()
168
169p.print_nv()
94960bbc 170print("\n\n")
ed1ec331 171p.print_nvr()
This page took 1.340003 seconds and 4 git commands to generate.