]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - modules/ftptree.py
- almost finished main ftp handling modules
[projects/pld-ftp-admin.git] / modules / ftptree.py
1 #!/usr/bin/env python
2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4 import sys, os, config, string, urllib, re
5 errnum=0
6
7 def bailoutonerror():
8     if not errnum == 0:
9         print "%d error(s) encountered... aborting" % errnum
10         sys.exit(1)
11
12 def perror(msg):
13     global errnum
14     errnum=errnum+1
15     print msg
16
17 def rm(file):
18     print 'rm: '+file
19
20 def mv(src, dst):
21     print "mv: %s %s" % (src, dst)
22
23 class Build:
24     def __init__(self):
25         self.requester=''
26         self.requester_email=''
27
28 class 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
111 class 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
139
140     def movepkgs(self, dsttree):
141         self.__checkbuild()
142         bailoutonerror()
143         self.__checkarchs(dsttree)
144         bailoutonerror()
145         self.__rmolderfromsrc()
146         self.__rmotherfromdst(dsttree)
147
148         for pkg in self.markedpkgs:
149             pkg.move(dsttree)
150
151     def markpkgs(self, wannabepkgs):
152         def chopoffextension(pkg):
153             found=pkg.find('.src.rpm')
154             if found==-1:
155                 return pkg
156             else:
157                 return pkg[:found]
158         for wannabepkg in wannabepkgs:
159             pkgname=chopoffextension(wannabepkg)
160             if pkgname in self.pkgnames:
161                 if not pkgname in self.loadedpkgs.keys():
162                     self.loadedpkgs[pkgname]=Pkg(pkgname, self)
163                 self.loadedpkgs[pkgname].mark()
164             else:
165                 perror(pkgname+" was not found in source tree")
166         bailoutonerror()
167     def __checkbuild(self):
168         #f=urllib.urlopen('http://ep09.pld-linux.org/~builderth/queue.txt')
169         f=open('queue.txt')
170         requests={}
171         reid=re.compile(r'^.*id=(.*) pri.*$')
172         regb=re.compile(r'^group:.*$|builders:.*$', re.M)
173         for i in re.findall(regb, f.read()):
174             if i[0]=='g':
175                 id=reid.sub(r'\1', i)
176                 requests[id]=""
177             elif i[0]=='b':
178                 requests[id]=requests[id]+i
179         f.close()
180         for pkg in self.markedpkgs:
181             for bid in pkg.build.keys():
182                 if requests.has_key(bid) and not requests[bid].find('?') == -1:
183                     perror("Building of package %s (buildid %s) not finished" % (pkg,bid))
184
185     def __checkarchs(self, dsttree):
186         def find_other_pkgs(pkg, tree):
187             ziewre=re.compile(string.join(pkg.name.split('-')[:-2], '-')+'-[^-]*-[^-]*$')
188             def filter_other_pkgs(x):
189                 if ziewre.match(x) and not x == pkg.name:
190                     return x
191                 else:
192                     return None
193             return filter(filter_other_pkgs, tree.pkgnames)
194         self.find_other_pkgs=find_other_pkgs
195         for pkg in self.markedpkgs:
196             otherpkgnames=find_other_pkgs(pkg, dsttree)
197             curarchs=[]
198             missingarchs=[]
199             for somepkg in otherpkgnames:
200                 curarchs.extend(Pkg(somepkg, dsttree).file.keys())
201             for arch in curarchs:
202                 if arch not in pkg.file.keys():
203                     missingarchs.append(arch)
204             if missingarchs:
205                 perror('Moving pkg %s would remove archs: %s' % (pkg, missingarchs))
206
207     def __rmolderfromsrc(self):
208         def find_older_pkgs(pkg):
209             def filter_older_pkgs(x):
210                 ziew=x.split('-')
211                 cur=pkg.name.split('-')
212                 if ziew[-2]<cur[-2]:
213                     return x
214                 elif ziew[-2]==cur[-2]:
215                     if ziew[-1]<cur[-1]:
216                         return x
217                     else:
218                         return None
219                 else:
220                     return None
221             return filter(filter_older_pkgs, self.find_other_pkgs(pkg, self))
222
223         for pkg in self.markedpkgs:
224             olderpkgnames=find_older_pkgs(pkg)
225             for i in olderpkgnames:
226                 Pkg(i, self).remove()
227
228     def __rmotherfromdst(self, dsttree):
229         for pkg in self.markedpkgs:
230             pkgnames=self.find_other_pkgs(pkg, dsttree)
231             for i in pkgnames:
232                 Pkg(i, dsttree).remove()
233
234
This page took 0.044757 seconds and 4 git commands to generate.