# vi: encoding=utf-8 ts=8 sts=4 sw=4 et import sys, os, config, string, urllib, re from common import fileexists, noarchcachedir from baseftptree import BasePkg, BaseFtpTree errnum=0 def bailoutonerror(): if not errnum == 0: print "%d error(s) encountered... aborting" % errnum sys.exit(1) def pinfo(msg): print msg def perror(msg): global errnum errnum=errnum+1 print msg def rm(file): os.remove(file) #print 'rm: '+file def mv(src, dst): os.rename(src, dst+'/'+src.split('/')[-1]) #print "mv: %s %s" % (src, dst+'/'+src.split('/')[-1]) class Pkg(BasePkg): def __init__(self, name, tree): self.marked4removal=False self.marked4moving=False BasePkg.__init__(self, name, tree) def mark4moving(self): if not self.marked4moving: self.tree.marked4moving.append(self) self.marked4moving=True def mark4removal(self): if not self.marked4removal: self.tree.marked4removal.append(self) self.marked4removal=True def load(self, content=None): BasePkg.load(self, content) if self.info.has_key('move'): self.mark4moving() def writeinfo(self): f=open(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', 'w') for bid in self.build.keys(): 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)) for key in self.info.keys(): f.write("info:%s:%s\n" % (key, string.join(self.info[key], ':'))) for arch in self.files.keys(): for rpm in self.files[arch]: f.write("file:%s:%s\n" % (arch, rpm)) def remove(self): for arch in self.files.keys(): for rpm in self.files[arch]: rm(self.tree.basedir+'/'+arch+'/RPMS/'+rpm) if arch=='noarch': if fileexists(noarchcachedir+rpm+'.filelist'): rm(noarchcachedir+rpm+'.filelist') if fileexists(noarchcachedir+rpm+'.reqlist'): rm(noarchcachedir+rpm+'.reqlist') rm(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info') def move(self, dsttree): if dsttree.has_key(self.name): movedany=False for arch in self.files.keys(): if arch in dsttree[self.name].files.keys(): pinfo("Arch %s for %s is already present in dest tree; removing from srctree" % (arch, self.name)) for rpm in self.files[arch]: rm(self.tree.basedir+'/'+arch+'/RPMS/'+rpm) else: movedany=True dsttree[self.name].files[arch]=self.files[arch] for rpm in self.files[arch]: mv(self.tree.basedir+'/'+arch+'/RPMS/'+rpm, dsttree.basedir+'/'+arch+'/RPMS/') if movedany: for bid in self.build.keys(): dsttree[self.name].build[bid]=self.build[bid] dsttree[self.name].writeinfo() rm(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info') else: for arch in self.files.keys(): for rpm in self.files[arch]: mv(self.tree.basedir+'/'+arch+'/RPMS/'+rpm, dsttree.basedir+'/'+arch+'/RPMS/') mv(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', dsttree.basedir+'/SRPMS/.metadata/') class FtpTree(BaseFtpTree): def __init__(self, tree, loadall=False): BaseFtpTree.__init__(self, tree) self.loadedpkgs={} self.marked4removal=[] self.marked4moving=[] self.pkgnames=[] self.__loadpkgnames() if loadall: for pkgname in self.pkgnames: self.loadedpkgs[pkgname]=Pkg(pkgname, self) def __getitem__(self, key): if self.loadedpkgs.has_key(key): return self.loadedpkgs[key] elif key in self.pkgnames: pkg=Pkg(key, self) self.loadedpkgs[key]=pkg return pkg else: raise KeyError, key def has_key(self, key): if key in self.pkgnames: return True else: return False def keys(self): return self.pkgnames def testmove(self, dsttree): self.__checkbuild() self.__checkarchs(dsttree) def movepkgs(self, dsttree): self.__checkbuild() bailoutonerror() self.__checkarchs(dsttree) bailoutonerror() self.__rmolderfromsrc() self.__rmotherfromdst(dsttree) for pkg in self.marked4moving: pkg.move(dsttree) def removepkgs(self): for pkg in self.marked4removal: pkg.remove() def mark4removal(self, wannabepkgs): self.__mark4something(wannabepkgs, Pkg.mark4removal) def mark4moving(self, wannabepkgs): self.__mark4something(wannabepkgs, Pkg.mark4moving) # Internal functions below def __loadpkgnames(self): def checkfiletype(name): if name[-13:]=='.src.rpm.info': return True else: return False list=filter(checkfiletype, os.listdir(self.basedir+'/SRPMS/.metadata')) self.pkgnames=map((lambda x: x[:-13]), list) def __mark4something(self, wannabepkgs, markfunction): def chopoffextension(pkg): found=pkg.find('.src.rpm') if found==-1: return pkg else: return pkg[:found] for wannabepkg in wannabepkgs: pkgname=chopoffextension(wannabepkg) if pkgname in self.pkgnames: if not pkgname in self.loadedpkgs.keys(): self.loadedpkgs[pkgname]=Pkg(pkgname, self) markfunction(self.loadedpkgs[pkgname]) else: perror(pkgname+" was not found in source tree") bailoutonerror() def __checkbuild(self): f=urllib.urlopen('http://ep09.pld-linux.org/~builderth/queue.txt') #f=open('queue.txt') requests={} reid=re.compile(r'^.*id=(.*) pri.*$') regb=re.compile(r'^group:.*$|builders:.*$', re.M) for i in re.findall(regb, f.read()): if i[0]=='g': id=reid.sub(r'\1', i) requests[id]="" elif i[0]=='b': requests[id]=requests[id]+i f.close() for pkg in self.marked4moving: for bid in pkg.build.keys(): if requests.has_key(bid) and not requests[bid].find('?') == -1: perror("Building of package %s (buildid %s) not finished" % (pkg,bid)) def __checkarchs(self, dsttree): for pkg in self.marked4moving: otherpkgnames=self.__find_other_pkgs(pkg, dsttree) curarchs=[] missingarchs=[] for somepkg in otherpkgnames: curarchs.extend(Pkg(somepkg, dsttree).files.keys()) for arch in curarchs: if arch not in pkg.files.keys(): missingarchs.append(arch) if missingarchs: perror('Moving %s would remove archs: %s' % (pkg, missingarchs)) def __rmolderfromsrc(self): for pkg in self.marked4moving: olderpkgnames=self.__find_older_pkgs(pkg) for i in olderpkgnames: Pkg(i, self).remove() def __rmotherfromdst(self, dsttree): for pkg in self.marked4moving: pkgnames=self.__find_other_pkgs(pkg, dsttree) for i in pkgnames: Pkg(i, dsttree).remove() # Used more than once filter functions def __find_other_pkgs(self, pkg, tree): ziewre=re.compile(string.join(pkg.name.split('-')[:-2], '-')+'-[^-]*-[^-]*$') def filter_other_pkgs(x): if ziewre.match(x) and not x == pkg.name: return True else: return False return filter(filter_other_pkgs, tree.pkgnames) def __find_older_pkgs(self, pkg): def filter_older_pkgs(x): checking=x.split('-') curpkg=pkg.name.split('-') if checking[-2]