2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
5 sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6 from config import incoming_dir, default_to, ftp_archs
8 from common import noarchcachedir, tmpdir, fileexists
9 from baseftptree import BaseFtpTree, BasePkg
14 ftpio.connect('from-incoming')
23 os.rename(src, dst+'/'+src.split('/')[-1])
24 #print "mv: %s %s" % (src, dst+'/'+src.split('/')[-1])
28 if x[-11:]=='.uploadinfo':
32 return filter(filterinfos, os.listdir(dir))
38 if not content[-5:]=='\nEND\n':
43 ftptree=BaseFtpTree(cval['default_to'])
45 if not ftpio.lock(cval['default_to']):
48 for uploadinfo in findfiles(incoming_dir+'SRPMS'):
49 content=getcontent(incoming_dir+'SRPMS/'+uploadinfo)
51 continue # Uploading not finished
53 pkg=BasePkg(uploadinfo[:-19], content=content)
54 srpm=pkg.files['SRPMS'][0]
56 if ftptree.has_key(`pkg`):
57 ftpio.log("%s already present in %s; removing newer files" %
59 rm(incoming_dir+'SRPMS/'+srpm)
60 f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
61 bid=pkg.build.keys()[0]
63 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
64 % (bid, build.requester, bid, build.requester_email))
67 mv(incoming_dir+'SRPMS/'+srpm, default_to+'SRPMS/RPMS')
69 f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'w')
73 rm(incoming_dir+'SRPMS/'+uploadinfo)
75 def send_noarch_msg(files_differ, reqs_differ, pkg, rpm, arch):
76 req_email=pkg.build[pkg.lastbid].requester_email
79 m_subject="Noarch error: %s files differ among builders" % rpm
83 newcc=pkg.build[bid].requester_email
84 if req_email!=newcc and newcc not in cc_list:
87 msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
89 msg=msg+"Cc: %s\n" % ", ".join(cc_list)
90 msg=msg+"""X-PLD-Builder: %s
91 References: <%s@pld.src.builder>
92 In-Reply-To: <%s@pld.src.builder>
95 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
97 sm = os.popen("/usr/sbin/sendmail -t", "w")
102 f=open("%s/files.diff" % tmpdir, 'r')
103 sm.write("Difference between %s (currently in %s) and %s FILES\n" %
104 (pkg.noarch_arch[rpm], `ftptree`, arch)),
105 for line in f.readlines(True)[2:]:
112 f=open("%s/reqs.diff" % tmpdir, 'r')
113 sm.write("Difference between %s (currently in %s) and %s REQS\n" %
114 (pkg.noarch_arch[rpm], `ftptree`, arch)),
115 for line in f.readlines(True)[2:]:
123 def move_noarch(f, arch, rpm, dstpkg):
124 if dstpkg.noarch_arch.has_key(rpm):
125 os.system("rpm -qlp %s > %s/files.new" %
126 (incoming_dir+arch+'/'+rpm, tmpdir))
127 os.system("rpm -qRp %s |sort|uniq > %s/reqs.new" %
128 (incoming_dir+arch+'/'+rpm, tmpdir))
133 if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
134 (noarchcachedir, rpm, tmpdir, tmpdir)):
136 if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
137 (noarchcachedir, rpm, tmpdir, tmpdir)):
140 if files_differ or reqs_differ:
141 send_noarch_msg(files_differ, reqs_differ, dstpkg, rpm, arch)
143 rm(incoming_dir+arch+'/'+rpm)
145 os.system("rpm -qlp %s > %s/%s.filelist" %
146 (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
147 os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" %
148 (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
149 f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpm, rpm, arch))
150 mv(incoming_dir+arch+'/'+rpm, default_to+'noarch/RPMS')
152 for arch in ftp_archs:
153 for uploadinfo in findfiles(incoming_dir+arch):
154 content=getcontent(incoming_dir+arch+'/'+uploadinfo)
156 continue # Uploading not finished
158 srcpkg=BasePkg(uploadinfo[:-19], content=content)
159 srpm=srcpkg.files['SRPMS'][0]
161 if not ftptree.has_key(`srcpkg`):
162 continue # We require the src.rpm to be present
164 dstpkg=BasePkg(`srcpkg`, ftptree)
166 if dstpkg.files.has_key(arch):
167 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
168 for rpm in srcpkg.files['ARCH']:
169 rm(incoming_dir+arch+'/'+rpm)
170 rm(incoming_dir+arch+'/'+uploadinfo)
173 f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
174 for rpm in srcpkg.files['ARCH']:
175 if rpm[-11:]=='.noarch.rpm':
176 move_noarch(f, arch, rpm, dstpkg)
178 f.write("file:%s:%s\n" % (arch, rpm))
179 mv(incoming_dir+arch+'/'+rpm, default_to+arch+'/RPMS')
182 rm(incoming_dir+arch+'/'+uploadinfo)
184 ftpio.unlock(cval['default_to'])