Merge lp:~michael.nelson/ubuntu-webcatalog/import-icon-file into lp:ubuntu-webcatalog

Proposed by Michael Nelson
Status: Merged
Merged at revision: 9
Proposed branch: lp:~michael.nelson/ubuntu-webcatalog/import-icon-file
Merge into: lp:ubuntu-webcatalog
Diff against target: 1131 lines (+983/-20)
10 files modified
.bzrignore (+1/-0)
django_project/settings.py (+1/-1)
requirements.txt (+1/-0)
src/webcatalog/forms.py (+1/-0)
src/webcatalog/management/commands/import_app_install_data.py (+63/-16)
src/webcatalog/models.py (+3/-1)
src/webcatalog/tests/factory.py (+4/-2)
src/webcatalog/tests/test_commands.py (+17/-0)
src/webcatalog/tests/test_data/firefox.xpm (+294/-0)
src/webcatalog/tests/test_data/scribus.xpm (+598/-0)
To merge this branch: bzr merge lp:~michael.nelson/ubuntu-webcatalog/import-icon-file
Reviewer Review Type Date Requested Status
Anthony Lenton (community) Approve
Review via email: mp+57473@code.launchpad.net

Description of the change

Overview
========

This branch attempts to extract the icons included in the app-install-data package and add them to the application models as they are imported.

But, after running a full import (http://people.canonical.com/~michaeln/tmp/import.txt), the database shows that:
{{{
>>> Application.objects.count()
2381

>>> Application.objects.filter(icon='').count()
573
}}}

That's based on the desktop and icon files in:

http://archive.ubuntu.com/ubuntu/pool/main/a/app-install-data-ubuntu/app-install-data_0.11.04.7.1_all.deb

I checked with mvo, and apparently this is valid:

{{{
13:45 <mvo> it sounds a bit high, but I need to double check, hold on a couple of minutes, should be straightforward
13:55 <mvo> I have (on natty) 2226 apps and 584 missing icons
}}}

Issues
======
I started trying to add better test coverage of the commands add_icon_to_app method, but got stuck when tests froze with this diff:

https://pastebin.canonical.com/46055/

(actually, not only did the test freeze, but the VM I was working on needed to be restarted each time :/ )

As this is just a prototype, i'd be happy to land it with the current tests, but would prefer to find a way for the above patch to work.

Running the command to import apps with icons
=============================================
It'll take quite a while, but if you want to see the command running, use:
fab manage:'import_app_install_data -v 1'

To post a comment you must log in.
Revision history for this message
Anthony Lenton (elachuni) wrote :

Hi Michael,

Great code as usual :)

- The two new tests fail for me, apparently due to arbitrary ordering in the DB when you get all() applications. Not assuming that firefox will be the first app retrieved and scribus the second one fixes it here.

- As for the pastebinned test, it seems to burn cpu calling the mocked os.path.exists, as django.core.files.storage also calls out to os.path.exists to get an available filename within the call to app.save(), and then iterates until it finds a filename that *doesn't* exist. It's fixed here by patching 'webcatalog.management.commands.import_app_install_data.os' in the test instead, and then setting mock_os.path.exists.return_value = True so that storage can still use the real version. The test then fails for a different reason, but it might be what you were looking for?

