]> git.ipfire.org Git - pakfire.git/blame - pakfire/packages/installed.py
Merge branch 'master' of ssh://git.ipfire.org/pub/git/oddments/pakfire
[pakfire.git] / pakfire / packages / installed.py
CommitLineData
47a4cb89
MT
1#!/usr/bin/python
2
4f91860e
MT
3import os
4
14ea3228
MT
5import pakfire.downloader
6
47a4cb89 7from base import Package
4f91860e
MT
8from binary import BinaryPackage
9
10from pakfire.constants import *
47a4cb89 11
fa6d335b
MT
12class 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?
240class InstalledPackage(DatabasePackage):
241 type = "installed"
242