]>
Commit | Line | Data |
---|---|---|
47a4cb89 MT |
1 | #!/usr/bin/python |
2 | ||
4f91860e MT |
3 | import os |
4 | ||
14ea3228 MT |
5 | import pakfire.downloader |
6 | ||
47a4cb89 | 7 | from base import Package |
4f91860e MT |
8 | from binary import BinaryPackage |
9 | ||
10 | from pakfire.constants import * | |
47a4cb89 | 11 | |
fa6d335b MT |
12 | class DatabasePackage(Package): |
13 | type = "db" | |
47a4cb89 | 14 | |
4f91860e MT |
15 | def __init__(self, pakfire, repo, db, data): |
16 | Package.__init__(self, pakfire, repo) | |
3723913b | 17 | |
47a4cb89 MT |
18 | self.db = db |
19 | ||
20 | self._data = {} | |
21 | ||
22 | for key in data.keys(): | |
23 | self._data[key] = data[key] | |
24 | ||
25 | def __repr__(self): | |
26 | return "<%s %s>" % (self.__class__.__name__, self.friendly_name) | |
27 | ||
28 | @property | |
29 | def metadata(self): | |
30 | return self._data | |
31 | ||
32 | @property | |
33 | def id(self): | |
34 | id = self.metadata.get("id") | |
35 | if not id: | |
36 | id = 0 | |
37 | ||
38 | return id | |
39 | ||
40 | @property | |
41 | def name(self): | |
42 | return self.metadata.get("name") | |
43 | ||
44 | @property | |
45 | def version(self): | |
46 | return self.metadata.get("version") | |
47 | ||
48 | @property | |
49 | def release(self): | |
50 | return self.metadata.get("release") | |
51 | ||
52 | @property | |
53 | def epoch(self): | |
54 | epoch = self.metadata.get("epoch", 0) | |
55 | ||
56 | return int(epoch) | |
57 | ||
58 | @property | |
59 | def arch(self): | |
60 | return self.metadata.get("arch") | |
61 | ||
62 | @property | |
63 | def maintainer(self): | |
64 | return self.metadata.get("maintainer") | |
65 | ||
66 | @property | |
67 | def license(self): | |
68 | return self.metadata.get("license") | |
69 | ||
70 | @property | |
71 | def summary(self): | |
72 | return self.metadata.get("summary") | |
73 | ||
74 | @property | |
75 | def description(self): | |
76 | return self.metadata.get("description") | |
77 | ||
78 | @property | |
79 | def group(self): | |
80 | return self.metadata.get("group") | |
81 | ||
82 | @property | |
83 | def build_data(self): | |
84 | return self.metadata.get("build_data") | |
85 | ||
86 | @property | |
87 | def build_host(self): | |
88 | return self.metadata.get("build_host") | |
89 | ||
90 | @property | |
91 | def build_id(self): | |
92 | return self.metadata.get("build_id") | |
93 | ||
1317485d MT |
94 | @property |
95 | def uuid(self): | |
96 | return self.metadata.get("uuid") | |
97 | ||
e399ad3a MT |
98 | @property |
99 | def size(self): | |
a5f5fced | 100 | return self.metadata.get("size", 0) |
e399ad3a | 101 | |
47a4cb89 MT |
102 | @property |
103 | def provides(self): | |
b6da0663 MT |
104 | if not hasattr(self, "__provides"): |
105 | # Get automatic provides | |
106 | provides = self._provides | |
47a4cb89 | 107 | |
b6da0663 MT |
108 | # Add other provides |
109 | for prov in self.metadata.get("provides", "").split(): | |
110 | if not prov in provides: | |
111 | provides.append(prov) | |
da77e6fa | 112 | |
b6da0663 MT |
113 | self.__provides = provides |
114 | ||
115 | return self.__provides | |
47a4cb89 MT |
116 | |
117 | @property | |
118 | def requires(self): | |
119 | requires = self.metadata.get("requires") | |
120 | ||
121 | if requires: | |
122 | return requires.split() | |
123 | ||
124 | return [] | |
125 | ||
126 | @property | |
127 | def conflicts(self): | |
128 | conflicts = self.metadata.get("conflicts") | |
129 | ||
130 | if conflicts: | |
131 | return conflicts.split() | |
132 | ||
133 | return [] | |
134 | ||
4f91860e MT |
135 | @property |
136 | def hash1(self): | |
137 | return self.metadata.get("hash1") | |
138 | ||
a5f5fced MT |
139 | @property |
140 | def scriptlet(self): | |
141 | return self.metadata.get("scriptlet") | |
142 | ||
4f91860e MT |
143 | @property |
144 | def filename(self): | |
145 | return self.metadata.get("filename") # XXX basename? | |
146 | ||
47a4cb89 MT |
147 | @property |
148 | def filelist(self): | |
b6da0663 MT |
149 | if not hasattr(self, "__filelist"): |
150 | c = self.db.cursor() | |
151 | c.execute("SELECT name FROM files WHERE pkg = ?", (self.id,)) | |
47a4cb89 | 152 | |
b6da0663 MT |
153 | self.__filelist = [] |
154 | for f in c: | |
155 | self.__filelist.append(f["name"]) | |
18ae128e | 156 | |
b6da0663 | 157 | c.close() |
47a4cb89 | 158 | |
b6da0663 | 159 | return self.__filelist |
47a4cb89 | 160 | |
a88d2cdc MT |
161 | def _does_provide_file(self, requires): |
162 | """ | |
163 | A faster version to find a file in the database. | |
164 | """ | |
165 | c = self.db.cursor() | |
166 | c.execute("SELECT pkg FROM files WHERE name = ?", (requires.requires,)) | |
167 | ||
168 | ret = False | |
169 | for pkg in c: | |
170 | if self.id == pkg[0]: | |
171 | ret = True | |
172 | break | |
173 | ||
174 | c.close() | |
175 | ||
176 | return ret | |
177 | ||
14ea3228 | 178 | def download(self, text=""): |
4f91860e MT |
179 | """ |
180 | Downloads the package from repository and returns a new instance | |
181 | of BinaryPackage. | |
182 | """ | |
183 | # Marker, if we need to download the package. | |
184 | download = True | |
185 | ||
186 | # Add shortcut for cache. | |
187 | cache = self.repo.cache | |
188 | ||
189 | cache_filename = "packages/%s" % os.path.basename(self.filename) | |
190 | ||
191 | # Check if file already exists in cache. | |
192 | if cache.exists(cache_filename): | |
193 | # If the file does already exist, we check if the hash1 matches. | |
194 | if cache.verify(cache_filename, self.hash1): | |
195 | # We already got the right file. Skip download. | |
196 | download = False | |
197 | else: | |
198 | # The file in cache has a wrong hash. Remove it and repeat download. | |
199 | cache.remove(cache_filename) | |
200 | ||
201 | if download: | |
4f91860e MT |
202 | # Make sure filename is of type string (and not unicode) |
203 | filename = str(self.filename) | |
204 | ||
14ea3228 MT |
205 | # Get a package grabber and add mirror download capabilities to it. |
206 | grabber = pakfire.downloader.PackageDownloader( | |
207 | text=text + os.path.basename(filename), | |
208 | ) | |
209 | grabber = self.repo.mirrors.group(grabber) | |
210 | ||
211 | i = grabber.urlopen(filename) | |
212 | ||
213 | # Open input and output files and download the file. | |
214 | o = cache.open(cache_filename, "w") | |
4f91860e MT |
215 | |
216 | buf = i.read(BUFFER_SIZE) | |
217 | while buf: | |
218 | o.write(buf) | |
219 | buf = i.read(BUFFER_SIZE) | |
220 | ||
221 | i.close() | |
222 | o.close() | |
223 | ||
224 | # Verify if the download was okay. | |
225 | if not cache.verify(cache_filename, self.hash1): | |
226 | raise Exception, "XXX this should never happen..." | |
227 | ||
228 | filename = os.path.join(cache.path, cache_filename) | |
229 | return BinaryPackage(self.pakfire, self.repo, filename) | |
fa6d335b MT |
230 | |
231 | # XXX maybe we can remove this later? | |
232 | class InstalledPackage(DatabasePackage): | |
233 | type = "installed" | |
234 |