Anyway, I'll probably land this with the two small test fixes, just to see the pretty icons :P

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2011-04-12 13:16:43 +0000
3+++ .bzrignore 2011-04-13 15:01:18 +0000
4@@ -3,3 +3,4 @@
5 virtualenv/
6 django_project/local_settings.py
7 django_project/static/
8+django_project/media_root_dev/*
9
10=== added directory 'django_project/media_root_dev'
11=== modified file 'django_project/settings.py'
12--- django_project/settings.py 2011-04-08 12:25:25 +0000
13+++ django_project/settings.py 2011-04-13 15:01:18 +0000
14@@ -45,7 +45,7 @@
15
16 # Absolute filesystem path to the directory that will hold user-uploaded files.
17 # Example: "/home/media/media.lawrence.com/media/"
18-MEDIA_ROOT = ''
19+MEDIA_ROOT = './django_project/media_root_dev/'
20
21 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
22 # trailing slash.
23
24=== modified file 'requirements.txt'
25--- requirements.txt 2011-04-11 13:51:17 +0000
26+++ requirements.txt 2011-04-13 15:01:18 +0000
27@@ -3,3 +3,4 @@
28 setuptools
29 south
30 python-debian
31+PIL
32
33=== modified file 'src/webcatalog/forms.py'
34--- src/webcatalog/forms.py 2011-04-12 15:05:33 +0000
35+++ src/webcatalog/forms.py 2011-04-13 15:01:18 +0000
36@@ -45,6 +45,7 @@
37 'x-appinstall-description': 'description',
38 'x-appinstall-section': 'section',
39 'type': 'app_type',
40+ 'icon': 'icon_name',
41 }
42
43
44
45=== modified file 'src/webcatalog/management/commands/import_app_install_data.py'
46--- src/webcatalog/management/commands/import_app_install_data.py 2011-04-13 01:46:00 +0000
47+++ src/webcatalog/management/commands/import_app_install_data.py 2011-04-13 15:01:18 +0000
48@@ -22,11 +22,16 @@
49 with_statement,
50 )
51
52+import os
53+import shutil
54 import tempfile
55 import urllib
56 from apt_inst import DebFile
57+from glob import iglob
58 from optparse import make_option
59+from StringIO import StringIO
60
61+from django.core.files.images import ImageFile
62 from django.core.management.base import BaseCommand
63
64 from webcatalog.forms import ApplicationForm
65@@ -72,26 +77,68 @@
66 if self.verbosity > 0:
67 self.stdout.write(
68 "Processing application data to update database...\n")
69+ data_dir = tempfile.mkdtemp()
70+ deb_file.data.extractall(data_dir)
71+ matcher = data_dir + '/usr/share/app-install/desktop/*.desktop'
72+ icon_dir = data_dir + '/usr/share/app-install/icons/'
73+ for desktop_file in iglob(matcher):
74+ self.process_desktop_file(desktop_file, icon_dir)
75
76- deb_file.data.go(self.process_archive_member)
77+ shutil.rmtree(data_dir)
78
79 def get_uri_for_series(self, distro_series):
80 # Write a temporary sources.list, update the cache and access:
81 # cache['app-install-data-ubuntu'].candidate.uri
82 pass
83
84- def process_archive_member(self, member, data):
85- if member.name.endswith('desktop'):
86- form = ApplicationForm.get_form_from_desktop_data(data)
87-
88- if form.is_valid():
89- app = form.save()
90- app.update_departments()
91- if self.verbosity > 0:
92- self.stdout.write(
93- u"{0} created.\n".format(app.name).encode('utf-8'))
94- else:
95- if self.verbosity > 0:
96- self.stdout.write(
97- u"Skipping {0} as input failed validation: {1}.\n".format(
98- member.name, form.errors).encode('utf-8'))
99+ def process_desktop_file(self, desktop_file_path, icon_dir):
100+ with open(desktop_file_path, 'r') as desktop_file:
101+ data = desktop_file.read()
102+ form = ApplicationForm.get_form_from_desktop_data(data)
103+
104+ if form.is_valid():
105+ app = form.save()
106+ app.update_departments()
107+ self.add_icon_to_app(app, icon_dir)
108+ if self.verbosity > 0:
109+ self.stdout.write(
110+ u"{0} created.\n".format(app.name).encode('utf-8'))
111+ else:
112+ if self.verbosity > 0:
113+ self.stdout.write(
114+ u"Skipping {0} as input failed validation: {1}.\n".format(
115+ member.name, form.errors).encode('utf-8'))
116+
117+ def add_icon_to_app(self, app, icon_dir):
118+ # If the desktop file specifies an icon, we check for it in the
119+ # default location, otherwise we use the packagename and check
120+ # for that.
121+ icon_name = app.icon_name or app.package_name
122+ icon_path_generic = icon_dir + "{0}".format(icon_name)
123+ icon_path = ''
124+
125+ # Some desktop files specify the icon extension as part of the
126+ # icon name.
127+ supported_extensions = ('xpm', 'png', 'svg', 'tiff')
128+ if icon_path_generic.endswith(supported_extensions):
129+ if os.path.exists(icon_path_generic):
130+ icon_path = icon_path_generic
131+ else:
132+ # Python's glob module doesn't seem to support extra matchers
133+ # such as '@(xpm|png|svg)'.
134+ for ext in supported_extensions:
135+ path_with_ext = icon_path_generic + '.' + ext
136+ if os.path.exists(path_with_ext):
137+ icon_path = path_with_ext
138+ break
139+
140+ if icon_path:
141+ with open(icon_path, "r") as icon_file:
142+ app.icon = ImageFile(icon_file)
143+ app.save()
144+ else:
145+ if self.verbosity > 0:
146+ self.stdout.write(
147+ u"No icon found for {0} at {1}.({2}).\n".format(
148+ app.name, icon_path_generic,
149+ '|'.join(supported_extensions)).encode('utf-8'))
150
151=== modified file 'src/webcatalog/models.py'
152--- src/webcatalog/models.py 2011-04-13 01:46:00 +0000
153+++ src/webcatalog/models.py 2011-04-13 15:01:18 +0000
154@@ -56,9 +56,11 @@
155 section = models.CharField(max_length=32)
156 categories = models.CharField(max_length=255, blank=True)
157 departments = models.ManyToManyField('Department', blank=True)
158+ icon_name = models.CharField(max_length=255, blank=True)
159+ icon = models.ImageField(upload_to='icons/%Y/%m', max_length=200,
160+ null=True, blank=True)
161
162 # Other desktop fields used by s-c
163- gnome_full_name = models.CharField(max_length=255, blank=True)
164 # x-gnome-fullname
165 # X-AppInstall-Ignore
166 # Icon
167
168=== modified file 'src/webcatalog/tests/factory.py'
169--- src/webcatalog/tests/factory.py 2011-04-12 13:58:04 +0000
170+++ src/webcatalog/tests/factory.py 2011-04-13 15:01:18 +0000
171@@ -24,6 +24,7 @@
172 import os
173 from itertools import count
174
175+from django.core.files.images import ImageFile
176 from django.test import TestCase
177
178 from webcatalog.models import Application
179@@ -70,7 +71,7 @@
180 user.save()
181
182 def make_application(self, package_name=None, name=None,
183- comment=None, description=None):
184+ comment=None, description=None, icon_name='', icon=None):
185 if name is None:
186 name = self.get_unique_string(prefix='Readable Name')
187 if package_name is None:
188@@ -82,7 +83,8 @@
189
190 return Application.objects.create(
191 package_name=package_name, name=name, comment=comment,
192- description=description, popcon=999)
193+ description=description, popcon=999, icon=icon,
194+ icon_name=icon_name)
195
196 def get_test_path(self, file_name):
197 return os.path.join(
198
199=== modified file 'src/webcatalog/tests/test_commands.py'
200--- src/webcatalog/tests/test_commands.py 2011-04-11 14:08:41 +0000
201+++ src/webcatalog/tests/test_commands.py 2011-04-13 15:01:18 +0000
202@@ -21,6 +21,7 @@
203 absolute_import,
204 with_statement,
205 )
206+import os
207 import shutil
208 import tempfile
209
210@@ -80,3 +81,19 @@
211 self.assertEqual(
212 'Graphic Page Layout and Publication (Stable)',
213 scribus.comment)
214+
215+ def test_icon_added_to_model(self):
216+ call_command(
217+ 'import_app_install_data',
218+ local_app_install_deb=self.factory.get_test_path(
219+ 'app-install-data-test_all.deb'),
220+ verbosity=0)
221+
222+ self.assertEqual(2, Application.objects.count())
223+ scribus, firefox = Application.objects.all()
224+ self.assertEqual(
225+ os.path.getsize(self.factory.get_test_path('firefox.xpm')),
226+ firefox.icon.size)
227+ self.assertEqual(
228+ os.path.getsize(self.factory.get_test_path('scribus.xpm')),
229+ scribus.icon.size)
230
231=== added file 'src/webcatalog/tests/test_data/firefox.xpm'
232--- src/webcatalog/tests/test_data/firefox.xpm 1970-01-01 00:00:00 +0000
233+++ src/webcatalog/tests/test_data/firefox.xpm 2011-04-13 15:01:18 +0000
234@@ -0,0 +1,294 @@
235+/* XPM */
236+static char *firefox[] = {
237+/* columns rows colors chars-per-pixel */
238+"32 32 256 2 ",
239+" c #1F0A03",
240+". c #330F09",
241+"X c #000836",
242+"o c #211220",
243+"O c #282036",
244+"+ c #420E03",
245+"@ c #541705",
246+"# c #701805",
247+"$ c #6D3812",
248+"% c #4E2B3B",
249+"& c #6C302F",
250+"* c #001147",
251+"= c #011C5A",
252+"- c #132C5C",
253+"; c #282C59",
254+": c #253255",
255+"> c #001E67",
256+", c #062767",
257+"< c #0C306F",
258+"1 c #032B76",
259+"2 c #0D3677",
260+"3 c #133C76",
261+"4 c #123D7D",
262+"5 c #213970",
263+"6 c #523746",
264+"7 c #354A5E",
265+"8 c #1D4C7D",
266+"9 c #3A547A",
267+"0 c #374F68",
268+"q c #4B4848",
269+"w c #565867",
270+"e c #5F6A68",
271+"r c #6C7175",
272+"t c #880B03",
273+"y c #940E03",
274+"u c #990E03",
275+"i c #951204",
276+"p c #9B1204",
277+"a c #9B1D06",
278+"s c #A31504",
279+"d c #A31D05",
280+"f c #AA1905",
281+"g c #B71F05",
282+"h c #842D11",
283+"j c #AB2A08",
284+"k c #AB2406",
285+"l c #B42A05",
286+"z c #B62708",
287+"x c #AE330D",
288+"c c #BB3B0D",
289+"v c #B8350B",
290+"b c #C23C0B",
291+"n c #C53806",
292+"m c #CF3507",
293+"M c #9F4D10",
294+"N c #B9490D",
295+"B c #BD5F0E",
296+"V c #A3481D",
297+"C c #B45715",
298+"Z c #B05118",
299+"A c #BF7E1D",
300+"S c #B96610",
301+"D c #8E5139",
302+"F c #A9572A",
303+"G c #B95B29",
304+"H c #AD4C23",
305+"J c #946D2F",
306+"K c #B8652C",
307+"L c #AF7A3F",
308+"P c #BE6E33",
309+"I c #C3420D",
310+"U c #CD450C",
311+"Y c #CD4B0E",
312+"T c #C9460A",
313+"R c #D34B06",
314+"E c #D1460B",
315+"W c #D44A0C",
316+"Q c #D84906",
317+"! c #D3520D",
318+"~ c #DA540C",
319+"^ c #D55B0E",
320+"/ c #DC5D0B",
321+"( c #D85907",
322+") c #CB4C11",
323+"_ c #C34B13",
324+"` c #CE5412",
325+"' c #CA5618",
326+"] c #D25512",
327+"[ c #D35C14",
328+"{ c #DC5C11",
329+"} c #E15709",
330+"| c #E25210",
331+" . c #D5660C",
332+".. c #DB630D",
333+"X. c #DE6C0B",
334+"o. c #D86807",
335+"O. c #DF7206",
336+"+. c #CA6212",
337+"@. c #D66315",
338+"#. c #DA6413",
339+"$. c #DC6A16",
340+"%. c #DB6C1A",
341+"&. c #D8641C",
342+"*. c #DF701A",
343+"=. c #E16B0C",
344+"-. c #E2740C",
345+";. c #E27E0A",
346+":. c #E87B0C",
347+">. c #E56914",
348+",. c #E57917",
349+"<. c #C46A27",
350+"1. c #CE7031",
351+"2. c #EA7727",
352+"3. c #895941",
353+"4. c #AA5846",
354+"5. c #8B6A56",
355+"6. c #947659",
356+"7. c #AE6D45",
357+"8. c #9A7F69",
358+"9. c #CC7F4D",
359+"0. c #B68B30",
360+"q. c #DF9013",
361+"w. c #E6850A",
362+"e. c #E78B0D",
363+"r. c #ED950E",
364+"t. c #E48312",
365+"y. c #EC8417",
366+"u. c #F0801D",
367+"i. c #EB9613",
368+"p. c #EC9919",
369+"a. c #F09F19",
370+"s. c #DFA01E",
371+"d. c #EFA016",
372+"f. c #F2A718",
373+"g. c #F8B81E",
374+"h. c #D38A22",
375+"j. c #DC8531",
376+"k. c #E98C38",
377+"l. c #F89337",
378+"z. c #DBA529",
379+"x. c #EDA624",
380+"c. c #F4B724",
381+"v. c #EAB937",
382+"b. c #F3BA3A",
383+"n. c #F9C42B",
384+"m. c #F7C539",
385+"M. c #FAD43E",
386+"N. c #AE8556",
387+"B. c #939373",
388+"V. c #A99979",
389+"C. c #AE9473",
390+"Z. c #A5A27C",
391+"A. c #D5934F",
392+"S. c #E58C48",
393+"D. c #DCAC4F",
394+"F. c #E0B147",
395+"G. c #E3AE41",
396+"H. c #ECA76E",
397+"J. c #E6C64C",
398+"K. c #F5CA47",
399+"L. c #F8D749",
400+"P. c #F3C953",
401+"I. c #F9D958",
402+"U. c #E4C65A",
403+"Y. c #FDE056",
404+"T. c #DAC964",
405+"R. c #EDD765",
406+"E. c #F6E66F",
407+"W. c #063988",
408+"Q. c #144585",
409+"!. c #164A8B",
410+"~. c #1C4C8C",
411+"^. c #1A5596",
412+"/. c #1B589B",
413+"(. c #265893",
414+"). c #305988",
415+"_. c #2D608F",
416+"`. c #356D9A",
417+"'. c #3A749A",
418+"]. c #3A638B",
419+"[. c #2C5CAB",
420+"{. c #1D64A9",
421+"}. c #1967B2",
422+"|. c #1E72BB",
423+" X c #2364A4",
424+".X c #2268AB",
425+"XX c #2978BB",
426+"oX c #3178B9",
427+"OX c #3670A6",
428+"+X c #496686",
429+"@X c #46789D",
430+"#X c #507290",
431+"$X c #5C798D",
432+"%X c #4665A1",
433+"&X c #6276A3",
434+"*X c #267DC2",
435+"=X c #758887",
436+"-X c #7A8E99",
437+";X c #538DB4",
438+":X c #6692AD",
439+">X c #2A82C6",
440+",X c #2A85CB",
441+"<X c #3386C6",
442+"1X c #358ACA",
443+"2X c #3494D5",
444+"3X c #3D9AD7",
445+"4X c #4893C8",
446+"5X c #498BCC",
447+"6X c #56A1C7",
448+"7X c #45A1D9",
449+"8X c #55AAD8",
450+"9X c #74B5D7",
451+"0X c #45A9E4",
452+"qX c #51AFE2",
453+"wX c #55B7E8",
454+"eX c #7DC2D6",
455+"rX c #58C5F0",
456+"tX c #63C3E8",
457+"yX c #75CCEB",
458+"uX c #7CD6EE",
459+"iX c #68D2F1",
460+"pX c #75D9F3",
461+"aX c #63CEF1",
462+"sX c #959D81",
463+"dX c #B29880",
464+"fX c #B3B59B",
465+"gX c #A8B29F",
466+"hX c #92A6A6",
467+"jX c #A7B7AB",
468+"kX c #C49F83",
469+"lX c #D4A280",
470+"zX c #D8D48A",
471+"xX c #85C7DD",
472+"cX c #8DD0DE",
473+"vX c #91D3DC",
474+"bX c #88DBF0",
475+"nX c #95DEEE",
476+"mX c #A6DDED",
477+"MX c #87E4F5",
478+"NX c #95ECFB",
479+"BX c #99E7F8",
480+"VX c #A8EDFA",
481+"CX c #B6EAF5",
482+"ZX c #A9F1FD",
483+"AX c #B7F1FB",
484+"SX c #BDF1FB",
485+"DX c #ACE1ED",
486+"FX c #C3DCD9",
487+"GX c #C4F4FC",
488+"HX c #CBF5FC",
489+"JX c #CBF9FF",
490+"KX c #D7FAFF",
491+"LX c #DBFBFF",
492+"PX c #D1F7FD",
493+"IX c #C2EAF4",
494+"UX c None",
495+/* pixels */
496+"UXUXUXUXUXUXUXUXUXUXUXUXUX8 _.`.@X@X'.UXUXUXUXUXUXUXUXUXUXUXUXUX",
497+"UXUXUXUXUXUXUXUXUXUX3 '.6XxXmXCXCXIXDXxX;X8 UXUXUXUXUXUXUXUXUXUX",
498+"UXUXUXUXUXUXUXUX, ~.5XbXAXJXLXLXLXLXKXHXBX:X$XUXUXUXUXUXUXUXUXUX",
499+"UXUXUXUXUXUXUX, !.5XyXBXSXHXHXPXPXHXHXGXZXeXhXgXr UXUXUXUXUXUXUX",
500+"UXUXUXl.k.UX= 3 [.5X9XjXkXFXGXHXHXGXSXAXVXuX4X-XzXB.4.UXUXUXUXUX",
501+"UXUXUX2.>.6 < w %X&X4.' dXCXSXSXGXSXCXBXbXtX8X:XsXR.V.F UXUXUXUX",
502+"UXUXUX| | @.<.9.9.G n 7.cXVXAXAXAXAXBXyXtX8X4X:XfXT.R.N.P UXUXUX",
503+"UXUXUX~ >.>.{ / { Y ] B.pXNXNXZXVXBXMXuXtX8XwXoXsXE.I.J.N.F.UXUX",
504+"UXUX>.>.| ~ ~ ] ] ] [ H dXgXjXvXNXNXMXMXpXiXrX3X].T.E.K.D.J.UXUX",
505+"UXUX,./ ~ Q Y W ] ] #.n W | [ -XpXpXpXiXaXrX7X<X{.B.I.P.P.L.UXUX",
506+"UXUX>.} Q E E E ) ] { 1.H.H.C.;XtXrXrXqX0X0XXX.X{.e K.L.I.M.UXUX",
507+"UXu.} Q E E E Y W [ &.S.lX-X%X7XwXwXqX1XXX1X>X^.(.w v.J.Y.m.h.UX",
508+"UXu.{ E E E Y Y ] &.2.k.r *X3X0X0X3X<XoX X X^.!.+XV.D.b.I.b.+.UX",
509+"UX2.| W E E ] ' ' &.<.A.=X,X2X2X2X,X X^.^.!.!.Q.9 R.K.b.L.v.F UX",
510+"UX,.~ E ) ] ] c a a 6 ).].*X*X*X>X>X.X^.!.Q.8 8 0 J.M.n.M.z.D UX",
511+"UX| W E W ] ` d d j w }.}.|.|.*X|.|.|.{.Q.W.2 2 7 J.J.n.n.0.0.UX",
512+"UX| b U Y [ _ l l n P +X{.}.}.OX#X@X.X/.2 2 2 < q J.m.c.c.s.s.UX",
513+"UXm m m Y ` ` n T R $.1.5.e 5.P j.D.V.(.8 < 1 : 0.c.n.g.f.i.w.UX",
514+"UXm n v Y ] [ W Q } T ' >.*.*.$.#.K 6.(.2 , = 7 z.x.g.d.i.;.UXUX",
515+"UXUXz z c ) [ [ ( } ` j c _ I N & 5 W.W.< = * J d.f.f.e.w.o.UXUX",
516+"UXUXz f z c ` [ ..>...) h & % ; 2 W.1 1 > > : h.d.r.r.w.o.G UXUX",
517+"UXUXg s p k _ ` [ @.$.*.F 6 ; 1 > * X X O q F x.i.w.w.-.V F UXUX",
518+"UXUXUXf u u x ) ` [ @.%.*.%.K 6 O o o $ B O.e.p.w.w.=.C 3.A.UXUX",
519+"UXUXUXUXs y i v _ ' [ @.@.$. .#.+.+.$.-.=.-.:.-.t.t.o.0.x.UXUXUX",
520+"UXUXUXUXf u t i v I ) ` [ @.@.#..... .^ .X.X.t.p.w.r.f.UXUXUXUX",
521+"UXUXUXUXUXu y t i l I Y ` ` [ ^ ^ ^ ! ! ^ $.O.t.t.w.t.UXUXUXUXUX",
522+"UXUXUXUXUXUXt i i y k v Y ! [ / ....=.=.=.=.*. . .B UXUXUXUXUXUX",
523+"UXUXUXUXUXUXUX@ i s p s j b T ! ~ ( / ( .. .C V V UXUXUXUXUXUXUX",
524+"UXUXUXUXUXUXUXUX. # s f k l n n T R R ( o.o.C M UXUXUXUXUXUXUXUX",
525+"UXUXUXUXUXUXUXUXUXUX+ h x x v T n N N N M $ . UXUXUXUXUXUXUXUXUX",
526+"UXUXUXUXUXUXUXUXUXUXUXUXUX+ . @ # . UXUXUXUXUXUXUXUXUXUXUXUXUX",
527+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
528+};
529
530=== added file 'src/webcatalog/tests/test_data/scribus.xpm'
531--- src/webcatalog/tests/test_data/scribus.xpm 1970-01-01 00:00:00 +0000
532+++ src/webcatalog/tests/test_data/scribus.xpm 2011-04-13 15:01:18 +0000
533@@ -0,0 +1,598 @@
534+/* XPM */
535+static char * scribus_cvs_xpm[] = {
536+"32 32 563 2",
537+" c None",
538+". c #3A89BB",
539+"+ c #5297C4",
540+"@ c #6CA7CD",
541+"# c #76ADD1",
542+"$ c #78AFD1",
543+"% c #6DA7CE",
544+"& c #5398C4",
545+"* c #3989BB",
546+"= c #3685B9",
547+"- c #569AC5",
548+"; c #88B8D7",
549+"> c #B2D1E5",
550+", c #C4DCEB",
551+"' c #C5DCEC",
552+") c #C5DDEC",
553+"! c #C6DDEC",
554+"~ c #87B7D6",
555+"{ c #5E98BD",
556+"] c #727D85",
557+"^ c #3988BB",
558+"/ c #79AED1",
559+"( c #A7CBE1",
560+"_ c #B6D4E6",
561+": c #B7D4E6",
562+"< c #B0C7D6",
563+"[ c #B3B2B3",
564+"} c #969798",
565+"| c #2379AF",
566+"1 c #2F83B7",
567+"2 c #86B7D6",
568+"3 c #A2C8E0",
569+"4 c #A3C9E0",
570+"5 c #A4C9E0",
571+"6 c #A5C9E0",
572+"7 c #A5C9E1",
573+"8 c #B5C4CE",
574+"9 c #D0CFCF",
575+"0 c #A7A7A6",
576+"a c #343738",
577+"b c #2679AE",
578+"c c #2A7FB5",
579+"d c #63A3CA",
580+"e c #92BFDA",
581+"f c #93BFDA",
582+"g c #92BEDA",
583+"h c #92BED9",
584+"i c #B2BABF",
585+"j c #C7C6C5",
586+"k c #A1A1A0",
587+"l c #666767",
588+"m c #2D3032",
589+"n c #257BB2",
590+"o c #3A8ABC",
591+"p c #75ADD0",
592+"q c #84B6D5",
593+"r c #83B6D5",
594+"s c #83B5D4",
595+"t c #83B5D5",
596+"u c #86B4D0",
597+"v c #AEB1B3",
598+"w c #B4B4B3",
599+"x c #8A8A8A",
600+"y c #787878",
601+"z c #424242",
602+"A c #495155",
603+"B c #2174A8",
604+"C c #257DB4",
605+"D c #418EBF",
606+"E c #6CA8CD",
607+"F c #71ABCE",
608+"G c #72ABCF",
609+"H c #71AACE",
610+"I c #71ABCF",
611+"J c #7FA5BE",
612+"K c #ACADAE",
613+"L c #909090",
614+"M c #737373",
615+"N c #707070",
616+"O c #585859",
617+"P c #406982",
618+"Q c #267AAF",
619+"R c #206EA0",
620+"S c #2275A9",
621+"T c #2479AF",
622+"U c #3C89BB",
623+"V c #5D9EC7",
624+"W c #62A1C9",
625+"X c #62A2C9",
626+"Y c #63A2C9",
627+"Z c #7998AD",
628+"` c #A6A6A6",
629+" . c #717070",
630+".. c #636363",
631+"+. c #656565",
632+"@. c #56636B",
633+"#. c #3078A6",
634+"$. c #287CB3",
635+"%. c #2374A8",
636+"&. c #327AA9",
637+"*. c #2778AC",
638+"=. c #2477AC",
639+"-. c #307FB2",
640+";. c #4A91BE",
641+">. c #5297C2",
642+",. c #5197C3",
643+"'. c #5096C3",
644+"). c #5298C4",
645+"!. c #5197C4",
646+"~. c #5397C2",
647+"{. c #798F9F",
648+"]. c #8E8C8A",
649+"^. c #5A5958",
650+"/. c #545454",
651+"(. c #595B5C",
652+"_. c #426E8A",
653+":. c #287DB3",
654+"<. c #297FB6",
655+"[. c #2375AA",
656+"}. c #407BA3",
657+"|. c #528FB8",
658+"1. c #4288B5",
659+"2. c #2B7AAC",
660+"3. c #2678AB",
661+"4. c #3380B1",
662+"5. c #3F8AB9",
663+"6. c #3F8BBB",
664+"7. c #408BBC",
665+"8. c #3F8BBC",
666+"9. c #3E8BBC",
667+"0. c #408CBD",
668+"a. c #418DBE",
669+"b. c #418DBD",
670+"c. c #3E8CBD",
671+"d. c #408DBE",
672+"e. c #458CB9",
673+"f. c #8A9C9E",
674+"g. c #B8AD8C",
675+"h. c #6F634B",
676+"i. c #4E4C49",
677+"j. c #485A66",
678+"k. c #2D78A8",
679+"l. c #297FB7",
680+"m. c #226A98",
681+"n. c #427FA7",
682+"o. c #5994BC",
683+"p. c #5995BD",
684+"q. c #498CB8",
685+"r. c #2D7BAD",
686+"s. c #2476AA",
687+"t. c #2D7CAE",
688+"u. c #2F7FB2",
689+"v. c #2F81B5",
690+"w. c #3082B6",
691+"x. c #2E81B6",
692+"y. c #3083B7",
693+"z. c #2F82B7",
694+"A. c #3183B8",
695+"B. c #3284B8",
696+"C. c #3184B8",
697+"D. c #3584B5",
698+"E. c #AFC1B2",
699+"F. c #D3BD84",
700+"G. c #907138",
701+"H. c #595040",
702+"I. c #366B8C",
703+"J. c #287EB6",
704+"K. c #297EB5",
705+"L. c #236B9A",
706+"M. c #1D557A",
707+"N. c #1B5376",
708+"O. c #4783AB",
709+"P. c #5C96BC",
710+"Q. c #5C96BE",
711+"R. c #5E98BF",
712+"S. c #5593BC",
713+"T. c #3780B0",
714+"U. c #2777AA",
715+"V. c #2677AA",
716+"W. c #2779AD",
717+"X. c #287CB2",
718+"Y. c #297DB3",
719+"Z. c #287DB4",
720+"`. c #297EB4",
721+" + c #2A7EB5",
722+".+ c #4B8CAF",
723+"++ c #C6C6A4",
724+"@+ c #AE8F4F",
725+"#+ c #8A7341",
726+"$+ c #446E7F",
727+"%+ c #2B7FB5",
728+"&+ c #2571A1",
729+"*+ c #195072",
730+"=+ c #1B4F70",
731+"-+ c #1A5073",
732+";+ c #4A85AC",
733+">+ c #5B95BC",
734+",+ c #5C95BD",
735+"'+ c #5E97BD",
736+")+ c #5F97BE",
737+"!+ c #5B95BD",
738+"~+ c #4086B3",
739+"{+ c #2978AA",
740+"]+ c #2476A8",
741+"^+ c #2577AB",
742+"/+ c #277AAF",
743+"(+ c #277CB1",
744+"_+ c #297DB2",
745+":+ c #2A7EB3",
746+"<+ c #297EB3",
747+"[+ c #2B7EB3",
748+"}+ c #709BA6",
749+"|+ c #CEBC86",
750+"1+ c #9A7737",
751+"2+ c #727964",
752+"3+ c #317DAB",
753+"4+ c #2A80B6",
754+"5+ c #287DB2",
755+"6+ c #1D567B",
756+"7+ c #194C6C",
757+"8+ c #1B4D6D",
758+"9+ c #194D6F",
759+"0+ c #4D86AD",
760+"a+ c #6097BD",
761+"b+ c #6198BE",
762+"c+ c #6399BE",
763+"d+ c #639ABF",
764+"e+ c #6299BF",
765+"f+ c #629ABF",
766+"g+ c #4C8DB6",
767+"h+ c #2C7AAB",
768+"i+ c #2878A9",
769+"j+ c #2B7AAB",
770+"k+ c #2F7FB0",
771+"l+ c #3181B3",
772+"m+ c #3382B4",
773+"n+ c #3383B5",
774+"o+ c #3382B5",
775+"p+ c #3985B3",
776+"q+ c #ADBAA6",
777+"r+ c #C2A86C",
778+"s+ c #9E824C",
779+"t+ c #5B726E",
780+"u+ c #2D81B5",
781+"v+ c #2D81B6",
782+"w+ c #27709D",
783+"x+ c #1D4F6E",
784+"y+ c #1D4D6C",
785+"z+ c #1F4F6E",
786+"A+ c #1C4F70",
787+"B+ c #4E86AB",
788+"C+ c #6499BD",
789+"D+ c #659ABE",
790+"E+ c #679BBF",
791+"F+ c #679CBF",
792+"G+ c #689CC0",
793+"H+ c #689DC0",
794+"I+ c #5D96BC",
795+"J+ c #3E84B0",
796+"K+ c #3A82AF",
797+"L+ c #3D85B1",
798+"M+ c #4189B5",
799+"N+ c #438BB8",
800+"O+ c #438BB9",
801+"P+ c #428BB9",
802+"Q+ c #6298B5",
803+"R+ c #E2D3A4",
804+"S+ c #AD9054",
805+"T+ c #A28F63",
806+"U+ c #52767F",
807+"V+ c #3080B2",
808+"W+ c #2A6991",
809+"X+ c #224F6B",
810+"Y+ c #214D68",
811+"Z+ c #23506C",
812+"`+ c #265471",
813+" @ c #205677",
814+".@ c #4982A7",
815+"+@ c #679ABD",
816+"@@ c #699CBF",
817+"#@ c #6A9DC0",
818+"$@ c #6B9EC0",
819+"%@ c #6B9EC1",
820+"&@ c #6D9FC1",
821+"*@ c #70A1C2",
822+"=@ c #74A3C4",
823+"-@ c #6B9FC1",
824+";@ c #5291B8",
825+">@ c #4D8DB5",
826+",@ c #5090B8",
827+"'@ c #5292BB",
828+")@ c #5394BE",
829+"!@ c #5193BE",
830+"~@ c #94ADAD",
831+"{@ c #CDBA8B",
832+"]@ c #AF9562",
833+"^@ c #A2926C",
834+"/@ c #56757B",
835+"(@ c #2E6587",
836+"_@ c #264D65",
837+":@ c #264E65",
838+"<@ c #285571",
839+"[@ c #2F6689",
840+"}@ c #306C92",
841+"|@ c #276993",
842+"1@ c #2A6C96",
843+"2@ c #4485AE",
844+"3@ c #528EB5",
845+"4@ c #6197BB",
846+"5@ c #699DBF",
847+"6@ c #6D9FC0",
848+"7@ c #75A3C3",
849+"8@ c #79A6C5",
850+"9@ c #7FA9C8",
851+"0@ c #83ADCA",
852+"a@ c #7CA9C7",
853+"b@ c #6299BD",
854+"c@ c #5E98BC",
855+"d@ c #6099BE",
856+"e@ c #609CC1",
857+"f@ c #619CC1",
858+"g@ c #C1C6B4",
859+"h@ c #C3AD7D",
860+"i@ c #B39D70",
861+"j@ c #9B8457",
862+"k@ c #5C655D",
863+"l@ c #315265",
864+"m@ c #2C4F64",
865+"n@ c #305D78",
866+"o@ c #397BA5",
867+"p@ c #3E87B5",
868+"q@ c #3A85B4",
869+"r@ c #276F9C",
870+"s@ c #20618B",
871+"t@ c #377BA6",
872+"u@ c #3C80AB",
873+"v@ c #3D81AC",
874+"w@ c #4586AF",
875+"x@ c #558FB5",
876+"y@ c #6E9FC0",
877+"z@ c #7CA8C6",
878+"A@ c #87AFCB",
879+"B@ c #8DB3CD",
880+"C@ c #90B5CF",
881+"D@ c #8BB3CE",
882+"E@ c #74A5C4",
883+"F@ c #6FA2C3",
884+"G@ c #6EA2C3",
885+"H@ c #7DAAC4",
886+"I@ c #D4D0B5",
887+"J@ c #B39969",
888+"K@ c #9E885E",
889+"L@ c #767260",
890+"M@ c #4E6169",
891+"N@ c #3D596A",
892+"O@ c #396078",
893+"P@ c #4082AC",
894+"Q@ c #448DBA",
895+"R@ c #458DBB",
896+"S@ c #3C85B4",
897+"T@ c #266791",
898+"U@ c #265D81",
899+"V@ c #3678A2",
900+"W@ c #4384AC",
901+"X@ c #4484AD",
902+"Y@ c #4887AF",
903+"Z@ c #5590B5",
904+"`@ c #6399BB",
905+" # c #75A4C3",
906+".# c #8CB3CD",
907+"+# c #97BAD2",
908+"@# c #9CBDD4",
909+"## c #92B8D0",
910+"$# c #7DABC8",
911+"%# c #7BAAC7",
912+"&# c #95B6C6",
913+"*# c #CEC4A6",
914+"=# c #A5926D",
915+"-# c #787E77",
916+";# c #556874",
917+"># c #4C6271",
918+",# c #455E6E",
919+"'# c #467593",
920+")# c #488EBA",
921+"!# c #488FBB",
922+"~# c #488EBB",
923+"{# c #387FAC",
924+"]# c #2D6181",
925+"^# c #2C6E98",
926+"/# c #4686AF",
927+"(# c #4C8BB3",
928+"_# c #4D8BB2",
929+":# c #508CB2",
930+"<# c #5B93B7",
931+"[# c #6198BA",
932+"}# c #699DBE",
933+"|# c #73A3C2",
934+"1# c #85AFCA",
935+"2# c #9DBED4",
936+"3# c #A6C4D8",
937+"4# c #8AB3CD",
938+"5# c #A9BFC4",
939+"6# c #BDB295",
940+"7# c #848E8C",
941+"8# c #657884",
942+"9# c #5F7B8D",
943+"0# c #5E87A0",
944+"a# c #5B8DAD",
945+"b# c #5491B7",
946+"c# c #5293BC",
947+"d# c #5193BD",
948+"e# c #4B8EB8",
949+"f# c #30729C",
950+"g# c #2C6385",
951+"h# c #3E7FA7",
952+"i# c #508EB5",
953+"j# c #528FB6",
954+"k# c #5792B8",
955+"l# c #6098BA",
956+"m# c #669BBD",
957+"n# c #6D9FBF",
958+"o# c #74A4C2",
959+"p# c #7BA8C5",
960+"q# c #86B0CA",
961+"r# c #9ABCD2",
962+"s# c #AAC7D9",
963+"t# c #9BBDD3",
964+"u# c #AFBCBC",
965+"v# c #9FA49C",
966+"w# c #748A99",
967+"x# c #7296AE",
968+"y# c #70A3C3",
969+"z# c #69A1C4",
970+"A# c #629CC1",
971+"B# c #5B98BF",
972+"C# c #5695BD",
973+"D# c #5494BC",
974+"E# c #4183AD",
975+"F# c #326686",
976+"G# c #316E95",
977+"H# c #508DB3",
978+"I# c #5893B8",
979+"J# c #5C95B9",
980+"K# c #659CBE",
981+"L# c #6CA0C1",
982+"M# c #72A3C3",
983+"N# c #79A8C5",
984+"O# c #7FAAC6",
985+"P# c #87B0CA",
986+"Q# c #8DB4CC",
987+"R# c #96BAD1",
988+"S# c #9FBFD4",
989+"T# c #A6B5B8",
990+"U# c #8BA0AC",
991+"V# c #7FA7C0",
992+"W# c #7AAAC8",
993+"X# c #75A7C7",
994+"Y# c #6FA3C5",
995+"Z# c #69A0C3",
996+"`# c #609BC0",
997+" $ c #5C98BF",
998+".$ c #5392B9",
999+"+$ c #367298",
1000+"@$ c #2E5A76",
1001+"#$ c #39779F",
1002+"$$ c #5E97BA",
1003+"%$ c #669CBD",
1004+"&$ c #6CA0C0",
1005+"*$ c #72A4C3",
1006+"=$ c #79A8C6",
1007+"-$ c #7EACC8",
1008+";$ c #83AEC9",
1009+">$ c #87B0C9",
1010+",$ c #8AB1CA",
1011+"'$ c #8BB2CA",
1012+")$ c #8BB0C6",
1013+"!$ c #84AEC8",
1014+"~$ c #7EABC7",
1015+"{$ c #7AA9C7",
1016+"]$ c #6EA3C4",
1017+"^$ c #689FC2",
1018+"/$ c #619BBF",
1019+"($ c #5794BA",
1020+"_$ c #3C7AA2",
1021+":$ c #335B76",
1022+"<$ c #2F6181",
1023+"[$ c #407EA5",
1024+"}$ c #5C95B8",
1025+"|$ c #689DBF",
1026+"1$ c #6EA1C1",
1027+"2$ c #73A4C3",
1028+"3$ c #82AEC9",
1029+"4$ c #85B0CA",
1030+"5$ c #86B0C9",
1031+"6$ c #85AEC9",
1032+"7$ c #82ADC8",
1033+"8$ c #7DAAC6",
1034+"9$ c #7AA8C6",
1035+"0$ c #70A4C5",
1036+"a$ c #6AA0C3",
1037+"b$ c #5E97BB",
1038+"c$ c #417FA6",
1039+"d$ c #346280",
1040+"e$ c #316180",
1041+"f$ c #407CA2",
1042+"g$ c #6298BA",
1043+"h$ c #7CAAC8",
1044+"i$ c #80ADC9",
1045+"j$ c #83AFCA",
1046+"k$ c #84AFCA",
1047+"l$ c #7FABC6",
1048+"m$ c #7CA9C5",
1049+"n$ c #79A7C5",
1050+"o$ c #76A7C6",
1051+"p$ c #70A3C4",
1052+"q$ c #649ABD",
1053+"r$ c #417CA2",
1054+"s$ c #35627F",
1055+"t$ c #325A74",
1056+"u$ c #3B7498",
1057+"v$ c #568EB1",
1058+"w$ c #6EA0BF",
1059+"x$ c #78A7C5",
1060+"y$ c #7CAAC7",
1061+"z$ c #7EACC9",
1062+"A$ c #81AECA",
1063+"B$ c #81ADC9",
1064+"C$ c #80ACC7",
1065+"D$ c #7EAAC6",
1066+"E$ c #7BA8C4",
1067+"F$ c #76A5C2",
1068+"G$ c #6EA1C0",
1069+"H$ c #578FB3",
1070+"I$ c #3D7598",
1071+"J$ c #365B73",
1072+"K$ c #3D5B6D",
1073+"L$ c #366683",
1074+"M$ c #3E799F",
1075+"N$ c #5D93B5",
1076+"O$ c #71A1C0",
1077+"P$ c #7DAAC7",
1078+"Q$ c #7EABC8",
1079+"R$ c #78A6C2",
1080+"S$ c #6F9EBC",
1081+"T$ c #5B90B1",
1082+"U$ c #3F799E",
1083+"V$ c #396683",
1084+"W$ c #415B6C",
1085+"X$ c #475A68",
1086+"Y$ c #345F7C",
1087+"Z$ c #32698C",
1088+"`$ c #40779B",
1089+" % c #4B81A3",
1090+".% c #5086A7",
1091+"+% c #3F7799",
1092+"@% c #32688A",
1093+"#% c #365F79",
1094+"$% c #495B66",
1095+"%% c #455965",
1096+"&% c #3C596B",
1097+"*% c #39596E",
1098+"=% c #3D596B",
1099+"-% c #465964",
1100+" ",
1101+" ",
1102+" . + @ # $ % & * ",
1103+" = - ; > , ' ) ! ! , > ~ { ] ",
1104+" ^ / ( _ : _ : _ _ : : : : < [ } ",
1105+" | 1 2 3 4 5 6 7 7 7 7 7 5 4 4 8 9 0 a ",
1106+" b c d e f g e f f f f f f f g h i j k l m ",
1107+" n o p q r r r r s q q s s t s u v w x y z A ",
1108+" B C D E F G H H F F I F H H G H J K L M N O P Q ",
1109+" R S T U V W W W X W X W W X W Y W Z ` ...+.@.#.$.%. ",
1110+" &.*.=.-.;.>.,.'.,.).).!.,.).).).~.{.].^./.(._.:.<.[. ",
1111+" }.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.a.e.f.g.h.i.j.k.l.:.m. ",
1112+" n.o.p.q.r.s.t.u.v.w.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N. ",
1113+" O.P.Q.R.S.T.U.V.W.X.$.Y.Z.`.c K. +.+++@+#+$+%+l.&+*+=+-+ ",
1114+" ;+>+,+'+)+!+~+{+]+^+/+(+X._+:+<+[+}+|+1+2+3+4+5+6+7+8+9+ ",
1115+" 0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+ ",
1116+" B+C+D+E+F+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @ ",
1117+" .@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@ ",
1118+" 1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@ ",
1119+" s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@ ",
1120+" U@V@W@X@2@Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]# ",
1121+" ^#/#(#_#:#<#[#}#|#1#2#3#2#4#5#6#7#8#9#0#a#b#c#d#e#f# ",
1122+" g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F# ",
1123+" G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$ ",
1124+" @$#$Z@$$%$&$*$=$-$;$>$,$'$)$!$~${$X#]$^$/$($_$:$ ",
1125+" <$[$}$|$1$2$=$$#3$4$q#5$6$7$8$9$X#0$a$b$c$d$ ",
1126+" e$f$g$1$E@=$h$i$j$k$;$7$l$m$n$o$p$q$r$s$ ",
1127+" t$u$v$w$x$y$z$i$A$B$C$D$E$F$G$H$I$J$ ",
1128+" K$L$M$N$O$n$P$Q$Q$8$R$S$T$U$V$W$ ",
1129+" X$Y$Z$`$ %.%.% %+%@%#%$% ",
1130+" %%&%*%*%=%-% ",
1131+" "};

Subscribers

People subscribed via source and target branches