]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - modules/ftptree.py
- the ftp handling module is mostly done (and working) - now need to work
[projects/pld-ftp-admin.git] / modules / ftptree.py
CommitLineData
098f4a50
MM
1#!/usr/bin/env python
2# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4import sys, os, config, string, urllib, re
5errnum=0
6
7def bailoutonerror():
8 if not errnum == 0:
9 print "%d error(s) encountered... aborting" % errnum
10 sys.exit(1)
11
12def perror(msg):
13 global errnum
14 errnum=errnum+1
15 print msg
16
17def rm(file):
18 print 'rm: '+file
19
20def mv(src, dst):
21 print "mv: %s %s" % (src, dst)
22
23class Build:
24 def __init__(self):
25 self.requester=''
26 self.requester_email=''
27
28class Pkg:
29 def __init__(self, name, tree):
30 self.file={}
31 self.info={}
32 self.build={}
33 self.tree=tree
34 self.name=name
35 self.loaded=False
36 self.marked=False
37 self.load()
38
39 def __repr__(self):
40 return self.name
41
42 def mark(self):
43 if not self.marked:
44 self.tree.markedpkgs.append(self)
45
46 def load(self):
47 f=open(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', 'r')
48 for entry in f.readlines():
49 i=string.split(string.strip(entry), ':')
50 if i[0] == 'info':
51 if len(i)==3:
52 self.info[i[1]]=i[2]
53 elif i[1]=='build':
54 if not self.build.has_key(i[2]):
55 self.build[i[2]]=Build()
56 if i[3]=='requester':
57 self.build[i[2]].requester=i[4]
58 elif i[3]=='requester_email':
59 self.build[i[2]].requester_email=i[4]
60 else:
61 self.info[i[1]]=i[2:]
62 elif i[0] == 'file':
63 if not self.file.has_key(i[1]):
64 self.file[i[1]]=[]
65 self.file[i[1]].append(i[2])
66 f.close()
67 self.loaded=True
68 if self.info.has_key('move'):
69 self.mark()
70
71 def writeinfo(self):
72 f=open(self.tree.basedir+'/SRPMS/.metadata/'+name+'.src.rpm.info', 'w')
73 for bid in self.build.keys():
74 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n" % (bid, self.build[bid].requester, bid, self.build[bid].requester_email))
75 for key in self.info.keys():
76 f.write("info:%s:%s\n" % (key, string.join(self.info[key], ':')))
77 for arch in self.file.keys():
78 for rpm in self.file[arch]:
79 f.write("file:%s:%s\n" % (arch, rpm))
80
81 def remove(self):
82 for arch in self.file.keys():
83 for rpm in self.file[arch]:
84 rm(self.tree.basedir+'/'+arch+'/RPMS/'+rpm)
85 rm(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info')
86
87 def move(self, dsttree):
88 if dsttree.has_key(self.name):
89 movedany=False
90 for arch in self.file.keys():
91 if arch in dsttree[self.name].file.keys():
92 for rpm in self.file[arch]:
93 rm(self.tree.basedir+'/'+arch+'/RPMS/'+rpm)
94 else:
95 movedany=True
96 dsttree[self.name].file[arch]=self.file[arch]
97 for rpm in self.file[arch]:
98 mv(self.tree.basedir+'/'+arch+'/RPMS/'+rpm, dsttree.basedir+'/'+arch+'/RPMS/')
99 if movedany:
100 for bid in self.build.keys():
101 dsttree[self.name].build[bid]=self.build[bid]
102 dsttree[self.name].writeinfo()
103 rm(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info')
104 else:
105 for arch in self.file.keys():
106 for rpm in self.file[arch]:
107 mv(self.tree.basedir+'/'+arch+'/RPMS/'+rpm, dsttree.basedir+'/'+arch+'/RPMS/')
108 mv(self.tree.basedir+'/SRPMS/.metadata/'+self.name+'.src.rpm.info', dsttree.basedir+'/SRPMS/.metadata/')
109
110
111class FtpTree:
112 def __init__(self, tree, loadall=False):
113 self.basedir=config.value['ftp_dir']+'/'+tree
114 self.loadedpkgs={}
115 self.markedpkgs=[]
116 def filter_pkgs(pkg):
117 if not pkg[-13:]=='.src.rpm.info':
118 return None
119 else:
120 return pkg[:-13]
121 self.pkgnames=map(filter_pkgs, os.listdir(self.basedir+'/SRPMS/.metadata/'))
122 if loadall:
123 for i in self.pkgnames:
124 self.loadedpkgs[i]=Pkg(i, self)
125 def __getitem__(self, key):
126 if self.loadedpkgs.has_key(key):
127 return self.loadedpkgs[key]
128 elif key in self.pkgnames:
129 pkg=Pkg(key, self)
130 self.loadedpkgs[key]=pkg
131 return pkg
132 else:
133 raise KeyError, key
134 def has_key(self, key):
135 if key in self.pkgnames:
136 return True
137 else:
138 return False
1610d209
MM
139 def keys(self):
140 return self.pkgnames
098f4a50
MM
141
142 def movepkgs(self, dsttree):
143 self.__checkbuild()
144 bailoutonerror()
145 self.__checkarchs(dsttree)
146 bailoutonerror()
147 self.__rmolderfromsrc()
148 self.__rmotherfromdst(dsttree)
149
150 for pkg in self.markedpkgs:
151 pkg.move(dsttree)
152
153 def markpkgs(self, wannabepkgs):
154 def chopoffextension(pkg):
155 found=pkg.find('.src.rpm')
156 if found==-1:
157 return pkg
158 else:
159 return pkg[:found]
160 for wannabepkg in wannabepkgs:
161 pkgname=chopoffextension(wannabepkg)
162 if pkgname in self.pkgnames:
163 if not pkgname in self.loadedpkgs.keys():
164 self.loadedpkgs[pkgname]=Pkg(pkgname, self)
165 self.loadedpkgs[pkgname].mark()
166 else:
167 perror(pkgname+" was not found in source tree")
168 bailoutonerror()
169 def __checkbuild(self):
170 #f=urllib.urlopen('http://ep09.pld-linux.org/~builderth/queue.txt')
171 f=open('queue.txt')
172 requests={}
173 reid=re.compile(r'^.*id=(.*) pri.*$')
174 regb=re.compile(r'^group:.*$|builders:.*$', re.M)
175 for i in re.findall(regb, f.read()):
176 if i[0]=='g':
177 id=reid.sub(r'\1', i)
178 requests[id]=""
179 elif i[0]=='b':
180 requests[id]=requests[id]+i
181 f.close()
182 for pkg in self.markedpkgs:
183 for bid in pkg.build.keys():
184 if requests.has_key(bid) and not requests[bid].find('?') == -1:
185 perror("Building of package %s (buildid %s) not finished" % (pkg,bid))
186
187 def __checkarchs(self, dsttree):
188 def find_other_pkgs(pkg, tree):
189 ziewre=re.compile(string.join(pkg.name.split('-')[:-2], '-')+'-[^-]*-[^-]*$')
190 def filter_other_pkgs(x):
191 if ziewre.match(x) and not x == pkg.name:
192 return x
193 else:
194 return None
195 return filter(filter_other_pkgs, tree.pkgnames)
196 self.find_other_pkgs=find_other_pkgs
197 for pkg in self.markedpkgs:
198 otherpkgnames=find_other_pkgs(pkg, dsttree)
199 curarchs=[]
200 missingarchs=[]
201 for somepkg in otherpkgnames:
202 curarchs.extend(Pkg(somepkg, dsttree).file.keys())
203 for arch in curarchs:
204 if arch not in pkg.file.keys():
205 missingarchs.append(arch)
206 if missingarchs:
207 perror('Moving pkg %s would remove archs: %s' % (pkg, missingarchs))
208
209 def __rmolderfromsrc(self):
210 def find_older_pkgs(pkg):
211 def filter_older_pkgs(x):
212 ziew=x.split('-')
213 cur=pkg.name.split('-')
214 if ziew[-2]<cur[-2]:
215 return x
216 elif ziew[-2]==cur[-2]:
217 if ziew[-1]<cur[-1]:
218 return x
219 else:
220 return None
221 else:
222 return None
223 return filter(filter_older_pkgs, self.find_other_pkgs(pkg, self))
224
225 for pkg in self.markedpkgs:
226 olderpkgnames=find_older_pkgs(pkg)
227 for i in olderpkgnames:
228 Pkg(i, self).remove()
229
230 def __rmotherfromdst(self, dsttree):
231 for pkg in self.markedpkgs:
232 pkgnames=self.find_other_pkgs(pkg, dsttree)
233 for i in pkgnames:
234 Pkg(i, dsttree).remove()
235
236
This page took 4.885254 seconds and 4 git commands to generate.