sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
from config import incoming_dir, default_to, ftp_archs
import config
-from common import fileexists
+from common import noarchcachedir, tmpdir
+from baseftptree import BaseFtpTree, BasePkg
def log(msg):
print msg
return False
return filter(filterinfos, os.listdir(dir))
-def getsrcrpm(content):
- for line in content.splitlines():
- if line[:11]=='file:SRPMS:':
- return line.split(':')[2]
-
def getcontent(file):
f=open(file, 'r')
content=f.read()
else:
return content[:-4]
+ftptree=BaseFtpTree(config.value['default_to'])
+
for uploadinfo in findfiles(incoming_dir+'SRPMS'):
content=getcontent(incoming_dir+'SRPMS/'+uploadinfo)
if not content:
continue # Uploading not finished
- if fileexists(default_to+'SRPMS/.metadata/'+uploadinfo[:-11]+'.info'):
- f=open(default_to+'SRPMS/.metadata/'+uploadinfo[:-11]+'.info', 'a')
- for line in content.splitlines(True):
- if line[:5]=='file:':
- srpm=line.strip().split(':')[2]
- log("%s already present in %s; removing newer files" %
- (srpm, config.value['default_to']))
- rm(incoming_dir+'SRPMS/'+srpm)
- elif line[:5]=='info:':
- f.write(line)
- else:
- log("Uknown line in uploadinfo file: "+line.strip())
+ pkg=BasePkg(uploadinfo[:-19], content=content)
+ srpm=pkg.files['SRPMS'][0]
+
+ if ftptree.has_key(`pkg`):
+ log("%s already present in %s; removing newer files" %
+ (srpm, ftptree))
+ rm(incoming_dir+'SRPMS/'+srpm)
+ f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
+ bid=pkg.build.keys()[0]
+ build=pkg.build[bid]
+ f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
+ % (bid, build.requester, bid, build.requester_email))
f.close()
else:
- mv(incoming_dir+'SRPMS/'+getsrcrpm(content), default_to+'SRPMS/RPMS')
+ mv(incoming_dir+'SRPMS/'+srpm, default_to+'SRPMS/RPMS')
- f=open(default_to+'SRPMS/.metadata/'+uploadinfo[:-11]+'.info', 'w')
+ f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'w')
f.write(content)
f.close()
rm(incoming_dir+'SRPMS/'+uploadinfo)
-
-def getfiles(filename):
- f=open(filename, 'r')
- file={}
- noarch_arch={}
- for line in f.readlines():
- if line[:5]=='file:':
- entry=line.split(':')
- if not file.has_key(entry[1]):
- file[entry[1]]=[]
- file[entry[1]].append(entry[2])
- elif line[:17]=='info:noarch_arch:':
- entry=line.split(':')
- noarch_arch[entry[2]]=entry[3]
- f.close()
- return (file, noarch_arch)
-
+def send_noarch_msg(files_differ, reqs_differ):
+ pass
+
+def move_noarch(f, arch, rpm, dstpkg):
+ if dstpkg.noarch_arch.has_key(rpm):
+ os.system("rpm -qlp %s > %s/files.new" %
+ (incoming_dir+arch+'/'+rpm, tmpdir))
+ os.system("rpm -qRp %s |sort|uniq > %s/reqs.new" %
+ (incoming_dir+arch+'/'+rpm, tmpdir))
+
+ files_differ=False
+ reqs_differ=False
+
+ if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
+ (noarchcachedir, rpm, tmpdir, tmpdir)):
+ files_differ=True
+ if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
+ (noarchcachedir, rpm, tmpdir, tmpdir)):
+ reqs_differ=True
+
+ if files_differ or reqs_differ:
+ # TODO: sending this thing will be a little more problematic
+ # than I originally thought
+ #send_noarch_msg(files_differ, reqs_differ)
+ print 'files or reqs differ'
+
+ rm(incoming_dir+arch+'/'+rpm)
+ else:
+ os.system("rpm -qlp %s > %s/%s.filelist" %
+ (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
+ os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" %
+ (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
+ f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpm, rpm, arch))
+ mv(incoming_dir+arch+'/'+rpm, default_to+'noarch/RPMS')
for arch in ftp_archs:
for uploadinfo in findfiles(incoming_dir+arch):
if not content:
continue # Uploading not finished
- srcrpm=getsrcrpm(content)
- dstinfofile=default_to+'SRPMS/.metadata/'+srcrpm+'.info'
+ srcpkg=BasePkg(uploadinfo[:-19], content=content)
+ srpm=srcpkg.files['SRPMS'][0]
- if not fileexists(dstinfofile):
+ if not ftptree.has_key(`srcpkg`):
continue # We require the src.rpm to be present
- (files, noarch_arch)=getfiles(dstinfofile)
+ dstpkg=BasePkg(`srcpkg`, ftptree)
- if files.has_key(arch):
- log("files from %s for arch %s already present in %s; removing newer files" % (srcrpm, arch, config.value['default_to']))
- for line in content.splitlines():
- if line[:10]=='file:ARCH:':
- rpm=line.split(':')[2]
- rm(incoming_dir+arch+'/'+rpm)
+ if dstpkg.files.has_key(arch):
+ log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
+ for rpm in srcpkg.files['ARCH']:
+ rm(incoming_dir+arch+'/'+rpm)
rm(incoming_dir+arch+'/'+uploadinfo)
continue
- f=open(dstinfofile, 'a')
- for line in content.splitlines():
- if line[:10]=='file:ARCH:':
- rpm=line.split(':')[2]
+ f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
+ for rpm in srcpkg.files['ARCH']:
+ if rpm[-11:]=='.noarch.rpm':
+ move_noarch(f, arch, rpm, dstpkg)
+ else:
f.write("file:%s:%s\n" % (arch, rpm))
mv(incoming_dir+arch+'/'+rpm, default_to+arch+'/RPMS')
f.close()
# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
import string, config
+from common import fileexists
class Build:
def __init__(self):
self.requester_email=''
class BasePkg:
- def __init__(self, name, tree):
+ def __init__(self, name, tree=None, content=None):
self.files={}
self.info={}
self.build={}
+ self.noarch_arch={}
self.tree=tree
self.name=name
- self.load()
+ self.load(content)
def __repr__(self):
return self.name
- def load(self):
- f=open(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', 'r')
- for entry in f.readlines():
+ def load(self, content=None):
+ if content:
+ lines=content.splitlines()
+ else:
+ f=open("%s/SRPMS/.metadata/%s.src.rpm.info" %
+ (self.tree.basedir, self.name), 'r')
+ lines=f.readlines()
+ f.close()
+
+ for entry in lines:
i=string.split(string.strip(entry), ':')
if i[0] == 'info':
if len(i)==3:
self.build[i[2]].requester=i[4]
elif i[3]=='requester_email':
self.build[i[2]].requester_email=i[4]
+ elif i[1]=='noarch_arch':
+ self.noarch_arch[i[2]]=i[3]
else:
self.info[i[1]]=i[2:]
elif i[0] == 'file':
if not self.files.has_key(i[1]):
self.files[i[1]]=[]
self.files[i[1]].append(i[2])
- f.close()
class BaseFtpTree:
def __init__(self, tree):
def __repr__(self):
return self.treename
+ def has_key(self, key):
+ if fileexists(self.basedir+'/SRPMS/.metadata/'+key+'.src.rpm.info'):
+ return True
+ else:
+ return False
+