2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
4 import sys, os, config, string, urllib, re
9 print "%d error(s) encountered... aborting" % errnum
21 print "mv: %s %s" % (src, dst)
26 self.requester_email=''
29 def __init__(self, name, tree):
44 self.tree.markedpkgs.append(self)
47 f=open(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', 'r')
48 for entry in f.readlines():
49 i=string.split(string.strip(entry), ':')
54 if not self.build.has_key(i[2]):
55 self.build[i[2]]=Build()
57 self.build[i[2]].requester=i[4]
58 elif i[3]=='requester_email':
59 self.build[i[2]].requester_email=i[4]
63 if not self.file.has_key(i[1]):
65 self.file[i[1]].append(i[2])
68 if self.info.has_key('move'):
72 f=open(self.tree.basedir+'/SRPMS/.metadata/'+name+'.src.rpm.info', 'w')
73 for bid in self.build.keys():
74 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n" % (bid, self.build[bid].requester, bid, self.build[bid].requester_email))
75 for key in self.info.keys():
76 f.write("info:%s:%s\n" % (key, string.join(self.info[key], ':')))
77 for arch in self.file.keys():
78 for rpm in self.file[arch]:
79 f.write("file:%s:%s\n" % (arch, rpm))
82 for arch in self.file.keys():
83 for rpm in self.file[arch]:
84 rm(self.tree.basedir+'/'+arch+'/RPMS/'+rpm)
85 rm(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info')
87 def move(self, dsttree):
88 if dsttree.has_key(self.name):
90 for arch in self.file.keys():
91 if arch in dsttree[self.name].file.keys():
92 for rpm in self.file[arch]:
93 rm(self.tree.basedir+'/'+arch+'/RPMS/'+rpm)
96 dsttree[self.name].file[arch]=self.file[arch]
97 for rpm in self.file[arch]:
98 mv(self.tree.basedir+'/'+arch+'/RPMS/'+rpm, dsttree.basedir+'/'+arch+'/RPMS/')
100 for bid in self.build.keys():
101 dsttree[self.name].build[bid]=self.build[bid]
102 dsttree[self.name].writeinfo()
103 rm(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info')
105 for arch in self.file.keys():
106 for rpm in self.file[arch]:
107 mv(self.tree.basedir+'/'+arch+'/RPMS/'+rpm, dsttree.basedir+'/'+arch+'/RPMS/')
108 mv(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', dsttree.basedir+'/SRPMS/.metadata/')
112 def __init__(self, tree, loadall=False):
113 self.basedir=config.value['ftp_dir']+'/'+tree
116 def filter_pkgs(pkg):
117 if not pkg[-13:]=='.src.rpm.info':
121 self.pkgnames=map(filter_pkgs, os.listdir(self.basedir+'/SRPMS/.metadata/'))
123 for i in self.pkgnames:
124 self.loadedpkgs[i]=Pkg(i, self)
125 def __getitem__(self, key):
126 if self.loadedpkgs.has_key(key):
127 return self.loadedpkgs[key]
128 elif key in self.pkgnames:
130 self.loadedpkgs[key]=pkg
134 def has_key(self, key):
135 if key in self.pkgnames:
140 def movepkgs(self, dsttree):
143 self.__checkarchs(dsttree)
145 self.__rmolderfromsrc()
146 self.__rmotherfromdst(dsttree)
148 for pkg in self.markedpkgs:
151 def markpkgs(self, wannabepkgs):
152 def chopoffextension(pkg):
153 found=pkg.find('.src.rpm')
158 for wannabepkg in wannabepkgs:
159 pkgname=chopoffextension(wannabepkg)
160 if pkgname in self.pkgnames:
161 if not pkgname in self.loadedpkgs.keys():
162 self.loadedpkgs[pkgname]=Pkg(pkgname, self)
163 self.loadedpkgs[pkgname].mark()
165 perror(pkgname+" was not found in source tree")
167 def __checkbuild(self):
168 #f=urllib.urlopen('http://ep09.pld-linux.org/~builderth/queue.txt')
171 reid=re.compile(r'^.*id=(.*) pri.*$')
172 regb=re.compile(r'^group:.*$|builders:.*$', re.M)
173 for i in re.findall(regb, f.read()):
175 id=reid.sub(r'\1', i)
178 requests[id]=requests[id]+i
180 for pkg in self.markedpkgs:
181 for bid in pkg.build.keys():
182 if requests.has_key(bid) and not requests[bid].find('?') == -1:
183 perror("Building of package %s (buildid %s) not finished" % (pkg,bid))
185 def __checkarchs(self, dsttree):
186 def find_other_pkgs(pkg, tree):
187 ziewre=re.compile(string.join(pkg.name.split('-')[:-2], '-')+'-[^-]*-[^-]*$')
188 def filter_other_pkgs(x):
189 if ziewre.match(x) and not x == pkg.name:
193 return filter(filter_other_pkgs, tree.pkgnames)
194 self.find_other_pkgs=find_other_pkgs
195 for pkg in self.markedpkgs:
196 otherpkgnames=find_other_pkgs(pkg, dsttree)
199 for somepkg in otherpkgnames:
200 curarchs.extend(Pkg(somepkg, dsttree).file.keys())
201 for arch in curarchs:
202 if arch not in pkg.file.keys():
203 missingarchs.append(arch)
205 perror('Moving pkg %s would remove archs: %s' % (pkg, missingarchs))
207 def __rmolderfromsrc(self):
208 def find_older_pkgs(pkg):
209 def filter_older_pkgs(x):
211 cur=pkg.name.split('-')
214 elif ziew[-2]==cur[-2]:
221 return filter(filter_older_pkgs, self.find_other_pkgs(pkg, self))
223 for pkg in self.markedpkgs:
224 olderpkgnames=find_older_pkgs(pkg)
225 for i in olderpkgnames:
226 Pkg(i, self).remove()
228 def __rmotherfromdst(self, dsttree):
229 for pkg in self.markedpkgs:
230 pkgnames=self.find_other_pkgs(pkg, dsttree)
232 Pkg(i, dsttree).remove()