]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - wwwbin/ftp-freshness.py
Use RPM Python API for spec parsing
[projects/pld-ftp-admin.git] / wwwbin / ftp-freshness.py
CommitLineData
ed1ec331
ER
1#!/usr/bin/python
2# arekm, 2007
3
4import os
5import re
ed1ec331 6import rpm
4fa927db 7import struct
ed1ec331 8import subprocess
4fa927db 9import sys
ed1ec331
ER
10
11# earlier == more important
12dirs = [ "/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" ]
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
ER
28class 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$')
4fa927db
JR
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])
ed1ec331
ER
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):
4fa927db
JR
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 ('','','')
ed1ec331
ER
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 print "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***"
122 for name in self.cvs_new_nvr:
123 self.cvs_new_nvr.sort()
124 cvs_nvr = self.cvs[name]
125 pkg_nvr = self.pkg[name]
3a72e9a1 126 print "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
ed1ec331
ER
127
128 def print_nv(self):
129 print "*** VERSION COMPARE ONLY ***"
130 self.cvs_new_nv.sort()
131 for name in self.cvs_new_nv:
132 cvs_nvr = self.cvs[name]
133 pkg_nvr = self.pkg[name]
3a72e9a1 134 print "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
ed1ec331
ER
135
136p = Pkgs()
137
138for d in dirs:
139 for rpm_file_name in os.listdir(d):
140 p.add_rpm(rpm_file_name)
141
142p.prepare()
143
144p.print_nv()
145print "\n\n"
146p.print_nvr()
This page took 0.593156 seconds and 4 git commands to generate.