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