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"
18 if os.path.isdir(specsdir):
22 cmd = ['git', 'clone', '--depth=1', 'git://git.pld-linux.org/SPECS', specsdir]
24 p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
25 (out, err) = p.communicate(None)
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', '#')
43 def __clean_macros(self):
44 for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']:
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])
51 def __get_from_rpm(self, file_name):
52 m = self.re_n.match(file_name)
55 name = m.group(1).strip()
56 version = m.group(2).strip()
57 release = m.group(3).strip()
58 return (name, version, release)
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
65 print >>sys.stderr, 'Processing: %s.spec' % name
68 s = self.ts.parseSpec(spec)
69 header = s.headers()[0]
70 name = header[rpm.RPMTAG_NAME]
71 version = header[rpm.RPMTAG_VERSION]
72 release = header[rpm.RPMTAG_RELEASE].partition('@')[0]
73 return (name, version, release)
75 print >>sys.stderr, 'Failed to parse: %s.spec' % name
78 def __update_cvs(self, name):
79 if not self.cvs.has_key(name):
80 self.cvs[name] = self.__get_from_cvs(name)
82 def __update_new(self, name):
83 cvs_nvr = self.cvs[name]
84 pkg_nvr = self.pkg[name]
86 cvs_rpm_vr = rpm.labelCompare(cvs_nvr, pkg_nvr)
87 cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], ""))
88 rpm_cvs_vr = rpm.labelCompare(pkg_nvr, cvs_nvr)
89 rpm_cvs_v = rpm.labelCompare((pkg_nvr[0], pkg_nvr[1], ""), (cvs_nvr[0], cvs_nvr[1], ""))
91 if rpm_cvs_v < 0 and cvs_rpm_v > 0:
92 self.cvs_new_nv.append(name)
94 if rpm_cvs_vr < 0 and cvs_rpm_vr > 0 and cvs_nvr[1] == pkg_nvr[1]:
95 self.cvs_new_nvr.append(name)
98 self.cvs_new_nvr.sort()
99 self.cvs_new_nvr = list(set(self.cvs_new_nvr))
100 self.cvs_new_nv.sort()
101 self.cvs_new_nv = list(set(self.cvs_new_nv))
103 pkgs = list(self.pkg) + list(self.cvs)
105 for name in list(set(pkgs)):
106 self.__update_new(name)
108 def add_rpm(self, file_name):
109 nvr = self.__get_from_rpm(file_name)
113 if self.pkg.has_key(name):
114 if rpm.labelCompare(nvr, self.pkg[name]) > 0:
119 self.__update_cvs(name)
122 ver_int = "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***\n"
123 ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
124 for name in self.cvs_new_nvr:
125 self.cvs_new_nvr.sort()
126 cvs_nvr = self.cvs[name]
127 pkg_nvr = self.pkg[name]
128 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])
129 if '.' in cvs_nvr[2]:
137 ver_int = "*** VERSION COMPARE ONLY ***\n"
138 ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
139 self.cvs_new_nv.sort()
140 for name in self.cvs_new_nv:
141 cvs_nvr = self.cvs[name]
142 pkg_nvr = self.pkg[name]
143 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])
144 if '.' in cvs_nvr[2]:
154 for rpm_file_name in os.listdir(d):
155 p.add_rpm(rpm_file_name)