]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - 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
38b2b764
MM
1#!/usr/bin/env python
2# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
b2ef6244 4import sys, os, stat, time
38b2b764
MM
5sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6from config import incoming_dir, default_to, ftp_archs
8e089d4f 7from config import value as cval
38b2b764 8import config
acd976ec 9from common import noarchcachedir, tmpdir, fileexists
bb2cb325 10from baseftptree import BaseFtpTree, BasePkg
8e089d4f 11from ftptree import FtpTree, Pkg
0a108b7f 12import ftpio
38b2b764
MM
13
14def rm(file):
18c8e935 15 os.remove(file)
38b2b764
MM
16
17def mv(src, dst):
8911f226 18 os.rename(src, dst + '/' + src.split('/')[-1])
38b2b764 19
54ff0049
ER
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
38b2b764
MM
30def findfiles(dir):
31 def filterinfos(x):
8911f226 32 if x[-11:] == '.uploadinfo':
76dc40c3 33 return True
38b2b764
MM
34 else:
35 return False
36 return filter(filterinfos, os.listdir(dir))
37
38b2b764 38def getcontent(file):
8911f226
ER
39 f = open(file, 'r')
40 content = f.read()
38b2b764 41 f.close()
8911f226 42 if not content[-5:] == '\nEND\n':
38b2b764
MM
43 return None
44 else:
45 return content[:-4]
46
8e089d4f 47def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
200470c5
MM
48 req_email=pkg.build[pkg.lastbid].requester_email
49 req_bid=pkg.lastbid
50 cc_list=[]
0fa16f20
MM
51 if 'logs_list' in cval:
52 cc_list.append(cval['logs_list'])
8e089d4f 53 m_subject="Noarch error: %s files differ among builders" % rpmfile
200470c5
MM
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")
8e089d4f 72
200470c5
MM
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" %
8e089d4f 78 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
200470c5
MM
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" %
8e089d4f 88 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
200470c5
MM
89 for line in f.readlines(True)[2:]:
90 sm.write(line)
91 f.close()
92
93 sm.close()
94
8e089d4f
ER
95def move_noarch(f, arch, rpmfile, dstpkg):
96 if dstpkg.noarch_arch.has_key(rpmfile):
9c19d8c9 97 os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
8e089d4f 98 (incoming_dir + arch + '/' + rpmfile, tmpdir))
9c19d8c9 99 os.system("rpm -qRp %s | LC_ALL=C sort | uniq > %s/reqs.new" %
8e089d4f 100 (incoming_dir + arch + '/' + rpmfile, tmpdir))
bb2cb325 101
8911f226
ER
102 files_differ = False
103 reqs_differ = False
bb2cb325
MM
104
105 if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
8e089d4f 106 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
8911f226 107 files_differ = True
bb2cb325 108 if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
8e089d4f 109 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
8911f226 110 reqs_differ = True
bb2cb325
MM
111
112 if files_differ or reqs_differ:
8e089d4f 113 send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
bb2cb325 114
8e089d4f 115 rm(incoming_dir + arch + '/' + rpmfile)
bb2cb325
MM
116 else:
117 os.system("rpm -qlp %s > %s/%s.filelist" %
8e089d4f
ER
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')
38b2b764 123
e4b21e2b
ER
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')
8e089d4f 154
e4b21e2b
ER
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
38b2b764 161for arch in ftp_archs:
8e089d4f 162 for uploadinfo in findfiles(incoming_dir + arch):
8911f226 163 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
38b2b764 164 if not content:
8911f226 165 print "%s not finished uploading" % uploadinfo
38b2b764
MM
166 continue # Uploading not finished
167
8911f226
ER
168 srcpkg = BasePkg(uploadinfo[:-19], content = content)
169 srpm = srcpkg.files['SRPMS'][0]
38b2b764 170
bb2cb325 171 if not ftptree.has_key(`srcpkg`):
38b2b764
MM
172 continue # We require the src.rpm to be present
173
8911f226 174 dstpkg = BasePkg(`srcpkg`, ftptree)
38b2b764 175
bb2cb325 176 if dstpkg.files.has_key(arch):
0a108b7f 177 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
8e089d4f 178 for rpmfile in srcpkg.files['ARCH']:
2eb653d6 179 try:
8e089d4f 180 rm(incoming_dir + arch + '/'+rpmfile)
2eb653d6 181 except OSError, e:
8e089d4f 182 l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
2eb653d6
AM
183 ftpio.log(l)
184 print l
8911f226 185 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764
MM
186 continue
187
8911f226 188 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
8e089d4f
ER
189 for rpmfile in srcpkg.files['ARCH']:
190 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
191 move_noarch(f, arch, rpmfile, dstpkg)
bb2cb325 192 else:
8e089d4f
ER
193 f.write("file:%s:%s\n" % (arch, rpmfile))
194 srcfile = incoming_dir + arch + '/' + rpmfile
8911f226 195
8e089d4f 196 if is_debuginfo(rpmfile):
54ff0049
ER
197 dstfile = default_to + arch + '/debuginfo'
198 else:
199 dstfile = default_to + arch + '/RPMS'
8911f226 200
631d11b9 201 try:
8911f226 202 mv(srcfile, dstfile)
631d11b9 203 except OSError, e:
8911f226 204 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
631d11b9
AM
205 ftpio.log(l)
206 print l
38b2b764
MM
207 f.close()
208
8911f226 209 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764 210
0a108b7f 211ftpio.unlock(cval['default_to'])
This page took 0.114793 seconds and 4 git commands to generate.