]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - bin/pfa-from-incoming
- wrap separate calls and loops into single pipe in pkg2src
[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
7c2f5e4c
AM
135moved_anything = False
136
e4b21e2b
ER
137for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
138 content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
139 if not content:
140 continue # Uploading not finished
141
142 pkg = BasePkg(uploadinfo[:-19], content = content)
143 srpm = pkg.files['SRPMS'][0]
144
46d96a92
AM
145 if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
146 ftpio.log("%s file missing; skipping move until next round" % (srpm))
147 continue
148
e4b21e2b
ER
149 if ftptree.has_key(`pkg`):
150 ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree))
151 rm(incoming_dir + 'SRPMS/' + srpm)
152 f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
153 bid = pkg.build.keys()[0]
154 build = pkg.build[bid]
155 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
156 % (bid, build.requester, bid, build.requester_email))
157 f.close()
158 else:
159 mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
8e089d4f 160
e4b21e2b
ER
161 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
162 f.write(content)
163 f.close()
164
165 rm(incoming_dir + 'SRPMS/' + uploadinfo)
166
38b2b764 167for arch in ftp_archs:
8e089d4f 168 for uploadinfo in findfiles(incoming_dir + arch):
8911f226 169 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
38b2b764 170 if not content:
2abd3b77 171 ftpio.log("%s not finished uploading" % uploadinfo)
38b2b764
MM
172 continue # Uploading not finished
173
8911f226
ER
174 srcpkg = BasePkg(uploadinfo[:-19], content = content)
175 srpm = srcpkg.files['SRPMS'][0]
38b2b764 176
bb2cb325 177 if not ftptree.has_key(`srcpkg`):
38b2b764
MM
178 continue # We require the src.rpm to be present
179
46d96a92
AM
180 rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
181 if len(rpmfile_missing):
182 for filem in rpmfile_missing:
183 ftpio.log("%s file missing; skipping move until next round" % (filem))
184 continue
185
8911f226 186 dstpkg = BasePkg(`srcpkg`, ftptree)
38b2b764 187
bb2cb325 188 if dstpkg.files.has_key(arch):
0a108b7f 189 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
8e089d4f 190 for rpmfile in srcpkg.files['ARCH']:
2eb653d6 191 try:
8e089d4f 192 rm(incoming_dir + arch + '/'+rpmfile)
2eb653d6 193 except OSError, e:
8e089d4f 194 l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
2eb653d6
AM
195 ftpio.log(l)
196 print l
8911f226 197 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764
MM
198 continue
199
8911f226 200 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
8e089d4f 201 for rpmfile in srcpkg.files['ARCH']:
7c2f5e4c 202 moved_anything = True
8e089d4f
ER
203 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
204 move_noarch(f, arch, rpmfile, dstpkg)
bb2cb325 205 else:
8e089d4f
ER
206 f.write("file:%s:%s\n" % (arch, rpmfile))
207 srcfile = incoming_dir + arch + '/' + rpmfile
8911f226 208
8e089d4f 209 if is_debuginfo(rpmfile):
54ff0049
ER
210 dstfile = default_to + arch + '/debuginfo'
211 else:
212 dstfile = default_to + arch + '/RPMS'
8911f226 213
631d11b9 214 try:
8911f226 215 mv(srcfile, dstfile)
631d11b9 216 except OSError, e:
8911f226 217 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
631d11b9
AM
218 ftpio.log(l)
219 print l
38b2b764
MM
220 f.close()
221
8911f226 222 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764 223
0a108b7f 224ftpio.unlock(cval['default_to'])
7c2f5e4c
AM
225
226if moved_anything:
a34f0e55 227 os.system("%s/pld-ftp-admin/bin/pfa-genindex --quiet test > /dev/null" % (os.getenv("HOME")))
This page took 0.098907 seconds and 4 git commands to generate.