Gentoo Archives: gentoo-commits

From: Devan Franchini <twitch153@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/layman:master commit in: layman/overlays/, layman/db_modules/sqlite_db/
Date: Fri, 28 Aug 2015 00:41:05
Message-Id: 1440722200.03f39c1a46149d472797e4adb6654705579c412c.twitch153@gentoo
1 commit: 03f39c1a46149d472797e4adb6654705579c412c
2 Author: Devan Franchini <twitch153 <AT> gentoo <DOT> org>
3 AuthorDate: Fri Aug 28 00:36:37 2015 +0000
4 Commit: Devan Franchini <twitch153 <AT> gentoo <DOT> org>
5 CommitDate: Fri Aug 28 00:36:40 2015 +0000
6 URL: https://gitweb.gentoo.org/proj/layman.git/commit/?id=03f39c1a
7
8 Adds multiple owner support to layman overlays
9
10 layman/db_modules/sqlite_db/sqlite_db.py | 69 ++++++++-----
11 layman/overlays/overlay.py | 164 ++++++++++++++++++-------------
12 2 files changed, 137 insertions(+), 96 deletions(-)
13
14 diff --git a/layman/db_modules/sqlite_db/sqlite_db.py b/layman/db_modules/sqlite_db/sqlite_db.py
15 index 22ae5f3..a3305a7 100644
16 --- a/layman/db_modules/sqlite_db/sqlite_db.py
17 +++ b/layman/db_modules/sqlite_db/sqlite_db.py
18 @@ -172,12 +172,21 @@ class DBHandler(object):
19 cursor.execute('''SELECT Owner_Email, Owner_Name FROM
20 Overlay_Owner JOIN Overlay USING (Overlay_ID) JOIN Owner USING
21 (Owner_ID) WHERE Overlay_ID = ?''', (overlay_id,))
22 - owner_info = cursor.fetchall()[0]
23 -
24 - overlay['owner_email'] = owner_info[0]
25 -
26 - if len(owner_info) > 1:
27 - overlay['owner_name'] = owner_info[1]
28 + owner_info = cursor.fetchall()
29 + overlay['owner'] = []
30 +
31 + for _owner in owner_info:
32 + owner = {}
33 + if _owner[0]:
34 + owner['email'] = _owner[0]
35 + else:
36 + owner['email'] = None
37 + if len(_owner) > 1:
38 + if _owner[1]:
39 + owner['name'] = _owner[1]
40 + else:
41 + owner['name'] = None
42 + overlay['owner'].append(owner)
43
44 cursor.execute('''SELECT Description FROM Description JOIN
45 Overlay USING (Overlay_ID) WHERE Overlay_ID = ?''',
46 @@ -225,7 +234,7 @@ class DBHandler(object):
47 '''
48 overlay_id = None
49 owner_id = None
50 - source_ids = []
51 + source_id = None
52 cursor = None
53
54 cursor = connection.cursor()
55 @@ -239,22 +248,37 @@ class DBHandler(object):
56 (overlay.name,))
57 overlay_id = cursor.fetchone()[0]
58
59 - cursor.execute('''INSERT INTO Owner ( Owner_Name, Owner_Email )
60 - VALUES ( ?, ? )''', (overlay.owner_name, overlay.owner_email,))
61 - connection.commit()
62 + for owner in overlay.owners:
63 + _name = owner['name']
64 + _email = owner['email']
65 +
66 + cursor.execute('''INSERT INTO Owner ( Owner_Name, Owner_Email )
67 + VALUES ( ?, ? )''', (owner['name'], owner['email'],))
68 + connection.commit()
69 +
70 + if _name != None:
71 + cursor.execute('''SELECT Owner_ID from Owner WHERE
72 + Owner_Email = ? AND Owner_Name = ?''', (_email, _name,))
73 + else:
74 + cursor.execute('''SELECT Owner_ID from Owner WHERE
75 + Owner_Email = ?''', (_email,))
76 + owner_id = cursor.fetchone()[0]
77
78 - cursor.execute('''SELECT Owner_ID from Owner WHERE Owner_Email = ?;''',
79 - (overlay.owner_email,))
80 - owner_id = cursor.fetchone()[0]
81 + cursor.execute('''INSERT INTO Overlay_Owner ( Overlay_ID,
82 + Owner_ID ) VALUES ( ?, ? )''', (overlay_id, owner_id,))
83
84 for source in overlay.sources:
85 cursor.execute('''INSERT INTO Source ( Type, Branch, URL )
86 VALUES ( ?, ?, ? )''', (source.type_key, source.branch,
87 source.src,))
88 connection.commit()
89 +
90 cursor.execute('''SELECT Source_ID FROM Source WHERE URL = ?;''',
91 (source.src,))
92 - source_ids.append(cursor.fetchone()[0])
93 + source_id = cursor.fetchone()[0]
94 +
95 + cursor.execute('''INSERT INTO Overlay_Source ( Overlay_ID,
96 + Source_ID ) VALUES ( ?, ? )''', (overlay_id, source_id, ))
97
98 for description in overlay.descriptions:
99 cursor.execute('''INSERT INTO Description ( Overlay_ID,
100 @@ -264,13 +288,6 @@ class DBHandler(object):
101 cursor.execute('''INSERT INTO Feed ( Overlay_ID, Feed ) VALUES ( ?,
102 ? )''', (overlay_id, feed,))
103
104 - cursor.execute('''INSERT INTO Overlay_Owner ( Overlay_ID, Owner_ID )
105 - VALUES ( ?, ? )''', (overlay_id, owner_id,))
106 -
107 - for source_id in source_ids:
108 - cursor.execute('''INSERT INTO Overlay_Source ( Overlay_ID,
109 - Source_ID ) VALUES ( ?, ? )''', (overlay_id, source_id,))
110 -
111 connection.commit()
112
113
114 @@ -280,7 +297,7 @@ class DBHandler(object):
115 '''
116 cursor = None
117 overlay_id = 0
118 - owner_id = 0
119 + owner_ids = []
120 source_ids = []
121
122 if overlay.name in self.overlays:
123 @@ -295,7 +312,7 @@ class DBHandler(object):
124
125 cursor.execute('''SELECT Owner_ID FROM Overlay_Owner WHERE
126 Overlay_ID = ?''', (overlay_id,))
127 - owner_id = cursor.fetchone()[0]
128 + owner_ids = cursor.fetchall()[0]
129
130 cursor.execute('''SELECT Source_ID FROM Overlay_Source WHERE
131 Overlay_ID = ?''', (overlay_id,))
132 @@ -314,8 +331,10 @@ class DBHandler(object):
133 cursor.execute('''DELETE FROM Source WHERE Source_ID = ?''',
134 (source_id,))
135
136 - cursor.execute('''DELETE FROM Owner WHERE Owner_ID = ?''',
137 - (owner_id,))
138 + for owner_id in owner_ids:
139 + cursor.execute('''DELETE FROM Owner WHERE Owner_ID = ?''',
140 + (owner_id,))
141 +
142 cursor.execute('''DELETE FROM Overlay WHERE Overlay_ID = ?''',
143 (overlay_id,))
144
145
146 diff --git a/layman/overlays/overlay.py b/layman/overlays/overlay.py
147 index defa4e3..11536d4 100755
148 --- a/layman/overlays/overlay.py
149 +++ b/layman/overlays/overlay.py
150 @@ -191,23 +191,28 @@ class Overlay(object):
151
152 self.sources = [create_dict_overlay_source(e) for e in _sources]
153
154 - if 'owner_name' in overlay:
155 - _owner = overlay['owner_name']
156 - self.owner_name = encode(_owner)
157 - else:
158 - self.owner_name = None
159 -
160 - if 'owner_email' in overlay:
161 - _email = overlay['owner_email']
162 - self.owner_email = encode(_email)
163 - else:
164 - self.owner_email = None
165 - msg = 'Overlay from_dict(), "%(name)s" is missing an "owner.email"'\
166 - ' entry!' % {'name': self.name}
167 - if not ignore:
168 - raise Exception(msg)
169 - elif ignore == 1:
170 - self.output.warn(msg, 4)
171 + self.owners = []
172 +
173 + if 'owner' in overlay:
174 + for _owner in overlay['owner']:
175 + owner = {}
176 + if 'name' in _owner and _owner['name']:
177 + owner['name'] = encode(_owner['name'])
178 + else:
179 + owner['name'] = None
180 +
181 + if 'email' in _owner:
182 + owner['email'] = encode(_owner['email'])
183 + else:
184 + owner['email'] = None
185 + msg = 'Overlay from_dict(), "%(name)s" is missing an '\
186 + '"owner.email" entry!' % {'name': self.name}
187 + if not ignore:
188 + raise Exception(msg)
189 + elif ignore == 1:
190 + self.output.warn(msg, 4)
191 +
192 + self.owners.append(owner)
193
194 if 'description' in overlay:
195 self.descriptions = []
196 @@ -313,21 +318,26 @@ class Overlay(object):
197
198 self.sources = [create_json_overlay_source(e) for e in _sources]
199
200 - if 'name' in json['owner']:
201 - self.owner_name = encode(json['owner']['name'])
202 - else:
203 - self.owner_name = None
204 + _owners = json['owner']
205 + self.owners = []
206
207 - if 'email' in json['owner']:
208 - self.owner_email = encode(json['owner']['email'])
209 - else:
210 - self.owner_email = None
211 - msg = 'Overlay from_json(), "%(name)s" is missing an "owner.email"'\
212 - 'entry!' % {'name': self.name}
213 - if not ignore:
214 - raise Exception(msg)
215 - elif ignore == 1:
216 - self.output.warn(msg, 4)
217 + for _owner in _owners:
218 + owner = {}
219 + if 'name' in _owner:
220 + owner['name'] = encode(_owner['name'])
221 + else:
222 + owner['name'] = None
223 + if 'email' in _owner:
224 + owner['email'] = encode(_owner['email'])
225 + else:
226 + owner['email'] = None
227 + msg = 'Overlay from_json(), "%(name)s" is missing an '\
228 + '"owner.email" entry!' % {'name': self.name}
229 + if not ignore:
230 + raise Exception(msg)
231 + elif ignore == 1:
232 + self.output.warn(msg, 4)
233 + self.owners.append(owner)
234
235 if 'description' in json:
236 self.descriptions = []
237 @@ -441,32 +451,35 @@ class Overlay(object):
238
239 self.sources = [create_overlay_source(e) for e in _sources]
240
241 - _owner = xml.find('owner')
242 + _owners = xml.findall('owner')
243 + self.owners = []
244
245 - if _owner == None:
246 - _email = None
247 - else:
248 - _email = _owner.find('email')
249 + for _owner in _owners:
250 + owner = {}
251
252 - if _owner != None and _email != None:
253 - self.owner_email = encode(strip_text(_email))
254 + _email = _owner.find('email')
255 _name = _owner.find('name')
256 +
257 if _name != None:
258 - self.owner_name = encode(strip_text(_name))
259 + owner['name'] = encode(strip_text(_name))
260 else:
261 - self.owner_name = None
262 - elif 'contact' in xml.attrib:
263 - self.owner_email = encode(xml.attrib['contact'])
264 - self.owner_name = None
265 - else:
266 - self.owner_email = ''
267 - self.owner_name = None
268 - msg = 'Overlay from_xml(), "%(name)s" is mising an '\
269 - '"owner.email" entry!' % {'name': self.name}
270 - if not ignore:
271 - raise Exception(msg)
272 - elif ignore == 1:
273 - self.output.warn(msg, 4)
274 + owner['name'] = None
275 + if _email != None:
276 + owner['email'] = encode(strip_text(_email))
277 + else:
278 + owner['email'] = None
279 + msg = 'Overlay from_xml(), "%(name)s" is missing an '\
280 + '"owner.email" entry!' % {'name': self.name}
281 + if not ignore:
282 + raise Exception(msg)
283 + elif ignore == 1:
284 + self.output.warn(msg, 4)
285 +
286 + # For backwards compatibility with older Overlay XML formats.
287 + if not _email and not _name and 'contact' in xml.attrib:
288 + owner['email'] = encode(xml.attrib['contact'])
289 + owner['name'] = None
290 + self.owners.append(owner)
291
292 _desc = xml.findall('description')
293 if _desc != None:
294 @@ -536,16 +549,27 @@ class Overlay(object):
295 if len(self.sources) == 1:
296 result += '\nSource : ' + self.sources[0].src
297 else:
298 - result += '\nSources:'
299 + result += '\nSources : '
300 for i, v in enumerate(self.sources):
301 result += '\n %d. %s' % (i + 1, v.src)
302 result += '\n'
303
304 - if self.owner_name != None:
305 - result += '\nContact : %s <%s>' \
306 - % (self.owner_name, self.owner_email)
307 - else:
308 - result += '\nContact : ' + self.owner_email
309 + if len(self.owners) == 1:
310 + if 'name' in self.owners[0] and self.owners[0]['name'] != None:
311 + result += '\nContact : %s <%s>' \
312 + % (self.owners[0]['name'], self.owners[0]['email'])
313 + else:
314 + result += '\nContact : ' + self.owners[0]['email']
315 + else:
316 + result += '\nContacts: '
317 + for i, v in enumerate(self.owners):
318 + result += '\n %d. ' % (i + 1)
319 + if 'name' in v and v['name'] != None:
320 + result += '%s <%s>' % (v['name'], v['email'])
321 + else:
322 + result += v['email']
323 + result += '\n'
324 +
325 if len(self.sources) == 1:
326 result += '\nType : ' + self.sources[0].type
327 else:
328 @@ -666,10 +690,7 @@ class Overlay(object):
329 repo['homepage'] = self.homepage
330 if self.irc != None:
331 repo['irc'] = self.irc
332 - repo['owner'] = {}
333 - repo['owner']['email'] = self.owner_email
334 - if self.owner_name != None:
335 - repo['owner']['name'] = self.owner_name
336 + repo['owner'] = [i for i in self.owners]
337 repo['source'] = []
338 for i in self.sources:
339 source = {'@type': i.__class__.type_key}
340 @@ -712,15 +733,16 @@ class Overlay(object):
341 irc = ET.Element('irc')
342 irc.text = self.irc
343 repo.append(irc)
344 - owner = ET.Element('owner')
345 - repo.append(owner)
346 - owner_email = ET.Element('email')
347 - owner_email.text = self.owner_email
348 - owner.append(owner_email)
349 - if self.owner_name != None:
350 - owner_name = ET.Element('name')
351 - owner_name.text = self.owner_name
352 - owner.append(owner_name)
353 + for _owner in self.owners:
354 + owner = ET.Element('owner')
355 + owner_email = ET.Element('email')
356 + owner_email.text = _owner['email']
357 + owner.append(owner_email)
358 + if 'name' in _owner and _owner['name']:
359 + owner_name = ET.Element('name')
360 + owner_name.text = _owner['name']
361 + owner.append(owner_name)
362 + repo.append(owner)
363 for i in self.sources:
364 if not i.branch:
365 source = ET.Element('source', type=i.__class__.type_key)