]>
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 | |
8537c16d MT |
79 | def groups(self): |
80 | return self.metadata.get("groups", "").split() | |
47a4cb89 MT |
81 | |
82 | @property | |
0c665250 MT |
83 | def build_date(self): |
84 | return self.metadata.get("build_date") | |
85 | ||
86 | @property | |
87 | def build_time(self): | |
b566f7e3 MT |
88 | build_time = self.metadata.get("build_time", 0) |
89 | ||
6b151a68 MT |
90 | try: |
91 | return int(build_time) | |
92 | except TypeError: | |
93 | return 0 | |
47a4cb89 MT |
94 | |
95 | @property | |
96 | def build_host(self): | |
97 | return self.metadata.get("build_host") | |
98 | ||
99 | @property | |
100 | def build_id(self): | |
101 | return self.metadata.get("build_id") | |
102 | ||
1317485d MT |
103 | @property |
104 | def uuid(self): | |
105 | return self.metadata.get("uuid") | |
106 | ||
e399ad3a MT |
107 | @property |
108 | def size(self): | |
a5f5fced | 109 | return self.metadata.get("size", 0) |
e399ad3a | 110 | |
47a4cb89 MT |
111 | @property |
112 | def provides(self): | |
b6da0663 MT |
113 | if not hasattr(self, "__provides"): |
114 | # Get automatic provides | |
115 | provides = self._provides | |
47a4cb89 | 116 | |
b6da0663 MT |
117 | # Add other provides |
118 | for prov in self.metadata.get("provides", "").split(): | |
a7277777 | 119 | provides.add(prov) |
da77e6fa | 120 | |
b6da0663 MT |
121 | self.__provides = provides |
122 | ||
123 | return self.__provides | |
47a4cb89 MT |
124 | |
125 | @property | |
126 | def requires(self): | |
127 | requires = self.metadata.get("requires") | |
128 | ||
129 | if requires: | |
130 | return requires.split() | |
131 | ||
132 | return [] | |
133 | ||
134 | @property | |
135 | def conflicts(self): | |
136 | conflicts = self.metadata.get("conflicts") | |
137 | ||
138 | if conflicts: | |
139 | return conflicts.split() | |
140 | ||
141 | return [] | |
142 | ||
4f91860e MT |
143 | @property |
144 | def hash1(self): | |
145 | return self.metadata.get("hash1") | |
146 | ||
a5f5fced MT |
147 | @property |
148 | def scriptlet(self): | |
149 | return self.metadata.get("scriptlet") | |
150 | ||
4f91860e MT |
151 | @property |
152 | def filename(self): | |
153 | return self.metadata.get("filename") # XXX basename? | |
154 | ||
47a4cb89 MT |
155 | @property |
156 | def filelist(self): | |
b6da0663 MT |
157 | if not hasattr(self, "__filelist"): |
158 | c = self.db.cursor() | |
159 | c.execute("SELECT name FROM files WHERE pkg = ?", (self.id,)) | |
47a4cb89 | 160 | |
b6da0663 MT |
161 | self.__filelist = [] |
162 | for f in c: | |
163 | self.__filelist.append(f["name"]) | |
18ae128e | 164 | |
b6da0663 | 165 | c.close() |
47a4cb89 | 166 | |
b6da0663 | 167 | return self.__filelist |
47a4cb89 | 168 | |
a88d2cdc MT |
169 | def _does_provide_file(self, requires): |
170 | """ | |
171 | A faster version to find a file in the database. | |
172 | """ | |
173 | c = self.db.cursor() | |
311ce792 | 174 | c.execute("SELECT * FROM files WHERE name GLOB ? AND pkg = ?", |
a2d1644c | 175 | (requires.requires, self.id)) |
a88d2cdc MT |
176 | |
177 | ret = False | |
178 | for pkg in c: | |
a2d1644c MT |
179 | ret = True |
180 | break | |
a88d2cdc MT |
181 | |
182 | c.close() | |
183 | ||
184 | return ret | |
185 | ||
14ea3228 | 186 | def download(self, text=""): |
4f91860e MT |
187 | """ |
188 | Downloads the package from repository and returns a new instance | |
189 | of BinaryPackage. | |
190 | """ | |
191 | # Marker, if we need to download the package. | |
192 | download = True | |
193 | ||
194 | # Add shortcut for cache. | |
195 | cache = self.repo.cache | |
196 | ||
197 | cache_filename = "packages/%s" % os.path.basename(self.filename) | |
198 | ||
199 | # Check if file already exists in cache. | |
200 | if cache.exists(cache_filename): | |
201 | # If the file does already exist, we check if the hash1 matches. | |
202 | if cache.verify(cache_filename, self.hash1): | |
203 | # We already got the right file. Skip download. | |
204 | download = False | |
205 | else: | |
206 | # The file in cache has a wrong hash. Remove it and repeat download. | |
207 | cache.remove(cache_filename) | |
208 | ||
209 | if download: | |
4f91860e MT |
210 | # Make sure filename is of type string (and not unicode) |
211 | filename = str(self.filename) | |
212 | ||
14ea3228 MT |
213 | # Get a package grabber and add mirror download capabilities to it. |
214 | grabber = pakfire.downloader.PackageDownloader( | |
215 | text=text + os.path.basename(filename), | |
216 | ) | |
217 | grabber = self.repo.mirrors.group(grabber) | |
218 | ||
219 | i = grabber.urlopen(filename) | |
220 | ||
221 | # Open input and output files and download the file. | |
222 | o = cache.open(cache_filename, "w") | |
4f91860e MT |
223 | |
224 | buf = i.read(BUFFER_SIZE) | |
225 | while buf: | |
226 | o.write(buf) | |
227 | buf = i.read(BUFFER_SIZE) | |
228 | ||
229 | i.close() | |
230 | o.close() | |
231 | ||
232 | # Verify if the download was okay. | |
233 | if not cache.verify(cache_filename, self.hash1): | |
234 | raise Exception, "XXX this should never happen..." | |
235 | ||
236 | filename = os.path.join(cache.path, cache_filename) | |
237 | return BinaryPackage(self.pakfire, self.repo, filename) | |
fa6d335b MT |
238 | |
239 | # XXX maybe we can remove this later? | |
240 | class InstalledPackage(DatabasePackage): | |
241 | type = "installed" | |
242 |