]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame_incremental - bin/pfa-from-incoming
Check for duplicates only in packages that we are trying to mv.
[projects/pld-ftp-admin.git] / bin / pfa-from-incoming
... / ...
CommitLineData
1#!/usr/bin/env python
2# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4import sys, os, stat, time
5sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6from config import incoming_dir, default_to, ftp_archs
7from config import value as cval
8import config
9from common import noarchcachedir, tmpdir, fileexists
10from baseftptree import BaseFtpTree, BasePkg
11from ftptree import FtpTree, Pkg
12import ftpio
13
14def rm(file):
15 os.remove(file)
16
17def mv(src, dst):
18 os.rename(src, dst + '/' + src.split('/')[-1])
19
20# duplicate code in ftptree.py
21def is_debuginfo(nvr):
22 """
23 returns true if NVR is debuginfo package and separate debuginfo is enabled
24 """
25 if not config.separate_debuginfo:
26 return False
27 pkg = nvr.split('-')[:-2]
28 return pkg[-1] == 'debuginfo'
29
30def findfiles(dir):
31 def filterinfos(x):
32 if x[-11:] == '.uploadinfo':
33 return True
34 else:
35 return False
36 return filter(filterinfos, os.listdir(dir))
37
38def getcontent(file):
39 f = open(file, 'r')
40 content = f.read()
41 f.close()
42 if not content[-5:] == '\nEND\n':
43 return None
44 else:
45 return content[:-4]
46
47def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
48 req_email=pkg.build[pkg.lastbid].requester_email
49 req_bid=pkg.lastbid
50 cc_list=[]
51 if 'logs_list' in cval:
52 cc_list.append(cval['logs_list'])
53 m_subject="Noarch error: %s files differ among builders" % rpmfile
54 bids=pkg.build.keys()
55 if len(bids)>1:
56 for bid in bids:
57 newcc=pkg.build[bid].requester_email
58 if req_email!=newcc and newcc not in cc_list:
59 cc_list.append(newcc)
60
61 msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
62 if cc_list:
63 msg=msg+"Cc: %s\n" % ", ".join(cc_list)
64 msg=msg+"""X-PLD-Builder: %s
65References: <%s@pld.src.builder>
66In-Reply-To: <%s@pld.src.builder>
67Subject: %s
68
69""" % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
70
71 sm = os.popen("/usr/sbin/sendmail -t", "w")
72
73 sm.write(msg)
74
75 if files_differ:
76 f=open("%s/files.diff" % tmpdir, 'r')
77 sm.write("Difference between %s (currently in %s) and %s FILES\n" %
78 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
79 for line in f.readlines(True)[2:]:
80 sm.write(line)
81 f.close()
82
83 sm.write('\n')
84
85 if reqs_differ:
86 f=open("%s/reqs.diff" % tmpdir, 'r')
87 sm.write("Difference between %s (currently in %s) and %s REQS\n" %
88 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
89 for line in f.readlines(True)[2:]:
90 sm.write(line)
91 f.close()
92
93 sm.close()
94
95def move_noarch(f, arch, rpmfile, dstpkg):
96 if dstpkg.noarch_arch.has_key(rpmfile):
97 os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
98 (incoming_dir + arch + '/' + rpmfile, tmpdir))
99 os.system("rpm -qRp %s | LC_ALL=C sort | uniq > %s/reqs.new" %
100 (incoming_dir + arch + '/' + rpmfile, tmpdir))
101
102 files_differ = False
103 reqs_differ = False
104
105 if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
106 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
107 files_differ = True
108 if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
109 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
110 reqs_differ = True
111
112 if files_differ or reqs_differ:
113 send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
114
115 rm(incoming_dir + arch + '/' + rpmfile)
116 else:
117 os.system("rpm -qlp %s > %s/%s.filelist" %
118 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
119 os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" %
120 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
121 f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpmfile, rpmfile, arch))
122 mv(incoming_dir + arch + '/' + rpmfile, default_to + 'noarch/RPMS')
123
124# main()
125try:
126 ftpio.connect('from-incoming-pid-%s' % os.getpid())
127except:
128 sys.exit(0)
129
130ftptree = BaseFtpTree(cval['default_to'])
131
132if not ftpio.lock(cval['default_to']):
133 sys.exit(0)
134
135for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
136 content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
137 if not content:
138 continue # Uploading not finished
139
140 pkg = BasePkg(uploadinfo[:-19], content = content)
141 srpm = pkg.files['SRPMS'][0]
142
143 if ftptree.has_key(`pkg`):
144 ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree))
145 rm(incoming_dir + 'SRPMS/' + srpm)
146 f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
147 bid = pkg.build.keys()[0]
148 build = pkg.build[bid]
149 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
150 % (bid, build.requester, bid, build.requester_email))
151 f.close()
152 else:
153 mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
154
155 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
156 f.write(content)
157 f.close()
158
159 rm(incoming_dir + 'SRPMS/' + uploadinfo)
160
161for arch in ftp_archs:
162 for uploadinfo in findfiles(incoming_dir + arch):
163 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
164 if not content:
165 print "%s not finished uploading" % uploadinfo
166 continue # Uploading not finished
167
168 srcpkg = BasePkg(uploadinfo[:-19], content = content)
169 srpm = srcpkg.files['SRPMS'][0]
170
171 if not ftptree.has_key(`srcpkg`):
172 continue # We require the src.rpm to be present
173
174 dstpkg = BasePkg(`srcpkg`, ftptree)
175
176 if dstpkg.files.has_key(arch):
177 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
178 for rpmfile in srcpkg.files['ARCH']:
179 try:
180 rm(incoming_dir + arch + '/'+rpmfile)
181 except OSError, e:
182 l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
183 ftpio.log(l)
184 print l
185 rm(incoming_dir + arch + '/' + uploadinfo)
186 continue
187
188 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
189 for rpmfile in srcpkg.files['ARCH']:
190 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
191 move_noarch(f, arch, rpmfile, dstpkg)
192 else:
193 f.write("file:%s:%s\n" % (arch, rpmfile))
194 srcfile = incoming_dir + arch + '/' + rpmfile
195
196 if is_debuginfo(rpmfile):
197 dstfile = default_to + arch + '/debuginfo'
198 else:
199 dstfile = default_to + arch + '/RPMS'
200
201 try:
202 mv(srcfile, dstfile)
203 except OSError, e:
204 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
205 ftpio.log(l)
206 print l
207 f.close()
208
209 rm(incoming_dir + arch + '/' + uploadinfo)
210
211ftpio.unlock(cval['default_to'])
This page took 0.02534 seconds and 4 git commands to generate.