#!/usr/bin/env python # vi: encoding=utf-8 ts=8 sts=4 sw=4 et import sys, os, config, string, urllib, re def fileexists(path): try: os.stat(path) except OSError, (errno, errmsg): return False else: return True if len(sys.argv) < 4: print "Not enough parameters given" print "move.py src-tree dst-tree package1 [package2...]" sys.exit(1) srctree=config.value['ftp_dir']+'/'+sys.argv[1] dsttree=config.value['ftp_dir']+'/'+sys.argv[2] errnum=0 if not fileexists(srctree): print srctree + " does not exist" sys.exit(1) if not fileexists(dsttree): print dsttree + " does not exist" sys.exit(1) def normalizenames(pkgname): found=string.find(pkgname, '.src.rpm') if found==-1: return pkgname else: return pkgname[:found] pkgnames=map(normalizenames, sys.argv[3:]) class Pkg: def __init__(self, name, tree): self.file={} self.info={} f=open(tree+'/SRPMS/.metadata/'+name+'.src.rpm.info', 'r') for entry in f.readlines(): i=string.split(string.strip(entry), ':') if i[0] == 'info': if len(i)==3: if i[1]=='buildid': if not self.info.has_key(i[1]): self.info['buildid']=[i[2]] else: self.info['buildid'].append(i[2]) else: self.info[i[1]]=i[2] else: self.info[i[1]]=i[2:] elif i[0] == 'file': if not self.file.has_key(i[1]): self.file[i[1]]=[] self.file[i[1]].append(i[2]) f.close() pkglist={} for name in pkgnames: if not fileexists(srctree+'/SRPMS/.metadata/'+name+'.src.rpm.info'): errnum=errnum+1 print name+" was not found in source tree" else: pkglist[name]=Pkg(name, srctree) if not errnum == 0: print "%d error(s) encountered... aborting" % errnum sys.exit(1) #f=urllib.urlopen('http://ep09.pld-linux.org/~builderth/queue.txt') f=open('queue.txt') requests={} reid=re.compile(r'^.*id=(.*) pri.*$') for i in re.findall(re.compile(r'^group:.*$|builders:.*$', re.M), 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 pkglist.keys(): for bid in pkglist[pkg].info['buildid']: if requests.has_key(bid) and not requests[bid].find('?') == -1: errnum=errnum+1 print "Building of package %s (buildid %s) not finished" % (pkg,bid) if not errnum == 0: print "%d error(s) encountered... aborting" % errnum sys.exit(1) dsttreefiles=map(normalizenames, os.listdir(dsttree+'/SRPMS/.metadata/')) def find_other_pkgs(pkg): ziewre=re.compile(string.join(pkg.split('-')[:-2], '-')+'-[^-]*-[^-]*$') def filter_other_pkgs(x): if ziewre.match(x): return x else: return None return filter(filter_other_pkgs, dsttreefiles) for pkg in pkglist.keys(): otherpkgnames=find_other_pkgs(pkg) curarchs=[] missingarchs=[] for somepkg in otherpkgnames: curarchs.extend(Pkg(somepkg, dsttree).file.keys()) for arch in curarchs: if arch not in pkglist[pkg].file.keys(): missingarchs.append(arch) if missingarchs: errnum=errnum+1 print 'Moving pkg %s would remove archs: %s' % (pkg, missingarchs) if not errnum == 0: print "%d error(s) encountered... aborting" % errnum sys.exit(1)