]> git.ipfire.org Git - pakfire.git/blame - pakfire/packages/installed.py
Remove signature from default package.
[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
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?
232class InstalledPackage(DatabasePackage):
233 type = "installed"
234