commit mozilla-xulrunner20 for openSUSE:Factory
Hello community, here is the log from the commit of package mozilla-xulrunner20 for openSUSE:Factory checked in at Wed Nov 10 20:43:29 CET 2010. -------- --- mozilla-xulrunner20/mozilla-xulrunner20.changes 2010-08-05 08:12:50.000000000 +0200 +++ mozilla-xulrunner20/mozilla-xulrunner20.changes 2010-11-06 13:56:02.000000000 +0100 @@ -1,0 +2,10 @@ +Sat Nov 6 12:50:18 UTC 2010 - wr@rosenauer.org + +- update to 2.0b7 (20101105) +- honour LANGUAGE environment variable (bmo#583793) +- fixed wrong reference in pkgconfig files +- use gio instead of gnome-vfs after 11.3 +- fix buildsymbols zip command and exclude dbg.gz from symbols.txt +- fixed "KDE mode" + +------------------------------------------------------------------- calling whatdependson for head-i586 New: ---- mozilla-language.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mozilla-xulrunner20.spec ++++++ --- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100 +++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100 @@ -31,9 +31,9 @@ %endif License: GPLv2+ ; LGPLv2.1+ ; MPLv1.1+ Version: 2.0b -Release: 1 -%define releasedate 2010083100 -%define version_internal 2.0b5 +Release: 2 +%define releasedate 2010110500 +%define version_internal 2.0b7 %define apiversion 2.0 %define uaweight 199900 Summary: Mozilla Runtime Environment 2.0 @@ -71,6 +71,7 @@ # --- Patch11: mozilla-cpuid.patch Patch12: mozilla-buildsymbols.patch +Patch13: mozilla-language.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires: mozilla-js20 = %{version} Requires(post): update-alternatives coreutils @@ -212,6 +213,7 @@ %patch11 -p1 %endif %patch12 -p1 +%patch13 -p1 %build kdehelperversion=$(cat toolkit/xre/nsKDEUtils.cpp | grep '#define KMOZILLAHELPER_VERSION' | cut -d ' ' -f 3) @@ -261,6 +263,12 @@ ac_add_options --enable-shared-js #ac_add_options --enable-debug EOF +%if %suse_version > 1130 +cat << EOF >> $MOZCONFIG +ac_add_options --disable-gnomevfs +ac_add_options --enable-gio +EOF +%endif %if %has_system_nspr cat << EOF >> $MOZCONFIG ac_add_options --with-system-nspr @@ -454,7 +462,9 @@ %{_libdir}/xulrunner-%{version_internal}/chrome/icons/ %{_libdir}/xulrunner-%{version_internal}/components/ %exclude %{_libdir}/xulrunner-%{version_internal}/components/libmozgnome.so +%if %suse_version <= 1130 %exclude %{_libdir}/xulrunner-%{version_internal}/components/libnkgnomevfs.so +%endif %{_libdir}/xulrunner-%{version_internal}/defaults/ %{_libdir}/xulrunner-%{version_internal}/greprefs.js %{_libdir}/xulrunner-%{version_internal}/icons/ @@ -519,7 +529,9 @@ %dir %{_libdir}/xulrunner-%{version_internal}/ %dir %{_libdir}/xulrunner-%{version_internal}/components/ %{_libdir}/xulrunner-%{version_internal}/components/libmozgnome.so +%if %suse_version <= 1130 %{_libdir}/xulrunner-%{version_internal}/components/libnkgnomevfs.so +%endif %if %localize ++++++ compare-locales.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/Checks.py new/compare-locales/lib/Mozilla/Checks.py --- old/compare-locales/lib/Mozilla/Checks.py 1970-01-01 01:00:00.000000000 +0100 +++ new/compare-locales/lib/Mozilla/Checks.py 2010-11-06 13:43:49.000000000 +0100 @@ -0,0 +1,265 @@ +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is l10n test automation. +# +# The Initial Developer of the Original Code is +# Mozilla Foundation +# Portions created by the Initial Developer are Copyright (C) 2010 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Axel Hecht <l10n@mozilla.com> +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +import re +import itertools +from difflib import SequenceMatcher +from xml import sax +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +from Parser import DTDParser + +class Checker(object): + '''Abstract class to implement checks per file type. + ''' + pattern = None + + def use(self, file): + return self.pattern.match(file) + + def check(self, refEnt, l10nEnt): + '''Given the reference and localized Entities, performs checks. + + This is a generator yielding tuples of + - "warning" or "error", depending on what should be reported, + - tuple of line, column info for the error within the string + - description string to be shown in the report + ''' + if True: + raise NotImplementedError, "Need to subclass" + yield ("error", (0,0), "This is an example error") + +class PrintfException(Exception): + def __init__(self, msg, pos): + self.pos = pos + self.msg = msg + +class PropertiesChecker(Checker): + '''Tests to run on .properties files. + ''' + pattern = re.compile('.*\.properties$') + printf = re.compile(r'%(?P<good>%|(?:(?P<number>[1-9][0-9]*)\$)?(?P<width>\*|[0-9]+)?(?P<prec>\.(?:\*|[0-9]+)?)?(?P<spec>[duxXosScpfg]))?') + + def check(self, refEnt, l10nEnt): + '''Test for the different variable formats. + ''' + refValue, l10nValue = refEnt.val, l10nEnt.val + refSpecs = None + # check for PluralForm.jsm stuff, should have the docs in the + # comment + if 'Localization_and_Plurals' in refEnt.pre_comment: + # For plurals, common variable pattern is #1. Try that. + pats = set(int(m.group(1)) for m in re.finditer('#([0-9]+)', + refValue)) + if len(pats)==0: + return + lpats = set(int(m.group(1)) for m in re.finditer('#([0-9]+)', + l10nValue)) + if pats - lpats: + yield ('warning', 0, 'not all variables used in l10n') + return + if lpats - pats: + yield ('error', 0, 'unreplaced variables in l10n') + return + return + try: + refSpecs = self.getPrintfSpecs(refValue) + except PrintfException, e: + refSpecs = [] + if refSpecs: + for t in self.checkPrintf(refSpecs, l10nValue): + yield t + return + + def checkPrintf(self, refSpecs, l10nValue): + try: + l10nSpecs = self.getPrintfSpecs(l10nValue) + except PrintfException, e: + yield ('error', e.pos, e.msg) + return + if refSpecs != l10nSpecs: + sm = SequenceMatcher() + sm.set_seqs(refSpecs, l10nSpecs) + msgs = [] + warn = None + for action, ls, le, rs, re in sm.get_opcodes(): + if action == 'equal': + continue + if action == 'delete': + # missing argument in l10n + if le == len(refSpecs): + # trailing specs missing, that's just a warning + warn = ', '.join('trailing argument %d `%s` missing' % + (i+1, refSpecs[i]) + for i in xrange(ls, le)) + else: + for i in xrange(ls, le): + msgs.append('argument %d `%s` missing' % + (i+1, refSpecs[i])) + continue + if action == 'insert': + # obsolete argument in l10n + for i in xrange(rs, re): + msgs.append('argument %d `%s` obsolete' % + (i+1, l10nSpecs[i])) + continue + if action == 'replace': + for i, j in zip(xrange(ls, le), xrange(rs, re)): + msgs.append('argument %d `%s` should be `%s`' % + (j+1, l10nSpecs[j], refSpecs[i])) + if msgs: + yield ('error', 0, ', '.join(msgs)) + if warn is not None: + yield ('warning', 0, warn) + + def getPrintfSpecs(self, val): + hasNumber = False + specs = [] + for m in self.printf.finditer(val): + if m.group("good") is None: + # found just a '%', signal an error + raise PrintfException('Found single %', m.start()) + if m.group("good") == '%': + # escaped % + continue + if ((hasNumber and m.group('number') is None) or + (not hasNumber and specs and m.group('number') is not None)): + # mixed style, numbered and not + raise PrintfException('Mixed ordered and non-ordered args', + m.start()) + hasNumber = m.group('number') is not None + if hasNumber: + pos = int(m.group('number')) - 1 + ls = len(specs) + if pos >= ls: + # pad specs + nones = pos - ls + specs[ls:pos] = nones*[None] + specs.append(m.group('spec')) + else: + if specs[pos] is not None: + raise PrintfException('Double ordered argument %d' % (pos+1), + m.start()) + specs[pos] = m.group('spec') + else: + specs.append(m.group('spec')) + # check for missing args + if hasNumber and not all(specs): + raise PrintfException('Ordered argument missing', 0) + return specs + + +class DTDChecker(Checker): + '''Tests to run on DTD files. + + Uses xml.sax for the heavy lifting of xml parsing. + + The code tries to parse until it doesn't find any unresolved entities + anymore. If it finds one, it tries to grab the key, and adds an empty + <!ENTITY key ""> definition to the header. + ''' + pattern = re.compile('.*\.dtd$') + + eref = re.compile('&(%s);' % DTDParser.Name) + tmpl = '''<!DOCTYPE elem [%s]> +<elem> +%s +</elem> +''' + xmllist = set(('amp', 'lt', 'gt', 'apos', 'quot')) + + def check(self, refEnt, l10nEnt): + '''Try to parse the refvalue inside a dummy element, and keep + track of entities that we need to define to make that work. + + Return a checker that offers just those entities. + ''' + refValue, l10nValue = refEnt.val, l10nEnt.val + # find entities the refValue references, + # reusing markup from DTDParser. + reflist = set(m.group(1).encode('utf-8') + for m in self.eref.finditer(refValue)) \ + - self.xmllist + entities = ''.join('<!ENTITY %s "">' % s for s in sorted(reflist)) + parser = sax.make_parser() + try: + parser.parse(StringIO(self.tmpl % (entities, refValue.encode('utf-8')))) + except sax.SAXParseException, e: + yield ('warning', + (0,0), + "can't parse en-US value") + + # find entities the l10nValue references, + # reusing markup from DTDParser. + l10nlist = set(m.group(1).encode('utf-8') + for m in self.eref.finditer(l10nValue)) \ + - self.xmllist + missing = sorted(l10nlist - reflist) + _entities = entities + ''.join('<!ENTITY %s "">' % s for s in missing) + warntmpl = 'Referencing unknown entity `%s`' + if reflist: + warntmpl += ' (%s known)' % ', '.join(sorted(reflist)) + try: + parser.parse(StringIO(self.tmpl % (_entities, l10nValue.encode('utf-8')))) + except sax.SAXParseException, e: + # xml parse error, yield error + # sometimes, the error is reported on our fake closing + # element, make that the end of the last line + lnr = e.getLineNumber() - 2 + lines = l10nValue.splitlines() + if lnr > len(lines): + lnr = len(lines) + col = len(lines[lnr-1]) + else: + col = e.getColumnNumber() + yield ('error', (lnr, col), ' '.join(e.args)) + + for key in missing: + yield ('warning', (0,0), warntmpl % key) + + +__checks = [DTDChecker(), PropertiesChecker()] + +def getChecks(file): + checks = map(lambda c: c.check, filter(lambda c: c.use(file), __checks)) + def _checks(refEnt, l10nEnt): + return itertools.chain(*[c(refEnt, l10nEnt) for c in checks]) + return _checks + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/CompareLocales.py new/compare-locales/lib/Mozilla/CompareLocales.py --- old/compare-locales/lib/Mozilla/CompareLocales.py 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/lib/Mozilla/CompareLocales.py 2010-11-06 13:43:49.000000000 +0100 @@ -65,9 +65,15 @@ return True return False +try: + from json import dumps +except: + from simplejson import dumps + import Parser import Paths +import Checks class Tree(object): def __init__(self, valuetype): @@ -270,8 +276,60 @@ except KeyError: self.details[file][category] = [data] self.summary[file.locale]['errors'] += 1 + elif category == 'warning': + try: + self.details[file][category].append(data) + except KeyError: + self.details[file][category] = [data] + self.summary[file.locale]['warnings'] += 1 return rv + def toExhibit(self): + items = [] + for locale in sorted(self.summary.iterkeys()): + summary = self.summary[locale] + if locale is not None: + item = {'id': 'xxx/' + locale, + 'label': locale, + 'locale': locale} + else: + item = {'id': 'xxx', + 'label': 'xxx', + 'locale': 'xxx'} + item['type'] = 'Build' + total = sum([summary[k] + for k in ('changed','unchanged','report','missing', + 'missingInFiles') + if k in summary]) + rate = (('changed' in summary and summary['changed'] * 100) + or 0) / total + item.update((k, summary.get(k, 0)) + for k in ('changed','unchanged')) + item.update((k, summary[k]) + for k in ('report','errors','warnings') + if k in summary) + item['missing'] = summary.get('missing', 0) + \ + summary.get('missingInFiles', 0) + item['completion'] = rate + item['total'] = total + result = 'success' + if item.get('warnings',0): + result = 'warning' + if item.get('errors',0) or item.get('missing',0): + result = 'failure' + item['result'] = result + items.append(item) + data = {"properties": dict.fromkeys( + ("completion", "errors", "warnings", "missing", "report", + "unchanged", "changed", "obsolete"), + {"valueType": "number"}), + "types": { + "Build": {"pluralLabel": "Builds"} + }} + data['items'] = items + return dumps(data, indent=2) def serialize(self, type="text/plain"): + if type=="application/json": + return self.toExhibit() def tostr(t): if t[1] == 'key': return ' ' * t[0] + '/'.join(t[2]) @@ -279,6 +337,8 @@ indent = ' ' * (t[0] + 1) if 'error' in t[2]: o += [indent + 'ERROR: ' + e for e in t[2]['error']] + if 'warning' in t[2]: + o += [indent + 'WARNING: ' + e for e in t[2]['warning']] if 'missingEntity' in t[2] or 'obsoleteEntity' in t[2]: missingEntities = ('missingEntity' in t[2] and t[2]['missingEntity']) \ or [] @@ -314,6 +374,7 @@ class ContentComparer: keyRE = re.compile('[kK]ey') + nl = re.compile('\n', re.M) def __init__(self, filterObserver): '''Create a ContentComparer. filterObserver is usually a instance of Observer. The return values @@ -331,7 +392,8 @@ self.observers.append(obs) def set_merge_stage(self, merge_stage): self.merge_stage = merge_stage - def merge(self, ref_entities, ref_map, ref_file, l10n_file, missing, p): + def merge(self, ref_entities, ref_map, ref_file, l10n_file, missing, skips, + p): outfile = os.path.join(self.merge_stage, l10n_file.module, l10n_file.file) outdir = os.path.dirname(outfile) if not os.path.isdir(outdir): @@ -340,10 +402,22 @@ shutil.copyfile(ref_file.fullpath, outfile) print "copied reference to " + outfile return - trailing = [ref_entities[ref_map[key]].all for key in missing] - shutil.copyfile(l10n_file.fullpath, outfile) + trailing = (['\n'] + + [ref_entities[ref_map[key]].all for key in missing] + + [ref_entities[ref_map[skip.key]].all for skip in skips]) + if skips: + # we need to skip a few errornous blocks in the input, copy by hand + f = codecs.open(outfile, 'wb', p.encoding) + offset = 0 + for skip in skips: + chunk = skip.span + f.write(p.contents[offset:chunk[0]]) + offset = chunk[1] + f.write(p.contents[offset:]) + else: + shutil.copyfile(l10n_file.fullpath, outfile) + f = codecs.open(outfile, 'ab', p.encoding) print "adding to " + outfile - f = codecs.open(outfile, 'ab', p.encoding) f.write(''.join(trailing)) f.close() def notify(self, category, file, data): @@ -363,6 +437,7 @@ def compare(self, ref_file, l10n): try: p = Parser.getParser(ref_file.file) + checks = Checks.getChecks(ref_file.file) except UserWarning: # no comparison, XXX report? return @@ -383,6 +458,17 @@ except Exception, e: self.notify('error', l10n, str(e)) return + lines = [] + def _getLine(offset): + if not lines: + lines.append(0) + for m in self.nl.finditer(p.contents): + lines.append(m.end()) + _line = 1 + for i in xrange(len(lines), 0, -1): + if offset >= lines[i-1]: + return (i, offset - lines[i-1]) + return (1, offset) l10n_list = l10n_map.keys() l10n_list.sort() ar = AddRemove() @@ -390,6 +476,7 @@ ar.set_right(l10n_list) report = missing = obsolete = changed = unchanged = keys = 0 missings = [] + skips = [] for action, item_or_pair in ar: if action == 'delete': # missing entity @@ -425,11 +512,31 @@ else: self.doChanged(ref_file, refent, l10nent) changed += 1 + # run checks: + if checks: + for tp, pos, msg in checks(refent, l10nent): + # compute real src position, if first line, col needs adjustment + _l, _offset = _getLine(l10nent.val_span[0]) + if isinstance(pos, tuple): + # line, column + if pos[0] == 1: + col = pos[1] + _offset + else: + col = pos[1] + _l += pos[0] - 1 + else: + _l, col = _getLine(l10nent.val_span[0] + pos) + # skip error entities when merging + if tp == 'error' and self.merge_stage is not None: + skips.append(l10nent) + self.notify(tp, l10n, + "%s at line %d, column %d within %s" % + (msg, _l, col, refent.key)) pass if missing: self.notify('missing', l10n, missing) - if self.merge_stage is not None and missings: - self.merge(ref[0], ref[1], ref_file, l10n, missings, p) + if self.merge_stage is not None and (missings or skips): + self.merge(ref[0], ref[1], ref_file, l10n, missings, skips, p) if report: self.notify('report', l10n, report) if obsolete: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/Parser.py new/compare-locales/lib/Mozilla/Parser.py --- old/compare-locales/lib/Mozilla/Parser.py 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/lib/Mozilla/Parser.py 2010-11-06 13:43:49.000000000 +0100 @@ -182,8 +182,7 @@ m = self.reKey.match(contents, offset) if m: offset = m.end() - entity = Entity(contents, self.postProcessValue, - *[m.span(i) for i in xrange(7)]) + entity = self.createEntity(contents, m) return (entity, offset) m = self.reKey.search(contents, offset) if m: @@ -192,6 +191,9 @@ junkend = m.start() return (Junk(contents, (offset, junkend)), junkend) return (None, offset) + def createEntity(self, contents, m): + return Entity(contents, self.postProcessValue, + *[m.span(i) for i in xrange(7)]) def getParser(path): for item in __constructors: @@ -215,30 +217,28 @@ class DTDParser(Parser): - def __init__(self): - # http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar - #":" | [A-Z] | "_" | [a-z] | - # [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] - # | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | - # [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | - # [#x10000-#xEFFFF] - CharMinusDash = u'\x09\x0A\x0D\u0020-\u002C\u002E-\uD7FF\uE000-\uFFFD' - XmlComment = '<!--(?:-?[%s])*?-->' % CharMinusDash - NameStartChar = u':A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF' + \ - u'\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF'+\ - u'\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD' - # + \U00010000-\U000EFFFF seems to be unsupported in python - - # NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | - # [#x0300-#x036F] | [#x203F-#x2040] - NameChar = NameStartChar + ur'\-\.0-9' + u'\xB7\u0300-\u036F\u203F-\u2040' - Name = '[' + NameStartChar + '][' + NameChar + ']*' - self.reKey = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)(<!ENTITY\s+(' + Name + ')\s+(\"[^\"]*\"|\'[^\']*\')\s*>)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)') - # add BOM to DTDs, details in bug 435002 - self.reHeader = re.compile(u'^\ufeff?(\s*<!--.*LICENSE BLOCK([^-]+-)*[^-]+-->)?') - self.reFooter = re.compile('\s*(<!--([^-]+-)*[^-]+-->\s*)*$') - self.rePE = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)(<!ENTITY\s+%\s+(' + Name + ')\s+SYSTEM\s+(\"[^\"]*\"|\'[^\']*\')\s*>\s*%' + Name + ';)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)') - Parser.__init__(self) + # http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar + #":" | [A-Z] | "_" | [a-z] | + # [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] + # | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | + # [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | + # [#x10000-#xEFFFF] + CharMinusDash = u'\x09\x0A\x0D\u0020-\u002C\u002E-\uD7FF\uE000-\uFFFD' + XmlComment = '<!--(?:-?[%s])*?-->' % CharMinusDash + NameStartChar = u':A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF' + \ + u'\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF'+\ + u'\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD' + # + \U00010000-\U000EFFFF seems to be unsupported in python + + # NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | + # [#x0300-#x036F] | [#x203F-#x2040] + NameChar = NameStartChar + ur'\-\.0-9' + u'\xB7\u0300-\u036F\u203F-\u2040' + Name = '[' + NameStartChar + '][' + NameChar + ']*' + reKey = re.compile('(?:(?P<pre>\s*)(?P<precomment>(?:' + XmlComment + '\s*)*)(?P<entity><!ENTITY\s+(?P<key>' + Name + ')\s+(?P<val>\"[^\"]*\"|\'[^\']*\'?)\s*>)(?P<post>[ \t]*(?:' + XmlComment + '\s*)*\n?)?)', re.DOTALL) + # add BOM to DTDs, details in bug 435002 + reHeader = re.compile(u'^\ufeff?(\s*<!--.*LICENSE BLOCK([^-]+-)*[^-]+-->)?') + reFooter = re.compile('\s*(<!--([^-]+-)*[^-]+-->\s*)*$') + rePE = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)(<!ENTITY\s+%\s+(' + Name + ')\s+SYSTEM\s+(\"[^\"]*\"|\'[^\']*\')\s*>\s*%' + Name + ';)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)') def getEntity(self, contents, offset): ''' Overload Parser.getEntity to special-case ParsedEntities. @@ -255,6 +255,13 @@ entity = Entity(contents, self.postProcessValue, *[m.span(i) for i in xrange(7)]) return (entity, inneroffset) + def createEntity(self, contents, m): + valspan = m.span('val') + valspan = (valspan[0]+1, valspan[1]-1) + return Entity(contents, self.postProcessValue, m.span(), + m.span('pre'), m.span('precomment'), + m.span('entity'), m.span('key'), valspan, + m.span('post')) class PropertiesParser(Parser): def __init__(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/Tests.py new/compare-locales/lib/Mozilla/Tests.py --- old/compare-locales/lib/Mozilla/Tests.py 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/lib/Mozilla/Tests.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,394 +0,0 @@ -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is l10n test automation. -# -# The Initial Developer of the Original Code is -# Mozilla Foundation -# Portions created by the Initial Developer are Copyright (C) 2006 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Axel Hecht <l10n@mozilla.com> -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -import logging -import Paths -import Parser - -def getRegionProperties(loc): - regprop = Paths.get_path('browser', loc, - 'chrome/browser-region/region.properties') - p = Parser.getParser(regprop) - f = Paths.File(regprop, 'chrome/browser-region/region.properties') - p.readContents(f.getContents()) - return p - -class Base: - '''Base class for all tests''' - def __init__(self): - if not hasattr(self, 'leafName'): - self.leafName = 'TODO' - logging.warning(' ' + self + ' does not have leafName set, writing to TODO') - def run(self): - '''Run this test for all locales, returns a dictionary with results''' - pass - def serialize(self, result, saveHandler): - '''Serialize the previously generated result, writes the dictionary - by default''' - return saveHandler(result, self.leafName) - pass - def failureTest(self, myResult, failureResult): - pass - -import CompareLocales -class CompareTest(Base): - '''Test class to compare locales''' - def __init__(self): - '''Initializes the test object''' - # nothing to be done here - self.apps = ['browser', 'mail'] - pass - def run(self): - '''Runs CompareLocales.compareApp()''' - app = Paths.EnumerateApp() - for appname in self.apps: - app.addApplication(appname) - return CompareLocales.compareApp(app) - def serialize(self, result, saveHandler): - '''Serialize the CompareLocales result by locale into - cmp-details-ab-CD - and a compacted version into - cmp-data - - ''' - #for locale, stats in result.details: - # assert locale is not None - # saveHandler(foo, 'cmp-details-%s.json' % locale) - saveHandler(result.summary, 'cmp-data.json') - - def failureTest(self, myResult, failureResult): - '''signal pass/warn/failure for each locale''' - def sumdata(data, part): - res = 0 - for mod in [u'browser', u'toolkit']: - res += data[part][mod] + data[part + u'Files'][mod] - return res - def getState(data): - ret = 0 - if sumdata(data, u'obsolete') > 0: - ret |= 1 - if sumdata(data, u'missing') > 0: - ret |= 2 - return ret - for loc, val in myResult.iteritems(): - if not failureResult.has_key(loc): - failureResult[loc] = getState(val) - else: - failureResult |= getState(val) - -from xml import sax -from types import DictType, FunctionType -import md5 -from codecs import utf_8_encode -import re -import os - -class SearchTest(Base): - """Test class to collect information from search plugins and to - verify that they're doing something good. - - """ - def __init__(self): - '''Set up the test class with a good leaf name''' - self.leafName = 'search-results.json' - pass - def run(self): - '''Collect all data from the MozSearch plugins in both the /cvsroot - repository for en-US and the /l10n repository for locales - - ''' - class DummyHandler(sax.handler.ContentHandler): - def startDocument(self): - self.md5 = md5.new() - self.indent = '' - self.engine = {'urls':[]} - self.lNames = [] - self.textField = None - self.content = '' - return - def endDocument(self): - self.engine['md5'] = self.md5.hexdigest() - return - def startElementNS(self, (ns, local), qname, attrs): - if self.textField: - logging.warning('Found Element, but expected CDATA.') - self.indent += ' ' - if ns != u'http://www.mozilla.org/2006/browser/search/': - raise UserWarning, ('bad namespace: ' + ns) - self.lNames.append(local) - handler = self.getOpenHandler() - if handler: - handler(self, attrs) - self.update(ns+local) - for qna in attrs.getQNames(): - self.update(qna[0] + qna[1] + attrs.getValueByQName(qna)) - return - def endElementNS(self, (ns, local), qname): - if self.textField: - self.engine[self.textField] = self.content - self.textField = None - self.content = '' - self.lNames.pop() - self.indent = self.indent[0:-2] - def characters(self, content): - self.update(content) - if not self.textField: - return - self.content += content - def update(self, content): - self.md5.update(utf_8_encode(content)[0]) - def openURL(self, attrs): - entry = {'params':{}, - 'type': attrs.getValueByQName(u'type'), - 'template': attrs.getValueByQName(u'template')} - self.engine['urls'].append(entry) - def handleParam(self, attrs): - try: - self.engine['urls'][-1]['params'][attrs.getValueByQName(u'name')] = attrs.getValueByQName(u'value') - except KeyError: - raise UserWarning, 'bad param' - return - def handleMozParam(self, attrs): - mp = None - try: - mp = { 'name': attrs.getValueByQName(u'name'), - 'condition': attrs.getValueByQName(u'condition'), - 'trueValue': attrs.getValueByQName(u'trueValue'), - 'falseValue': attrs.getValueByQName(u'falseValue')} - except KeyError: - try: - mp = {'name': attrs.getValueByQName(u'name'), - 'condition': attrs.getValueByQName(u'condition'), - 'pref': attrs.getValueByQName(u'pref')} - except KeyError: - raise UserWarning, 'bad mozParam' - if self.engine['urls'][-1].has_key('MozParams'): - self.engine['urls'][-1]['MozParams'].append(mp) - else: - self.engine['urls'][-1]['MozParams'] = [mp] - return - def handleShortName(self, attrs): - self.textField = 'ShortName' - return - def handleImage(self, attrs): - self.textField = 'Image' - return - def getOpenHandler(self): - return self.getHandler(DummyHandler.openHandlers) - def getHandler(self, handlers): - for local in self.lNames: - if type(handlers) != DictType or not handlers.has_key(local): - return - handlers = handlers[local] - if handlers.has_key('_handler'): - return handlers['_handler'] - return - openHandlers = {'SearchPlugin': - {'ShortName': {'_handler': handleShortName}, - 'Image': {'_handler': handleImage}, - 'Url':{'_handler': openURL, - 'Param': {'_handler':handleParam}, - 'MozParam': {'_handler':handleMozParam} - } - } - } - - handler = DummyHandler() - parser = sax.make_parser() - parser.setContentHandler(handler) - parser.setFeature(sax.handler.feature_namespaces, True) - - locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')] - locales.insert(0, 'en-US') - sets = {} - details = {} - - for loc in locales: - l = logging.getLogger('locales.' + loc) - try: - lst = open(Paths.get_path('browser',loc,'searchplugins/list.txt'),'r') - except IOError: - l.error("Locale " + loc + " doesn't have search plugins") - details[Paths.get_path('browser',loc,'searchplugins/list.txt')] = { - 'error': 'not found' - } - continue - sets[loc] = {'list': []} - p = getRegionProperties(loc) - orders = {} - for entity in p: - m = re.match('browser.search.order.([1-9])', entity.key) - if m: - orders[entity.val.strip()] = int(m.group(1)) - elif entity.key == 'browser.search.defaultenginename': - sets[loc]['default'] = entity.val.strip() - sets[loc]['orders'] = orders - for fn in lst: - name = fn.strip() - if len(name) == 0: - continue - leaf = 'searchplugins/' + name + '.xml' - _path = Paths.get_path('browser','en-US', leaf) - if not os.access(_path, os.R_OK): - _path = Paths.get_path('browser', loc, leaf) - l.debug('testing ' + _path) - sets[loc]['list'].append(_path) - try: - parser.parse(_path) - except IOError: - l.error("can't open " + _path) - details[_path] = {'_name': name, 'error': 'not found'} - continue - except UserWarning, ex: - l.error("error in searchplugin " + _path) - details[_path] = {'_name': name, 'error': ex.args[0]} - continue - except sax._exceptions.SAXParseException, ex: - l.error("error in searchplugin " + _path) - details[_path] = {'_name': name, 'error': ex.args[0]} - continue - details[_path] = handler.engine - details[_path]['_name'] = name - - engines = {'locales': sets, - 'details': details} - return engines - def failureTest(self, myResult, failureResult): - '''signal pass/warn/failure for each locale - Just signaling errors in individual plugins for now. - - ''' - for loc, val in myResult['locales'].iteritems(): - l = logging.getLogger('locales.' + loc) - # Verify that there are no errors in the engine parsing, - # and that there default engine is the first one. - if (not val['orders'].has_key(val['default'])) or val['orders'][val['default']] != 1: - l.error('Default engine is not first in order in locale ' + loc) - if not failureResult.has_key(loc): - failureResult[loc] = 2 - else: - failureResult[loc] |= 2 - for p in val['list']: - # no logging, that is already reported above - if myResult['details'][p].has_key('error'): - if not failureResult.has_key(loc): - failureResult[loc] = 2 - else: - failureResult[loc] |= 2 - -class RSSReaderTest(Base): - """Test class to collect information about RSS readers and to - verify that they might be working. - - """ - def __init__(self): - '''Set up the test class with a good leaf name''' - self.leafName = 'feed-reader-results.json' - pass - def run(self): - '''Collect the data from browsers region.properties for all locales - - ''' - locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')] - uri = re.compile('browser\\.contentHandlers\\.types\\.([0-5])\\.uri') - title = re.compile('browser\\.contentHandlers\\.types\\.([0-5])\\.title') - res = {} - for loc in locales: - l = logging.getLogger('locales.' + loc) - p = getRegionProperties(loc) - uris = {} - titles = {} - for entity in p: - key = entity.key - val = entity.val - m = uri.match(key) - if m: - o = int(m.group(1)) - if uris.has_key(o): - l.error('Double definition of RSS reader ' + o) - uris[o] = val.strip() - else: - m = title.match(key) - if m: - o = int(m.group(1)) - if titles.has_key(o): - l.error('Double definition of RSS reader ' + o) - titles[o] = val.strip() - ind = sorted(uris.keys()) - if ind != range(len(ind)) or ind != sorted(titles.keys()): - l.error('RSS Readers are badly set up') - res[loc] = [(titles[o], uris[o]) for o in ind] - return res - -class BookmarksTest(Base): - """Test class to collect information about bookmarks and check their - structure. - - """ - def __init__(self): - '''Set up the test class with a good leaf name''' - self.leafName = 'bookmarks-results.json' - pass - def run(self): - '''Collect the data from bookmarks.html for all locales - - ''' - locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')] - bm = Parser.BookmarksParser() - res = {} - for loc in locales: - try: - bm.readFile('l10n/%s/browser/profile/bookmarks.html'%loc) - res[loc] = bm.getDetails() - except Exception, e: - logging.getLogger('locale.%s'%loc).error('Bookmarks are busted, %s'%e) - return res - def failureTest(self, myResult, failureResult): - '''signal pass/warn/failure for each locale - Just signaling errors for now. - - ''' - locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')] - bm = Parser.BookmarksParser() - bm.read('mozilla/browser/locales/en-US/profile/bookmarks.html') - enUSDetails = bm.getDetails() - for loc in locales: - if not myResult.has_key(loc): - if not failureResult.has_key(loc): - failureResult[loc] = 2 - else: - failureResult[loc] |= 2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/__init__.py new/compare-locales/lib/Mozilla/__init__.py --- old/compare-locales/lib/Mozilla/__init__.py 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/lib/Mozilla/__init__.py 2010-11-06 13:43:49.000000000 +0100 @@ -1 +1 @@ -version="0.9pre" +version="0.9" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/tests/unitChecks.py new/compare-locales/lib/Mozilla/tests/unitChecks.py --- old/compare-locales/lib/Mozilla/tests/unitChecks.py 1970-01-01 01:00:00.000000000 +0100 +++ new/compare-locales/lib/Mozilla/tests/unitChecks.py 2010-11-06 13:43:49.000000000 +0100 @@ -0,0 +1,77 @@ +import unittest + +from Mozilla.Checks import getChecks +from Mozilla.Parser import getParser + + +class BaseHelper(unittest.TestCase): + filename = None + refContent = None + + def setUp(self): + p = getParser(self.filename) + p.readContents(self.refContent) + self.refs = [e for e in p] + + def _test(self, content, refWarnOrErrors): + p = getParser(self.filename) + p.readContents(content) + l10n = [e for e in p] + checks = getChecks(self.filename) + found = tuple(checks(self.refs[0], l10n[0])) + self.assertEqual(found, refWarnOrErrors) + + +class TestPlurals(BaseHelper): + filename = 'foo.properties' + refContent = '''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 number of files +# example: 111 files - Downloads +downloadsTitleFiles=#1 file - Downloads;#1 files - #2 +''' + + def testGood(self): + self._test('''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 number of files +# example: 111 files - Downloads +downloadsTitleFiles=#1 file - Downloads;#1 files - #2;#1 filers +''', + tuple()) + + def testNotUsed(self): + self._test('''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 number of files +# example: 111 files - Downloads +downloadsTitleFiles=#1 file - Downloads;#1 files - Downloads;#1 filers +''', + (('warning', 0, 'not all variables used in l10n'),)) + + def testNotDefined(self): + self._test('''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 number of files +# example: 111 files - Downloads +downloadsTitleFiles=#1 file - Downloads;#1 files - #2;#1 #3 +''', + (('error', 0, 'unreplaced variables in l10n'),)) + + +class TestDTDs(BaseHelper): + filename = 'foo.dtd' + refContent = '''<!ENTITY foo "This is 'good'"> +''' + def testWarning(self): + self._test('''<!ENTITY foo "This is ¬ good"> +''', + (('warning',(0,0),'Referencing unknown entity `not`'),)) + def testXMLEntity(self): + self._test('''<!ENTITY foo "This is "good""> +''', + tuple()) + + +if __name__ == '__main__': + unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/tests/unitDTD.py new/compare-locales/lib/Mozilla/tests/unitDTD.py --- old/compare-locales/lib/Mozilla/tests/unitDTD.py 1970-01-01 01:00:00.000000000 +0100 +++ new/compare-locales/lib/Mozilla/tests/unitDTD.py 2010-11-06 13:43:49.000000000 +0100 @@ -0,0 +1,52 @@ +import unittest +import re + +from Mozilla.Parser import getParser, Junk + +class TestDTD(unittest.TestCase): + + def testGood(self): + self._test('''<!ENTITY foo.label "stuff">''', + (('foo.label','stuff'),)) + + + quoteContent = '''<!ENTITY good.one "one"> +<!ENTITY bad.one "bad " quote"> +<!ENTITY good.two "two"> +<!ENTITY bad.two "bad "quoted" word"> +<!ENTITY good.three "three"> +<!ENTITY good.four "good ' quote"> +<!ENTITY good.five "good 'quoted' word"> +''' + quoteRef = ( + ('good.one', 'one'), + ('_junk_1_25-56', '<!ENTITY bad.one "bad " quote">'), + ('good.two', 'two'), + ('_junk_2_82-119', '<!ENTITY bad.two "bad "quoted" word">'), + ('good.three', 'three'), + ('good.four', 'good \' quote'), + ('good.five', 'good \'quoted\' word'), + ) + def testQuote(self): + self._test(self.quoteContent, self.quoteRef) + + def testApos(self): + qr = re.compile('[\'"]', re.M) + def quot2apos(s): + return qr.sub(lambda m: m.group(0)=='"' and "'" or '"', s) + + self._test(quot2apos(self.quoteContent), + map(lambda t: (t[0], quot2apos(t[1])), self.quoteRef)) + + def _test(self, content, refs): + p = getParser('foo.dtd') + Junk.junkid = 0 + p.readContents(content) + entities = [e for e in p] + self.assertEqual(len(entities), len(refs)) + for e, ref in zip(entities, refs): + self.assertEqual(e.val, ref[1]) + self.assertEqual(e.key, ref[0]) + +if __name__ == '__main__': + unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/tests/unitProperties.py new/compare-locales/lib/Mozilla/tests/unitProperties.py --- old/compare-locales/lib/Mozilla/tests/unitProperties.py 1970-01-01 01:00:00.000000000 +0100 +++ new/compare-locales/lib/Mozilla/tests/unitProperties.py 2010-11-06 13:43:49.000000000 +0100 @@ -0,0 +1,34 @@ +import unittest + +from Mozilla.Parser import getParser + +class TestLineWraps(unittest.TestCase): + + def setUp(self): + self.p = getParser('foo.properties') + + def tearDown(self): + del self.p + + def testBackslashes(self): + self.p.readContents(r'''one_line = This is one line +two_line = This is the first \ +of two lines +one_line_trailing = This line ends in \\ +and has junk +two_lines_triple = This line is one of two and ends in \\\ +and still has another line coming +''') + ref = ['This is one line', + u'This is the first \\\nof two lines', + r'This line ends in \\'] + i = iter(self.p) + for r, e in zip(ref, i): + self.assertEqual(e.val, r) + e = i.next() + self.assertEqual(e.key, '_junk_1_113-126') + for r, e in zip(('This line is one of two and ends in \\\\\\\nand still has another line coming',), i): + self.assertEqual(e.val, r) + +if __name__ == '__main__': + unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/scripts/compare-locales new/compare-locales/scripts/compare-locales --- old/compare-locales/scripts/compare-locales 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/scripts/compare-locales 2010-11-06 13:43:49.000000000 +0100 @@ -57,6 +57,8 @@ 'localization. [default: en-US]') parser.add_option('-m', '--merge', help='Use this directory to stage merged files') +parser.add_option('--json', action='store_true', dest='json', + help='Dump just summary as exhibit JSON') (options, args) = parser.parse_args() if len(args) < 3: @@ -72,7 +74,10 @@ app.reference = options.reference o = compareApp(app, merge_stage = options.merge) -print codecs.utf_8_encode(o.serialize())[0] +so = {} +if options.json: + so['type']='application/json' +print codecs.utf_8_encode(o.serialize(**so))[0] if not options.merge: # if not merging, error on really missing strings diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/scripts/test-locales new/compare-locales/scripts/test-locales --- old/compare-locales/scripts/test-locales 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/scripts/test-locales 1970-01-01 01:00:00.000000000 +0100 @@ -1,245 +0,0 @@ -#! python -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is l10n test automation. -# -# The Initial Developer of the Original Code is -# Mozilla Foundation -# Portions created by the Initial Developer are Copyright (C) 2006 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Axel Hecht <l10n@mozilla.com> -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - - -import logging -import sys -import os -import os.path -from datetime import datetime -import time -from optparse import OptionParser -import gzip -import codecs - -from Mozilla import Parser, CompareLocales, Paths, Tests -import simplejson - -# -# Helper classes -# - -# -# Logging -# -class LogHandler(logging.Handler): - def __init__(self): - self.log = [] - logging.Handler.__init__(self) - def emit(self, record): - self.log.append((record.name, record.levelname, record.getMessage().strip())) - -# -# JSON with optional gzip -# -class Wrapper: - def __init__(self, path, name): - self.p = os.path.join(path, name) - self.n = name - self.f = None - if opts.gzip: - self.p += '.gz' - def open(self, mode): - if self.f: - self.f.close() - if opts.gzip: - mode += 'b' - self.f = open(self.p, mode) - if opts.gzip: - self.f = gzip.GzipFile(fileobj = self.f, filename = self.n) - self.w = codecs.getwriter('utf-8')(self.f) - self.r = codecs.getreader('utf-8')(self.f) - def write(self, str): - self.w.write(str) - def read(self, size = -1): - return self.r.read(size) - def rewind(self): - if opts.gzip: - self.f.rewind() - else: - self.f.seek(0,0) - def close(self): - if opts.gzip: - f = self.f.fileobj; - self.f.close() - if opts.gzip: - f.close() - self.w = self.r = self.f = None -# -# Helper function for JSON output with optional gzip -# -def saveJSON(dic, localName): - name = os.path.join(basePath, localName) ; - if opts.gzip: - f = open(name + '.gz', 'wb') - s = gzip.GzipFile(fileobj = f, filename = localName) - else: - f = open(name, 'w') - s = f - sw = codecs.getwriter('utf-8')(s) - sw.write(simplejson.dumps(dic, sort_keys=True)) - sw.reset() - if opts.gzip: - s.close() - f.close() - - -lvl = logging.WARNING -date = datetime.utcnow().replace(second=0,microsecond=0).isoformat(' ') -# parse commandline arguments -cp = OptionParser(version='0.2') -cp.add_option('-v', '--verbose', action='count', dest='v', default=0, - help='Make more noise') -cp.add_option('-q', '--quiet', action='count', dest='q', default=0, - help='Make less noise') -cp.add_option('-O', '--base-dir', type='string', dest='target', - default='results', - help='Destination base directory') -cp.add_option('-c', '--checkout', action='store_true', dest='checkout', - default=False, - help='Run make -f client.mk l10n-checkout [Default: not]') -cp.add_option('-d', '--date', type='string', dest='date', - help='Explicit start date or subdir [Default: now]') -cp.add_option('-z',action="store_true", dest="gzip", default=False, - help='Use gzip compression for output') -cp.add_option('-w','--enable-waterfall', action="store_true", - dest="waterfall", default=False, - help='Update waterfall data') -cp.add_option('--end-date', type='string', dest='enddate', - help='Explicit (faked) end date') -opts, optlist = cp.parse_args(sys.argv[1:]) - -# -# Set up Logging -# -logging.basicConfig(level=(logging.WARNING + 10*(opts.q - opts.v))) -# Add a handler to store the output -h = LogHandler() -logging.getLogger('').addHandler(h) - -# -# Check that we're in the right location and check out if requested -# -try: - os.chdir('mozilla') - if opts.checkout: - env = '' - l = logging.getLogger('cvsco') - if opts.date: - env = 'MOZ_CO_DATE="' + opts.date + ' +0" ' - fh = os.popen(env + 'make -f client.mk l10n-checkout') - for ln in fh: - l.info(ln.strip()) - if fh.close(): - raise Exception('cvs checkout failed') - os.chdir('..') -except Exception,e: - sys.exit(str(e)) - -if not opts.date: - opts.date = date # use default set above - -logging.debug(' Ensure output directory') -# replace : with - -opts.date = opts.date.replace(':','-') -if not os.path.isdir(opts.target): - sys.exit('error: ' + opts.target + ' is not a directory') -if opts.waterfall: - startdate = time.mktime(time.strptime(opts.date, '%Y-%m-%d %H-%M-%S')) + time.altzone -basePath = os.path.join(opts.target, opts.date) -if not os.path.isdir(basePath): - os.mkdir(basePath) - - -tests = [Tests.CompareTest(), - Tests.SearchTest(), - Tests.RSSReaderTest()] -# disable bookmarks test, that's hard to fix. XXX -# Tests.BookmarksTest()] -drop = {} -for test in tests: - res = test.run() - test.serialize(res, saveJSON) - if opts.waterfall: - test.failureTest(res, drop) - -if not opts.waterfall: - saveJSON(h.log, 'buildlog.json') - sys.exit() - - -if opts.enddate: - endtime = time.mktime(time.strptime(opts.enddate, '%Y-%m-%d %H:%M:%S')) + time.altzone -else: - endtime = time.mktime(datetime.now().timetuple()) -f = None -w = Wrapper(opts.target, 'waterfall.json') -if os.path.isfile(w.p): - w.open('r') - water = simplejson.load(w) -else: - water = [] - -water.append((opts.date, (startdate, endtime), drop)) -# -# Check if we need to rotate the waterfall -# -rotateLen = 24 -if len(water) > rotateLen * 1.5: - # rotate, maximum of 16 logs - suffix = '' - if opts.gzip: - suffix = '.gz' - fnames = [os.path.join(opts.target, 'waterfall-%x.json'%i) + suffix for i in range(16)] - # remove oldest log - if os.path.isfile(fnames[15]): - os.remove(fnames[15]) - for l in range(14, -1, -1): - if os.path.isfile(fnames[l]): - os.rename(fnames[l], fnames[l+1]) - w0 = Wrapper('.', fnames[0]) - w0.open('w') - simplejson.dump(water[:rotateLen], w0, sort_keys=True) - w0.close() - water = water[rotateLen:] - -w.open('w') -simplejson.dump(water, w, sort_keys=True) -w.close() - -saveJSON(h.log, 'buildlog.json') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/setup.py new/compare-locales/setup.py --- old/compare-locales/setup.py 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/setup.py 2010-11-06 13:43:49.000000000 +0100 @@ -5,7 +5,7 @@ of the format, the Mozilla architecture does not provide fallback strings at runtime. This library and the calling scripts provide a way to check a given localization for completeness. For more information see -http://developer.mozilla.org/en/docs/Compare-locales +https://developer.mozilla.org/en/docs/Compare-locales """ docstrings = __doc__.split("\n") @@ -41,7 +41,6 @@ description=docstrings[0], long_description="\n".join(docstrings[2:]), license="MPL 1.1/GPL 2.0/LGPL 2.1", - url="http://developer.mozilla.org/en/docs/Compare-locales", classifiers=filter(None, classifiers.split("\n")), platforms=["any"], scripts=['scripts/compare-locales', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/tests/unitProperties.py new/compare-locales/tests/unitProperties.py --- old/compare-locales/tests/unitProperties.py 2010-09-01 21:36:44.000000000 +0200 +++ new/compare-locales/tests/unitProperties.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,26 +0,0 @@ -import unittest - -from Mozilla.Parser import getParser - -class TestLineWraps(unittest.TestCase): - - def setUp(self): - self.p = getParser('foo.properties') - - def tearDown(self): - self.p = None - - def testBackslashes(self): - self.p.readContents(r'''one_line = This is one line -two_line = This is the first \ -of two lines -one_line_trailing = This line ends in \\ -and has junk -two_lines_triple = This line is one of two and ends in \\\ -and still has another line coming -''') - for e in self.p: - print '"%s" => %s \n\n' % (e.key, e.val) - -if __name__ == '__main__': - unittest.main() ++++++ create-tar.sh ++++++ --- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100 +++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100 @@ -1,7 +1,7 @@ #!/bin/bash BRANCH="mozilla-central" -RELEASE_TAG="FIREFOX_4_0b5_RELEASE" +RELEASE_TAG="FIREFOX_4_0b7_RELEASE" VERSION="2.0b" # mozilla ++++++ l10n-2.0b.tar.bz2 ++++++ mozilla-xulrunner20/l10n-2.0b.tar.bz2 mozilla-xulrunner20/l10n-2.0b.tar.bz2 differ: char 11, line 1 ++++++ mozilla-buildsymbols.patch ++++++ --- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100 +++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100 @@ -1,12 +1,12 @@ # HG changeset patch # User Wolfgang Rosenauer <wr@rosenauer.org> -# Parent 6637fa42939971816b5b0163e44cbdc0f7290066 +# Parent 7351fc8754c200b787fd701e7efa5fd2fc5864ff Bug 588129 - symbols.txt file missing from *.crashreporter-symbols.zip diff --git a/Makefile.in b/Makefile.in --- a/Makefile.in +++ b/Makefile.in -@@ -186,17 +186,18 @@ ifdef MOZ_CRASHREPORTER +@@ -183,17 +183,20 @@ ifdef MOZ_CRASHREPORTER $(DIST)/crashreporter-symbols \ $(MAKE_SYM_STORE_PATH) > \ $(DIST)/crashreporter-symbols/$(SYMBOL_INDEX_NAME) @@ -16,8 +16,10 @@ zip -r9D "../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip" . cd $(DIST)/crashreporter-symbols && \ - zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" -+ zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" \ -+ zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.txt" ++ grep "sym" $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \ ++ mv $(SYMBOL_INDEX_NAME).tmp $(SYMBOL_INDEX_NAME) ++ cd $(DIST)/crashreporter-symbols && \ ++ zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" -i "*.txt" else ifdef WINCE ifdef SYMBOLSTORE_PATH ++++++ mozilla-kde.patch ++++++ --- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100 +++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100 @@ -21,9 +21,9 @@ diff --git a/modules/libpref/src/nsPrefService.cpp b/modules/libpref/src/nsPrefService.cpp --- a/modules/libpref/src/nsPrefService.cpp +++ b/modules/libpref/src/nsPrefService.cpp -@@ -51,16 +51,17 @@ - #include "nsILocalFile.h" - #include "nsIObserverService.h" +@@ -55,16 +55,17 @@ + #include "nsIStringEnumerator.h" + #include "nsIZipReader.h" #include "nsPrefBranch.h" #include "nsXPIDLString.h" #include "nsCRT.h" @@ -39,7 +39,57 @@ #include "prefapi.h" #include "prefread.h" #include "prefapi_private_data.h" -@@ -718,28 +719,40 @@ static nsresult pref_InitDefaults() +@@ -760,30 +761,48 @@ pref_LoadPrefsInDir(nsIFile* aDir, char + } + + static nsresult pref_LoadPrefsInDirList(const char *listId) + { + nsresult rv; + nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); + if (NS_FAILED(rv)) return rv; + ++ // make sure we load these special files after all the others ++ static const char* specialFiles[] = { ++#if defined(XP_UNIX) ++ "" ++#endif ++ }; ++ ++ if (nsKDEUtils::kdeSession()) { ++ for(int i = 0; ++ i < NS_ARRAY_LENGTH(specialFiles); ++ ++i ) { ++ if (*specialFiles[ i ] == '\0') { ++ specialFiles[ i ] = "kde.js"; ++ break; ++ } ++ } ++ } ++ + nsCOMPtr<nsISimpleEnumerator> dirList; + dirSvc->Get(listId, + NS_GET_IID(nsISimpleEnumerator), + getter_AddRefs(dirList)); + if (dirList) { + PRBool hasMore; + while (NS_SUCCEEDED(dirList->HasMoreElements(&hasMore)) && hasMore) { + nsCOMPtr<nsISupports> elem; + dirList->GetNext(getter_AddRefs(elem)); + if (elem) { + nsCOMPtr<nsIFile> dir = do_QueryInterface(elem); + if (dir) { + // Do we care if a file provided by this process fails to load? +- pref_LoadPrefsInDir(dir, nsnull, 0); ++ pref_LoadPrefsInDir(dir, specialFiles, NS_ARRAY_LENGTH(specialFiles)); + } + } + } + } + return NS_OK; + } + + //---------------------------------------------------------------------------------------- +@@ -814,28 +833,40 @@ static nsresult pref_InitDefaults() /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */ static const char* specialFiles[] = { #if defined(XP_MAC) || defined(XP_MACOSX) @@ -117,7 +167,7 @@ #define DOWNLOAD_MANAGER_ALERT_ICON "chrome://mozapps/skin/downloads/downloadIcon.png" #define PREF_BDM_SHOWALERTONCOMPLETE "browser.download.manager.showAlertOnComplete" #define PREF_BDM_SHOWALERTINTERVAL "browser.download.manager.showAlertInterval" -@@ -2188,16 +2192,25 @@ nsDownload::SetState(DownloadState aStat +@@ -2192,16 +2196,25 @@ nsDownload::SetState(DownloadState aStat nsCOMPtr<nsIPrefBranch> pref(do_GetService(NS_PREFSERVICE_CONTRACTID)); // Master pref to control this function. @@ -143,7 +193,7 @@ PRInt64 goat = PR_Now() - mStartTime; showTaskbarAlert = goat > alertIntervalUSec; -@@ -2223,16 +2236,17 @@ nsDownload::SetState(DownloadState aStat +@@ -2227,16 +2240,17 @@ nsDownload::SetState(DownloadState aStat // because if it is, they'll click open the download manager and // the items they downloaded will have been removed. alerts->ShowAlertNotification( @@ -484,7 +534,7 @@ + case "cancel": + button.setAttribute("icon","cancel"); + break; -+ case "disclosue": ++ case "disclosure": + button.setAttribute("icon","properties"); + break; + case "help": @@ -2088,7 +2138,7 @@ diff --git a/toolkit/xre/Makefile.in b/toolkit/xre/Makefile.in --- a/toolkit/xre/Makefile.in +++ b/toolkit/xre/Makefile.in -@@ -95,17 +95,18 @@ CMMSRCS = nsNativeAppSupportCocoa.mm +@@ -97,17 +97,18 @@ CMMSRCS = nsNativeAppSupportCocoa.mm else ifeq ($(MOZ_WIDGET_TOOLKIT),os2) CPPSRCS += nsNativeAppSupportOS2.cpp @@ -2550,9 +2600,9 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),android) OSHELPER += nsMIMEInfoAndroid.cpp OSHELPER += nsAndroidHandlerApp.cpp + OSHELPER += nsExternalSharingAppService.cpp + EXPORTS += nsExternalSharingAppService.h endif - - ifeq ($(MOZ_WIDGET_TOOLKIT),qt) diff --git a/uriloader/exthandler/unix/nsCommonRegistry.cpp b/uriloader/exthandler/unix/nsCommonRegistry.cpp new file mode 100644 --- /dev/null @@ -3104,7 +3154,7 @@ diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in --- a/widget/src/gtk2/Makefile.in +++ b/widget/src/gtk2/Makefile.in -@@ -155,11 +155,14 @@ endif +@@ -157,11 +157,14 @@ endif DEFINES += -DCAIRO_GFX @@ -3458,7 +3508,7 @@ diff --git a/xpcom/components/Makefile.in b/xpcom/components/Makefile.in --- a/xpcom/components/Makefile.in +++ b/xpcom/components/Makefile.in -@@ -98,10 +98,11 @@ FORCE_STATIC_LIB = 1 +@@ -94,10 +94,11 @@ FORCE_STATIC_LIB = 1 # Force use of PIC FORCE_USE_PIC = 1 @@ -3597,7 +3647,7 @@ diff --git a/xpcom/io/Makefile.in b/xpcom/io/Makefile.in --- a/xpcom/io/Makefile.in +++ b/xpcom/io/Makefile.in -@@ -191,17 +191,17 @@ include $(topsrcdir)/config/rules.mk +@@ -192,17 +192,17 @@ include $(topsrcdir)/ipc/chromium/chromi DEFINES += -D_IMPL_NS_COM ifeq ($(OS_ARCH),Linux) @@ -3606,8 +3656,8 @@ endif endif --LOCAL_INCLUDES = -I.. -+LOCAL_INCLUDES = -I.. -I$(topsrcdir)/toolkit/xre +-LOCAL_INCLUDES += -I.. ++LOCAL_INCLUDES += -I.. -I$(topsrcdir)/toolkit/xre ifeq ($(MOZ_PLATFORM_MAEMO),5) CFLAGS += $(MOZ_DBUS_CFLAGS) ++++++ mozilla-language.patch ++++++ # HG changeset patch # User Wolfgang Rosenauer <wr@rosenauer.org> # Parent 4a8194d5971401441da4f4f3bbd2730e506da4bc Bug 583793 - Firefox interface language set to LANG, ignores LANGUAGE diff --git a/intl/locale/src/nsLocaleService.cpp b/intl/locale/src/nsLocaleService.cpp --- a/intl/locale/src/nsLocaleService.cpp +++ b/intl/locale/src/nsLocaleService.cpp @@ -192,22 +192,24 @@ nsLocaleService::nsLocaleService(void) return; } #ifdef MOZ_ENABLE_MEEGOTOUCH // Create a snapshot of the gconf locale values into the // corresponding environment variables to obey system settings // as accurately as possible. CopyGConfToEnv("/meegotouch/i18n/language", "LANG"); + CopyGConfToEnv("/meegotouch/i18n/language", "LANGUAGE"); CopyGConfToEnv("/meegotouch/i18n/lc_collate", NSILOCALE_COLLATE); CopyGConfToEnv("/meegotouch/i18n/lc_monetary", NSILOCALE_MONETARY); CopyGConfToEnv("/meegotouch/i18n/lc_numeric", NSILOCALE_NUMERIC); CopyGConfToEnv("/meegotouch/i18n/lc_time", NSILOCALE_TIME); #endif // Get system configuration + const char* language = getenv("LANGUAGE"); const char* lang = getenv("LANG"); for( i = 0; i < LocaleListLength; i++ ) { nsresult result; // setlocale( , "") evaluates LC_* and LANG char* lc_temp = setlocale(posix_locale_category[i], ""); CopyASCIItoUTF16(LocaleList[i], category); category_platform = category; category_platform.AppendLiteral("##PLATFORM"); @@ -222,16 +224,21 @@ nsLocaleService::nsLocaleService(void) else { CopyASCIItoUTF16(lang, platformLocale); result = posixConverter->GetXPLocale(lang, xpLocale); } } if (NS_FAILED(result)) { return; } + // LANGUAGE is overriding LC_MESSAGES + if (i == LC_MESSAGES && language && *language) { + CopyASCIItoUTF16(language, platformLocale); + result = posixConverter->GetXPLocale(language, xpLocale); + } resultLocale->AddCategory(category, xpLocale); resultLocale->AddCategory(category_platform, platformLocale); } mSystemLocale = do_QueryInterface(resultLocale); mApplicationLocale = do_QueryInterface(resultLocale); } // if ( NS_SUCCEEDED )... #endif // XP_UNIX || XP_BEOS ++++++ mozilla-pkgconfig.patch ++++++ --- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100 +++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100 @@ -14,7 +14,7 @@ include $(topsrcdir)/toolkit/mozapps/installer/packager.mk +# the apilibdir always ends with 1.9 as every patch update will provide a link -+apilibdir = $(dir $(installdir))xulrunner-1.9.2 ++apilibdir = $(dir $(installdir))xulrunner-2.0 + $(MOZILLA_VERSION).system.conf: $(topsrcdir)/config/milestone.txt Makefile printf "[%s]\nGRE_PATH=%s\nxulrunner=true\nabi=%s" \ @@ -24,7 +24,7 @@ # to register xulrunner per-user, override this with $HOME/.gre.d regdir = /etc/gre.d -@@ -109,16 +112,17 @@ pkg_config_files += mozilla-nss.pc +@@ -116,16 +119,17 @@ pkg_config_files += mozilla-nss.pc endif %.pc: $(srcdir)/%.pc.in $(GLOBAL_DEPS) @@ -40,8 +40,8 @@ -e "s|%FULL_NSPR_LIBS%|$(FULL_NSPR_LIBS)|" \ -e "s|%FULL_NSPR_CFLAGS%|$(FULL_NSPR_CFLAGS)|" \ -e "s|%NSPR_NAME%|$(NSPR_NAME)|" \ - -e "s|%NSPR_VERSION%|$(NSPR_VERSION)|" > $@ - chmod 644 $@ + -e "s|%NSPR_VERSION%|$(NSPR_VERSION)|" \ + -e "s|%MOZ_XUL_LINK%|$(MOZ_XUL_LINK)|" \ diff --git a/xulrunner/installer/libxul-embedding.pc.in b/xulrunner/installer/libxul-embedding.pc.in --- a/xulrunner/installer/libxul-embedding.pc.in +++ b/xulrunner/installer/libxul-embedding.pc.in @@ -72,7 +72,7 @@ Description: The Mozilla Runtime and Embedding Engine Version: %MOZILLA_VERSION% Requires: %NSPR_NAME% >= %NSPR_VERSION% - Libs: -L${sdkdir}/lib -lxpcomglue_s -lxul -lxpcom + Libs: -L${sdkdir}/lib %MOZ_XUL_LINK% diff --git a/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in b/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in --- a/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in +++ b/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in @@ -112,6 +112,6 @@ Description: The Mozilla JavaScript Library Version: %MOZILLA_VERSION% Requires: %NSPR_NAME% >= %NSPR_VERSION% --Libs: -L${sdkdir}/lib -lmozjs -+Libs: -Wl,-rpath,${libdir} -L${sdkdir}/lib -lmozjs +-Libs: -L${sdkdir}/lib %MOZ_JS_LINK% ++Libs: -Wl,-rpath,${libdir} -L${sdkdir}/lib %MOZ_JS_LINK% Cflags: -I${includedir} -DXP_UNIX -DJS_THREADSAFE ++++++ mozilla-shared-nss-db.patch ++++++ --- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100 +++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100 @@ -7,7 +7,7 @@ diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in -@@ -560,16 +560,20 @@ MOZ_ALSA_LIBS = @MOZ_ALSA_LIBS +@@ -571,16 +571,20 @@ MOZ_ALSA_LIBS = @MOZ_ALSA_LIBS GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ @@ -22,16 +22,16 @@ + MOZ_NATIVE_MAKEDEPEND = @SYSTEM_MAKEDEPEND@ + export CL_INCLUDES_PREFIX = @CL_INCLUDES_PREFIX@ + MOZ_AUTO_DEPS = @MOZ_AUTO_DEPS@ COMPILER_DEPEND = @COMPILER_DEPEND@ MDDEPDIR := @MDDEPDIR@ CC_WRAPPER = @CC_WRAPPER@ - CXX_WRAPPER = @CXX_WRAPPER@ - diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in -@@ -8452,16 +8452,31 @@ AC_SUBST(QCMS_LIBS) +@@ -8610,16 +8610,31 @@ AC_SUBST(QCMS_LIBS) dnl ======================================================== dnl HarfBuzz @@ -43,7 +43,7 @@ +dnl Check for nss-shared-helper +dnl ======================================================== + -+ PKG_CHECK_MODULES(NSSHELPER, nss-shared-helper, ++ PKG_CHECK_MODULES(NSSHELPER, nss-shared-helper, + [MOZ_ENABLE_NSSHELPER=1], + [MOZ_ENABLE_NSSHELPER=]) + @@ -55,18 +55,18 @@ +AC_SUBST(NSSHELPER_LIBS) + +dnl ======================================================== + dnl OTS + dnl ======================================================== + MOZ_OTS_LIBS='$(DEPTH)/gfx/ots/src/$(LIB_PREFIX)mozots.$(LIB_SUFFIX)' + AC_SUBST(MOZ_OTS_LIBS) + + dnl ======================================================== dnl disable xul dnl ======================================================== - MOZ_ARG_DISABLE_BOOL(xul, - [ --disable-xul Disable XUL], - MOZ_XUL= ) - if test "$MOZ_XUL"; then - AC_DEFINE(MOZ_XUL) - else diff --git a/security/manager/ssl/src/Makefile.in b/security/manager/ssl/src/Makefile.in --- a/security/manager/ssl/src/Makefile.in +++ b/security/manager/ssl/src/Makefile.in -@@ -112,19 +112,20 @@ CSRCS += md4.c +@@ -117,19 +117,20 @@ CSRCS += md4.c EXTRA_DEPS = $(NSS_DEP_LIBS) @@ -115,7 +115,7 @@ #include "nsNetUtil.h" #include "nsAppDirectoryServiceDefs.h" -@@ -1647,18 +1654,34 @@ nsNSSComponent::InitializeNSS(PRBool sho +@@ -1658,18 +1665,34 @@ nsNSSComponent::InitializeNSS(PRBool sho ConfigureInternalPKCS11Token(); // The NSS_INIT_NOROOTINIT flag turns off the loading of the root certs ++++++ xulrunner-source-2.0b.tar.bz2 ++++++ mozilla-xulrunner20/xulrunner-source-2.0b.tar.bz2 mozilla-xulrunner20/xulrunner-source-2.0b.tar.bz2 differ: char 11, line 1 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de