1
'''Integrate XPI extensions (such as Firefox translations)'''
3
# this is part of langpack-o-matic, by Martin Pitt <martin.pitt@canonical.com>
4
# (C) 2011 Canonical Ltd.
10
import xml.dom.minidom
11
from xml.parsers.expat import ExpatError
17
xpi_data_root = 'po2xpi/data'
20
'''Return ID of given XPI.'''
23
dom_doc = xml.dom.minidom.parseString(zipfile.ZipFile(xpi).open('install.rdf').read())
24
except ExpatError as e:
25
logging.error('Invalid XPI %s: %s', xpi, str(e))
29
attr = dom_doc.getElementsByTagName('RDF:Description')[0].attributes['em:id']
31
attr = dom_doc.getElementsByTagName('Description')[0].attributes['em:id']
36
def _make_tar_from_xpi(xpi, output_tar, id):
37
'''Unpack an XPI into a mozilla.tar.gz suitable for Firefox < 4.0 langpacks'''
39
workdir = tempfile.mkdtemp()
40
dest = os.path.join(workdir, 'usr/lib/firefox-addons/extensions', id)
42
zip = zipfile.ZipFile(xpi)
45
if os.path.exists(output_tar):
46
tar = tarfile.open(output_tar)
47
tar.extractall(workdir)
49
tar = tarfile.open(output_tar, 'w:gz')
53
shutil.rmtree(workdir)
55
def install_xpis(release_version, locale, source_pkg):
56
'''Install XPIs for given locale into source package tree'''
58
# Chinese langpacks are split, treat specially
59
if locale.startswith('zh_'):
60
lang = locale.split('.')[0].split('@')[0].replace('_', '-')
62
lang = locale.split('_')[0].split('@')[0]
64
xpis = glob(os.path.join(xpi_data_root, '%s/*/xpi/%s.xpi' % (release_version, lang))) + \
65
glob(os.path.join(xpi_data_root, '%s/*/xpi/%s-*.xpi' % (release_version, lang)))
67
destdir = os.path.join(source_pkg, 'data')
70
if not os.path.isdir(destdir):
73
if float(release_version) > 11:
74
# Firefox 4.0 (in Ubuntu 11.04+) can use packed XPIs
75
logging.debug('Copying %s (ID: %s) into %s', xpi, id, source_pkg)
76
shutil.copy(xpi, os.path.join(destdir, id + '.xpi'))
78
# older releases need the unpacked XPI; ship a readymade tarball in
79
# the langpacks, which debian/rules will unpack
80
logging.debug('Unpacking %s (ID: %s) into %s', xpi, id, source_pkg)
81
_make_tar_from_xpi(xpi, os.path.join(destdir, 'mozilla.tar.gz'), id)
83
# Add Firefox search plugins
84
if float(release_version) > 10.09:
85
search_plugins = glob(os.path.join('extra-files', 'searchplugins', release_version, lang)) + \
86
glob(os.path.join('extra-files', 'searchplugins', release_version, '%s-*' % lang))
88
output_tar = os.path.join(destdir, 'searchplugins.tar')
89
logging.debug('Creating Firefox search plugins pack %s', output_tar)
90
tar = tarfile.open(output_tar, 'w')
91
for lang in search_plugins:
92
tar.add(lang, os.path.join('usr/lib/firefox-addons/searchplugins',
93
os.path.basename(lang)))
96
if __name__ == '__main__':
97
import tempfile, unittest
99
class _T(unittest.TestCase):
101
self.all_xpis = glob(os.path.join(xpi_data_root, '*/*/xpi/*.xpi'))
102
self.assertNotEqual(len(self.all_xpis), 0)
104
self.workdir = tempfile.mkdtemp()
107
shutil.rmtree(self.workdir)
109
def test_xpi_id(self):
112
for xpi in self.all_xpis:
115
self.assertTrue(id.endswith('.mozilla.org') or id.endswith('.ubuntu.com'))
116
self.assertTrue(os.path.basename(xpi).split('.')[0].split('-')[0] in id)
118
def test_install_xpis_unavailable(self):
119
'''install_xpis() for unavailable langpack'''
121
# valid release, unknown locale
122
install_xpis('11.04', 'zz', self.workdir)
123
installed = os.listdir(os.path.join(self.workdir))
124
self.assertEqual(installed, [])
126
# invalid release, known locale
127
install_xpis('10.03', 'de', self.workdir)
128
installed = os.listdir(os.path.join(self.workdir))
129
self.assertEqual(installed, [])
131
def test_install_xpis_nocountry(self):
132
'''install_xpis() for language without country'''
134
install_xpis('11.04', 'de_DE.UTF-8', self.workdir)
135
installed = os.listdir(os.path.join(self.workdir, 'data'))
136
self.assertEqual(len(installed), 1, 'installed: ' + ' '.join(installed))
137
self.assertTrue('-de@' in installed[0])
139
def test_install_xpis_unpacked(self):
140
'''install_xpis() for Firefox < 4.0 (unpacked XPI)'''
142
install_xpis('10.04', 'es_ES.UTF-8', self.workdir)
143
installed = os.listdir(os.path.join(self.workdir, 'data'))
144
self.assertEqual(len(installed), 1, 'installed: ' + ' '.join(installed))
145
self.assertEqual(installed[0], 'mozilla.tar.gz')
146
tar = tarfile.open(os.path.join(self.workdir, 'data',
148
names = [n.startswith('./') and n[2:] or n for n in tar.getnames()]
150
self.assertTrue('usr/lib/firefox-addons/extensions/langpack-es-ES@firefox.mozilla.org/chrome/es-ES.jar'
152
self.assertTrue('usr/lib/firefox-addons/extensions/langpack-es-AR@firefox.mozilla.org/chrome/es-AR.jar'
155
def test_install_xpis_country(self):
156
'''install_xpis() for country specific language'''
158
install_xpis('11.04', 'es_AR.UTF-8', self.workdir)
159
installed = os.listdir(os.path.join(self.workdir, 'data'))
160
self.assertTrue(len(installed) > 1, 'installed: ' + ' '.join(installed))
161
searching = ['es-AR@', 'es-ES@']
163
for s in list(searching):
166
self.assertEqual(searching, [], 'should have installed ' + ' '.join(searching))
168
def test_install_xpis_zh_cn(self):
169
'''install_xpis() for Chinese split (CN)'''
171
install_xpis('11.04', 'zh_CN.UTF-8', self.workdir)
172
installed = os.listdir(os.path.join(self.workdir, 'data'))
173
self.assertEqual(len(installed), 1, 'installed: ' + ' '.join(installed))
174
self.assertTrue('-zh-CN@' in installed[0])
176
def test_install_xpis_zh_tw(self):
177
'''install_xpis() for Chinese split (TW)'''
179
install_xpis('11.04', 'zh_TW.UTF-8', self.workdir)
180
installed = os.listdir(os.path.join(self.workdir, 'data'))
181
self.assertEqual(len(installed), 1, 'installed: ' + ' '.join(installed))
182
self.assertTrue('-zh-TW@' in installed[0])