[thunderbird-lightning/el5: 33/33] Update to 2.6.4, add some el5 tb changes
Orion Poplawski
orion at fedoraproject.org
Sun Dec 15 05:39:07 UTC 2013
commit 16ca95274dd3cec0550a02f583cfb39b64ef616a
Merge: be78a5b d1fe355
Author: Orion Poplawski <orion at cora.nwra.com>
Date: Sat Dec 14 22:39:05 2013 -0700
Update to 2.6.4, add some el5 tb changes
.gitignore | 7 +
mklangsource.sh | 12 +-
mozilla-694594-gcc-4.4.patch | 12 -
mozilla-abort.patch | 11 -
mozilla-build-arm.patch | 12 +
mozilla-build.patch | 21 +-
mozilla-gtk-close.patch | 12 -
mozilla-python.patch | 2498 ++++++------------------------------
sources | 4 +-
thunderbird-lightning-alarm.patch | 59 -
thunderbird-lightning.spec | 65 +-
thunderbird-mozconfig | 2 +
xulrunner-2.0-chromium-types.patch | 29 +-
xulrunner-pagesize-ia64.patch | 109 --
14 files changed, 522 insertions(+), 2331 deletions(-)
---
diff --cc .gitignore
index d7f5d41,34b401c..650fb06
--- a/.gitignore
+++ b/.gitignore
@@@ -35,6 -35,12 +35,13 @@@
/lightning-1.8.source.tar.bz2
/lightning-1.9.source.tar.bz2
/l10n-1.9.tar.xz
+/pysqlite-2.6.3.tar.gz
/lightning-1.9.1.source.tar.bz2
/l10n-1.9.1.tar.xz
+ /l10n-2.6.tar.xz
+ /lightning-2.6.source.tar.bz2
+ /thunderbird-24.1.0.source.tar.bz2
+ /l10n-2.6.2.tar.xz
+ /lightning-2.6.2.source.tar.bz2
+ /lighting-2.6.4.source.tar.bz2
+ /l10n-2.6.4.tar.xz
diff --cc mozilla-python.patch
index dbcc729,5c2114e..0e0efb2
--- a/mozilla-python.patch
+++ b/mozilla-python.patch
@@@ -1,2087 -1,2820 +1,435 @@@
- diff -up comm-esr17/mozilla/build/ConfigStatus.py.python comm-esr17/mozilla/build/ConfigStatus.py
- --- comm-esr17/mozilla/build/ConfigStatus.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/build/ConfigStatus.py 2012-11-19 13:20:39.000000000 +0100
- @@ -6,7 +6,6 @@
- # drop-in replacement for autoconf 2.13's config.status, with features
- # borrowed from autoconf > 2.5, and additional features.
-
- -from __future__ import with_statement
- from optparse import OptionParser
- import sys, re, os, posixpath, ntpath
- from StringIO import StringIO
- @@ -76,13 +75,13 @@ class FileAvoidWrite(StringIO):
- return
- except IOError:
- pass
- - finally:
- - file.close()
- + file.close()
-
- log("creating %s" % relpath(self.filename, os.curdir))
- ensureParentDir(self.filename)
- - with open(self.filename, 'w') as file:
- - file.write(buf)
- + ff = open(self.filename, 'w')
- + ff.write(buf)
- + ff.close()
-
- def __enter__(self):
- return self
- @@ -203,8 +202,12 @@ class ConfigEnvironment(object):
- pp.context.update(DEPTH = self.get_depth(path))
- pp.do_filter('attemptSubstitution')
- pp.setMarker(None)
- - with FileAvoidWrite(path) as pp.out:
- + pp.out = FileAvoidWrite(path)
- + pp.out.__enter__()
- + try:
- pp.do_include(input)
- + finally:
- + pp.out.__exit__(0, 0, 0)
-
- def create_config_header(self, path):
- '''Creates the given config header. A config header is generated by
- @@ -216,7 +219,8 @@ class ConfigEnvironment(object):
- "#undef UNKNOWN_NAME" is turned into "/* #undef UNKNOWN_NAME */"
- Whitespaces are preserved.
- '''
- - with open(self.get_input(path), 'rU') as input:
- + input = open(self.get_input(path), 'rU')
- + if 1:
- ensureParentDir(path)
- output = FileAvoidWrite(path)
- r = re.compile('^\s*#\s*(?P<cmd>[a-z]+)(?:\s+(?P<name>\S+)(?:\s+(?P<value>\S+))?)?', re.U)
- @@ -237,6 +241,7 @@ class ConfigEnvironment(object):
-
- output.write(l)
- output.close()
- + input.close()
-
- def config_status(topobjdir = '.', topsrcdir = '.',
- defines = [], non_global_defines = [], substs = [],
- diff -up comm-esr17/mozilla/build/virtualenv/populate_virtualenv.py.python comm-esr17/mozilla/build/virtualenv/populate_virtualenv.py
- --- comm-esr17/mozilla/build/virtualenv/populate_virtualenv.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/build/virtualenv/populate_virtualenv.py 2012-11-19 13:20:39.000000000 +0100
- @@ -5,7 +5,6 @@
- # This file contains code for populating the virtualenv environment for
- # Mozilla's build system. It is typically called as part of configure.
-
- -from __future__ import with_statement
- import os.path
- import subprocess
- import sys
- @@ -43,8 +42,9 @@ def populate_virtualenv(top_source_direc
- if package[0].endswith('.pth'):
- assert len(package) == 2
-
- - with open(os.path.join(distutils.sysconfig.get_python_lib(), package[0]), 'a') as f:
- - f.write("%s\n" % os.path.join(top_source_directory, package[1]))
- + f = open(os.path.join(distutils.sysconfig.get_python_lib(), package[0]), 'a')
- + f.write("%s\n" % os.path.join(top_source_directory, package[1]))
- + f.close()
-
- def call_setup(directory, arguments):
- """Calls setup.py in a directory."""
- diff -up comm-esr17/mozilla/config/expandlibs_exec.py.python comm-esr17/mozilla/config/expandlibs_exec.py
- --- comm-esr17/mozilla/config/expandlibs_exec.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/config/expandlibs_exec.py 2012-11-19 13:20:39.000000000 +0100
- @@ -20,13 +20,11 @@ With the --symbol-order argument, follow
- relevant linker options to change the order in which the linker puts the
- symbols appear in the resulting binary. Only works for ELF targets.
- '''
- -from __future__ import with_statement
+ diff -up mozilla-esr24/build/virtualenv/populate_virtualenv.py.python mozilla-esr24/build/virtualenv/populate_virtualenv.py
+ --- mozilla-esr24/build/virtualenv/populate_virtualenv.py.python 2013-09-11 05:22:20.000000000 +0200
-+++ mozilla-esr24/build/virtualenv/populate_virtualenv.py 2013-10-22 14:29:24.560993882 +0200
-@@ -16,7 +16,8 @@ import sys
+++++ mozilla-esr24/build/virtualenv/populate_virtualenv.py 2013-10-22 16:03:57.000000000 +0200
++@@ -16,7 +17,8 @@ import sys
+
+ # Minimum version of Python required to build.
+ MINIMUM_PYTHON_MAJOR = 2
+ -MINIMUM_PYTHON_MINOR = 7
+ +# Override for RHEL
+ +MINIMUM_PYTHON_MINOR = 4
+
+
+ class VirtualenvManager(object):
+ diff -up mozilla-esr24/dom/bindings/Codegen.py.python mozilla-esr24/dom/bindings/Codegen.py
+ --- mozilla-esr24/dom/bindings/Codegen.py.python 2013-09-11 05:22:23.000000000 +0200
-+++ mozilla-esr24/dom/bindings/Codegen.py 2013-10-22 14:29:24.561993885 +0200
+++++ mozilla-esr24/dom/bindings/Codegen.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -8440,7 +8440,7 @@ class CGBindingRoot(CGThing):
+ def getParentDescriptor(desc):
+ if not desc.interface.parent:
+ return set()
+ - return { desc.getDescriptor(desc.interface.parent.identifier.name) }
+ + return set ([desc.getDescriptor(desc.interface.parent.identifier.name)])
+ for x in dependencySortObjects(jsImplemented, getParentDescriptor,
+ lambda d: d.interface.identifier.name):
+ cgthings.append(CGCallbackInterface(x))
+ diff -up mozilla-esr24/python/mach/mach/logging.py.python mozilla-esr24/python/mach/mach/logging.py
+ --- mozilla-esr24/python/mach/mach/logging.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mach/mach/logging.py 2013-10-22 14:29:24.562993887 +0200
+++++ mozilla-esr24/python/mach/mach/logging.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -18,6 +18,10 @@ import logging
import sys
- import os
- from expandlibs import ExpandArgs, relativize, isObject, ensureParentDir, ExpandLibsDeps
- import expandlibs_config as conf
- from optparse import OptionParser
- -import subprocess
- import tempfile
- import shutil
- import subprocess
- @@ -73,7 +71,11 @@ class ExpandArgsMore(ExpandArgs):
- elif os.path.exists(arg) and len(ar_extract):
- tmp = tempfile.mkdtemp(dir=os.curdir)
- self.tmp.append(tmp)
- - subprocess.call(ar_extract + [os.path.abspath(arg)], cwd=tmp)
- + tmp_arg = ar_extract + [os.path.abspath(arg)]
- + oldir = os.getcwd()
- + os.chdir(tmp)
- + os.system(' '.join(tmp_arg))
- + os.chdir(oldir)
- objs = []
- for root, dirs, files in os.walk(tmp):
- objs += [relativize(os.path.join(root, f)) for f in files if isObject(f)]
- @@ -165,8 +167,8 @@ class ExpandArgsMore(ExpandArgs):
- def orderSymbols(self, order):
- '''Given a file containing a list of symbols, adds the appropriate
- argument to make the linker put the symbols in that order.'''
- - with open(order) as file:
- - sections = self._getOrderedSections([l.strip() for l in file.readlines() if l.strip()])
- + ff = open(order)
- + sections = self._getOrderedSections([l.strip() for l in ff.readlines() if l.strip()])
- split_sections = {}
- linked_sections = [s[0] for s in SECTION_INSERT_BEFORE]
- for s in sections:
- @@ -293,29 +295,38 @@ def main():
- deps.pop(0)
- # Remove command
- deps.pop(0)
- - with ExpandArgsMore(args) as args:
- + args2 = ExpandArgsMore(args)
- + args2.__enter__()
- + try:
- if options.extract:
- - args.extract()
- + args2.extract()
- if options.symbol_order:
- - args.orderSymbols(options.symbol_order)
- + args2.orderSymbols(options.symbol_order)
- if options.uselist:
- - args.makelist()
- + args2.makelist()
-
- if options.verbose:
- - print >>sys.stderr, "Executing: " + " ".join(args)
- - for tmp in [f for f in args.tmp if os.path.isfile(f)]:
- + print >>sys.stderr, "Executing: " + " ".join(args2)
- + for tmp in [f for f in args2.tmp if os.path.isfile(f)]:
- print >>sys.stderr, tmp + ":"
- - with open(tmp) as file:
- - print >>sys.stderr, "".join([" " + l for l in file.readlines()])
- + ff = open(tmp)
- + ff.__enter__()
- + try:
- + print >>sys.stderr, "".join([" " + l for l in ff.readlines()])
- + finally:
- + ff.__exit__(0, 0, 0)
- sys.stderr.flush()
- - ret = subprocess.call(args)
- + ret = subprocess.call(args2)
- if ret:
- exit(ret)
- + finally:
- + args2.__exit__(0, 0, 0)
- if not options.depend:
- return
- ensureParentDir(options.depend)
- - with open(options.depend, 'w') as depfile:
- - depfile.write("%s : %s\n" % (options.target, ' '.join(dep for dep in deps if os.path.isfile(dep) and dep != options.target)))
- + depfile = open(options.depend, 'w')
- + depfile.write("%s : %s\n" % (options.target, ' '.join(dep for dep in deps if os.path.isfile(dep) and dep != options.target)))
- + depfile.close()
-
-
- if __name__ == '__main__':
- diff -up comm-esr17/mozilla/config/expandlibs_gen.py.python comm-esr17/mozilla/config/expandlibs_gen.py
- --- comm-esr17/mozilla/config/expandlibs_gen.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/config/expandlibs_gen.py 2012-11-19 13:20:39.000000000 +0100
- @@ -5,7 +5,6 @@
- '''Given a list of object files and library names, prints a library
- descriptor to standard output'''
-
- -from __future__ import with_statement
- import sys
- import os
- import expandlibs_config as conf
- @@ -39,9 +38,11 @@ if __name__ == '__main__':
- raise Exception("Missing option: -o")
-
- ensureParentDir(options.output)
- - with open(options.output, 'w') as outfile:
- - print >>outfile, generate(args)
- + outfile = open(options.output, 'w')
- + print >>outfile, generate(args)
- + outfile.close()
- if options.depend:
- ensureParentDir(options.depend)
- - with open(options.depend, 'w') as depfile:
- - depfile.write("%s : %s\n" % (options.output, ' '.join(ExpandLibsDeps(args))))
- + depfile = open(options.depend, 'w')
- + depfile.write("%s : %s\n" % (options.output, ' '.join(ExpandLibsDeps(args))))
- + depfile.close()
- diff -up comm-esr17/mozilla/config/expandlibs.py.python comm-esr17/mozilla/config/expandlibs.py
- --- comm-esr17/mozilla/config/expandlibs.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/config/expandlibs.py 2012-11-19 13:20:39.000000000 +0100
- @@ -26,7 +26,6 @@ ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} follo
- descriptor contains. And for each of these LIBS, also apply the same
- rules.
- '''
- -from __future__ import with_statement
- import sys, os, errno
- import expandlibs_config as conf
-
- @@ -75,15 +74,15 @@ class LibDescriptor(dict):
- '''Creates an instance of a lib descriptor, initialized with contents
- from a list of strings when given. This is intended for use with
- file.readlines()'''
- - if isinstance(content, list) and all([isinstance(item, str) for item in content]):
- - pass
- - elif content is not None:
- - raise TypeError("LibDescriptor() arg 1 must be None or a list of strings")
- super(LibDescriptor, self).__init__()
- for key in self.KEYS:
- self[key] = []
- - if not content:
- + if content == None:
- return
- + if isinstance(content, list):
- + for item in content:
- + if not isinstance(item, str):
- + raise TypeError("LibDescriptor() arg 1 must be None or a list of strings")
- for key, value in [(s.strip() for s in item.split('=', 2)) for item in content if item.find('=') >= 0]:
- if key in self.KEYS:
- self[key] = value.split()
- @@ -118,8 +117,9 @@ class ExpandArgs(list):
- def _expand_desc(self, arg):
- '''Internal function taking care of lib descriptor expansion only'''
- if os.path.exists(arg + conf.LIBS_DESC_SUFFIX):
- - with open(arg + conf.LIBS_DESC_SUFFIX, 'r') as f:
- - desc = LibDescriptor(f.readlines())
- + f = open(arg + conf.LIBS_DESC_SUFFIX, 'r')
- + desc = LibDescriptor(f.readlines())
- + f.close()
- objs = [relativize(o) for o in desc['OBJS']]
- for lib in desc['LIBS']:
- objs += self._expand(lib)
- diff -up comm-esr17/mozilla/config/optimizejars.py.python comm-esr17/mozilla/config/optimizejars.py
- --- comm-esr17/mozilla/config/optimizejars.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/config/optimizejars.py 2012-11-19 13:20:39.000000000 +0100
- @@ -287,14 +287,17 @@ def optimizejar(jar, outjar, inlog = Non
- outfd.write(dirend_data)
-
- print "Stripped %d bytes" % total_stripped
- - print "%s %d/%d in %s" % (("Ordered" if inlog is not None else "Deoptimized"),
- + tmp_str = "Ordered"
- + if inlog is None:
- + tmp_str = "Deoptimized"
- + print "%s %d/%d in %s" % (tmp_str,
- reordered_count, len(central_directory), outjar)
- outfd.close()
- return outlog
-
- if len(sys.argv) != 5:
- print "Usage: --optimize|--deoptimize %s JAR_LOG_DIR IN_JAR_DIR OUT_JAR_DIR" % sys.argv[0]
- - exit(1)
- + sys.exit(1)
-
- jar_regex = re.compile("\\.jar?$")
-
- diff -up comm-esr17/mozilla/configure.python comm-esr17/mozilla/configure
- --- comm-esr17/mozilla/configure.python 2012-11-16 22:42:38.000000000 +0100
- +++ comm-esr17/mozilla/configure 2012-11-19 13:20:40.000000000 +0100
- @@ -1176,7 +1176,7 @@ NSS_VERSION=3
-
- GLIB_VERSION=1.2.0
- PERL_VERSION=5.006
- -PYTHON_VERSION=2.5
- +PYTHON_VERSION=2.4
- CAIRO_VERSION=1.10
- PANGO_VERSION=1.14.0
- GTK2_VERSION=2.10.0
- diff -up comm-esr17/mozilla/config/writemozinfo.py.python comm-esr17/mozilla/config/writemozinfo.py
- --- comm-esr17/mozilla/config/writemozinfo.py.python 2012-11-16 22:41:19.000000000 +0100
- +++ comm-esr17/mozilla/config/writemozinfo.py 2012-11-19 13:20:39.000000000 +0100
- @@ -9,7 +9,6 @@
- # configuration, such as the target OS and CPU.
- #
- # The output file is intended to be used as input to the mozinfo package.
- -from __future__ import with_statement
- import os, re, sys
-
- def build_dict(env=os.environ):
- @@ -102,8 +101,12 @@ def write_json(file, env=os.environ):
- """
- s = jsonify(build_dict(env))
- if isinstance(file, basestring):
- - with open(file, "w") as f:
- + f = open(file, "w")
- + f.__enter__()
- + try:
- f.write(s)
- + finally:
- + f.__exit__()
- else:
- file.write(s)
-
- diff -up comm-esr17/mozilla/dom/bindings/Codegen.py.python comm-esr17/mozilla/dom/bindings/Codegen.py
- --- comm-esr17/mozilla/dom/bindings/Codegen.py.python 2012-11-16 22:41:27.000000000 +0100
- +++ comm-esr17/mozilla/dom/bindings/Codegen.py 2012-11-19 13:53:13.000000000 +0100
- @@ -45,7 +45,7 @@ def toStringBool(arg):
- def toBindingNamespace(arg):
- return re.sub("((_workers)?$)", "Binding\\1", arg);
-
- -class CGThing():
- +class CGThing:
- """
- Abstract base class for things that spit out code.
- """
- @@ -78,8 +78,9 @@ class CGNativePropertyHooks(CGThing):
- else:
- enumerateOwnProperties = resolveOwnProperty = "NULL"
- parent = self.descriptor.interface.parent
- - parentHooks = ("&" + toBindingNamespace(parent.identifier.name) + "::NativeHooks"
- - if parent else 'NULL')
- + parentHooks = ('NULL')
- + if parent:
- + parentHooks = ("&" + toBindingNamespace(parent.identifier.name) + "::NativeHooks")
- return """
- const NativePropertyHooks NativeHooks = { %s, ResolveProperty, %s, EnumerateProperties, %s };
- """ % (resolveOwnProperty, enumerateOwnProperties, parentHooks)
- @@ -92,7 +93,9 @@ def DOMClass(descriptor):
- # padding.
- protoList.extend(['prototypes::id::_ID_Count'] * (descriptor.config.maxProtoChainLength - len(protoList)))
- prototypeChainString = ', '.join(protoList)
- - nativeHooks = "NULL" if descriptor.workers else "&NativeHooks"
- + nativeHooks = "&NativeHooks"
- + if descriptor.workers:
- + nativeHooks = "NULL"
- return """{
- { %s },
- %s, %s
- @@ -109,7 +112,12 @@ class CGDOMJSClass(CGThing):
- def declare(self):
- return "extern DOMJSClass Class;\n"
- def define(self):
- - traceHook = TRACE_HOOK_NAME if self.descriptor.customTrace else 'NULL'
- + traceHook = 'NULL'
- + if self.descriptor.customTrace:
- + traceHook = TRACE_HOOK_NAME
- + property_hook_name = 'JS_PropertyStub'
- + if self.descriptor.concrete and not self.descriptor.workers and self.descriptor.wrapperCache:
- + property_hook_name = ADDPROPERTY_HOOK_NAME
- return """
- DOMJSClass Class = {
- { "%s",
- @@ -133,7 +141,7 @@ DOMJSClass Class = {
- -1
- };
- """ % (self.descriptor.interface.identifier.name,
- - ADDPROPERTY_HOOK_NAME if self.descriptor.concrete and not self.descriptor.workers and self.descriptor.wrapperCache else 'JS_PropertyStub',
- + property_hook_name,
- FINALIZE_HOOK_NAME, traceHook,
- CGIndenter(CGGeneric(DOMClass(self.descriptor))).define())
-
- @@ -175,7 +183,9 @@ class CGInterfaceObjectJSClass(CGThing):
- def define(self):
- if not self.descriptor.hasInstanceInterface:
- return ""
- - ctorname = "NULL" if not self.descriptor.interface.ctor() else CONSTRUCT_HOOK_NAME
- + ctorname = CONSTRUCT_HOOK_NAME
- + if not self.descriptor.interface.ctor():
- + ctorname = "NULL"
- hasinstance = HASINSTANCE_HOOK_NAME
- return """
- static JSClass InterfaceObjectClass = {
- @@ -509,7 +519,7 @@ def UnionConversions(descriptors):
- return CGWrapper(CGList(SortedDictValues(unionConversions), "\n"),
- post="\n\n")
-
- -class Argument():
- +class Argument:
- """
- A class for outputting the type and name of an argument
- """
- @@ -570,7 +580,9 @@ class CGAbstractMethod(CGThing):
- if self.static:
- decorators.append('static')
- decorators.append(self.returnType)
- - maybeNewline = " " if self.inline else "\n"
- + maybeNewline = "\n"
- + if self.inline:
- + maybeNewline = " "
- return ' '.join(decorators) + maybeNewline
- def declare(self):
- if self.inline:
- @@ -579,7 +591,10 @@ class CGAbstractMethod(CGThing):
- def _define(self):
- return self.definition_prologue() + "\n" + self.definition_body() + self.definition_epilogue()
- def define(self):
- - return "" if self.inline else self._define()
- + ret_PYTHON24 = self._define()
- + if self.inline:
- + ret_PYTHON24 = ""
- + return ret_PYTHON24
- def definition_prologue(self):
- return "%s%s%s(%s)\n{" % (self._template(), self._decorators(),
- self.name, self._argstring())
- @@ -644,7 +659,9 @@ def finalizeHook(descriptor, hookName, c
- return """if (self) {
- self->%s(%s);
- }""" % (hookName, context)
- - clearWrapper = "ClearWrapper(self, self);\n" if descriptor.wrapperCache else ""
- + clearWrapper = ""
- + if descriptor.wrapperCache:
- + clearWrapper = "ClearWrapper(self, self);\n"
- if descriptor.workers:
- release = "self->Release();"
- else:
- @@ -942,7 +959,12 @@ class MethodDefiner(PropertyDefiner):
- for m in methods if not isChromeOnly(m)]
-
- # FIXME Check for an existing iterator on the interface first.
- - if any(m.isGetter() and m.isIndexed() for m in methods):
- + any_result_PYTHON24 = False
- + for m in methods:
- + if m.isGetter() and m.isIndexed():
- + any_result_PYTHON24 = True
- + break
- + if any_result_PYTHON24:
- self.regular.append({"name": 'iterator',
- "methodInfo": False,
- "nativeName": "JS_ArrayIterator",
- @@ -998,9 +1020,18 @@ class AttrDefiner(PropertyDefiner):
- def __init__(self, descriptor, name):
- PropertyDefiner.__init__(self, descriptor, name)
- self.name = name
- - attributes = [m for m in descriptor.interface.members if m.isAttr()]
- - self.chrome = [m for m in attributes if isChromeOnly(m)]
- - self.regular = [m for m in attributes if not isChromeOnly(m)]
- + attributes = []
- + for m in descriptor.interface.members:
- + if m.isAttr():
- + attributes.append(m)
- + self.chrome = []
- + for m in attributes:
- + if isChromeOnly(m):
- + self.chrome.append(m)
- + self.regular = []
- + for m in attributes:
- + if not isChromeOnly(m):
- + self.regular.append(m)
-
- def generateArray(self, array, name, doIdArrays):
- if len(array) == 0:
- @@ -1037,9 +1068,18 @@ class ConstDefiner(PropertyDefiner):
- def __init__(self, descriptor, name):
- PropertyDefiner.__init__(self, descriptor, name)
- self.name = name
- - constants = [m for m in descriptor.interface.members if m.isConst()]
- - self.chrome = [m for m in constants if isChromeOnly(m)]
- - self.regular = [m for m in constants if not isChromeOnly(m)]
- + constants = []
- + for m in descriptor.interface.members:
- + if m.isConst():
- + constants.append(m)
- + self.chrome = []
- + for m in constants:
- + if isChromeOnly(m):
- + self.chrome.append(m)
- + self.regular = []
- + for m in constants:
- + if not isChromeOnly(m):
- + self.regular.append(m)
-
- def generateArray(self, array, name, doIdArrays):
- if len(array) == 0:
- @@ -1056,7 +1096,7 @@ class ConstDefiner(PropertyDefiner):
- 'ConstantSpec',
- PropertyDefiner.getControllingPref, specData, doIdArrays)
-
- -class PropertyArrays():
- +class PropertyArrays:
- def __init__(self, descriptor):
- self.staticMethods = MethodDefiner(descriptor, "StaticMethods", True)
- self.methods = MethodDefiner(descriptor, "Methods", False)
- @@ -1072,9 +1112,19 @@ class PropertyArrays():
- return [ "methods", "attrs", "consts" ]
-
- def hasChromeOnly(self):
- - return any(getattr(self, a).hasChromeOnly() for a in self.arrayNames())
- + any_result_PYTHON24 = False
- + for a in self.arrayNames():
- + if getattr(self, a).hasChromeOnly():
- + any_result_PYTHON24 = True
- + break
- + return any_result_PYTHON24
- def hasNonChromeOnly(self):
- - return any(getattr(self, a).hasNonChromeOnly() for a in self.arrayNames())
- + any_result_PYTHON24 = False
- + for a in self.arrayNames():
- + if getattr(self, a).hasNonChromeOnly():
- + any_result_PYTHON24 = True
- + break
- + return any_result_PYTHON24
- def __str__(self):
- define = ""
- for array in self.arrayNames():
- @@ -1085,7 +1135,10 @@ class CGNativeProperties(CGList):
- def __init__(self, descriptor, properties):
- def generateNativeProperties(name, chrome):
- def check(p):
- - return p.hasChromeOnly() if chrome else p.hasNonChromeOnly()
- + if chrome:
- + return p.hasChromeOnly()
- + else:
- + return p.hasNonChromeOnly()
-
- nativeProps = []
- for array in properties.arrayNames():
- @@ -1223,20 +1276,33 @@ class CGCreateInterfaceObjectsMethod(CGA
- chromeProperties = accessCheck + " ? &sChromeOnlyNativeProperties : nullptr"
- else:
- chromeProperties = "nullptr"
- + str_needInterfacePrototypeObject = "NULL"
- + if needInterfacePrototypeObject:
- + str_needInterfacePrototypeObject = "&PrototypeClass"
- + str_needInterfaceObjectClass = "NULL"
- + if needInterfaceObjectClass:
- + str_needInterfaceObjectClass = "&InterfaceObjectClass"
- + str_needConstructor = "NULL"
- + if needConstructor:
- + str_needConstructor = constructHook
- + str_needInterfaceObject = "NULL"
- + if needInterfaceObject:
- + str_needInterfaceObject = '"' + self.descriptor.interface.identifier.name + '"'
- +
- call = """return dom::CreateInterfaceObjects(aCx, aGlobal, aReceiver, parentProto,
- %s, %s, %s, %d,
- %s,
- %s,
- %s,
- %s);""" % (
- - "&PrototypeClass" if needInterfacePrototypeObject else "NULL",
- - "&InterfaceObjectClass" if needInterfaceObjectClass else "NULL",
- - constructHook if needConstructor else "NULL",
- + str_needInterfacePrototypeObject,
- + str_needInterfaceObjectClass,
- + str_needConstructor,
- constructArgs,
- domClass,
- properties,
- chromeProperties,
- - '"' + self.descriptor.interface.identifier.name + '"' if needInterfaceObject else "NULL")
- + str_needInterfaceObject)
- functionBody = CGList(
- [CGGeneric(getParentProto), initIds, prefCache, CGGeneric(call)],
- "\n\n")
- @@ -1485,7 +1551,7 @@ numericTags = [
- IDLType.Tags.float, IDLType.Tags.double
- ]
-
- -class CastableObjectUnwrapper():
- +class CastableObjectUnwrapper:
- """
- A class for unwrapping an object named by the "source" argument
- based on the passed-in descriptor and storing it in a variable
- @@ -1894,8 +1960,8 @@ for (uint32_t i = 0; i < length; ++i) {
- templateBody = CGList([interfaceObject, templateBody], "\n")
- else:
- templateBody = CGList([templateBody, object], "\n")
- -
- - if any([arrayObject, dateObject, nonPlatformObject, object]):
- +
- + if arrayObject or dateObject or nonPlatformObject or object:
- templateBody.prepend(CGGeneric("JSObject& argObj = ${val}.toObject();"))
- templateBody = CGWrapper(CGIndenter(templateBody),
- pre="if (${val}.isObject()) {\n",
- @@ -1905,7 +1971,11 @@ for (uint32_t i = 0; i < length; ++i) {
-
- otherMemberTypes = filter(lambda t: t.isString() or t.isEnum(),
- memberTypes)
- - otherMemberTypes.extend(t for t in memberTypes if t.isPrimitive())
- + otherMemberTypes_extend_PYTHON24 = []
- + for t in memberTypes:
- + if t.isPrimitive():
- + otherMemberTypes_extend_PYTHON24.append(t)
- + otherMemberTypes.extend(otherMemberTypes_extend_PYTHON24)
- if len(otherMemberTypes) > 0:
- assert len(otherMemberTypes) == 1
- memberType = otherMemberTypes[0]
- @@ -2470,7 +2540,10 @@ def convertConstIDLValueToJSVal(value):
- if tag in [IDLType.Tags.int64, IDLType.Tags.uint64]:
- return "DOUBLE_TO_JSVAL(%s)" % (value.value)
- if tag == IDLType.Tags.bool:
- - return "JSVAL_TRUE" if value.value else "JSVAL_FALSE"
- + ret_PYTHON24 = "JSVAL_FALSE"
- + if value.value:
- + ret_PYTHON24 = "JSVAL_TRUE"
- + return ret_PYTHON24
- if tag in [IDLType.Tags.float, IDLType.Tags.double]:
- return "DOUBLE_TO_JSVAL(%s)" % (value.value)
- raise TypeError("Const value of unhandled type: " + value.type)
- @@ -2781,10 +2854,16 @@ def infallibleForAttr(attr, descriptorPr
- memberIsCreator(attr))[1]
-
- def typeNeedsCx(type):
- + type_need_cx = False
- + if type is not None and type.isUnion():
- + for t in type.unroll().flatMemberTypes:
- + if typeNeedsCx(t):
- + type_need_cx = True
- + break
- +
- return (type is not None and
- (type.isCallback() or type.isAny() or type.isObject() or
- - (type.isUnion() and
- - any(typeNeedsCx(t) for t in type.unroll().flatMemberTypes))))
- + (type_need_cx)))
-
- # Returns a tuple consisting of a CGThing containing the type of the return
- # value, or None if there is no need for a return value, and a boolean signaling
- @@ -2872,8 +2951,13 @@ class CGCallGenerator(CGThing):
- if isFallible:
- args.append(CGGeneric("rv"))
-
- + some_type_needs_cx = False
- + for (a, _) in arguments:
- + if typeNeedsCx(a.type):
- + some_type_needs_cx = True
- + break
- needsCx = (typeNeedsCx(returnType) or
- - any(typeNeedsCx(a.type) for (a, _) in arguments) or
- + some_type_needs_cx or
- 'implicitJSContext' in extendedAttributes)
-
- if not "cx" in argsPre and needsCx:
- @@ -2957,15 +3041,21 @@ class CGPerSignatureCall(CGThing):
- invalidEnumValueFatal=not setter) for
- i in range(argConversionStartsAt, self.argCount)])
-
- + get_err_reports = None
- + if self.isFallible():
- + get_err_reports = self.getErrorReport()
- cgThings.append(CGCallGenerator(
- - self.getErrorReport() if self.isFallible() else None,
- + get_err_reports,
- self.getArguments(), self.argsPre, returnType,
- self.extendedAttributes, descriptor, nativeMethodName,
- static))
- self.cgRoot = CGList(cgThings, "\n")
-
- def getArgv(self):
- - return "argv" if self.argCount > 0 else ""
- + ret_PYTHON24 = ""
- + if self.argCount > 0:
- + ret_PYTHON24 = "argv"
- + return ret_PYTHON24
- def getArgvDecl(self):
- return "\nJS::Value* argv = JS_ARGV(cx, vp);\n"
- def getArgc(self):
- @@ -3293,7 +3383,7 @@ class CGGetterCall(CGPerSignatureCall):
- nativeMethodName, False, descriptor,
- attr, getter=True)
-
- -class FakeArgument():
- +class FakeArgument:
- """
- A class that quacks like an IDLArgument. This is used to make
- setters look like method calls or for special operations.
- @@ -3325,7 +3415,7 @@ class CGSetterCall(CGPerSignatureCall):
- # We just get our stuff from our last arg no matter what
- return ""
-
- -class FakeCastableDescriptor():
- +class FakeCastableDescriptor:
- def __init__(self, descriptor):
- self.castable = True
- self.workers = descriptor.workers
- @@ -3501,7 +3591,9 @@ class CGMemberJITInfo(CGThing):
- def defineJitInfo(self, infoName, opName, infallible):
- protoID = "prototypes::id::%s" % self.descriptor.interface.identifier.name
- depth = "PrototypeTraits<%s>::Depth" % protoID
- - failstr = "true" if infallible else "false"
- + failstr = "false"
- + if infallible:
- + failstr = "true"
- return ("\n"
- "const JSJitInfo %s = {\n"
- " %s,\n"
- @@ -3713,12 +3805,15 @@ return true;"""
- post="\n"
- "}")
-
- + holder_PYTHON24 = None
- + if holderType:
- + holder_PYTHON24 = holderType.define()
- return {
- "name": name,
- "structType": structType,
- "externalType": externalType,
- "setter": CGIndenter(setter).define(),
- - "holderType": holderType.define() if holderType else None
- + "holderType": holder_PYTHON24
- }
-
- def mapTemplate(template, templateVarArray):
- @@ -3931,22 +4026,29 @@ class ClassMethod(ClassItem):
- return self.body
-
- def declare(self, cgClass):
- - templateClause = 'template <%s>\n' % ', '.join(self.templateArgs) \
- - if self.bodyInHeader and self.templateArgs else ''
- - args = ', '.join([str(a) for a in self.args])
- +
- + templateClause = ""
- + if self.bodyInHeader and self.templateArgs:
- + templateClause = 'template <%s>\n' % ', '.join(self.templateArgs)
- + args_to_add = []
- + for a in self.args:
- + args_to_add.append(str(a))
- + args = ', '.join(args_to_add)
- if self.bodyInHeader:
- body = CGIndenter(CGGeneric(self.getBody())).define()
- body = '\n{\n' + body + '\n}'
- else:
- body = ';'
+ import time
+
+ +class NullHandler(logging.Handler):
+ + def emit(self, record):
+ + pass
+ +logging.NullHandler = NullHandler
+
+ def format_seconds(total):
+ """Format number of seconds to MM:SS.DD form."""
+ @@ -166,7 +170,7 @@ class LoggingManager(object):
+ """Enable JSON logging on the specified file object."""
+
+ # Configure the consumer of structured messages.
+ - handler = logging.StreamHandler(stream=fh)
+ + handler = logging.StreamHandler(fh)
+ handler.setFormatter(StructuredJSONFormatter())
+ handler.setLevel(logging.DEBUG)
+
+ @@ -188,7 +192,7 @@ class LoggingManager(object):
+ write_interval=write_interval)
+ formatter.set_terminal(self.terminal)
+
+ - handler = logging.StreamHandler(stream=fh)
+ + handler = logging.StreamHandler(fh)
+ handler.setFormatter(formatter)
+ handler.setLevel(level)
+
+ diff -up mozilla-esr24/python/mozbuild/mozbuild/backend/base.py.python mozilla-esr24/python/mozbuild/mozbuild/backend/base.py
+ --- mozilla-esr24/python/mozbuild/mozbuild/backend/base.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozbuild/backend/base.py 2013-10-22 14:29:24.562993887 +0200
+++++ mozilla-esr24/python/mozbuild/mozbuild/backend/base.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -57,13 +57,13 @@ class BackendConsumeSummary(object):
+
+ @property
+ def reader_summary(self):
+ - return 'Finished reading {:d} moz.build files into {:d} descriptors in {:.2f}s'.format(
+ + return 'Finished reading {0:d} moz.build files into {1:d} descriptors in {2:.2f}s'.format(
+ self.mozbuild_count, self.object_count,
+ self.mozbuild_execution_time)
+
+ @property
+ def backend_summary(self):
+ - return 'Backend executed in {:.2f}s'.format(self.backend_execution_time)
+ + return 'Backend executed in {0:.2f}s'.format(self.backend_execution_time)
+
+ def backend_detailed_summary(self):
+ """Backend summary to be supplied by BuildBackend implementations."""
+ @@ -72,7 +72,7 @@ class BackendConsumeSummary(object):
+ @property
+ def total_summary(self):
+ efficiency_value = self.cpu_time / self.wall_time if self.wall_time else 100
+ - return 'Total wall time: {:.2f}s; CPU time: {:.2f}s; Efficiency: {:.0%}'.format(
+ + return 'Total wall time: {0:.2f}s; CPU time: {1:.2f}s; Efficiency: {2:.0%}'.format(
+ self.wall_time, self.cpu_time, efficiency_value)
+
+ def summaries(self):
+ diff -up mozilla-esr24/python/mozbuild/mozbuild/backend/recursivemake.py.python mozilla-esr24/python/mozbuild/mozbuild/backend/recursivemake.py
+ --- mozilla-esr24/python/mozbuild/mozbuild/backend/recursivemake.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozbuild/backend/recursivemake.py 2013-10-22 14:29:24.562993887 +0200
+++++ mozilla-esr24/python/mozbuild/mozbuild/backend/recursivemake.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -114,7 +114,7 @@ class RecursiveMakeBackend(BuildBackend)
+ self.summary.unchanged_count = 0
+
+ def detailed(summary):
+ - return '{:d} total backend files. {:d} created; {:d} updated; {:d} unchanged'.format(
+ + return '{0:d} total backend files. {1:d} created; {2:d} updated; {3:d} unchanged'.format(
+ summary.managed_count, summary.created_count,
+ summary.updated_count, summary.unchanged_count)
+
+ diff -up mozilla-esr24/python/mozbuild/mozbuild/frontend/data.py.python mozilla-esr24/python/mozbuild/mozbuild/frontend/data.py
+ --- mozilla-esr24/python/mozbuild/mozbuild/frontend/data.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozbuild/frontend/data.py 2013-10-22 14:29:24.562993887 +0200
+++++ mozilla-esr24/python/mozbuild/mozbuild/frontend/data.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -17,7 +17,7 @@ structures.
+
+ from __future__ import unicode_literals
+
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
+
+
+ class TreeMetadata(object):
+ diff -up mozilla-esr24/python/mozbuild/mozbuild/frontend/reader.py.python mozilla-esr24/python/mozbuild/mozbuild/frontend/reader.py
+ --- mozilla-esr24/python/mozbuild/mozbuild/frontend/reader.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozbuild/frontend/reader.py 2013-10-22 14:29:24.562993887 +0200
+++++ mozilla-esr24/python/mozbuild/mozbuild/frontend/reader.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -52,7 +52,7 @@ from .sandbox_symbols import (
+ )
+
+
+ -if sys.version_info.major == 2:
+ +if sys.version_info[0] == 2:
+ text_type = unicode
+ type_type = types.TypeType
+ else:
+ diff -up mozilla-esr24/python/mozbuild/mozbuild/frontend/sandbox_symbols.py.python mozilla-esr24/python/mozbuild/mozbuild/frontend/sandbox_symbols.py
+ --- mozilla-esr24/python/mozbuild/mozbuild/frontend/sandbox_symbols.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozbuild/frontend/sandbox_symbols.py 2013-10-22 14:29:24.563993889 +0200
-@@ -17,7 +17,7 @@ the Sandbox consists of, you've come to
+++++ mozilla-esr24/python/mozbuild/mozbuild/frontend/sandbox_symbols.py 2013-10-22 15:49:15.000000000 +0200
++@@ -17,7 +17,7 @@ the Sandbox consists of, you've come to
+
+ from __future__ import unicode_literals
+
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
+ from mozbuild.util import (
+ HierarchicalStringList,
+ StrictOrderingOnAppendList,
+ diff -up mozilla-esr24/python/mozbuild/mozpack/chrome/flags.py.python mozilla-esr24/python/mozbuild/mozpack/chrome/flags.py
+ --- mozilla-esr24/python/mozbuild/mozpack/chrome/flags.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozpack/chrome/flags.py 2013-10-22 14:29:24.563993889 +0200
+++++ mozilla-esr24/python/mozbuild/mozpack/chrome/flags.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -5,7 +5,7 @@
+ import re
+ from distutils.version import LooseVersion
+ from mozpack.errors import errors
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
+
+
+ class Flag(object):
+ diff -up mozilla-esr24/python/mozbuild/mozpack/copier.py.python mozilla-esr24/python/mozbuild/mozpack/copier.py
+ --- mozilla-esr24/python/mozbuild/mozpack/copier.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozpack/copier.py 2013-10-22 14:29:24.563993889 +0200
+++++ mozilla-esr24/python/mozbuild/mozpack/copier.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -11,10 +11,9 @@ from mozpack.files import (
+ import mozpack.path
+ import errno
+ from collections import (
+ - namedtuple,
+ - OrderedDict,
+ + namedtuple
+ )
-
- + is_const = ''
- + if self.const:
- + is_const = ' const'
- return string.Template("""${templateClause}${decorators}${returnType}
- ${name}(${args})${const}${body}
- """).substitute({ 'templateClause': templateClause,
- 'decorators': self.getDecorators(True),
- 'returnType': self.returnType,
- 'name': self.name,
- - 'const': ' const' if self.const else '',
- + 'const': is_const,
- 'args': args,
- 'body': body })
-
- @@ -3970,6 +4072,9 @@ ${name}(${args})${const}${body}
-
- body = CGIndenter(CGGeneric(self.getBody())).define()
-
- + is_const = ''
- + if self.const:
- + is_const = ' const'
- return string.Template("""${templateClause}${decorators}${returnType}
- ${className}::${name}(${args})${const}
- {
- @@ -3981,7 +4086,7 @@ ${body}
- 'className': cgClass.getNameString(),
- 'name': self.name,
- 'args': args,
- - 'const': ' const' if self.const else '',
- + 'const': is_const,
- 'body': body })
-
- class ClassConstructor(ClassItem):
- @@ -4083,7 +4188,10 @@ class ClassMember(ClassItem):
- ClassItem.__init__(self, name, visibility)
-
- def declare(self, cgClass):
- - return '%s%s %s;\n' % ('static ' if self.static else '', self.type,
- + is_static = ''
- + if self.static:
- + is_static = 'static '
- + return '%s%s %s;\n' % (is_static, self.type,
- self.name)
-
- def define(self, cgClass):
- @@ -4122,7 +4230,10 @@ class ClassEnum(ClassItem):
- else:
- entry = '%s = %s' % (self.entries[i], self.values[i])
- entries.append(entry)
- - name = '' if not self.name else ' ' + self.name
- + name = ' ' + self.name
- + if not self.name:
- + name = ''
- +
- return 'enum%s\n{\n %s\n};\n' % (name, ',\n '.join(entries))
-
- def define(self, cgClass):
- @@ -4145,7 +4256,10 @@ class CGClass(CGThing):
- self.templateSpecialization = templateSpecialization
- self.isStruct = isStruct
- self.indent = indent
- - self.defaultVisibility ='public' if isStruct else 'private'
- + self.defaultVisibility = 'private'
- + if isStruct:
- + self.defaultVisibility = 'public'
- +
-
- def getNameString(self):
- className = self.name
- @@ -4163,7 +4277,9 @@ class CGClass(CGThing):
- result = result + self.indent + 'template <%s>\n' \
- % ','.join([str(a) for a in templateArgs])
-
- - type = 'struct' if self.isStruct else 'class'
- + type = 'class'
- + if self.isStruct:
- + type = 'struct'
-
- if self.templateSpecialization:
- specialization = \
- @@ -4357,7 +4473,10 @@ class CGClassForwardDeclare(CGThing):
- self.name = name
- self.isStruct = isStruct
- def declare(self):
- - type = 'struct' if self.isStruct else 'class'
- + type = 'class'
- + if self.isStruct:
- + type = 'struct'
- +
- return '%s %s;\n' % (type, self.name)
- def define(self):
- # Header only
- @@ -5046,8 +5165,13 @@ class CGDictionary(CGThing):
- def __init__(self, dictionary, descriptorProvider):
- self.dictionary = dictionary;
- self.workers = descriptorProvider.workers
- - if all(CGDictionary(d, descriptorProvider).generatable for
- - d in CGDictionary.getDictionaryDependencies(dictionary)):
- + is_generatable = True
- + for d in CGDictionary.getDictionaryDependencies(dictionary):
- + if not CGDictionary(d, descriptorProvider).generatable:
- + is_generatable = False
- + break
- +
- + if is_generatable:
- self.generatable = True
- else:
- self.generatable = False
- @@ -5165,7 +5289,9 @@ class CGDictionary(CGThing):
-
- @staticmethod
- def makeDictionaryName(dictionary, workers):
- - suffix = "Workers" if workers else ""
- + suffix = ""
- + if workers:
- + suffix = "Workers"
- return dictionary.identifier.name + suffix
-
- def makeClassName(self, dictionary):
- @@ -5433,7 +5559,7 @@ class CGBindingRoot(CGThing):
- return stripTrailingWhitespace(self.root.define())
-
-
- -class GlobalGenRoots():
- +class GlobalGenRoots:
- """
- Roots for global codegen.
-
- diff -up comm-esr17/mozilla/dom/bindings/Configuration.py.python comm-esr17/mozilla/dom/bindings/Configuration.py
- --- comm-esr17/mozilla/dom/bindings/Configuration.py.python 2012-11-16 22:41:27.000000000 +0100
- +++ comm-esr17/mozilla/dom/bindings/Configuration.py 2012-11-19 13:20:39.000000000 +0100
- @@ -219,7 +219,10 @@ class Descriptor(DescriptorProvider):
- self.interface.identifier.name)
-
- def make_name(name):
- - return name + "_workers" if self.workers else name
- + ret = name
- + if self.workers:
- + ret = name + "_workers"
- + return ret
- self.name = make_name(interface.identifier.name)
-
- # self.extendedAttributes is a dict of dicts, keyed on
- @@ -292,11 +295,15 @@ class Descriptor(DescriptorProvider):
-
- assert member.isAttr()
- assert bool(getter) != bool(setter)
- - key = 'getterOnly' if getter else 'setterOnly'
- + key = 'setterOnly'
- + if getter:
- + key = 'getterOnly'
- attrs = self.extendedAttributes['all'].get(name, []) + self.extendedAttributes[key].get(name, [])
- infallible = member.getExtendedAttribute("Infallible")
- if infallible is None:
- - infallibleAttr = "GetterInfallible" if getter else "SetterInfallible"
- + infallibleAttr = "SetterInfallible"
- + if getter:
- + infallibleAttr = "GetterInfallible"
- infallible = member.getExtendedAttribute(infallibleAttr)
-
- ensureValidInfallibleExtendedAttribute(infallible)
- diff -up comm-esr17/mozilla/dom/bindings/parser/WebIDL.py.python comm-esr17/mozilla/dom/bindings/parser/WebIDL.py
- --- comm-esr17/mozilla/dom/bindings/parser/WebIDL.py.python 2012-11-16 22:41:27.000000000 +0100
- +++ comm-esr17/mozilla/dom/bindings/parser/WebIDL.py 2012-11-19 13:20:39.000000000 +0100
- @@ -59,9 +59,13 @@ class WebIDLError(Exception):
- self.warning = warning
-
- def __str__(self):
- + add_comma = ""
- + if len(self.locations) != 0:
- + add_comma = ", "
- + len(self.locations)
- return "%s: %s%s%s" % (self.warning and 'warning' or 'error',
- self.message,
- - ", " if len(self.locations) != 0 else "",
- + add_comma,
- "\n".join(self.locations))
-
- class Location(object):
- @@ -70,7 +74,9 @@ class Location(object):
- self._lineno = lineno
- self._lexpos = lexpos
- self._lexdata = lexer.lexdata
- - self._file = filename if filename else "<unknown>"
- + self._file = "<unknown>"
- + if filename:
- + self._file = filename
-
- def __eq__(self, other):
- return self._lexpos == other._lexpos and \
- @@ -467,7 +473,8 @@ class IDLInterface(IDLObjectWithScope):
- IDLScope.resolveIdentifierConflict(self, identifier, originalObject,
- newObject)
- assert False # Not reached
+ +from ordereddict import OrderedDict
+
+ def ensure_parent_dir(file):
+ '''Ensures the directory parent to the given file exists'''
+ @@ -157,6 +156,7 @@ class FileCopier(FileRegistry):
+ destfile = os.path.normpath(os.path.join(destination, path))
+ dest_files.add(destfile)
+ ensure_parent_dir(destfile)
+ + print "file.copy", destfile
+ file.copy(destfile, skip_if_older)
+
+ actual_dest_files = set()
+ @@ -272,9 +272,12 @@ class Jarrer(FileRegistry, BaseFile):
+ old_jar = JarReader(fileobj=dest)
+ except Exception:
+ old_jar = []
-
- + print self.members
- + print iter(self.members)
- retval = originalObject.addOverload(newObject)
- # Might be a ctor, which isn't in self.members
- if newObject in self.members:
- @@ -481,7 +488,10 @@ class IDLInterface(IDLObjectWithScope):
- self._finished = True
-
- assert not self.parent or isinstance(self.parent, IDLIdentifierPlaceholder)
- - parent = self.parent.finish(scope) if self.parent else None
- +
- + parent = None
- + if self.parent:
- + parent = self.parent.finish(scope)
- if parent and isinstance(parent, IDLExternalInterface):
- raise WebIDLError("%s inherits from %s which does not have "
- "a definition" %
- @@ -492,7 +502,7 @@ class IDLInterface(IDLObjectWithScope):
-
- self.parent = parent
-
- - assert iter(self.members)
- + #assert iter(self.members)
-
- if self.parent:
- self.parent.finish(scope)
- @@ -637,7 +647,12 @@ class IDLInterface(IDLObjectWithScope):
- return depth
-
- def hasConstants(self):
- - return any(m.isConst() for m in self.members)
- + any_const_member = False
- + for m in self.members:
- + if m.isConst():
- + any_const_member = True
- + break
- + return any_const_member
-
- def hasInterfaceObject(self):
- if self.isCallback():
- @@ -667,8 +682,9 @@ class IDLInterface(IDLObjectWithScope):
- if not self.hasInterfaceObject():
- raise WebIDLError("Constructor and NoInterfaceObject are incompatible",
- [self.location])
+ + print "old jar", old_jar
+ + for f in old_jar:
+ + print f.filename, f
+ old_contents = dict([(f.filename, f) for f in old_jar])
-
- - args = attrlist[0] if len(attrlist) else []
- + args = []
- + if len(attrlist):
- + args = attrlist[0]
-
- retType = IDLWrapperType(self.location, self)
-
- @@ -681,7 +697,9 @@ class IDLInterface(IDLObjectWithScope):
- method.addExtendedAttributes(["Creator"])
- method.resolve(self)
-
- - self._extendedAttrDict[identifier] = attrlist if len(attrlist) else True
- + self._extendedAttrDict[identifier] = True
- + if len(attrlist):
- + self._extendedAttrDict[identifier] = attrlist
-
- def addImplementedInterface(self, implementedInterface):
- assert(isinstance(implementedInterface, IDLInterface))
- @@ -1860,7 +1878,9 @@ class IDLInterfaceMember(IDLObjectWithId
- attrlist = list(attr)
- identifier = attrlist.pop(0)
- self.handleExtendedAttribute(identifier, attrlist)
- - self._extendedAttrDict[identifier] = attrlist if len(attrlist) else True
- + self._extendedAttrDict[identifier] = True
- + if len(attrlist):
- + self._extendedAttrDict[identifier] = attrlist
-
- def handleExtendedAttribute(self, name, list):
- pass
- @@ -2660,7 +2680,9 @@ class Parser(Tokenizer):
- """
- InterfaceMembers : ExtendedAttributeList InterfaceMember InterfaceMembers
- """
- - p[0] = [p[2]] if p[2] else []
- + p[0] = []
- + if p[2]:
- + p[0] = [p[2]]
-
- assert not p[1] or p[2]
- p[2].addExtendedAttributes(p[1])
- @@ -2915,17 +2937,31 @@ class Parser(Tokenizer):
- raise WebIDLError("Duplicate qualifiers are not allowed",
- [self.getLocation(p, 1)])
-
- - static = True if IDLMethod.Special.Static in p[1] else False
- + static = False
- + if IDLMethod.Special.Static in p[1]:
- + static = True
- # If static is there that's all that's allowed. This is disallowed
- # by the parser, so we can assert here.
- assert not static or len(qualifiers) == 1
-
- - getter = True if IDLMethod.Special.Getter in p[1] else False
- - setter = True if IDLMethod.Special.Setter in p[1] else False
- - creator = True if IDLMethod.Special.Creator in p[1] else False
- - deleter = True if IDLMethod.Special.Deleter in p[1] else False
- - legacycaller = True if IDLMethod.Special.LegacyCaller in p[1] else False
- - stringifier = True if IDLMethod.Special.Stringifier in p[1] else False
- + getter = False
- + if IDLMethod.Special.Getter in p[1]:
- + getter = True
- + setter = False
- + if IDLMethod.Special.Setter in p[1]:
- + setter = True
- + creator = False
- + if IDLMethod.Special.Creator in p[1]:
- + creator = True
- + deleter = False
- + if IDLMethod.Special.Deleter in p[1]:
- + deleter = True
- + legacycaller = False
- + if IDLMethod.Special.LegacyCaller in p[1]:
- + legacycaller = True
- + stringifier = False
- + if IDLMethod.Special.Stringifier in p[1]:
- + stringifier = True
-
- if getter or deleter:
- if setter or creator:
- @@ -2939,9 +2975,12 @@ class Parser(Tokenizer):
- specialType = IDLMethod.NamedOrIndexed.Neither
-
- if getter or deleter:
- + getter_deleter = "deleter"
- + if getter:
- + getter_deleter = "getter"
- if len(arguments) != 1:
- raise WebIDLError("%s has wrong number of arguments" %
- - ("getter" if getter else "deleter"),
- + (getter_deleter),
- [self.getLocation(p, 2)])
- argType = arguments[0].type
- if argType == BuiltinTypes[IDLBuiltinType.Types.domstring]:
- @@ -2950,21 +2989,27 @@ class Parser(Tokenizer):
- specialType = IDLMethod.NamedOrIndexed.Indexed
+ + print "Old content", old_contents
+ + print "JarWriter"
+ with JarWriter(fileobj=dest, compress=self.compress,
+ optimize=self.optimize) as jar:
+ for path, file in self:
+ diff -up mozilla-esr24/python/mozbuild/mozpack/files.py.python mozilla-esr24/python/mozbuild/mozpack/files.py
+ --- mozilla-esr24/python/mozbuild/mozpack/files.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozpack/files.py 2013-10-22 14:29:24.563993889 +0200
+++++ mozilla-esr24/python/mozbuild/mozpack/files.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -17,7 +17,7 @@ from io import BytesIO
+ from mozpack.errors import ErrorMessage
+ from mozpack.mozjar import JarReader
+ import mozpack.path
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
+
+
+ class Dest(object):
+ @@ -150,8 +150,10 @@ class ExecutableFile(File):
+ return False
+ try:
+ if may_strip(dest):
+ + print "strip", dest
+ strip(dest)
+ if may_elfhack(dest):
+ + print "elfhack", dest
+ elfhack(dest)
+ except ErrorMessage:
+ os.remove(dest)
+ diff -up mozilla-esr24/python/mozbuild/mozpack/mozjar.py.python mozilla-esr24/python/mozbuild/mozpack/mozjar.py
+ --- mozilla-esr24/python/mozbuild/mozpack/mozjar.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozpack/mozjar.py 2013-10-22 14:29:24.563993889 +0200
+++++ mozilla-esr24/python/mozbuild/mozpack/mozjar.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -10,7 +10,7 @@ from zipfile import (
+ ZIP_STORED,
+ ZIP_DEFLATED,
+ )
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
+ from urlparse import urlparse, ParseResult
+ import mozpack.path
+
+ @@ -94,8 +94,6 @@ class JarStruct(object):
else:
- raise WebIDLError("%s has wrong argument type (must be DOMString or UnsignedLong)" %
- - ("getter" if getter else "deleter"),
- + (getter_deleter),
- [arguments[0].location])
- if arguments[0].optional or arguments[0].variadic:
- + optional_variadic = "variadic"
- + if arguments[0].optional:
- + optional_variadic = "optional"
- raise WebIDLError("%s cannot have %s argument" %
- - ("getter" if getter else "deleter",
- - "optional" if arguments[0].optional else "variadic"),
- + (getter_deleter,
- + optional_variadic),
- [arguments[0].location])
- if getter:
- if returnType.isVoid():
- raise WebIDLError("getter cannot have void return type",
- [self.getLocation(p, 2)])
- if setter or creator:
- + setter_creator = "creator"
- + if setter:
- + setter_creator = "setter"
- if len(arguments) != 2:
- raise WebIDLError("%s has wrong number of arguments" %
- - ("setter" if setter else "creator"),
- + (setter_creator),
- [self.getLocation(p, 2)])
- argType = arguments[0].type
- if argType == BuiltinTypes[IDLBuiltinType.Types.domstring]:
- @@ -2973,17 +3018,23 @@ class Parser(Tokenizer):
- specialType = IDLMethod.NamedOrIndexed.Indexed
+ size = sizes[t]
+ value = data[offset:offset + size]
+ - if isinstance(value, memoryview):
+ - value = value.tobytes()
+ if not name in sizes:
+ self._values[name] = value
else:
- raise WebIDLError("%s has wrong argument type (must be DOMString or UnsignedLong)" %
- - ("setter" if setter else "creator"),
- + (setter_creator),
- [arguments[0].location])
- if arguments[0].optional or arguments[0].variadic:
- + optional_variadic = "variadic"
- + if arguments[0].optional:
- + optional_variadic = "optional"
- raise WebIDLError("%s cannot have %s argument" %
- - ("setter" if setter else "creator",
- - "optional" if arguments[0].optional else "variadic"),
- + (setter_creator,
- + optional_variadic),
- [arguments[0].location])
- if arguments[1].optional or arguments[1].variadic:
- + optional_variadic = "variadic"
- + if arguments[1].optional:
- + optional_variadic = "optional"
- raise WebIDLError("%s cannot have %s argument" %
- - ("setter" if setter else "creator",
- - "optional" if arguments[1].optional else "variadic"),
- + (setter_creator,
- + optional_variadic),
- [arguments[1].location])
-
- if stringifier:
- @@ -3007,7 +3058,9 @@ class Parser(Tokenizer):
- raise WebIDLError("Cannot have a non-optional argument following an optional argument",
- [argument.location])
- inOptionalArguments = argument.optional
- - variadicArgument = argument if argument.variadic else None
- + variadicArgument = None
- + if argument.variadic:
- + variadicArgument = argument
-
- # identifier might be None. This is only permitted for special methods.
- if not identifier:
- @@ -3017,15 +3070,27 @@ class Parser(Tokenizer):
- [self.getLocation(p, 2)])
-
- location = BuiltinLocation("<auto-generated-identifier>")
- + named_indexed = ""
- + if specialType == IDLMethod.NamedOrIndexed.Named:
- + named_indexed = "named"
- + if specialType == IDLMethod.NamedOrIndexed.Indexed:
- + named_indexed = "indexed"
- + a_getter = ""
- + if getter: a_getter = "getter"
- + a_setter = ""
- + if setter: a_setter = "setter"
- + a_deleter = ""
- + if deleter: a_deleter = "deleter"
- + a_creator = ""
- + if creator: a_creator = "creator"
- + a_legacycaller = ""
- + if legacycaller: a_legacycaller = "legacycaller"
- + a_stringifier = ""
- + if stringifier: a_stringifier = "stringifier"
- identifier = IDLUnresolvedIdentifier(location, "__%s%s%s%s%s%s%s" %
- - ("named" if specialType == IDLMethod.NamedOrIndexed.Named else \
- - "indexed" if specialType == IDLMethod.NamedOrIndexed.Indexed else "",
- - "getter" if getter else "",
- - "setter" if setter else "",
- - "deleter" if deleter else "",
- - "creator" if creator else "",
- - "legacycaller" if legacycaller else "",
- - "stringifier" if stringifier else ""), allowDoubleUnderscore=True)
- + (named_indexed,
- + a_getter, a_setter, a_deleter, a_creator, a_legacycaller, a_stringifier),
- + allowDoubleUnderscore=True)
-
- method = IDLMethod(self.getLocation(p, 2), identifier, returnType, arguments,
- static=static, getter=getter, setter=setter, creator=creator,
- @@ -3116,7 +3181,9 @@ class Parser(Tokenizer):
- """
- ArgumentList : Argument Arguments
- """
- - p[0] = [p[1]] if p[1] else []
- + p[0] = []
- + if p[1]:
- + p[0] = [p[1]]
- p[0].extend(p[2])
-
- def p_ArgumentListEmpty(self, p):
- @@ -3129,7 +3196,9 @@ class Parser(Tokenizer):
- """
- Arguments : COMMA Argument Arguments
- """
- - p[0] = [p[2]] if p[2] else []
- + p[0] = []
- + if p[2]:
- + p[0] = [p[2]]
- p[0].extend(p[3])
-
- def p_ArgumentsEmpty(self, p):
- @@ -3233,7 +3302,9 @@ class Parser(Tokenizer):
- """
- ExtendedAttributes : COMMA ExtendedAttribute ExtendedAttributes
- """
- - p[0] = [p[2]] if p[2] else []
- + p[0] = []
- + if p[2]:
- + p[0] = [p[2]]
- p[0].extend(p[3])
-
- def p_ExtendedAttributesEmpty(self, p):
- diff -up comm-esr17/mozilla/ipc/ipdl/ipdl/lower.py.python comm-esr17/mozilla/ipc/ipdl/ipdl/lower.py
- --- comm-esr17/mozilla/ipc/ipdl/ipdl/lower.py.python 2012-11-16 22:41:35.000000000 +0100
- +++ comm-esr17/mozilla/ipc/ipdl/ipdl/lower.py 2012-11-19 13:20:39.000000000 +0100
- @@ -5057,7 +5057,10 @@ class _GenerateProtocolActorCode(ipdl.as
- action = ExprVar('Trigger::Recv')
- else: assert 0 and 'unknown combo %s/%s'% (self.side, direction)
-
- - msgid = md.pqMsgId() if not reply else md.pqReplyId()
- +
- + msgid = md.pqMsgId()
- + if reply:
- + msgid = md.pqReplyId()
- ifbad = StmtIf(ExprNot(
- ExprCall(
- ExprVar(self.protocol.name +'::Transition'),
- diff -up comm-esr17/mozilla/js/src/build/ConfigStatus.py.python comm-esr17/mozilla/js/src/build/ConfigStatus.py
- --- comm-esr17/mozilla/js/src/build/ConfigStatus.py.python 2012-11-16 22:41:35.000000000 +0100
- +++ comm-esr17/mozilla/js/src/build/ConfigStatus.py 2012-11-19 13:20:39.000000000 +0100
- @@ -6,7 +6,6 @@
- # drop-in replacement for autoconf 2.13's config.status, with features
- # borrowed from autoconf > 2.5, and additional features.
-
- -from __future__ import with_statement
- from optparse import OptionParser
- import sys, re, os, posixpath, ntpath
- from StringIO import StringIO
- @@ -76,13 +75,13 @@ class FileAvoidWrite(StringIO):
- return
- except IOError:
- pass
- - finally:
- - file.close()
- + file.close()
-
- log("creating %s" % relpath(self.filename, os.curdir))
- ensureParentDir(self.filename)
- - with open(self.filename, 'w') as file:
- - file.write(buf)
- + ff = open(self.filename, 'w')
- + ff.write(buf)
- + ff.close()
-
- def __enter__(self):
- return self
- @@ -203,8 +202,12 @@ class ConfigEnvironment(object):
- pp.context.update(DEPTH = self.get_depth(path))
- pp.do_filter('attemptSubstitution')
- pp.setMarker(None)
- - with FileAvoidWrite(path) as pp.out:
- + pp.out = FileAvoidWrite(path)
- + pp.out.__enter__()
- + try:
- pp.do_include(input)
- + finally:
- + pp.out.__exit__(0, 0, 0)
-
- def create_config_header(self, path):
- '''Creates the given config header. A config header is generated by
- @@ -216,7 +219,8 @@ class ConfigEnvironment(object):
- "#undef UNKNOWN_NAME" is turned into "/* #undef UNKNOWN_NAME */"
- Whitespaces are preserved.
+ @@ -122,8 +120,6 @@ class JarStruct(object):
+ assert data is not None
+ format, size = JarStruct.TYPE_MAPPING[type]
+ data = data[:size]
+ - if isinstance(data, memoryview):
+ - data = data.tobytes()
+ return struct.unpack('<' + format, data)[0], size
+
+ def serialize(self):
+ @@ -261,12 +257,12 @@ class JarFileReader(object):
+ the file data.
'''
- - with open(self.get_input(path), 'rU') as input:
- + input = open(self.get_input(path), 'rU')
- + if 1:
- ensureParentDir(path)
- output = FileAvoidWrite(path)
- r = re.compile('^\s*#\s*(?P<cmd>[a-z]+)(?:\s+(?P<name>\S+)(?:\s+(?P<value>\S+))?)?', re.U)
- @@ -237,6 +241,7 @@ class ConfigEnvironment(object):
-
- output.write(l)
- output.close()
- + input.close()
-
- def config_status(topobjdir = '.', topsrcdir = '.',
- defines = [], non_global_defines = [], substs = [],
- diff -up comm-esr17/mozilla/js/src/builtin/embedjs.py.python comm-esr17/mozilla/js/src/builtin/embedjs.py
- --- comm-esr17/mozilla/js/src/builtin/embedjs.py.python 2012-11-16 22:41:35.000000000 +0100
- +++ comm-esr17/mozilla/js/src/builtin/embedjs.py 2012-11-19 13:20:39.000000000 +0100
- @@ -8,16 +8,17 @@
- # It expects error messages in the JS code to be referenced by their C enum
- # keys as literals.
-
- -from __future__ import with_statement
- import re, sys, os, js2c, fileinput
-
- def replaceErrorMsgs(source_files, messages_file, output_file):
- messages = buildMessagesTable(messages_file)
- - with open(output_file, 'w') as output:
- + output = open(output_file, 'w')
- + if 1:
- if len(source_files) == 0:
- return
- for line in fileinput.input(source_files):
- output.write(replaceMessages(line, messages))
- + output.close()
-
- def buildMessagesTable(messages_file):
- table = {}
- @@ -46,4 +47,4 @@ def main():
- os.remove(combined_file)
-
- if __name__ == "__main__":
- - main()
- \ No newline at end of file
- + main()
- diff -up comm-esr17/mozilla/js/src/config/expandlibs_exec.py.python comm-esr17/mozilla/js/src/config/expandlibs_exec.py
- --- comm-esr17/mozilla/js/src/config/expandlibs_exec.py.python 2012-11-16 22:41:35.000000000 +0100
- +++ comm-esr17/mozilla/js/src/config/expandlibs_exec.py 2012-11-19 13:20:39.000000000 +0100
- @@ -20,13 +20,11 @@ With the --symbol-order argument, follow
- relevant linker options to change the order in which the linker puts the
- symbols appear in the resulting binary. Only works for ELF targets.
- '''
- -from __future__ import with_statement
- import sys
+ assert header['compression'] in [JAR_DEFLATED, JAR_STORED]
+ - self._data = data
+ # Copy some local file header fields.
+ for name in ['filename', 'compressed_size',
+ 'uncompressed_size', 'crc32']:
+ setattr(self, name, header[name])
+ self.compressed = header['compression'] == JAR_DEFLATED
+ + self._data = data[:header['compressed_size']]
+
+ def read(self, length=-1):
+ '''
+ @@ -316,9 +312,7 @@ class JarFileReader(object):
+ return self._uncompressed_data
+ data = self.compressed_data
+ if self.compressed:
+ - data = zlib.decompress(data.tobytes(), -MAX_WBITS)
+ - else:
+ - data = data.tobytes()
+ + data = zlib.decompress(data, -MAX_WBITS)
+ if len(data) != self.uncompressed_size:
+ raise JarReaderError('Corrupted file? %s' % self.filename)
+ self._uncompressed_data = BytesIO(data)
+ @@ -339,7 +333,7 @@ class JarReader(object):
+ data = fileobj.read()
+ else:
+ data = open(file, 'rb').read()
+ - self._data = memoryview(data)
+ + self._data = buffer(data)
+ # The End of Central Directory Record has a variable size because of
+ # comments it may contain, so scan for it from the end of the file.
+ offset = -CDIR_END_SIZE
+ @@ -661,8 +655,6 @@ class Deflater(object):
+ self._data.write(data)
+ if self.compress:
+ if self._deflater:
+ - if isinstance(data, memoryview):
+ - data = data.tobytes()
+ self._deflated.write(self._deflater.compress(data))
+ else:
+ raise JarWriterError("Can't write after flush")
+ diff -up mozilla-esr24/python/mozbuild/mozpack/unify.py.python mozilla-esr24/python/mozbuild/mozpack/unify.py
+ --- mozilla-esr24/python/mozbuild/mozpack/unify.py.python 2013-09-11 05:22:49.000000000 +0200
-+++ mozilla-esr24/python/mozbuild/mozpack/unify.py 2013-10-22 14:29:24.564993891 +0200
+++++ mozilla-esr24/python/mozbuild/mozpack/unify.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -19,7 +19,7 @@ import mozpack.path
+ import struct
import os
- from expandlibs import ExpandArgs, relativize, isObject, ensureParentDir, ExpandLibsDeps
- import expandlibs_config as conf
- from optparse import OptionParser
- -import subprocess
- import tempfile
- import shutil
import subprocess
- @@ -73,7 +71,11 @@ class ExpandArgsMore(ExpandArgs):
- elif os.path.exists(arg) and len(ar_extract):
- tmp = tempfile.mkdtemp(dir=os.curdir)
- self.tmp.append(tmp)
- - subprocess.call(ar_extract + [os.path.abspath(arg)], cwd=tmp)
- + tmp_arg = ar_extract + [os.path.abspath(arg)]
- + oldir = os.getcwd()
- + os.chdir(tmp)
- + os.system(' '.join(tmp_arg))
- + os.chdir(oldir)
- objs = []
- for root, dirs, files in os.walk(tmp):
- objs += [relativize(os.path.join(root, f)) for f in files if isObject(f)]
- @@ -165,8 +167,8 @@ class ExpandArgsMore(ExpandArgs):
- def orderSymbols(self, order):
- '''Given a file containing a list of symbols, adds the appropriate
- argument to make the linker put the symbols in that order.'''
- - with open(order) as file:
- - sections = self._getOrderedSections([l.strip() for l in file.readlines() if l.strip()])
- + ff = open(order)
- + sections = self._getOrderedSections([l.strip() for l in ff.readlines() if l.strip()])
- split_sections = {}
- linked_sections = [s[0] for s in SECTION_INSERT_BEFORE]
- for s in sections:
- @@ -293,29 +295,38 @@ def main():
- deps.pop(0)
- # Remove command
- deps.pop(0)
- - with ExpandArgsMore(args) as args:
- + args2 = ExpandArgsMore(args)
- + args2.__enter__()
- + try:
- if options.extract:
- - args.extract()
- + args2.extract()
- if options.symbol_order:
- - args.orderSymbols(options.symbol_order)
- + args2.orderSymbols(options.symbol_order)
- if options.uselist:
- - args.makelist()
- + args2.makelist()
-
- if options.verbose:
- - print >>sys.stderr, "Executing: " + " ".join(args)
- - for tmp in [f for f in args.tmp if os.path.isfile(f)]:
- + print >>sys.stderr, "Executing: " + " ".join(args2)
- + for tmp in [f for f in args2.tmp if os.path.isfile(f)]:
- print >>sys.stderr, tmp + ":"
- - with open(tmp) as file:
- - print >>sys.stderr, "".join([" " + l for l in file.readlines()])
- + ff = open(tmp)
- + ff.__enter__()
- + try:
- + print >>sys.stderr, "".join([" " + l for l in ff.readlines()])
- + finally:
- + ff.__exit__(0, 0, 0)
- sys.stderr.flush()
- - ret = subprocess.call(args)
- + ret = subprocess.call(args2)
- if ret:
- exit(ret)
- + finally:
- + args2.__exit__(0, 0, 0)
- if not options.depend:
- return
- ensureParentDir(options.depend)
- - with open(options.depend, 'w') as depfile:
- - depfile.write("%s : %s\n" % (options.target, ' '.join(dep for dep in deps if os.path.isfile(dep) and dep != options.target)))
- + depfile = open(options.depend, 'w')
- + depfile.write("%s : %s\n" % (options.target, ' '.join(dep for dep in deps if os.path.isfile(dep) and dep != options.target)))
- + depfile.close()
-
-
- if __name__ == '__main__':
- diff -up comm-esr17/mozilla/js/src/config/expandlibs_gen.py.python comm-esr17/mozilla/js/src/config/expandlibs_gen.py
- --- comm-esr17/mozilla/js/src/config/expandlibs_gen.py.python 2012-11-16 22:41:35.000000000 +0100
- +++ comm-esr17/mozilla/js/src/config/expandlibs_gen.py 2012-11-19 13:20:39.000000000 +0100
- @@ -5,7 +5,6 @@
- '''Given a list of object files and library names, prints a library
- descriptor to standard output'''
-
- -from __future__ import with_statement
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
+
+
+ def may_unify_binary(file):
-diff -up mozilla-esr24/rebase/argparse.py.python mozilla-esr24/rebase/argparse.py
---- mozilla-esr24/rebase/argparse.py.python 2013-10-22 16:49:19.310375183 +0200
-+++ mozilla-esr24/rebase/argparse.py 2011-03-31 23:43:27.000000000 +0200
-@@ -0,0 +1,2362 @@
-+# Author: Steven J. Bethard <steven.bethard at gmail.com>.
-+
-+"""Command-line parsing library
-+
-+This module is an optparse-inspired command-line parsing library that:
-+
-+ - handles both optional and positional arguments
-+ - produces highly informative usage messages
-+ - supports parsers that dispatch to sub-parsers
-+
-+The following is a simple usage example that sums integers from the
-+command-line and writes the result to a file::
-+
-+ parser = argparse.ArgumentParser(
-+ description='sum the integers at the command line')
-+ parser.add_argument(
-+ 'integers', metavar='int', nargs='+', type=int,
-+ help='an integer to be summed')
-+ parser.add_argument(
-+ '--log', default=sys.stdout, type=argparse.FileType('w'),
-+ help='the file where the sum should be written')
-+ args = parser.parse_args()
-+ args.log.write('%s' % sum(args.integers))
-+ args.log.close()
-+
-+The module contains the following public classes:
-+
-+ - ArgumentParser -- The main entry point for command-line parsing. As the
-+ example above shows, the add_argument() method is used to populate
-+ the parser with actions for optional and positional arguments. Then
-+ the parse_args() method is invoked to convert the args at the
-+ command-line into an object with attributes.
-+
-+ - ArgumentError -- The exception raised by ArgumentParser objects when
-+ there are errors with the parser's actions. Errors raised while
-+ parsing the command-line are caught by ArgumentParser and emitted
-+ as command-line messages.
-+
-+ - FileType -- A factory for defining types of files to be created. As the
-+ example above shows, instances of FileType are typically passed as
-+ the type= argument of add_argument() calls.
-+
-+ - Action -- The base class for parser actions. Typically actions are
-+ selected by passing strings like 'store_true' or 'append_const' to
-+ the action= argument of add_argument(). However, for greater
-+ customization of ArgumentParser actions, subclasses of Action may
-+ be defined and passed as the action= argument.
-+
-+ - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,
-+ ArgumentDefaultsHelpFormatter -- Formatter classes which
-+ may be passed as the formatter_class= argument to the
-+ ArgumentParser constructor. HelpFormatter is the default,
-+ RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser
-+ not to change the formatting for help text, and
-+ ArgumentDefaultsHelpFormatter adds information about argument defaults
-+ to the help.
-+
-+All other classes in this module are considered implementation details.
-+(Also note that HelpFormatter and RawDescriptionHelpFormatter are only
-+considered public as object names -- the API of the formatter objects is
-+still considered an implementation detail.)
-+"""
-+
-+__version__ = '1.2.1'
-+__all__ = [
-+ 'ArgumentParser',
-+ 'ArgumentError',
-+ 'ArgumentTypeError',
-+ 'FileType',
-+ 'HelpFormatter',
-+ 'ArgumentDefaultsHelpFormatter',
-+ 'RawDescriptionHelpFormatter',
-+ 'RawTextHelpFormatter',
-+ 'Namespace',
-+ 'Action',
-+ 'ONE_OR_MORE',
-+ 'OPTIONAL',
-+ 'PARSER',
-+ 'REMAINDER',
-+ 'SUPPRESS',
-+ 'ZERO_OR_MORE',
-+]
-+
-+
-+import copy as _copy
-+import os as _os
-+import re as _re
-+import sys as _sys
-+import textwrap as _textwrap
-+
-+from gettext import gettext as _
-+
-+try:
-+ set
-+except NameError:
-+ # for python < 2.4 compatibility (sets module is there since 2.3):
-+ from sets import Set as set
-+
-+try:
-+ basestring
-+except NameError:
-+ basestring = str
-+
-+try:
-+ sorted
-+except NameError:
-+ # for python < 2.4 compatibility:
-+ def sorted(iterable, reverse=False):
-+ result = list(iterable)
-+ result.sort()
-+ if reverse:
-+ result.reverse()
-+ return result
-+
-+
-+def _callable(obj):
-+ return hasattr(obj, '__call__') or hasattr(obj, '__bases__')
-+
-+
-+SUPPRESS = '==SUPPRESS=='
-+
-+OPTIONAL = '?'
-+ZERO_OR_MORE = '*'
-+ONE_OR_MORE = '+'
-+PARSER = 'A...'
-+REMAINDER = '...'
-+_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'
-+
-+# =============================
-+# Utility functions and classes
-+# =============================
-+
-+class _AttributeHolder(object):
-+ """Abstract base class that provides __repr__.
-+
-+ The __repr__ method returns a string in the format::
-+ ClassName(attr=name, attr=name, ...)
-+ The attributes are determined either by a class-level attribute,
-+ '_kwarg_names', or by inspecting the instance __dict__.
-+ """
-+
-+ def __repr__(self):
-+ type_name = type(self).__name__
-+ arg_strings = []
-+ for arg in self._get_args():
-+ arg_strings.append(repr(arg))
-+ for name, value in self._get_kwargs():
-+ arg_strings.append('%s=%r' % (name, value))
-+ return '%s(%s)' % (type_name, ', '.join(arg_strings))
-+
-+ def _get_kwargs(self):
-+ return sorted(self.__dict__.items())
-+
-+ def _get_args(self):
-+ return []
-+
-+
-+def _ensure_value(namespace, name, value):
-+ if getattr(namespace, name, None) is None:
-+ setattr(namespace, name, value)
-+ return getattr(namespace, name)
-+
-+
-+# ===============
-+# Formatting Help
-+# ===============
-+
-+class HelpFormatter(object):
-+ """Formatter for generating usage messages and argument help strings.
-+
-+ Only the name of this class is considered a public API. All the methods
-+ provided by the class are considered an implementation detail.
-+ """
-+
-+ def __init__(self,
-+ prog,
-+ indent_increment=2,
-+ max_help_position=24,
-+ width=None):
-+
-+ # default setting for width
-+ if width is None:
-+ try:
-+ width = int(_os.environ['COLUMNS'])
-+ except (KeyError, ValueError):
-+ width = 80
-+ width -= 2
-+
-+ self._prog = prog
-+ self._indent_increment = indent_increment
-+ self._max_help_position = max_help_position
-+ self._width = width
-+
-+ self._current_indent = 0
-+ self._level = 0
-+ self._action_max_length = 0
-+
-+ self._root_section = self._Section(self, None)
-+ self._current_section = self._root_section
-+
-+ self._whitespace_matcher = _re.compile(r'\s+')
-+ self._long_break_matcher = _re.compile(r'\n\n\n+')
-+
-+ # ===============================
-+ # Section and indentation methods
-+ # ===============================
-+ def _indent(self):
-+ self._current_indent += self._indent_increment
-+ self._level += 1
-+
-+ def _dedent(self):
-+ self._current_indent -= self._indent_increment
-+ assert self._current_indent >= 0, 'Indent decreased below 0.'
-+ self._level -= 1
-+
-+ class _Section(object):
-+
-+ def __init__(self, formatter, parent, heading=None):
-+ self.formatter = formatter
-+ self.parent = parent
-+ self.heading = heading
-+ self.items = []
-+
-+ def format_help(self):
-+ # format the indented section
-+ if self.parent is not None:
-+ self.formatter._indent()
-+ join = self.formatter._join_parts
-+ for func, args in self.items:
-+ func(*args)
-+ item_help = join([func(*args) for func, args in self.items])
-+ if self.parent is not None:
-+ self.formatter._dedent()
-+
-+ # return nothing if the section was empty
-+ if not item_help:
-+ return ''
-+
-+ # add the heading if the section was non-empty
-+ if self.heading is not SUPPRESS and self.heading is not None:
-+ current_indent = self.formatter._current_indent
-+ heading = '%*s%s:\n' % (current_indent, '', self.heading)
-+ else:
-+ heading = ''
-+
-+ # join the section-initial newline, the heading and the help
-+ return join(['\n', heading, item_help, '\n'])
-+
-+ def _add_item(self, func, args):
-+ self._current_section.items.append((func, args))
-+
-+ # ========================
-+ # Message building methods
-+ # ========================
-+ def start_section(self, heading):
-+ self._indent()
-+ section = self._Section(self, self._current_section, heading)
-+ self._add_item(section.format_help, [])
-+ self._current_section = section
-+
-+ def end_section(self):
-+ self._current_section = self._current_section.parent
-+ self._dedent()
-+
-+ def add_text(self, text):
-+ if text is not SUPPRESS and text is not None:
-+ self._add_item(self._format_text, [text])
-+
-+ def add_usage(self, usage, actions, groups, prefix=None):
-+ if usage is not SUPPRESS:
-+ args = usage, actions, groups, prefix
-+ self._add_item(self._format_usage, args)
-+
-+ def add_argument(self, action):
-+ if action.help is not SUPPRESS:
-+
-+ # find all invocations
-+ get_invocation = self._format_action_invocation
-+ invocations = [get_invocation(action)]
-+ for subaction in self._iter_indented_subactions(action):
-+ invocations.append(get_invocation(subaction))
-+
-+ # update the maximum item length
-+ invocation_length = max([len(s) for s in invocations])
-+ action_length = invocation_length + self._current_indent
-+ self._action_max_length = max(self._action_max_length,
-+ action_length)
-+
-+ # add the item to the list
-+ self._add_item(self._format_action, [action])
-+
-+ def add_arguments(self, actions):
-+ for action in actions:
-+ self.add_argument(action)
-+
-+ # =======================
-+ # Help-formatting methods
-+ # =======================
-+ def format_help(self):
-+ help = self._root_section.format_help()
-+ if help:
-+ help = self._long_break_matcher.sub('\n\n', help)
-+ help = help.strip('\n') + '\n'
-+ return help
-+
-+ def _join_parts(self, part_strings):
-+ return ''.join([part
-+ for part in part_strings
-+ if part and part is not SUPPRESS])
-+
-+ def _format_usage(self, usage, actions, groups, prefix):
-+ if prefix is None:
-+ prefix = _('usage: ')
-+
-+ # if usage is specified, use that
-+ if usage is not None:
-+ usage = usage % dict(prog=self._prog)
-+
-+ # if no optionals or positionals are available, usage is just prog
-+ elif usage is None and not actions:
-+ usage = '%(prog)s' % dict(prog=self._prog)
-+
-+ # if optionals and positionals are available, calculate usage
-+ elif usage is None:
-+ prog = '%(prog)s' % dict(prog=self._prog)
-+
-+ # split optionals from positionals
-+ optionals = []
-+ positionals = []
-+ for action in actions:
-+ if action.option_strings:
-+ optionals.append(action)
-+ else:
-+ positionals.append(action)
-+
-+ # build full usage string
-+ format = self._format_actions_usage
-+ action_usage = format(optionals + positionals, groups)
-+ usage = ' '.join([s for s in [prog, action_usage] if s])
-+
-+ # wrap the usage parts if it's too long
-+ text_width = self._width - self._current_indent
-+ if len(prefix) + len(usage) > text_width:
-+
-+ # break usage into wrappable parts
-+ part_regexp = r'\(.*?\)+|\[.*?\]+|\S+'
-+ opt_usage = format(optionals, groups)
-+ pos_usage = format(positionals, groups)
-+ opt_parts = _re.findall(part_regexp, opt_usage)
-+ pos_parts = _re.findall(part_regexp, pos_usage)
-+ assert ' '.join(opt_parts) == opt_usage
-+ assert ' '.join(pos_parts) == pos_usage
-+
-+ # helper for wrapping lines
-+ def get_lines(parts, indent, prefix=None):
-+ lines = []
-+ line = []
-+ if prefix is not None:
-+ line_len = len(prefix) - 1
-+ else:
-+ line_len = len(indent) - 1
-+ for part in parts:
-+ if line_len + 1 + len(part) > text_width:
-+ lines.append(indent + ' '.join(line))
-+ line = []
-+ line_len = len(indent) - 1
-+ line.append(part)
-+ line_len += len(part) + 1
-+ if line:
-+ lines.append(indent + ' '.join(line))
-+ if prefix is not None:
-+ lines[0] = lines[0][len(indent):]
-+ return lines
-+
-+ # if prog is short, follow it with optionals or positionals
-+ if len(prefix) + len(prog) <= 0.75 * text_width:
-+ indent = ' ' * (len(prefix) + len(prog) + 1)
-+ if opt_parts:
-+ lines = get_lines([prog] + opt_parts, indent, prefix)
-+ lines.extend(get_lines(pos_parts, indent))
-+ elif pos_parts:
-+ lines = get_lines([prog] + pos_parts, indent, prefix)
-+ else:
-+ lines = [prog]
-+
-+ # if prog is long, put it on its own line
-+ else:
-+ indent = ' ' * len(prefix)
-+ parts = opt_parts + pos_parts
-+ lines = get_lines(parts, indent)
-+ if len(lines) > 1:
-+ lines = []
-+ lines.extend(get_lines(opt_parts, indent))
-+ lines.extend(get_lines(pos_parts, indent))
-+ lines = [prog] + lines
-+
-+ # join lines into usage
-+ usage = '\n'.join(lines)
-+
-+ # prefix with 'usage:'
-+ return '%s%s\n\n' % (prefix, usage)
-+
-+ def _format_actions_usage(self, actions, groups):
-+ # find group indices and identify actions in groups
-+ group_actions = set()
-+ inserts = {}
-+ for group in groups:
-+ try:
-+ start = actions.index(group._group_actions[0])
-+ except ValueError:
-+ continue
-+ else:
-+ end = start + len(group._group_actions)
-+ if actions[start:end] == group._group_actions:
-+ for action in group._group_actions:
-+ group_actions.add(action)
-+ if not group.required:
-+ if start in inserts:
-+ inserts[start] += ' ['
-+ else:
-+ inserts[start] = '['
-+ inserts[end] = ']'
-+ else:
-+ if start in inserts:
-+ inserts[start] += ' ('
-+ else:
-+ inserts[start] = '('
-+ inserts[end] = ')'
-+ for i in range(start + 1, end):
-+ inserts[i] = '|'
-+
-+ # collect all actions format strings
-+ parts = []
-+ for i, action in enumerate(actions):
-+
-+ # suppressed arguments are marked with None
-+ # remove | separators for suppressed arguments
-+ if action.help is SUPPRESS:
-+ parts.append(None)
-+ if inserts.get(i) == '|':
-+ inserts.pop(i)
-+ elif inserts.get(i + 1) == '|':
-+ inserts.pop(i + 1)
-+
-+ # produce all arg strings
-+ elif not action.option_strings:
-+ part = self._format_args(action, action.dest)
-+
-+ # if it's in a group, strip the outer []
-+ if action in group_actions:
-+ if part[0] == '[' and part[-1] == ']':
-+ part = part[1:-1]
-+
-+ # add the action string to the list
-+ parts.append(part)
-+
-+ # produce the first way to invoke the option in brackets
-+ else:
-+ option_string = action.option_strings[0]
-+
-+ # if the Optional doesn't take a value, format is:
-+ # -s or --long
-+ if action.nargs == 0:
-+ part = '%s' % option_string
-+
-+ # if the Optional takes a value, format is:
-+ # -s ARGS or --long ARGS
-+ else:
-+ default = action.dest.upper()
-+ args_string = self._format_args(action, default)
-+ part = '%s %s' % (option_string, args_string)
-+
-+ # make it look optional if it's not required or in a group
-+ if not action.required and action not in group_actions:
-+ part = '[%s]' % part
-+
-+ # add the action string to the list
-+ parts.append(part)
-+
-+ # insert things at the necessary indices
-+ for i in sorted(inserts, reverse=True):
-+ parts[i:i] = [inserts[i]]
-+
-+ # join all the action items with spaces
-+ text = ' '.join([item for item in parts if item is not None])
-+
-+ # clean up separators for mutually exclusive groups
-+ open = r'[\[(]'
-+ close = r'[\])]'
-+ text = _re.sub(r'(%s) ' % open, r'\1', text)
-+ text = _re.sub(r' (%s)' % close, r'\1', text)
-+ text = _re.sub(r'%s *%s' % (open, close), r'', text)
-+ text = _re.sub(r'\(([^|]*)\)', r'\1', text)
-+ text = text.strip()
-+
-+ # return the text
-+ return text
-+
-+ def _format_text(self, text):
-+ if '%(prog)' in text:
-+ text = text % dict(prog=self._prog)
-+ text_width = self._width - self._current_indent
-+ indent = ' ' * self._current_indent
-+ return self._fill_text(text, text_width, indent) + '\n\n'
-+
-+ def _format_action(self, action):
-+ # determine the required width and the entry label
-+ help_position = min(self._action_max_length + 2,
-+ self._max_help_position)
-+ help_width = self._width - help_position
-+ action_width = help_position - self._current_indent - 2
-+ action_header = self._format_action_invocation(action)
-+
-+ # ho nelp; start on same line and add a final newline
-+ if not action.help:
-+ tup = self._current_indent, '', action_header
-+ action_header = '%*s%s\n' % tup
-+
-+ # short action name; start on the same line and pad two spaces
-+ elif len(action_header) <= action_width:
-+ tup = self._current_indent, '', action_width, action_header
-+ action_header = '%*s%-*s ' % tup
-+ indent_first = 0
-+
-+ # long action name; start on the next line
-+ else:
-+ tup = self._current_indent, '', action_header
-+ action_header = '%*s%s\n' % tup
-+ indent_first = help_position
-+
-+ # collect the pieces of the action help
-+ parts = [action_header]
-+
-+ # if there was help for the action, add lines of help text
-+ if action.help:
-+ help_text = self._expand_help(action)
-+ help_lines = self._split_lines(help_text, help_width)
-+ parts.append('%*s%s\n' % (indent_first, '', help_lines[0]))
-+ for line in help_lines[1:]:
-+ parts.append('%*s%s\n' % (help_position, '', line))
-+
-+ # or add a newline if the description doesn't end with one
-+ elif not action_header.endswith('\n'):
-+ parts.append('\n')
-+
-+ # if there are any sub-actions, add their help as well
-+ for subaction in self._iter_indented_subactions(action):
-+ parts.append(self._format_action(subaction))
-+
-+ # return a single string
-+ return self._join_parts(parts)
-+
-+ def _format_action_invocation(self, action):
-+ if not action.option_strings:
-+ metavar, = self._metavar_formatter(action, action.dest)(1)
-+ return metavar
-+
-+ else:
-+ parts = []
-+
-+ # if the Optional doesn't take a value, format is:
-+ # -s, --long
-+ if action.nargs == 0:
-+ parts.extend(action.option_strings)
-+
-+ # if the Optional takes a value, format is:
-+ # -s ARGS, --long ARGS
-+ else:
-+ default = action.dest.upper()
-+ args_string = self._format_args(action, default)
-+ for option_string in action.option_strings:
-+ parts.append('%s %s' % (option_string, args_string))
-+
-+ return ', '.join(parts)
-+
-+ def _metavar_formatter(self, action, default_metavar):
-+ if action.metavar is not None:
-+ result = action.metavar
-+ elif action.choices is not None:
-+ choice_strs = [str(choice) for choice in action.choices]
-+ result = '{%s}' % ','.join(choice_strs)
-+ else:
-+ result = default_metavar
-+
-+ def format(tuple_size):
-+ if isinstance(result, tuple):
-+ return result
-+ else:
-+ return (result, ) * tuple_size
-+ return format
-+
-+ def _format_args(self, action, default_metavar):
-+ get_metavar = self._metavar_formatter(action, default_metavar)
-+ if action.nargs is None:
-+ result = '%s' % get_metavar(1)
-+ elif action.nargs == OPTIONAL:
-+ result = '[%s]' % get_metavar(1)
-+ elif action.nargs == ZERO_OR_MORE:
-+ result = '[%s [%s ...]]' % get_metavar(2)
-+ elif action.nargs == ONE_OR_MORE:
-+ result = '%s [%s ...]' % get_metavar(2)
-+ elif action.nargs == REMAINDER:
-+ result = '...'
-+ elif action.nargs == PARSER:
-+ result = '%s ...' % get_metavar(1)
-+ else:
-+ formats = ['%s' for _ in range(action.nargs)]
-+ result = ' '.join(formats) % get_metavar(action.nargs)
-+ return result
-+
-+ def _expand_help(self, action):
-+ params = dict(vars(action), prog=self._prog)
-+ for name in list(params):
-+ if params[name] is SUPPRESS:
-+ del params[name]
-+ for name in list(params):
-+ if hasattr(params[name], '__name__'):
-+ params[name] = params[name].__name__
-+ if params.get('choices') is not None:
-+ choices_str = ', '.join([str(c) for c in params['choices']])
-+ params['choices'] = choices_str
-+ return self._get_help_string(action) % params
-+
-+ def _iter_indented_subactions(self, action):
-+ try:
-+ get_subactions = action._get_subactions
-+ except AttributeError:
-+ pass
-+ else:
-+ self._indent()
-+ for subaction in get_subactions():
-+ yield subaction
-+ self._dedent()
-+
-+ def _split_lines(self, text, width):
-+ text = self._whitespace_matcher.sub(' ', text).strip()
-+ return _textwrap.wrap(text, width)
-+
-+ def _fill_text(self, text, width, indent):
-+ text = self._whitespace_matcher.sub(' ', text).strip()
-+ return _textwrap.fill(text, width, initial_indent=indent,
-+ subsequent_indent=indent)
-+
-+ def _get_help_string(self, action):
-+ return action.help
-+
-+
-+class RawDescriptionHelpFormatter(HelpFormatter):
-+ """Help message formatter which retains any formatting in descriptions.
-+
-+ Only the name of this class is considered a public API. All the methods
-+ provided by the class are considered an implementation detail.
-+ """
-+
-+ def _fill_text(self, text, width, indent):
-+ return ''.join([indent + line for line in text.splitlines(True)])
-+
-+
-+class RawTextHelpFormatter(RawDescriptionHelpFormatter):
-+ """Help message formatter which retains formatting of all help text.
-+
-+ Only the name of this class is considered a public API. All the methods
-+ provided by the class are considered an implementation detail.
-+ """
-+
-+ def _split_lines(self, text, width):
-+ return text.splitlines()
-+
-+
-+class ArgumentDefaultsHelpFormatter(HelpFormatter):
-+ """Help message formatter which adds default values to argument help.
-+
-+ Only the name of this class is considered a public API. All the methods
-+ provided by the class are considered an implementation detail.
-+ """
-+
-+ def _get_help_string(self, action):
-+ help = action.help
-+ if '%(default)' not in action.help:
-+ if action.default is not SUPPRESS:
-+ defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
-+ if action.option_strings or action.nargs in defaulting_nargs:
-+ help += ' (default: %(default)s)'
-+ return help
-+
-+
-+# =====================
-+# Options and Arguments
-+# =====================
-+
-+def _get_action_name(argument):
-+ if argument is None:
-+ return None
-+ elif argument.option_strings:
-+ return '/'.join(argument.option_strings)
-+ elif argument.metavar not in (None, SUPPRESS):
-+ return argument.metavar
-+ elif argument.dest not in (None, SUPPRESS):
-+ return argument.dest
-+ else:
-+ return None
-+
-+
-+class ArgumentError(Exception):
-+ """An error from creating or using an argument (optional or positional).
-+
-+ The string value of this exception is the message, augmented with
-+ information about the argument that caused it.
-+ """
-+
-+ def __init__(self, argument, message):
-+ self.argument_name = _get_action_name(argument)
-+ self.message = message
-+
-+ def __str__(self):
-+ if self.argument_name is None:
-+ format = '%(message)s'
-+ else:
-+ format = 'argument %(argument_name)s: %(message)s'
-+ return format % dict(message=self.message,
-+ argument_name=self.argument_name)
-+
-+
-+class ArgumentTypeError(Exception):
-+ """An error from trying to convert a command line string to a type."""
-+ pass
-+
-+
-+# ==============
-+# Action classes
-+# ==============
-+
-+class Action(_AttributeHolder):
-+ """Information about how to convert command line strings to Python objects.
-+
-+ Action objects are used by an ArgumentParser to represent the information
-+ needed to parse a single argument from one or more strings from the
-+ command line. The keyword arguments to the Action constructor are also
-+ all attributes of Action instances.
-+
-+ Keyword Arguments:
-+
-+ - option_strings -- A list of command-line option strings which
-+ should be associated with this action.
-+
-+ - dest -- The name of the attribute to hold the created object(s)
-+
-+ - nargs -- The number of command-line arguments that should be
-+ consumed. By default, one argument will be consumed and a single
-+ value will be produced. Other values include:
-+ - N (an integer) consumes N arguments (and produces a list)
-+ - '?' consumes zero or one arguments
-+ - '*' consumes zero or more arguments (and produces a list)
-+ - '+' consumes one or more arguments (and produces a list)
-+ Note that the difference between the default and nargs=1 is that
-+ with the default, a single value will be produced, while with
-+ nargs=1, a list containing a single value will be produced.
-+
-+ - const -- The value to be produced if the option is specified and the
-+ option uses an action that takes no values.
-+
-+ - default -- The value to be produced if the option is not specified.
-+
-+ - type -- The type which the command-line arguments should be converted
-+ to, should be one of 'string', 'int', 'float', 'complex' or a
-+ callable object that accepts a single string argument. If None,
-+ 'string' is assumed.
-+
-+ - choices -- A container of values that should be allowed. If not None,
-+ after a command-line argument has been converted to the appropriate
-+ type, an exception will be raised if it is not a member of this
-+ collection.
-+
-+ - required -- True if the action must always be specified at the
-+ command line. This is only meaningful for optional command-line
-+ arguments.
-+
-+ - help -- The help string describing the argument.
-+
-+ - metavar -- The name to be used for the option's argument with the
-+ help string. If None, the 'dest' value will be used as the name.
-+ """
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ nargs=None,
-+ const=None,
-+ default=None,
-+ type=None,
-+ choices=None,
-+ required=False,
-+ help=None,
-+ metavar=None):
-+ self.option_strings = option_strings
-+ self.dest = dest
-+ self.nargs = nargs
-+ self.const = const
-+ self.default = default
-+ self.type = type
-+ self.choices = choices
-+ self.required = required
-+ self.help = help
-+ self.metavar = metavar
-+
-+ def _get_kwargs(self):
-+ names = [
-+ 'option_strings',
-+ 'dest',
-+ 'nargs',
-+ 'const',
-+ 'default',
-+ 'type',
-+ 'choices',
-+ 'help',
-+ 'metavar',
-+ ]
-+ return [(name, getattr(self, name)) for name in names]
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ raise NotImplementedError(_('.__call__() not defined'))
-+
-+
-+class _StoreAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ nargs=None,
-+ const=None,
-+ default=None,
-+ type=None,
-+ choices=None,
-+ required=False,
-+ help=None,
-+ metavar=None):
-+ if nargs == 0:
-+ raise ValueError('nargs for store actions must be > 0; if you '
-+ 'have nothing to store, actions such as store '
-+ 'true or store const may be more appropriate')
-+ if const is not None and nargs != OPTIONAL:
-+ raise ValueError('nargs must be %r to supply const' % OPTIONAL)
-+ super(_StoreAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ nargs=nargs,
-+ const=const,
-+ default=default,
-+ type=type,
-+ choices=choices,
-+ required=required,
-+ help=help,
-+ metavar=metavar)
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ setattr(namespace, self.dest, values)
-+
-+
-+class _StoreConstAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ const,
-+ default=None,
-+ required=False,
-+ help=None,
-+ metavar=None):
-+ super(_StoreConstAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ nargs=0,
-+ const=const,
-+ default=default,
-+ required=required,
-+ help=help)
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ setattr(namespace, self.dest, self.const)
-+
-+
-+class _StoreTrueAction(_StoreConstAction):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ default=False,
-+ required=False,
-+ help=None):
-+ super(_StoreTrueAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ const=True,
-+ default=default,
-+ required=required,
-+ help=help)
-+
-+
-+class _StoreFalseAction(_StoreConstAction):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ default=True,
-+ required=False,
-+ help=None):
-+ super(_StoreFalseAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ const=False,
-+ default=default,
-+ required=required,
-+ help=help)
-+
-+
-+class _AppendAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ nargs=None,
-+ const=None,
-+ default=None,
-+ type=None,
-+ choices=None,
-+ required=False,
-+ help=None,
-+ metavar=None):
-+ if nargs == 0:
-+ raise ValueError('nargs for append actions must be > 0; if arg '
-+ 'strings are not supplying the value to append, '
-+ 'the append const action may be more appropriate')
-+ if const is not None and nargs != OPTIONAL:
-+ raise ValueError('nargs must be %r to supply const' % OPTIONAL)
-+ super(_AppendAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ nargs=nargs,
-+ const=const,
-+ default=default,
-+ type=type,
-+ choices=choices,
-+ required=required,
-+ help=help,
-+ metavar=metavar)
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ items = _copy.copy(_ensure_value(namespace, self.dest, []))
-+ items.append(values)
-+ setattr(namespace, self.dest, items)
-+
-+
-+class _AppendConstAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ const,
-+ default=None,
-+ required=False,
-+ help=None,
-+ metavar=None):
-+ super(_AppendConstAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ nargs=0,
-+ const=const,
-+ default=default,
-+ required=required,
-+ help=help,
-+ metavar=metavar)
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ items = _copy.copy(_ensure_value(namespace, self.dest, []))
-+ items.append(self.const)
-+ setattr(namespace, self.dest, items)
-+
-+
-+class _CountAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest,
-+ default=None,
-+ required=False,
-+ help=None):
-+ super(_CountAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ nargs=0,
-+ default=default,
-+ required=required,
-+ help=help)
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ new_count = _ensure_value(namespace, self.dest, 0) + 1
-+ setattr(namespace, self.dest, new_count)
-+
-+
-+class _HelpAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ dest=SUPPRESS,
-+ default=SUPPRESS,
-+ help=None):
-+ super(_HelpAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ default=default,
-+ nargs=0,
-+ help=help)
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ parser.print_help()
-+ parser.exit()
-+
-+
-+class _VersionAction(Action):
-+
-+ def __init__(self,
-+ option_strings,
-+ version=None,
-+ dest=SUPPRESS,
-+ default=SUPPRESS,
-+ help="show program's version number and exit"):
-+ super(_VersionAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ default=default,
-+ nargs=0,
-+ help=help)
-+ self.version = version
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ version = self.version
-+ if version is None:
-+ version = parser.version
-+ formatter = parser._get_formatter()
-+ formatter.add_text(version)
-+ parser.exit(message=formatter.format_help())
-+
-+
-+class _SubParsersAction(Action):
-+
-+ class _ChoicesPseudoAction(Action):
-+
-+ def __init__(self, name, help):
-+ sup = super(_SubParsersAction._ChoicesPseudoAction, self)
-+ sup.__init__(option_strings=[], dest=name, help=help)
-+
-+ def __init__(self,
-+ option_strings,
-+ prog,
-+ parser_class,
-+ dest=SUPPRESS,
-+ help=None,
-+ metavar=None):
-+
-+ self._prog_prefix = prog
-+ self._parser_class = parser_class
-+ self._name_parser_map = {}
-+ self._choices_actions = []
-+
-+ super(_SubParsersAction, self).__init__(
-+ option_strings=option_strings,
-+ dest=dest,
-+ nargs=PARSER,
-+ choices=self._name_parser_map,
-+ help=help,
-+ metavar=metavar)
-+
-+ def add_parser(self, name, **kwargs):
-+ # set prog from the existing prefix
-+ if kwargs.get('prog') is None:
-+ kwargs['prog'] = '%s %s' % (self._prog_prefix, name)
-+
-+ # create a pseudo-action to hold the choice help
-+ if 'help' in kwargs:
-+ help = kwargs.pop('help')
-+ choice_action = self._ChoicesPseudoAction(name, help)
-+ self._choices_actions.append(choice_action)
-+
-+ # create the parser and add it to the map
-+ parser = self._parser_class(**kwargs)
-+ self._name_parser_map[name] = parser
-+ return parser
-+
-+ def _get_subactions(self):
-+ return self._choices_actions
-+
-+ def __call__(self, parser, namespace, values, option_string=None):
-+ parser_name = values[0]
-+ arg_strings = values[1:]
-+
-+ # set the parser name if requested
-+ if self.dest is not SUPPRESS:
-+ setattr(namespace, self.dest, parser_name)
-+
-+ # select the parser
-+ try:
-+ parser = self._name_parser_map[parser_name]
-+ except KeyError:
-+ tup = parser_name, ', '.join(self._name_parser_map)
-+ msg = _('unknown parser %r (choices: %s)' % tup)
-+ raise ArgumentError(self, msg)
-+
-+ # parse all the remaining options into the namespace
-+ # store any unrecognized options on the object, so that the top
-+ # level parser can decide what to do with them
-+ namespace, arg_strings = parser.parse_known_args(arg_strings, namespace)
-+ if arg_strings:
-+ vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
-+ getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
-+
-+
-+# ==============
-+# Type classes
-+# ==============
-+
-+class FileType(object):
-+ """Factory for creating file object types
-+
-+ Instances of FileType are typically passed as type= arguments to the
-+ ArgumentParser add_argument() method.
-+
-+ Keyword Arguments:
-+ - mode -- A string indicating how the file is to be opened. Accepts the
-+ same values as the builtin open() function.
-+ - bufsize -- The file's desired buffer size. Accepts the same values as
-+ the builtin open() function.
-+ """
-+
-+ def __init__(self, mode='r', bufsize=None):
-+ self._mode = mode
-+ self._bufsize = bufsize
-+
-+ def __call__(self, string):
-+ # the special argument "-" means sys.std{in,out}
-+ if string == '-':
-+ if 'r' in self._mode:
-+ return _sys.stdin
-+ elif 'w' in self._mode:
-+ return _sys.stdout
-+ else:
-+ msg = _('argument "-" with mode %r' % self._mode)
-+ raise ValueError(msg)
-+
-+ # all other arguments are used as file names
-+ if self._bufsize:
-+ return open(string, self._mode, self._bufsize)
-+ else:
-+ return open(string, self._mode)
-+
-+ def __repr__(self):
-+ args = [self._mode, self._bufsize]
-+ args_str = ', '.join([repr(arg) for arg in args if arg is not None])
-+ return '%s(%s)' % (type(self).__name__, args_str)
-+
-+# ===========================
-+# Optional and Positional Parsing
-+# ===========================
-+
-+class Namespace(_AttributeHolder):
-+ """Simple object for storing attributes.
-+
-+ Implements equality by attribute names and values, and provides a simple
-+ string representation.
-+ """
-+
-+ def __init__(self, **kwargs):
-+ for name in kwargs:
-+ setattr(self, name, kwargs[name])
-+
-+ __hash__ = None
-+
-+ def __eq__(self, other):
-+ return vars(self) == vars(other)
-+
-+ def __ne__(self, other):
-+ return not (self == other)
-+
-+ def __contains__(self, key):
-+ return key in self.__dict__
-+
-+
-+class _ActionsContainer(object):
-+
-+ def __init__(self,
-+ description,
-+ prefix_chars,
-+ argument_default,
-+ conflict_handler):
-+ super(_ActionsContainer, self).__init__()
-+
-+ self.description = description
-+ self.argument_default = argument_default
-+ self.prefix_chars = prefix_chars
-+ self.conflict_handler = conflict_handler
-+
-+ # set up registries
-+ self._registries = {}
-+
-+ # register actions
-+ self.register('action', None, _StoreAction)
-+ self.register('action', 'store', _StoreAction)
-+ self.register('action', 'store_const', _StoreConstAction)
-+ self.register('action', 'store_true', _StoreTrueAction)
-+ self.register('action', 'store_false', _StoreFalseAction)
-+ self.register('action', 'append', _AppendAction)
-+ self.register('action', 'append_const', _AppendConstAction)
-+ self.register('action', 'count', _CountAction)
-+ self.register('action', 'help', _HelpAction)
-+ self.register('action', 'version', _VersionAction)
-+ self.register('action', 'parsers', _SubParsersAction)
-+
-+ # raise an exception if the conflict handler is invalid
-+ self._get_handler()
-+
-+ # action storage
-+ self._actions = []
-+ self._option_string_actions = {}
-+
-+ # groups
-+ self._action_groups = []
-+ self._mutually_exclusive_groups = []
-+
-+ # defaults storage
-+ self._defaults = {}
-+
-+ # determines whether an "option" looks like a negative number
-+ self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$')
-+
-+ # whether or not there are any optionals that look like negative
-+ # numbers -- uses a list so it can be shared and edited
-+ self._has_negative_number_optionals = []
-+
-+ # ====================
-+ # Registration methods
-+ # ====================
-+ def register(self, registry_name, value, object):
-+ registry = self._registries.setdefault(registry_name, {})
-+ registry[value] = object
-+
-+ def _registry_get(self, registry_name, value, default=None):
-+ return self._registries[registry_name].get(value, default)
-+
-+ # ==================================
-+ # Namespace default accessor methods
-+ # ==================================
-+ def set_defaults(self, **kwargs):
-+ self._defaults.update(kwargs)
-+
-+ # if these defaults match any existing arguments, replace
-+ # the previous default on the object with the new one
-+ for action in self._actions:
-+ if action.dest in kwargs:
-+ action.default = kwargs[action.dest]
-+
-+ def get_default(self, dest):
-+ for action in self._actions:
-+ if action.dest == dest and action.default is not None:
-+ return action.default
-+ return self._defaults.get(dest, None)
-+
-+
-+ # =======================
-+ # Adding argument actions
-+ # =======================
-+ def add_argument(self, *args, **kwargs):
-+ """
-+ add_argument(dest, ..., name=value, ...)
-+ add_argument(option_string, option_string, ..., name=value, ...)
-+ """
-+
-+ # if no positional args are supplied or only one is supplied and
-+ # it doesn't look like an option string, parse a positional
-+ # argument
-+ chars = self.prefix_chars
-+ if not args or len(args) == 1 and args[0][0] not in chars:
-+ if args and 'dest' in kwargs:
-+ raise ValueError('dest supplied twice for positional argument')
-+ kwargs = self._get_positional_kwargs(*args, **kwargs)
-+
-+ # otherwise, we're adding an optional argument
-+ else:
-+ kwargs = self._get_optional_kwargs(*args, **kwargs)
-+
-+ # if no default was supplied, use the parser-level default
-+ if 'default' not in kwargs:
-+ dest = kwargs['dest']
-+ if dest in self._defaults:
-+ kwargs['default'] = self._defaults[dest]
-+ elif self.argument_default is not None:
-+ kwargs['default'] = self.argument_default
-+
-+ # create the action object, and add it to the parser
-+ action_class = self._pop_action_class(kwargs)
-+ if not _callable(action_class):
-+ raise ValueError('unknown action "%s"' % action_class)
-+ action = action_class(**kwargs)
-+
-+ # raise an error if the action type is not callable
-+ type_func = self._registry_get('type', action.type, action.type)
-+ if not _callable(type_func):
-+ raise ValueError('%r is not callable' % type_func)
-+
-+ return self._add_action(action)
-+
-+ def add_argument_group(self, *args, **kwargs):
-+ group = _ArgumentGroup(self, *args, **kwargs)
-+ self._action_groups.append(group)
-+ return group
-+
-+ def add_mutually_exclusive_group(self, **kwargs):
-+ group = _MutuallyExclusiveGroup(self, **kwargs)
-+ self._mutually_exclusive_groups.append(group)
-+ return group
-+
-+ def _add_action(self, action):
-+ # resolve any conflicts
-+ self._check_conflict(action)
-+
-+ # add to actions list
-+ self._actions.append(action)
-+ action.container = self
-+
-+ # index the action by any option strings it has
-+ for option_string in action.option_strings:
-+ self._option_string_actions[option_string] = action
-+
-+ # set the flag if any option strings look like negative numbers
-+ for option_string in action.option_strings:
-+ if self._negative_number_matcher.match(option_string):
-+ if not self._has_negative_number_optionals:
-+ self._has_negative_number_optionals.append(True)
-+
-+ # return the created action
-+ return action
-+
-+ def _remove_action(self, action):
-+ self._actions.remove(action)
-+
-+ def _add_container_actions(self, container):
-+ # collect groups by titles
-+ title_group_map = {}
-+ for group in self._action_groups:
-+ if group.title in title_group_map:
-+ msg = _('cannot merge actions - two groups are named %r')
-+ raise ValueError(msg % (group.title))
-+ title_group_map[group.title] = group
-+
-+ # map each action to its group
-+ group_map = {}
-+ for group in container._action_groups:
-+
-+ # if a group with the title exists, use that, otherwise
-+ # create a new group matching the container's group
-+ if group.title not in title_group_map:
-+ title_group_map[group.title] = self.add_argument_group(
-+ title=group.title,
-+ description=group.description,
-+ conflict_handler=group.conflict_handler)
-+
-+ # map the actions to their new group
-+ for action in group._group_actions:
-+ group_map[action] = title_group_map[group.title]
-+
-+ # add container's mutually exclusive groups
-+ # NOTE: if add_mutually_exclusive_group ever gains title= and
-+ # description= then this code will need to be expanded as above
-+ for group in container._mutually_exclusive_groups:
-+ mutex_group = self.add_mutually_exclusive_group(
-+ required=group.required)
-+
-+ # map the actions to their new mutex group
-+ for action in group._group_actions:
-+ group_map[action] = mutex_group
-+
-+ # add all actions to this container or their group
-+ for action in container._actions:
-+ group_map.get(action, self)._add_action(action)
-+
-+ def _get_positional_kwargs(self, dest, **kwargs):
-+ # make sure required is not specified
-+ if 'required' in kwargs:
-+ msg = _("'required' is an invalid argument for positionals")
-+ raise TypeError(msg)
-+
-+ # mark positional arguments as required if at least one is
-+ # always required
-+ if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]:
-+ kwargs['required'] = True
-+ if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs:
-+ kwargs['required'] = True
-+
-+ # return the keyword arguments with no option strings
-+ return dict(kwargs, dest=dest, option_strings=[])
-+
-+ def _get_optional_kwargs(self, *args, **kwargs):
-+ # determine short and long option strings
-+ option_strings = []
-+ long_option_strings = []
-+ for option_string in args:
-+ # error on strings that don't start with an appropriate prefix
-+ if not option_string[0] in self.prefix_chars:
-+ msg = _('invalid option string %r: '
-+ 'must start with a character %r')
-+ tup = option_string, self.prefix_chars
-+ raise ValueError(msg % tup)
-+
-+ # strings starting with two prefix characters are long options
-+ option_strings.append(option_string)
-+ if option_string[0] in self.prefix_chars:
-+ if len(option_string) > 1:
-+ if option_string[1] in self.prefix_chars:
-+ long_option_strings.append(option_string)
-+
-+ # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
-+ dest = kwargs.pop('dest', None)
-+ if dest is None:
-+ if long_option_strings:
-+ dest_option_string = long_option_strings[0]
-+ else:
-+ dest_option_string = option_strings[0]
-+ dest = dest_option_string.lstrip(self.prefix_chars)
-+ if not dest:
-+ msg = _('dest= is required for options like %r')
-+ raise ValueError(msg % option_string)
-+ dest = dest.replace('-', '_')
-+
-+ # return the updated keyword arguments
-+ return dict(kwargs, dest=dest, option_strings=option_strings)
-+
-+ def _pop_action_class(self, kwargs, default=None):
-+ action = kwargs.pop('action', default)
-+ return self._registry_get('action', action, action)
-+
-+ def _get_handler(self):
-+ # determine function from conflict handler string
-+ handler_func_name = '_handle_conflict_%s' % self.conflict_handler
-+ try:
-+ return getattr(self, handler_func_name)
-+ except AttributeError:
-+ msg = _('invalid conflict_resolution value: %r')
-+ raise ValueError(msg % self.conflict_handler)
-+
-+ def _check_conflict(self, action):
-+
-+ # find all options that conflict with this option
-+ confl_optionals = []
-+ for option_string in action.option_strings:
-+ if option_string in self._option_string_actions:
-+ confl_optional = self._option_string_actions[option_string]
-+ confl_optionals.append((option_string, confl_optional))
-+
-+ # resolve any conflicts
-+ if confl_optionals:
-+ conflict_handler = self._get_handler()
-+ conflict_handler(action, confl_optionals)
-+
-+ def _handle_conflict_error(self, action, conflicting_actions):
-+ message = _('conflicting option string(s): %s')
-+ conflict_string = ', '.join([option_string
-+ for option_string, action
-+ in conflicting_actions])
-+ raise ArgumentError(action, message % conflict_string)
-+
-+ def _handle_conflict_resolve(self, action, conflicting_actions):
-+
-+ # remove all conflicting options
-+ for option_string, action in conflicting_actions:
-+
-+ # remove the conflicting option
-+ action.option_strings.remove(option_string)
-+ self._option_string_actions.pop(option_string, None)
-+
-+ # if the option now has no option string, remove it from the
-+ # container holding it
-+ if not action.option_strings:
-+ action.container._remove_action(action)
-+
-+
-+class _ArgumentGroup(_ActionsContainer):
-+
-+ def __init__(self, container, title=None, description=None, **kwargs):
-+ # add any missing keyword arguments by checking the container
-+ update = kwargs.setdefault
-+ update('conflict_handler', container.conflict_handler)
-+ update('prefix_chars', container.prefix_chars)
-+ update('argument_default', container.argument_default)
-+ super_init = super(_ArgumentGroup, self).__init__
-+ super_init(description=description, **kwargs)
-+
-+ # group attributes
-+ self.title = title
-+ self._group_actions = []
-+
-+ # share most attributes with the container
-+ self._registries = container._registries
-+ self._actions = container._actions
-+ self._option_string_actions = container._option_string_actions
-+ self._defaults = container._defaults
-+ self._has_negative_number_optionals = \
-+ container._has_negative_number_optionals
-+
-+ def _add_action(self, action):
-+ action = super(_ArgumentGroup, self)._add_action(action)
-+ self._group_actions.append(action)
-+ return action
-+
-+ def _remove_action(self, action):
-+ super(_ArgumentGroup, self)._remove_action(action)
-+ self._group_actions.remove(action)
-+
-+
-+class _MutuallyExclusiveGroup(_ArgumentGroup):
-+
-+ def __init__(self, container, required=False):
-+ super(_MutuallyExclusiveGroup, self).__init__(container)
-+ self.required = required
-+ self._container = container
-+
-+ def _add_action(self, action):
-+ if action.required:
-+ msg = _('mutually exclusive arguments must be optional')
-+ raise ValueError(msg)
-+ action = self._container._add_action(action)
-+ self._group_actions.append(action)
-+ return action
-+
-+ def _remove_action(self, action):
-+ self._container._remove_action(action)
-+ self._group_actions.remove(action)
-+
-+
-+class ArgumentParser(_AttributeHolder, _ActionsContainer):
-+ """Object for parsing command line strings into Python objects.
-+
-+ Keyword Arguments:
-+ - prog -- The name of the program (default: sys.argv[0])
-+ - usage -- A usage message (default: auto-generated from arguments)
-+ - description -- A description of what the program does
-+ - epilog -- Text following the argument descriptions
-+ - parents -- Parsers whose arguments should be copied into this one
-+ - formatter_class -- HelpFormatter class for printing help messages
-+ - prefix_chars -- Characters that prefix optional arguments
-+ - fromfile_prefix_chars -- Characters that prefix files containing
-+ additional arguments
-+ - argument_default -- The default value for all arguments
-+ - conflict_handler -- String indicating how to handle conflicts
-+ - add_help -- Add a -h/-help option
-+ """
-+
-+ def __init__(self,
-+ prog=None,
-+ usage=None,
-+ description=None,
-+ epilog=None,
-+ version=None,
-+ parents=[],
-+ formatter_class=HelpFormatter,
-+ prefix_chars='-',
-+ fromfile_prefix_chars=None,
-+ argument_default=None,
-+ conflict_handler='error',
-+ add_help=True):
-+
-+ if version is not None:
-+ import warnings
-+ warnings.warn(
-+ """The "version" argument to ArgumentParser is deprecated. """
-+ """Please use """
-+ """"add_argument(..., action='version', version="N", ...)" """
-+ """instead""", DeprecationWarning)
-+
-+ superinit = super(ArgumentParser, self).__init__
-+ superinit(description=description,
-+ prefix_chars=prefix_chars,
-+ argument_default=argument_default,
-+ conflict_handler=conflict_handler)
-+
-+ # default setting for prog
-+ if prog is None:
-+ prog = _os.path.basename(_sys.argv[0])
-+
-+ self.prog = prog
-+ self.usage = usage
-+ self.epilog = epilog
-+ self.version = version
-+ self.formatter_class = formatter_class
-+ self.fromfile_prefix_chars = fromfile_prefix_chars
-+ self.add_help = add_help
-+
-+ add_group = self.add_argument_group
-+ self._positionals = add_group(_('positional arguments'))
-+ self._optionals = add_group(_('optional arguments'))
-+ self._subparsers = None
-+
-+ # register types
-+ def identity(string):
-+ return string
-+ self.register('type', None, identity)
-+
-+ # add help and version arguments if necessary
-+ # (using explicit default to override global argument_default)
-+ if '-' in prefix_chars:
-+ default_prefix = '-'
-+ else:
-+ default_prefix = prefix_chars[0]
-+ if self.add_help:
-+ self.add_argument(
-+ default_prefix+'h', default_prefix*2+'help',
-+ action='help', default=SUPPRESS,
-+ help=_('show this help message and exit'))
-+ if self.version:
-+ self.add_argument(
-+ default_prefix+'v', default_prefix*2+'version',
-+ action='version', default=SUPPRESS,
-+ version=self.version,
-+ help=_("show program's version number and exit"))
-+
-+ # add parent arguments and defaults
-+ for parent in parents:
-+ self._add_container_actions(parent)
-+ try:
-+ defaults = parent._defaults
-+ except AttributeError:
-+ pass
-+ else:
-+ self._defaults.update(defaults)
-+
-+ # =======================
-+ # Pretty __repr__ methods
-+ # =======================
-+ def _get_kwargs(self):
-+ names = [
-+ 'prog',
-+ 'usage',
-+ 'description',
-+ 'version',
-+ 'formatter_class',
-+ 'conflict_handler',
-+ 'add_help',
-+ ]
-+ return [(name, getattr(self, name)) for name in names]
-+
-+ # ==================================
-+ # Optional/Positional adding methods
-+ # ==================================
-+ def add_subparsers(self, **kwargs):
-+ if self._subparsers is not None:
-+ self.error(_('cannot have multiple subparser arguments'))
-+
-+ # add the parser class to the arguments if it's not present
-+ kwargs.setdefault('parser_class', type(self))
-+
-+ if 'title' in kwargs or 'description' in kwargs:
-+ title = _(kwargs.pop('title', 'subcommands'))
-+ description = _(kwargs.pop('description', None))
-+ self._subparsers = self.add_argument_group(title, description)
-+ else:
-+ self._subparsers = self._positionals
-+
-+ # prog defaults to the usage message of this parser, skipping
-+ # optional arguments and with no "usage:" prefix
-+ if kwargs.get('prog') is None:
-+ formatter = self._get_formatter()
-+ positionals = self._get_positional_actions()
-+ groups = self._mutually_exclusive_groups
-+ formatter.add_usage(self.usage, positionals, groups, '')
-+ kwargs['prog'] = formatter.format_help().strip()
-+
-+ # create the parsers action and add it to the positionals list
-+ parsers_class = self._pop_action_class(kwargs, 'parsers')
-+ action = parsers_class(option_strings=[], **kwargs)
-+ self._subparsers._add_action(action)
-+
-+ # return the created parsers action
-+ return action
-+
-+ def _add_action(self, action):
-+ if action.option_strings:
-+ self._optionals._add_action(action)
-+ else:
-+ self._positionals._add_action(action)
-+ return action
-+
-+ def _get_optional_actions(self):
-+ return [action
-+ for action in self._actions
-+ if action.option_strings]
-+
-+ def _get_positional_actions(self):
-+ return [action
-+ for action in self._actions
-+ if not action.option_strings]
-+
-+ # =====================================
-+ # Command line argument parsing methods
-+ # =====================================
-+ def parse_args(self, args=None, namespace=None):
-+ args, argv = self.parse_known_args(args, namespace)
-+ if argv:
-+ msg = _('unrecognized arguments: %s')
-+ self.error(msg % ' '.join(argv))
-+ return args
-+
-+ def parse_known_args(self, args=None, namespace=None):
-+ # args default to the system args
-+ if args is None:
-+ args = _sys.argv[1:]
-+
-+ # default Namespace built from parser defaults
-+ if namespace is None:
-+ namespace = Namespace()
-+
-+ # add any action defaults that aren't present
-+ for action in self._actions:
-+ if action.dest is not SUPPRESS:
-+ if not hasattr(namespace, action.dest):
-+ if action.default is not SUPPRESS:
-+ default = action.default
-+ if isinstance(action.default, basestring):
-+ default = self._get_value(action, default)
-+ setattr(namespace, action.dest, default)
-+
-+ # add any parser defaults that aren't present
-+ for dest in self._defaults:
-+ if not hasattr(namespace, dest):
-+ setattr(namespace, dest, self._defaults[dest])
-+
-+ # parse the arguments and exit if there are any errors
-+ try:
-+ namespace, args = self._parse_known_args(args, namespace)
-+ if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
-+ args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
-+ delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
-+ return namespace, args
-+ except ArgumentError:
-+ err = _sys.exc_info()[1]
-+ self.error(str(err))
-+
-+ def _parse_known_args(self, arg_strings, namespace):
-+ # replace arg strings that are file references
-+ if self.fromfile_prefix_chars is not None:
-+ arg_strings = self._read_args_from_files(arg_strings)
-+
-+ # map all mutually exclusive arguments to the other arguments
-+ # they can't occur with
-+ action_conflicts = {}
-+ for mutex_group in self._mutually_exclusive_groups:
-+ group_actions = mutex_group._group_actions
-+ for i, mutex_action in enumerate(mutex_group._group_actions):
-+ conflicts = action_conflicts.setdefault(mutex_action, [])
-+ conflicts.extend(group_actions[:i])
-+ conflicts.extend(group_actions[i + 1:])
-+
-+ # find all option indices, and determine the arg_string_pattern
-+ # which has an 'O' if there is an option at an index,
-+ # an 'A' if there is an argument, or a '-' if there is a '--'
-+ option_string_indices = {}
-+ arg_string_pattern_parts = []
-+ arg_strings_iter = iter(arg_strings)
-+ for i, arg_string in enumerate(arg_strings_iter):
-+
-+ # all args after -- are non-options
-+ if arg_string == '--':
-+ arg_string_pattern_parts.append('-')
-+ for arg_string in arg_strings_iter:
-+ arg_string_pattern_parts.append('A')
-+
-+ # otherwise, add the arg to the arg strings
-+ # and note the index if it was an option
-+ else:
-+ option_tuple = self._parse_optional(arg_string)
-+ if option_tuple is None:
-+ pattern = 'A'
-+ else:
-+ option_string_indices[i] = option_tuple
-+ pattern = 'O'
-+ arg_string_pattern_parts.append(pattern)
-+
-+ # join the pieces together to form the pattern
-+ arg_strings_pattern = ''.join(arg_string_pattern_parts)
-+
-+ # converts arg strings to the appropriate and then takes the action
-+ seen_actions = set()
-+ seen_non_default_actions = set()
-+
-+ def take_action(action, argument_strings, option_string=None):
-+ seen_actions.add(action)
-+ argument_values = self._get_values(action, argument_strings)
-+
-+ # error if this argument is not allowed with other previously
-+ # seen arguments, assuming that actions that use the default
-+ # value don't really count as "present"
-+ if argument_values is not action.default:
-+ seen_non_default_actions.add(action)
-+ for conflict_action in action_conflicts.get(action, []):
-+ if conflict_action in seen_non_default_actions:
-+ msg = _('not allowed with argument %s')
-+ action_name = _get_action_name(conflict_action)
-+ raise ArgumentError(action, msg % action_name)
-+
-+ # take the action if we didn't receive a SUPPRESS value
-+ # (e.g. from a default)
-+ if argument_values is not SUPPRESS:
-+ action(self, namespace, argument_values, option_string)
-+
-+ # function to convert arg_strings into an optional action
-+ def consume_optional(start_index):
-+
-+ # get the optional identified at this index
-+ option_tuple = option_string_indices[start_index]
-+ action, option_string, explicit_arg = option_tuple
-+
-+ # identify additional optionals in the same arg string
-+ # (e.g. -xyz is the same as -x -y -z if no args are required)
-+ match_argument = self._match_argument
-+ action_tuples = []
-+ while True:
-+
-+ # if we found no optional action, skip it
-+ if action is None:
-+ extras.append(arg_strings[start_index])
-+ return start_index + 1
-+
-+ # if there is an explicit argument, try to match the
-+ # optional's string arguments to only this
-+ if explicit_arg is not None:
-+ arg_count = match_argument(action, 'A')
-+
-+ # if the action is a single-dash option and takes no
-+ # arguments, try to parse more single-dash options out
-+ # of the tail of the option string
-+ chars = self.prefix_chars
-+ if arg_count == 0 and option_string[1] not in chars:
-+ action_tuples.append((action, [], option_string))
-+ char = option_string[0]
-+ option_string = char + explicit_arg[0]
-+ new_explicit_arg = explicit_arg[1:] or None
-+ optionals_map = self._option_string_actions
-+ if option_string in optionals_map:
-+ action = optionals_map[option_string]
-+ explicit_arg = new_explicit_arg
-+ else:
-+ msg = _('ignored explicit argument %r')
-+ raise ArgumentError(action, msg % explicit_arg)
-+
-+ # if the action expect exactly one argument, we've
-+ # successfully matched the option; exit the loop
-+ elif arg_count == 1:
-+ stop = start_index + 1
-+ args = [explicit_arg]
-+ action_tuples.append((action, args, option_string))
-+ break
-+
-+ # error if a double-dash option did not use the
-+ # explicit argument
-+ else:
-+ msg = _('ignored explicit argument %r')
-+ raise ArgumentError(action, msg % explicit_arg)
-+
-+ # if there is no explicit argument, try to match the
-+ # optional's string arguments with the following strings
-+ # if successful, exit the loop
-+ else:
-+ start = start_index + 1
-+ selected_patterns = arg_strings_pattern[start:]
-+ arg_count = match_argument(action, selected_patterns)
-+ stop = start + arg_count
-+ args = arg_strings[start:stop]
-+ action_tuples.append((action, args, option_string))
-+ break
-+
-+ # add the Optional to the list and return the index at which
-+ # the Optional's string args stopped
-+ assert action_tuples
-+ for action, args, option_string in action_tuples:
-+ take_action(action, args, option_string)
-+ return stop
-+
-+ # the list of Positionals left to be parsed; this is modified
-+ # by consume_positionals()
-+ positionals = self._get_positional_actions()
-+
-+ # function to convert arg_strings into positional actions
-+ def consume_positionals(start_index):
-+ # match as many Positionals as possible
-+ match_partial = self._match_arguments_partial
-+ selected_pattern = arg_strings_pattern[start_index:]
-+ arg_counts = match_partial(positionals, selected_pattern)
-+
-+ # slice off the appropriate arg strings for each Positional
-+ # and add the Positional and its args to the list
-+ for action, arg_count in zip(positionals, arg_counts):
-+ args = arg_strings[start_index: start_index + arg_count]
-+ start_index += arg_count
-+ take_action(action, args)
-+
-+ # slice off the Positionals that we just parsed and return the
-+ # index at which the Positionals' string args stopped
-+ positionals[:] = positionals[len(arg_counts):]
-+ return start_index
-+
-+ # consume Positionals and Optionals alternately, until we have
-+ # passed the last option string
-+ extras = []
-+ start_index = 0
-+ if option_string_indices:
-+ max_option_string_index = max(option_string_indices)
-+ else:
-+ max_option_string_index = -1
-+ while start_index <= max_option_string_index:
-+
-+ # consume any Positionals preceding the next option
-+ next_option_string_index = min([
-+ index
-+ for index in option_string_indices
-+ if index >= start_index])
-+ if start_index != next_option_string_index:
-+ positionals_end_index = consume_positionals(start_index)
-+
-+ # only try to parse the next optional if we didn't consume
-+ # the option string during the positionals parsing
-+ if positionals_end_index > start_index:
-+ start_index = positionals_end_index
-+ continue
-+ else:
-+ start_index = positionals_end_index
-+
-+ # if we consumed all the positionals we could and we're not
-+ # at the index of an option string, there were extra arguments
-+ if start_index not in option_string_indices:
-+ strings = arg_strings[start_index:next_option_string_index]
-+ extras.extend(strings)
-+ start_index = next_option_string_index
-+
-+ # consume the next optional and any arguments for it
-+ start_index = consume_optional(start_index)
-+
-+ # consume any positionals following the last Optional
-+ stop_index = consume_positionals(start_index)
-+
-+ # if we didn't consume all the argument strings, there were extras
-+ extras.extend(arg_strings[stop_index:])
-+
-+ # if we didn't use all the Positional objects, there were too few
-+ # arg strings supplied.
-+ if positionals:
-+ self.error(_('too few arguments'))
-+
-+ # make sure all required actions were present
-+ for action in self._actions:
-+ if action.required:
-+ if action not in seen_actions:
-+ name = _get_action_name(action)
-+ self.error(_('argument %s is required') % name)
-+
-+ # make sure all required groups had one option present
-+ for group in self._mutually_exclusive_groups:
-+ if group.required:
-+ for action in group._group_actions:
-+ if action in seen_non_default_actions:
-+ break
-+
-+ # if no actions were used, report the error
-+ else:
-+ names = [_get_action_name(action)
-+ for action in group._group_actions
-+ if action.help is not SUPPRESS]
-+ msg = _('one of the arguments %s is required')
-+ self.error(msg % ' '.join(names))
-+
-+ # return the updated namespace and the extra arguments
-+ return namespace, extras
-+
-+ def _read_args_from_files(self, arg_strings):
-+ # expand arguments referencing files
-+ new_arg_strings = []
-+ for arg_string in arg_strings:
-+
-+ # for regular arguments, just add them back into the list
-+ if arg_string[0] not in self.fromfile_prefix_chars:
-+ new_arg_strings.append(arg_string)
-+
-+ # replace arguments referencing files with the file content
-+ else:
-+ try:
-+ args_file = open(arg_string[1:])
-+ try:
-+ arg_strings = []
-+ for arg_line in args_file.read().splitlines():
-+ for arg in self.convert_arg_line_to_args(arg_line):
-+ arg_strings.append(arg)
-+ arg_strings = self._read_args_from_files(arg_strings)
-+ new_arg_strings.extend(arg_strings)
-+ finally:
-+ args_file.close()
-+ except IOError:
-+ err = _sys.exc_info()[1]
-+ self.error(str(err))
-+
-+ # return the modified argument list
-+ return new_arg_strings
-+
-+ def convert_arg_line_to_args(self, arg_line):
-+ return [arg_line]
-+
-+ def _match_argument(self, action, arg_strings_pattern):
-+ # match the pattern for this action to the arg strings
-+ nargs_pattern = self._get_nargs_pattern(action)
-+ match = _re.match(nargs_pattern, arg_strings_pattern)
-+
-+ # raise an exception if we weren't able to find a match
-+ if match is None:
-+ nargs_errors = {
-+ None: _('expected one argument'),
-+ OPTIONAL: _('expected at most one argument'),
-+ ONE_OR_MORE: _('expected at least one argument'),
-+ }
-+ default = _('expected %s argument(s)') % action.nargs
-+ msg = nargs_errors.get(action.nargs, default)
-+ raise ArgumentError(action, msg)
-+
-+ # return the number of arguments matched
-+ return len(match.group(1))
-+
-+ def _match_arguments_partial(self, actions, arg_strings_pattern):
-+ # progressively shorten the actions list by slicing off the
-+ # final actions until we find a match
-+ result = []
-+ for i in range(len(actions), 0, -1):
-+ actions_slice = actions[:i]
-+ pattern = ''.join([self._get_nargs_pattern(action)
-+ for action in actions_slice])
-+ match = _re.match(pattern, arg_strings_pattern)
-+ if match is not None:
-+ result.extend([len(string) for string in match.groups()])
-+ break
-+
-+ # return the list of arg string counts
-+ return result
-+
-+ def _parse_optional(self, arg_string):
-+ # if it's an empty string, it was meant to be a positional
-+ if not arg_string:
-+ return None
-+
-+ # if it doesn't start with a prefix, it was meant to be positional
-+ if not arg_string[0] in self.prefix_chars:
-+ return None
-+
-+ # if the option string is present in the parser, return the action
-+ if arg_string in self._option_string_actions:
-+ action = self._option_string_actions[arg_string]
-+ return action, arg_string, None
-+
-+ # if it's just a single character, it was meant to be positional
-+ if len(arg_string) == 1:
-+ return None
-+
-+ # if the option string before the "=" is present, return the action
-+ if '=' in arg_string:
-+ option_string, explicit_arg = arg_string.split('=', 1)
-+ if option_string in self._option_string_actions:
-+ action = self._option_string_actions[option_string]
-+ return action, option_string, explicit_arg
-+
-+ # search through all possible prefixes of the option string
-+ # and all actions in the parser for possible interpretations
-+ option_tuples = self._get_option_tuples(arg_string)
-+
-+ # if multiple actions match, the option string was ambiguous
-+ if len(option_tuples) > 1:
-+ options = ', '.join([option_string
-+ for action, option_string, explicit_arg in option_tuples])
-+ tup = arg_string, options
-+ self.error(_('ambiguous option: %s could match %s') % tup)
-+
-+ # if exactly one action matched, this segmentation is good,
-+ # so return the parsed action
-+ elif len(option_tuples) == 1:
-+ option_tuple, = option_tuples
-+ return option_tuple
-+
-+ # if it was not found as an option, but it looks like a negative
-+ # number, it was meant to be positional
-+ # unless there are negative-number-like options
-+ if self._negative_number_matcher.match(arg_string):
-+ if not self._has_negative_number_optionals:
-+ return None
-+
-+ # if it contains a space, it was meant to be a positional
-+ if ' ' in arg_string:
-+ return None
-+
-+ # it was meant to be an optional but there is no such option
-+ # in this parser (though it might be a valid option in a subparser)
-+ return None, arg_string, None
-+
-+ def _get_option_tuples(self, option_string):
-+ result = []
-+
-+ # option strings starting with two prefix characters are only
-+ # split at the '='
-+ chars = self.prefix_chars
-+ if option_string[0] in chars and option_string[1] in chars:
-+ if '=' in option_string:
-+ option_prefix, explicit_arg = option_string.split('=', 1)
-+ else:
-+ option_prefix = option_string
-+ explicit_arg = None
-+ for option_string in self._option_string_actions:
-+ if option_string.startswith(option_prefix):
-+ action = self._option_string_actions[option_string]
-+ tup = action, option_string, explicit_arg
-+ result.append(tup)
-+
-+ # single character options can be concatenated with their arguments
-+ # but multiple character options always have to have their argument
-+ # separate
-+ elif option_string[0] in chars and option_string[1] not in chars:
-+ option_prefix = option_string
-+ explicit_arg = None
-+ short_option_prefix = option_string[:2]
-+ short_explicit_arg = option_string[2:]
-+
-+ for option_string in self._option_string_actions:
-+ if option_string == short_option_prefix:
-+ action = self._option_string_actions[option_string]
-+ tup = action, option_string, short_explicit_arg
-+ result.append(tup)
-+ elif option_string.startswith(option_prefix):
-+ action = self._option_string_actions[option_string]
-+ tup = action, option_string, explicit_arg
-+ result.append(tup)
-+
-+ # shouldn't ever get here
-+ else:
-+ self.error(_('unexpected option string: %s') % option_string)
-+
-+ # return the collected option tuples
-+ return result
-+
-+ def _get_nargs_pattern(self, action):
-+ # in all examples below, we have to allow for '--' args
-+ # which are represented as '-' in the pattern
-+ nargs = action.nargs
-+
-+ # the default (None) is assumed to be a single argument
-+ if nargs is None:
-+ nargs_pattern = '(-*A-*)'
-+
-+ # allow zero or one arguments
-+ elif nargs == OPTIONAL:
-+ nargs_pattern = '(-*A?-*)'
-+
-+ # allow zero or more arguments
-+ elif nargs == ZERO_OR_MORE:
-+ nargs_pattern = '(-*[A-]*)'
-+
-+ # allow one or more arguments
-+ elif nargs == ONE_OR_MORE:
-+ nargs_pattern = '(-*A[A-]*)'
-+
-+ # allow any number of options or arguments
-+ elif nargs == REMAINDER:
-+ nargs_pattern = '([-AO]*)'
-+
-+ # allow one argument followed by any number of options or arguments
-+ elif nargs == PARSER:
-+ nargs_pattern = '(-*A[-AO]*)'
-+
-+ # all others should be integers
-+ else:
-+ nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
-+
-+ # if this is an optional action, -- is not allowed
-+ if action.option_strings:
-+ nargs_pattern = nargs_pattern.replace('-*', '')
-+ nargs_pattern = nargs_pattern.replace('-', '')
-+
-+ # return the pattern
-+ return nargs_pattern
-+
-+ # ========================
-+ # Value conversion methods
-+ # ========================
-+ def _get_values(self, action, arg_strings):
-+ # for everything but PARSER args, strip out '--'
-+ if action.nargs not in [PARSER, REMAINDER]:
-+ arg_strings = [s for s in arg_strings if s != '--']
-+
-+ # optional argument produces a default when not present
-+ if not arg_strings and action.nargs == OPTIONAL:
-+ if action.option_strings:
-+ value = action.const
-+ else:
-+ value = action.default
-+ if isinstance(value, basestring):
-+ value = self._get_value(action, value)
-+ self._check_value(action, value)
-+
-+ # when nargs='*' on a positional, if there were no command-line
-+ # args, use the default if it is anything other than None
-+ elif (not arg_strings and action.nargs == ZERO_OR_MORE and
-+ not action.option_strings):
-+ if action.default is not None:
-+ value = action.default
-+ else:
-+ value = arg_strings
-+ self._check_value(action, value)
-+
-+ # single argument or optional argument produces a single value
-+ elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
-+ arg_string, = arg_strings
-+ value = self._get_value(action, arg_string)
-+ self._check_value(action, value)
-+
-+ # REMAINDER arguments convert all values, checking none
-+ elif action.nargs == REMAINDER:
-+ value = [self._get_value(action, v) for v in arg_strings]
-+
-+ # PARSER arguments convert all values, but check only the first
-+ elif action.nargs == PARSER:
-+ value = [self._get_value(action, v) for v in arg_strings]
-+ self._check_value(action, value[0])
-+
-+ # all other types of nargs produce a list
-+ else:
-+ value = [self._get_value(action, v) for v in arg_strings]
-+ for v in value:
-+ self._check_value(action, v)
-+
-+ # return the converted value
-+ return value
-+
-+ def _get_value(self, action, arg_string):
-+ type_func = self._registry_get('type', action.type, action.type)
-+ if not _callable(type_func):
-+ msg = _('%r is not callable')
-+ raise ArgumentError(action, msg % type_func)
-+
-+ # convert the value to the appropriate type
-+ try:
-+ result = type_func(arg_string)
-+
-+ # ArgumentTypeErrors indicate errors
-+ except ArgumentTypeError:
-+ name = getattr(action.type, '__name__', repr(action.type))
-+ msg = str(_sys.exc_info()[1])
-+ raise ArgumentError(action, msg)
-+
-+ # TypeErrors or ValueErrors also indicate errors
-+ except (TypeError, ValueError):
-+ name = getattr(action.type, '__name__', repr(action.type))
-+ msg = _('invalid %s value: %r')
-+ raise ArgumentError(action, msg % (name, arg_string))
-+
-+ # return the converted value
-+ return result
-+
-+ def _check_value(self, action, value):
-+ # converted value must be one of the choices (if specified)
-+ if action.choices is not None and value not in action.choices:
-+ tup = value, ', '.join(map(repr, action.choices))
-+ msg = _('invalid choice: %r (choose from %s)') % tup
-+ raise ArgumentError(action, msg)
-+
-+ # =======================
-+ # Help-formatting methods
-+ # =======================
-+ def format_usage(self):
-+ formatter = self._get_formatter()
-+ formatter.add_usage(self.usage, self._actions,
-+ self._mutually_exclusive_groups)
-+ return formatter.format_help()
-+
-+ def format_help(self):
-+ formatter = self._get_formatter()
-+
-+ # usage
-+ formatter.add_usage(self.usage, self._actions,
-+ self._mutually_exclusive_groups)
-+
-+ # description
-+ formatter.add_text(self.description)
-+
-+ # positionals, optionals and user-defined groups
-+ for action_group in self._action_groups:
-+ formatter.start_section(action_group.title)
-+ formatter.add_text(action_group.description)
-+ formatter.add_arguments(action_group._group_actions)
-+ formatter.end_section()
-+
-+ # epilog
-+ formatter.add_text(self.epilog)
-+
-+ # determine help from format above
-+ return formatter.format_help()
-+
-+ def format_version(self):
-+ import warnings
-+ warnings.warn(
-+ 'The format_version method is deprecated -- the "version" '
-+ 'argument to ArgumentParser is no longer supported.',
-+ DeprecationWarning)
-+ formatter = self._get_formatter()
-+ formatter.add_text(self.version)
-+ return formatter.format_help()
-+
-+ def _get_formatter(self):
-+ return self.formatter_class(prog=self.prog)
-+
-+ # =====================
-+ # Help-printing methods
-+ # =====================
-+ def print_usage(self, file=None):
-+ if file is None:
-+ file = _sys.stdout
-+ self._print_message(self.format_usage(), file)
-+
-+ def print_help(self, file=None):
-+ if file is None:
-+ file = _sys.stdout
-+ self._print_message(self.format_help(), file)
-+
-+ def print_version(self, file=None):
-+ import warnings
-+ warnings.warn(
-+ 'The print_version method is deprecated -- the "version" '
-+ 'argument to ArgumentParser is no longer supported.',
-+ DeprecationWarning)
-+ self._print_message(self.format_version(), file)
-+
-+ def _print_message(self, message, file=None):
-+ if message:
-+ if file is None:
-+ file = _sys.stderr
-+ file.write(message)
-+
-+ # ===============
-+ # Exiting methods
-+ # ===============
-+ def exit(self, status=0, message=None):
-+ if message:
-+ self._print_message(message, _sys.stderr)
-+ _sys.exit(status)
-+
-+ def error(self, message):
-+ """error(message: string)
-+
-+ Prints a usage message incorporating the message to stderr and
-+ exits.
-+
-+ If you override this in a subclass, it should not return -- it
-+ should either exit or raise an exception.
-+ """
-+ self.print_usage(_sys.stderr)
-+ self.exit(2, _('%s: error: %s\n') % (self.prog, message))
+ diff -up mozilla-esr24/rebase/ordereddict.py.python mozilla-esr24/rebase/ordereddict.py
---- mozilla-esr24/rebase/ordereddict.py.python 2013-10-22 16:49:25.033378278 +0200
-+++ mozilla-esr24/rebase/ordereddict.py 2013-10-22 14:29:24.000000000 +0200
++--- mozilla-esr24/rebase/ordereddict.py.python 2013-10-22 15:49:15.000000000 +0200
+++++ mozilla-esr24/rebase/ordereddict.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -0,0 +1,127 @@
+ +# Copyright (c) 2009 Raymond Hettinger
+ +#
+ +# Permission is hereby granted, free of charge, to any person
+ +# obtaining a copy of this software and associated documentation files
+ +# (the "Software"), to deal in the Software without restriction,
+ +# including without limitation the rights to use, copy, modify, merge,
+ +# publish, distribute, sublicense, and/or sell copies of the Software,
+ +# and to permit persons to whom the Software is furnished to do so,
+ +# subject to the following conditions:
+ +#
+ +# The above copyright notice and this permission notice shall be
+ +# included in all copies or substantial portions of the Software.
+ +#
+ +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ +# OTHER DEALINGS IN THE SOFTWARE.
+ +
+ +from UserDict import DictMixin
+ +
+ +class OrderedDict(dict, DictMixin):
+ +
+ + def __init__(self, *args, **kwds):
+ + if len(args) > 1:
+ + raise TypeError('expected at most 1 arguments, got %d' % len(args))
+ + try:
+ + self.__end
+ + except AttributeError:
+ + self.clear()
+ + self.update(*args, **kwds)
+ +
+ + def clear(self):
+ + self.__end = end = []
+ + end += [None, end, end] # sentinel node for doubly linked list
+ + self.__map = {} # key --> [key, prev, next]
+ + dict.clear(self)
+ +
+ + def __setitem__(self, key, value):
+ + if key not in self:
+ + end = self.__end
+ + curr = end[1]
+ + curr[2] = end[1] = self.__map[key] = [key, curr, end]
+ + dict.__setitem__(self, key, value)
+ +
+ + def __delitem__(self, key):
+ + dict.__delitem__(self, key)
+ + key, prev, next = self.__map.pop(key)
+ + prev[2] = next
+ + next[1] = prev
+ +
+ + def __iter__(self):
+ + end = self.__end
+ + curr = end[2]
+ + while curr is not end:
+ + yield curr[0]
+ + curr = curr[2]
+ +
+ + def __reversed__(self):
+ + end = self.__end
+ + curr = end[1]
+ + while curr is not end:
+ + yield curr[0]
+ + curr = curr[1]
+ +
+ + def popitem(self, last=True):
+ + if not self:
+ + raise KeyError('dictionary is empty')
+ + if last:
+ + key = reversed(self).next()
+ + else:
+ + key = iter(self).next()
+ + value = self.pop(key)
+ + return key, value
+ +
+ + def __reduce__(self):
+ + items = [[k, self[k]] for k in self]
+ + tmp = self.__map, self.__end
+ + del self.__map, self.__end
+ + inst_dict = vars(self).copy()
+ + self.__map, self.__end = tmp
+ + if inst_dict:
+ + return (self.__class__, (items,), inst_dict)
+ + return self.__class__, (items,)
+ +
+ + def keys(self):
+ + return list(self)
+ +
+ + setdefault = DictMixin.setdefault
+ + update = DictMixin.update
+ + pop = DictMixin.pop
+ + values = DictMixin.values
+ + items = DictMixin.items
+ + iterkeys = DictMixin.iterkeys
+ + itervalues = DictMixin.itervalues
+ + iteritems = DictMixin.iteritems
+ +
+ + def __repr__(self):
+ + if not self:
+ + return '%s()' % (self.__class__.__name__,)
+ + return '%s(%r)' % (self.__class__.__name__, self.items())
+ +
+ + def copy(self):
+ + return self.__class__(self)
+ +
+ + @classmethod
+ + def fromkeys(cls, iterable, value=None):
+ + d = cls()
+ + for key in iterable:
+ + d[key] = value
+ + return d
+ +
+ + def __eq__(self, other):
+ + if isinstance(other, OrderedDict):
+ + if len(self) != len(other):
+ + return False
+ + for p, q in zip(self.items(), other.items()):
+ + if p != q:
+ + return False
+ + return True
+ + return dict.__eq__(self, other)
+ +
+ + def __ne__(self, other):
+ + return not self == other
-diff -up mozilla-esr24/toolkit/components/telemetry/histogram_tools.py.python mozilla-esr24/toolkit/components/telemetry/histogram_tools.py
---- mozilla-esr24/toolkit/components/telemetry/histogram_tools.py.python 2013-09-11 05:22:53.000000000 +0200
-+++ mozilla-esr24/toolkit/components/telemetry/histogram_tools.py 2013-10-22 14:29:24.564993891 +0200
-@@ -5,13 +5,8 @@
- import math
-
- # For compatibility with Python 2.6
--try:
-- from collections import OrderedDict
--except ImportError:
-- from simplejson import OrderedDict
-- import simplejson as json
--else:
-- import json
-+from simplejson import OrderedDict
-+import simplejson as json
-
- def table_dispatch(kind, table, body):
- """Call body with table[kind] if it exists. Raise an error otherwise."""
+ diff -up mozilla-esr24/toolkit/mozapps/installer/find-dupes.py.python mozilla-esr24/toolkit/mozapps/installer/find-dupes.py
+ --- mozilla-esr24/toolkit/mozapps/installer/find-dupes.py.python 2013-09-11 05:22:55.000000000 +0200
-+++ mozilla-esr24/toolkit/mozapps/installer/find-dupes.py 2013-10-22 14:29:24.564993891 +0200
+++++ mozilla-esr24/toolkit/mozapps/installer/find-dupes.py 2013-10-22 15:49:15.000000000 +0200
+ @@ -5,7 +5,7 @@
import sys
- import os
- import expandlibs_config as conf
- @@ -39,9 +38,11 @@ if __name__ == '__main__':
- raise Exception("Missing option: -o")
+ import hashlib
+ from mozpack.packager.unpack import UnpackFinder
+ -from collections import OrderedDict
+ +from ordereddict import OrderedDict
- ensureParentDir(options.output)
- - with open(options.output, 'w') as outfile:
- - print >>outfile, generate(args)
- + outfile = open(options.output, 'w')
- + print >>outfile, generate(args)
- + outfile.close()
- if options.depend:
- ensureParentDir(options.depend)
- - with open(options.depend, 'w') as depfile:
- - depfile.write("%s : %s\n" % (options.output, ' '.join(ExpandLibsDeps(args))))
- + depfile = open(options.depend, 'w')
- + depfile.write("%s : %s\n" % (options.output, ' '.join(ExpandLibsDeps(args))))
- + depfile.close()
- diff -up comm-esr17/mozilla/js/src/config/expandlibs.py.python comm-esr17/mozilla/js/src/config/expandlibs.py
- --- comm-esr17/mozilla/js/src/config/expandlibs.py.python 2012-11-16 22:41:35.000000000 +0100
- +++ comm-esr17/mozilla/js/src/config/expandlibs.py 2012-11-19 13:20:39.000000000 +0100
- @@ -26,7 +26,6 @@ ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} follo
- descriptor contains. And for each of these LIBS, also apply the same
- rules.
'''
- -from __future__ import with_statement
- import sys, os, errno
- import expandlibs_config as conf
-
- @@ -75,15 +74,15 @@ class LibDescriptor(dict):
- '''Creates an instance of a lib descriptor, initialized with contents
- from a list of strings when given. This is intended for use with
- file.readlines()'''
- - if isinstance(content, list) and all([isinstance(item, str) for item in content]):
- - pass
- - elif content is not None:
- - raise TypeError("LibDescriptor() arg 1 must be None or a list of strings")
- super(LibDescriptor, self).__init__()
- for key in self.KEYS:
- self[key] = []
- - if not content:
- + if content == None:
- return
- + if isinstance(content, list):
- + for item in content:
- + if not isinstance(item, str):
- + raise TypeError("LibDescriptor() arg 1 must be None or a list of strings")
- for key, value in [(s.strip() for s in item.split('=', 2)) for item in content if item.find('=') >= 0]:
- if key in self.KEYS:
- self[key] = value.split()
- @@ -118,8 +117,9 @@ class ExpandArgs(list):
- def _expand_desc(self, arg):
- '''Internal function taking care of lib descriptor expansion only'''
- if os.path.exists(arg + conf.LIBS_DESC_SUFFIX):
- - with open(arg + conf.LIBS_DESC_SUFFIX, 'r') as f:
- - desc = LibDescriptor(f.readlines())
- + f = open(arg + conf.LIBS_DESC_SUFFIX, 'r')
- + desc = LibDescriptor(f.readlines())
- + f.close()
- objs = [relativize(o) for o in desc['OBJS']]
- for lib in desc['LIBS']:
- objs += self._expand(lib)
- diff -up comm-esr17/mozilla/js/src/configure.python comm-esr17/mozilla/js/src/configure
- --- comm-esr17/mozilla/js/src/configure.python 2012-11-16 22:42:38.000000000 +0100
- +++ comm-esr17/mozilla/js/src/configure 2012-11-19 13:20:39.000000000 +0100
- @@ -934,7 +934,7 @@ _SUBDIR_CONFIG_ARGS="$ac_configure_args"
- NSPR_VERSION=4
-
- PERL_VERSION=5.006
- -PYTHON_VERSION=2.5
- +PYTHON_VERSION=2.4
- WINDRES_VERSION=2.14.90
- W32API_VERSION=3.14
-
- diff -up comm-esr17/mozilla/js/xpconnect/src/codegen.py.python comm-esr17/mozilla/js/xpconnect/src/codegen.py
- --- comm-esr17/mozilla/js/xpconnect/src/codegen.py.python 2012-11-16 22:41:39.000000000 +0100
- +++ comm-esr17/mozilla/js/xpconnect/src/codegen.py 2012-11-19 13:20:39.000000000 +0100
- @@ -482,8 +482,11 @@ def writeStub(f, customMethodCalls, memb
- argumentValues = (customMethodCall['additionalArgumentValues']
- % header.methodNativeName(member))
- if isAttr:
- + strict_str = ""
- + if isSetter:
- + strict_str = ", strict"
- callTemplate += (" return %s(cx, obj, id%s, %s, vp_);\n"
- - % (templateName, ", strict" if isSetter else "", argumentValues))
- + % (templateName, strict_str, argumentValues))
- else:
- callTemplate += (" return %s(cx, argc, %s, vp);\n"
- % (templateName, argumentValues))
- diff -up comm-esr17/mozilla/js/xpconnect/src/dombindingsgen.py.python comm-esr17/mozilla/js/xpconnect/src/dombindingsgen.py
- --- comm-esr17/mozilla/js/xpconnect/src/dombindingsgen.py.python 2012-11-16 22:41:39.000000000 +0100
- +++ comm-esr17/mozilla/js/xpconnect/src/dombindingsgen.py 2012-11-19 13:20:39.000000000 +0100
- @@ -159,7 +159,10 @@ class DOMClass(UserDict.DictMixin):
-
- def ops(getterType, setterType):
- def opType(type):
- - return type + (" " if type.endswith('>') else "")
- + if type.endswith('>'):
- + return type + " "
- + else:
- + return type
-
- if getterType or setterType:
- opsClass = ", Ops<"
- @@ -178,7 +181,10 @@ class DOMClass(UserDict.DictMixin):
- if key == 'indexOps':
- return ops(self.indexGetter and self.indexGetterType, self.indexSetter and self.indexSetterType)
- if key == 'nameOps':
- - return ops(self.nameGetter and self.nameGetterType, self.nameSetter and self.nameSetterType) if self.nameGetter else ""
- + if self.nameGetter:
- + return ops(self.nameGetter and self.nameGetterType, self.nameSetter and self.nameSetterType)
- + else:
- + return ""
-
- if key == 'listClass':
- if self.base:
- @@ -191,7 +197,10 @@ class DOMClass(UserDict.DictMixin):
-
- def __cmp__(x, y):
- if x.isBase != y.isBase:
- - return -1 if x.isBase else 1
- + if x.isBase:
- + return -1
- + else:
- + return 1;
- return cmp(x.name, y.name)
-
- class Configuration:
- diff -up comm-esr17/mozilla/js/xpconnect/src/qsgen.py.python comm-esr17/mozilla/js/xpconnect/src/qsgen.py
- --- comm-esr17/mozilla/js/xpconnect/src/qsgen.py.python 2012-11-16 22:41:39.000000000 +0100
- +++ comm-esr17/mozilla/js/xpconnect/src/qsgen.py 2012-11-19 13:20:39.000000000 +0100
- @@ -821,8 +821,11 @@ def writeQuickStub(f, customMethodCalls,
- argumentValues = (customMethodCall['additionalArgumentValues']
- % nativeName)
- if isAttr:
- + templateStrict = ", strict"
- + if not isSetter:
- + templateStrict = ""
- callTemplate += (" return %s(cx, obj, id%s, %s, vp_);\n"
- - % (templateName, ", strict" if isSetter else "", argumentValues))
- + % (templateName, templateStrict, argumentValues))
- else:
- callTemplate += (" return %s(cx, argc, %s, vp);\n"
- % (templateName, argumentValues))
- diff -up comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-data.py.python comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-data.py
- --- comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-data.py.python 2012-11-16 22:42:08.000000000 +0100
- +++ comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-data.py 2012-11-19 13:20:39.000000000 +0100
- @@ -5,8 +5,6 @@
- # Write out histogram information for C++. The histograms are defined
- # in a file provided as a command-line argument.
-
- -from __future__ import with_statement
- -
- import sys
- import histogram_tools
-
- diff -up comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-enum.py.python comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-enum.py
- --- comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-enum.py.python 2012-11-16 22:42:08.000000000 +0100
- +++ comm-esr17/mozilla/toolkit/components/telemetry/gen-histogram-enum.py 2012-11-19 13:20:39.000000000 +0100
- @@ -6,8 +6,6 @@
- # histograms. The histograms are defined in a file provided as a
- # command-line argument.
-
- -from __future__ import with_statement
- -
- import sys
- import histogram_tools
-
- diff -up comm-esr17/mozilla/toolkit/components/telemetry/histogram_tools.py.python comm-esr17/mozilla/toolkit/components/telemetry/histogram_tools.py
- --- comm-esr17/mozilla/toolkit/components/telemetry/histogram_tools.py.python 2012-11-16 22:42:08.000000000 +0100
- +++ comm-esr17/mozilla/toolkit/components/telemetry/histogram_tools.py 2012-11-19 13:20:39.000000000 +0100
- @@ -2,14 +2,13 @@
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
- -from __future__ import with_statement
- -
- import simplejson as json
-
- def from_file(filename):
- """Return an iterator that provides (name, definition) tuples of
- histograms defined in filename.
- """
- - with open(filename, 'r') as f:
- - histograms = json.load(f, object_pairs_hook=json.OrderedDict)
- - return histograms.iteritems()
- + f = open(filename, 'r')
- + histograms = json.load(f, object_pairs_hook=json.OrderedDict)
- + f.close()
- + return histograms.iteritems()
- diff -up comm-esr17/mozilla/xpcom/idl-parser/header.py.python comm-esr17/mozilla/xpcom/idl-parser/header.py
- --- comm-esr17/mozilla/xpcom/idl-parser/header.py.python 2012-11-16 22:42:15.000000000 +0100
- +++ comm-esr17/mozilla/xpcom/idl-parser/header.py 2012-11-19 13:20:39.000000000 +0100
- @@ -7,7 +7,7 @@
-
- """Print a C++ header file for the IDL files specified on the command line"""
-
- -import sys, os.path, re, xpidl, itertools, glob
- +import sys, os.path, re, xpidl, itertools, glob, string
-
- printdoccomments = False
-
- @@ -159,7 +159,7 @@ forward_decl = """class %(name)s; /* for
-
- def idl_basename(f):
- """returns the base name of a file with the last extension stripped"""
- - return os.path.basename(f).rpartition('.')[0]
- + return string.split(os.path.basename(f), '.')[0]
-
- def print_header(idl, fd, filename):
- fd.write(header % {'filename': filename,
- @@ -333,11 +333,17 @@ def write_interface(iface, fd):
-
- fd.write(" %s = 0;\n" % attributeAsNative(a, True))
- if a.infallible:
- + args = ''
- + if a.implicit_jscontext:
- + args = 'JSContext* cx'
- + argnames = ''
- + if a.implicit_jscontext:
- + argnames = 'cx, '
- fd.write(attr_infallible_tmpl %
- {'realtype': a.realtype.nativeType('in'),
- 'nativename': attributeNativeName(a, getter=True),
- - 'args': '' if not a.implicit_jscontext else 'JSContext* cx',
- - 'argnames': '' if not a.implicit_jscontext else 'cx, '})
- + 'args': args,
- + 'argnames': argnames})
-
- if not a.readonly:
- fd.write(" %s = 0;\n" % attributeAsNative(a, False))
- @@ -475,7 +481,9 @@ if __name__ == '__main__':
- o.add_option('--regen', action='store_true', dest='regen', default=False,
- help="Regenerate IDL Parser cache")
- options, args = o.parse_args()
- - file = args[0] if args else None
- + file = None
- + if args:
- + file = args[0]
-
- if options.cachedir is not None:
- if not os.path.isdir(options.cachedir):
- diff -up comm-esr17/mozilla/xpcom/idl-parser/typelib.py.python comm-esr17/mozilla/xpcom/idl-parser/typelib.py
- --- comm-esr17/mozilla/xpcom/idl-parser/typelib.py.python 2012-11-16 22:42:15.000000000 +0100
- +++ comm-esr17/mozilla/xpcom/idl-parser/typelib.py 2012-11-19 13:20:39.000000000 +0100
- @@ -260,7 +260,9 @@ if __name__ == '__main__':
- o.add_option('--regen', action='store_true', dest='regen', default=False,
- help="Regenerate IDL Parser cache")
- options, args = o.parse_args()
- - file = args[0] if args else None
- + file = None
- + if args:
- + file = args[0]
-
- if options.cachedir is not None:
- if not os.path.isdir(options.cachedir):
- diff -up comm-esr17/mozilla/xpcom/typelib/xpt/tools/xpt.py.python comm-esr17/mozilla/xpcom/typelib/xpt/tools/xpt.py
- --- comm-esr17/mozilla/xpcom/typelib/xpt/tools/xpt.py.python 2012-11-16 22:42:15.000000000 +0100
- +++ comm-esr17/mozilla/xpcom/typelib/xpt/tools/xpt.py 2012-11-19 13:20:39.000000000 +0100
- @@ -65,7 +65,6 @@ InterfaceType() - construct a new
-
- """
-
- -from __future__ import with_statement
- import os, sys
- import struct
- import operator
- @@ -102,7 +101,7 @@ class Type(object):
- this class directly. Rather, use one of its subclasses.
-
- """
- - _prefixdescriptor = struct.Struct(">B")
- + _prefixdescriptor = struct
- Tags = enum(
- # The first 18 entries are SimpleTypeDescriptor
- 'int8',
- @@ -184,13 +183,13 @@ class Type(object):
-
- """
- start = data_pool + offset - 1
- - (data,) = Type._prefixdescriptor.unpack(map[start:start + Type._prefixdescriptor.size])
- + (data,) = Type._prefixdescriptor.unpack(">B", map[start:start + Type._prefixdescriptor.calcsize(">B")])
- # first three bits are the flags
- flags = data & 0xE0
- flags = Type.decodeflags(flags)
- # last five bits is the tag
- tag = data & 0x1F
- - offset += Type._prefixdescriptor.size
- + offset += Type._prefixdescriptor.calcsize(">B")
- t = None
- if tag <= Type.Tags.wchar_t_ptr or tag >= Type.Tags.UTF8String:
- t = SimpleType.get(data, tag, flags)
- @@ -214,7 +213,7 @@ class Type(object):
- and the subclass method must be called.
-
- """
- - file.write(Type._prefixdescriptor.pack(self.encodeflags() | self.tag))
- + file.write(Type._prefixdescriptor.pack(">B", self.encodeflags() | self.tag))
-
- class SimpleType(Type):
- """
- @@ -263,7 +262,7 @@ class InterfaceType(Type):
- (InterfaceTypeDescriptor from the typelib specification.)
-
- """
- - _descriptor = struct.Struct(">H")
- + _descriptor = struct
-
- def __init__(self, iface, pointer=True, **kwargs):
- if not pointer:
- @@ -285,8 +284,8 @@ class InterfaceType(Type):
- if not flags['pointer']:
- return None, offset
- start = data_pool + offset - 1
- - (iface_index,) = InterfaceType._descriptor.unpack(map[start:start + InterfaceType._descriptor.size])
- - offset += InterfaceType._descriptor.size
- + (iface_index,) = InterfaceType._descriptor.unpack(">H", map[start:start + InterfaceType._descriptor.calcsize(">H")])
- + offset += InterfaceType._descriptor.calcsize(">H")
- iface = None
- # interface indices are 1-based
- if iface_index > 0 and iface_index <= len(typelib.interfaces):
- @@ -301,7 +300,7 @@ class InterfaceType(Type):
- """
- Type.write(self, typelib, file)
- # write out the interface index (1-based)
- - file.write(InterfaceType._descriptor.pack(typelib.interfaces.index(self.iface) + 1))
- + file.write(InterfaceType._descriptor.pack(">H", typelib.interfaces.index(self.iface) + 1))
-
- def __str__(self):
- if self.iface:
- @@ -315,7 +314,7 @@ class InterfaceIsType(Type):
- typelib specification.)
-
- """
- - _descriptor = struct.Struct(">B")
- + _descriptor = struct
- _cache = {}
-
- def __init__(self, param_index, pointer=True, **kwargs):
- @@ -339,8 +338,8 @@ class InterfaceIsType(Type):
- if not flags['pointer']:
- return None, offset
- start = data_pool + offset - 1
- - (param_index,) = InterfaceIsType._descriptor.unpack(map[start:start + InterfaceIsType._descriptor.size])
- - offset += InterfaceIsType._descriptor.size
- + (param_index,) = InterfaceIsType._descriptor.unpack(">B", map[start:start + InterfaceIsType._descriptor.calcsize(">B")])
- + offset += InterfaceIsType._descriptor.calcsize(">B")
- if param_index not in InterfaceIsType._cache:
- InterfaceIsType._cache[param_index] = InterfaceIsType(param_index, **flags)
- return InterfaceIsType._cache[param_index], offset
- @@ -352,7 +351,7 @@ class InterfaceIsType(Type):
-
- """
- Type.write(self, typelib, file)
- - file.write(InterfaceIsType._descriptor.pack(self.param_index))
- + file.write(InterfaceIsType._descriptor.pack(">B", self.param_index))
-
- def __str__(self):
- return "InterfaceIs *"
- @@ -364,7 +363,7 @@ class ArrayType(Type):
- (ArrayTypeDescriptor from the typelib specification.)
-
- """
- - _descriptor = struct.Struct(">BB")
- + _descriptor = struct
-
- def __init__(self, element_type, size_is_arg_num, length_is_arg_num,
- pointer=True, **kwargs):
- @@ -388,8 +387,8 @@ class ArrayType(Type):
- if not flags['pointer']:
- return None, offset
- start = data_pool + offset - 1
- - (size_is_arg_num, length_is_arg_num) = ArrayType._descriptor.unpack(map[start:start + ArrayType._descriptor.size])
- - offset += ArrayType._descriptor.size
- + (size_is_arg_num, length_is_arg_num) = ArrayType._descriptor.unpack(">BB", map[start:start + ArrayType._descriptor.calcsize(">BB")])
- + offset += ArrayType._descriptor.calcsize(">BB")
- t, offset = Type.read(typelib, map, data_pool, offset)
- return ArrayType(t, size_is_arg_num, length_is_arg_num, **flags), offset
-
- @@ -400,7 +399,7 @@ class ArrayType(Type):
-
- """
- Type.write(self, typelib, file)
- - file.write(ArrayType._descriptor.pack(self.size_is_arg_num,
- + file.write(ArrayType._descriptor.pack(">BB", self.size_is_arg_num,
- self.length_is_arg_num))
- self.element_type.write(typelib, file)
-
- @@ -414,7 +413,7 @@ class StringWithSizeType(Type):
- from the typelib specification.)
-
- """
- - _descriptor = struct.Struct(">BB")
- + _descriptor = struct
-
- def __init__(self, size_is_arg_num, length_is_arg_num,
- pointer=True, **kwargs):
- @@ -437,8 +436,8 @@ class StringWithSizeType(Type):
- if not flags['pointer']:
- return None, offset
- start = data_pool + offset - 1
- - (size_is_arg_num, length_is_arg_num) = StringWithSizeType._descriptor.unpack(map[start:start + StringWithSizeType._descriptor.size])
- - offset += StringWithSizeType._descriptor.size
- + (size_is_arg_num, length_is_arg_num) = StringWithSizeType._descriptor.unpack(">BB", map[start:start + StringWithSizeType._descriptor.calcsize(">BB")])
- + offset += StringWithSizeType._descriptor.calcsize(">BB")
- return StringWithSizeType(size_is_arg_num, length_is_arg_num, **flags), offset
-
- def write(self, typelib, file):
- @@ -448,7 +447,7 @@ class StringWithSizeType(Type):
-
- """
- Type.write(self, typelib, file)
- - file.write(StringWithSizeType._descriptor.pack(self.size_is_arg_num,
- + file.write(StringWithSizeType._descriptor.pack(">BB", self.size_is_arg_num,
- self.length_is_arg_num))
-
- def __str__(self):
- @@ -461,7 +460,7 @@ class WideStringWithSizeType(Type):
- (WideStringWithSizeTypeDescriptor from the typelib specification.)
-
- """
- - _descriptor = struct.Struct(">BB")
- + _descriptor = struct
-
- def __init__(self, size_is_arg_num, length_is_arg_num,
- pointer=True, **kwargs):
- @@ -484,8 +483,8 @@ class WideStringWithSizeType(Type):
- if not flags['pointer']:
- return None, offset
- start = data_pool + offset - 1
- - (size_is_arg_num, length_is_arg_num) = WideStringWithSizeType._descriptor.unpack(map[start:start + WideStringWithSizeType._descriptor.size])
- - offset += WideStringWithSizeType._descriptor.size
- + (size_is_arg_num, length_is_arg_num) = WideStringWithSizeType._descriptor.unpack(">BB", map[start:start + WideStringWithSizeType._descriptor.calcsize(">BB")])
- + offset += WideStringWithSizeType._descriptor.calcsize(">BB")
- return WideStringWithSizeType(size_is_arg_num, length_is_arg_num, **flags), offset
-
- def write(self, typelib, file):
- @@ -495,7 +494,7 @@ class WideStringWithSizeType(Type):
-
- """
- Type.write(self, typelib, file)
- - file.write(WideStringWithSizeType._descriptor.pack(self.size_is_arg_num,
- + file.write(WideStringWithSizeType._descriptor.pack(">BB", self.size_is_arg_num,
- self.length_is_arg_num))
-
- def __str__(self):
- @@ -507,7 +506,7 @@ class Param(object):
- (ParamDescriptor from the typelib specification.)
-
- """
- - _descriptorstart = struct.Struct(">B")
- + _descriptorstart = struct
-
- def __init__(self, type, in_=True, out=False, retval=False,
- shared=False, dipper=False, optional=False):
- @@ -574,11 +573,11 @@ class Param(object):
- following this ParamDescriptor.
- """
- start = data_pool + offset - 1
- - (flags,) = Param._descriptorstart.unpack(map[start:start + Param._descriptorstart.size])
- + (flags,) = Param._descriptorstart.unpack(">B", map[start:start + Param._descriptorstart.calcsize(">B")])
- # only the first five bits are flags
- flags &= 0xFC
- flags = Param.decodeflags(flags)
- - offset += Param._descriptorstart.size
- + offset += Param._descriptorstart.calcsize(">B")
- t, offset = Type.read(typelib, map, data_pool, offset)
- p = Param(t, **flags)
- return p, offset
- @@ -589,7 +588,7 @@ class Param(object):
- to the correct position.
-
- """
- - file.write(Param._descriptorstart.pack(self.encodeflags()))
- + file.write(Param._descriptorstart.pack(">B", self.encodeflags()))
- self.type.write(typelib, file)
-
- def prefix(self):
- @@ -626,7 +625,7 @@ class Method(object):
- (MethodDescriptor from the typelib specification.)
-
- """
- - _descriptorstart = struct.Struct(">BIB")
- + _descriptorstart = struct
-
- def __init__(self, name, result,
- params=[], getter=False, setter=False, notxpcom=False,
- @@ -724,13 +723,13 @@ class Method(object):
-
- """
- start = data_pool + offset - 1
- - flags, name_offset, num_args = Method._descriptorstart.unpack(map[start:start + Method._descriptorstart.size])
- + flags, name_offset, num_args = Method._descriptorstart.unpack(">BIB", map[start:start + Method._descriptorstart.calcsize(">BIB")])
- # only the first seven bits are flags
- flags &= 0xFE
- flags = Method.decodeflags(flags)
- name = Typelib.read_string(map, data_pool, name_offset)
- m = Method(name, None, **flags)
- - offset += Method._descriptorstart.size
- + offset += Method._descriptorstart.calcsize(">BIB")
- offset = m.read_params(typelib, map, data_pool, offset, num_args)
- offset = m.read_result(typelib, map, data_pool, offset)
- return m, offset
- @@ -741,7 +740,7 @@ class Method(object):
- seeked to the right position.
-
- """
- - file.write(Method._descriptorstart.pack(self.encodeflags(),
- + file.write(Method._descriptorstart.pack(">BIB", self.encodeflags(),
- self._name_offset,
- len(self.params)))
- for p in self.params:
- @@ -767,7 +766,7 @@ class Constant(object):
- (ConstantDesciptor from the typelib specification.)
-
- """
- - _descriptorstart = struct.Struct(">I")
- + _descriptorstart = struct
- # Actual value is restricted to this set of types
- #XXX: the spec lies, the source allows a bunch more
- # http://hg.mozilla.org/mozilla-central/annotate/9c85f9aaec8c/xpcom/typelib/xpt/src/xpt_struct.c#l689
- @@ -792,9 +791,9 @@ class Constant(object):
-
- """
- start = data_pool + offset - 1
- - (name_offset,) = Constant._descriptorstart.unpack(map[start:start + Constant._descriptorstart.size])
- + (name_offset,) = Constant._descriptorstart.unpack(">I", map[start:start + Constant._descriptorstart.calcsize(">I")])
- name = Typelib.read_string(map, data_pool, name_offset)
- - offset += Constant._descriptorstart.size
- + offset += Constant._descriptorstart.calcsize(">I")
- # Read TypeDescriptor
- t, offset = Type.read(typelib, map, data_pool, offset)
- c = None
- @@ -812,7 +811,7 @@ class Constant(object):
- to be seeked to the proper position.
-
- """
- - file.write(Constant._descriptorstart.pack(self._name_offset))
- + file.write(Constant._descriptorstart.pack(">I", self._name_offset))
- self.type.write(typelib, file)
- tt = Constant.typemap[self.type.tag]
- file.write(struct.pack(tt, self.value))
- @@ -840,8 +839,8 @@ class Interface(object):
- (InterfaceDescriptor from the typelib specification.)
-
- """
- - _direntry = struct.Struct(">16sIII")
- - _descriptorstart = struct.Struct(">HH")
- + _direntry = struct
- + _descriptorstart = struct
-
- UNRESOLVED_IID = "00000000-0000-0000-0000-000000000000"
-
- @@ -909,11 +908,11 @@ class Interface(object):
- if offset == 0:
- return
- start = data_pool + offset - 1
- - parent, num_methods = Interface._descriptorstart.unpack(map[start:start + Interface._descriptorstart.size])
- + parent, num_methods = Interface._descriptorstart.unpack(">HH", map[start:start + Interface._descriptorstart.calcsize(">HH")])
- if parent > 0 and parent <= len(typelib.interfaces):
- self.parent = typelib.interfaces[parent - 1]
- # Read methods
- - offset += Interface._descriptorstart.size
- + offset += Interface._descriptorstart.calcsize(">HH")
- for i in range(num_methods):
- m, offset = Method.read(typelib, map, data_pool, offset)
- self.methods.append(m)
- @@ -944,7 +943,7 @@ class Interface(object):
- to |file|, which is assumed to be seeked to the correct offset.
-
- """
- - file.write(Interface._direntry.pack(Typelib.string_to_iid(self.iid),
- + file.write(Interface._direntry.pack(">16sIII", Typelib.string_to_iid(self.iid),
- self._name_offset,
- self._namespace_offset,
- self._descriptor_offset))
- @@ -963,7 +962,7 @@ class Interface(object):
- parent_idx = 0
- if self.parent:
- parent_idx = typelib.interfaces.index(self.parent) + 1
- - file.write(Interface._descriptorstart.pack(parent_idx, len(self.methods)))
- + file.write(Interface._descriptorstart.pack(">HH", parent_idx, len(self.methods)))
- for m in self.methods:
- m.write(typelib, file)
- file.write(struct.pack(">H", len(self.constants)))
- @@ -1011,7 +1010,7 @@ class Typelib(object):
- or the static Typelib.read method may be called to read one from a file.
-
- """
- - _header = struct.Struct(">16sBBHIII")
- + _header = struct
-
- def __init__(self, version=TYPELIB_VERSION, interfaces=[], annotations=[]):
- """
- @@ -1067,10 +1066,11 @@ class Typelib(object):
- expected_size = None
- if isinstance(input_file, basestring):
- filename = input_file
- - with open(input_file, "rb") as f:
- - st = os.fstat(f.fileno())
- - data = f.read(st.st_size)
- - expected_size = st.st_size
- + f = open(input_file, "rb")
- + st = os.fstat(f.fileno())
- + data = f.read(st.st_size)
- + expected_size = st.st_size
- + f.close()
- else:
- data = input_file.read()
-
- @@ -1080,7 +1080,7 @@ class Typelib(object):
- num_interfaces,
- file_length,
- interface_directory_offset,
- - data_pool_offset) = Typelib._header.unpack(data[:Typelib._header.size])
- + data_pool_offset) = Typelib._header.unpack(">16sBBHIII", data[:Typelib._header.calcsize(">16sBBHIII")])
- if magic != XPT_MAGIC:
- raise FileFormatError, "Bad magic: %s" % magic
- xpt = Typelib((major_ver, minor_ver))
- @@ -1095,7 +1095,7 @@ class Typelib(object):
- interface_directory_offset -= 1
- # make a half-hearted attempt to read Annotations,
- # since XPIDL doesn't produce any anyway.
- - start = Typelib._header.size
- + start = Typelib._header.calcsize(">16sBBHIII")
- (anno, ) = struct.unpack(">B", data[start:start + struct.calcsize(">B")])
- islast = anno & 0x80
- tag = anno & 0x7F
- @@ -1105,9 +1105,9 @@ class Typelib(object):
-
- for i in range(num_interfaces):
- # iid, name, namespace, interface_descriptor
- - start = interface_directory_offset + i * Interface._direntry.size
- - end = interface_directory_offset + (i+1) * Interface._direntry.size
- - ide = Interface._direntry.unpack(data[start:end])
- + start = interface_directory_offset + i * Interface._direntry.calcsize(">16sIII")
- + end = interface_directory_offset + (i+1) * Interface._direntry.calcsize(">16sIII")
- + ide = Interface._direntry.unpack(">16sIII", data[start:end])
- iid = Typelib.iid_to_string(ide[0])
- name = Typelib.read_string(data, data_pool_offset, ide[1])
- namespace = Typelib.read_string(data, data_pool_offset, ide[2])
- @@ -1144,14 +1144,14 @@ class Typelib(object):
- def writefd(self, fd):
- # write out space for a header + one empty annotation,
- # padded to 4-byte alignment.
- - headersize = (Typelib._header.size + 1)
- + headersize = (Typelib._header.calcsize(">16sBBHIII") + 1)
- if headersize % 4:
- headersize += 4 - headersize % 4
- fd.write("\x00" * headersize)
- # save this offset, it's the interface directory offset.
- interface_directory_offset = fd.tell()
- # write out space for an interface directory
- - fd.write("\x00" * Interface._direntry.size * len(self.interfaces))
- + fd.write("\x00" * Interface._direntry.calcsize(">16sIII") * len(self.interfaces))
- # save this offset, it's the data pool offset.
- data_pool_offset = fd.tell()
- # write out all the interface descriptors to the data pool
- @@ -1161,7 +1161,7 @@ class Typelib(object):
- # now, seek back and write the header
- file_len = fd.tell()
- fd.seek(0)
- - fd.write(Typelib._header.pack(XPT_MAGIC,
- + fd.write(Typelib._header.pack(">16sBBHIII", XPT_MAGIC,
- TYPELIB_VERSION[0],
- TYPELIB_VERSION[1],
- len(self.interfaces),
- @@ -1185,8 +1185,9 @@ class Typelib(object):
- """
- self._sanityCheck()
- if isinstance(output_file, basestring):
- - with open(output_file, "wb") as f:
- - self.writefd(f)
- + f = open(output_file, "wb")
- + self.writefd(f)
- + f.close()
- else:
- self.writefd(output_file)
-
+ Find files duplicated in a given packaged directory, independently of its
diff --cc sources
index 79f203e,8e58219..bb33f4b
--- a/sources
+++ b/sources
@@@ -1,3 -1,2 +1,3 @@@
- fa4e24bffcc10d7c11f75f717b505850 lightning-1.9.1.source.tar.bz2
- 837cabfda70191a646cf8b5c7cbd8236 l10n-1.9.1.tar.xz
+ 53d457a8ff97a305d975c20d1bebff04 lighting-2.6.4.source.tar.bz2
+ 35a82b3eac18a4f59cbd7d7b7120b1da l10n-2.6.4.tar.xz
+711afa1062a1d2c4a67acdf02a33d86e pysqlite-2.6.3.tar.gz
diff --cc thunderbird-lightning.spec
index fb915bc,807fdb1..1af6a6a
--- a/thunderbird-lightning.spec
+++ b/thunderbird-lightning.spec
@@@ -2,10 -2,15 +2,14 @@@
%global nss_version 3.13.3
%global cairo_version 1.8.8
%global freetype_version 2.1.9
-%global sqlite_version 3.6.14
%global libnotify_version 0.4
- # Update these two as a pair - see calendar/lightning/install.rdf
- %global thunderbird_version 17.0
- %global thunderbird_next_version 18.0
+ %global libvpx_version 1.0.0
+ # Update these two as a pair - see calendar/lightning/install.rdf and mail/config/version.txt
+ %global thunderbird_version 24.2.0
+ %global thunderbird_next_version 25.0
+ %global lightning_version 2.6.4
+ # Bump one with each minor lightning release
+ %global gdata_version 0.25
# Compatible versions are listed in:
# comm-release/calendar/lightning/install.rdf.rej
# comm-release/calendar/providers/gdata/install.rdf.rej
@@@ -44,30 -48,14 +48,31 @@@ Source100: find-external-require
# Mozilla (XULRunner) patches
Patch0: thunderbird-version.patch
- Patch1: camelia.patch
+ Patch1: mozilla-build-arm.patch
# Fix build on secondary arches (patches copied from xulrunner)
Patch2: xulrunner-10.0-secondary-ipc.patch
+
+ Patch097: mozilla-python.patch
Patch099: mozilla-build.patch
Patch100: xulrunner-2.0-chromium-types.patch
- Patch101: mozilla-abort.patch
Patch103: xulrunner-gc-sections-ppc.patch
+Patch104: mozilla-694594-gcc-4.4.patch
+Patch105: mozilla-gtk-close.patch
+# For RHEL5 only
+Patch201: mozilla-python.patch
+Patch202: mozilla-py24.patch
+Patch203: xulrunner-build-gcc41.patch
+Patch204: xulrunner-missing-pysqlite.patch
+Patch205: xulrunner-hidden.patch
+# This is fix for ia64 jemmaloc, ia64 and ppc js
+Patch206: xulrunner-pagesize-ia64.patch
+
+# Thunderbird specific
+Patch301: thunderbird-python.patch
+
+# Lightning
+# Fix alarm handling after suspend (bug #910976)
+Patch10: thunderbird-lightning-alarm.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: nspr-devel >= %{nspr_version}
@@@ -129,26 -127,16 +147,27 @@@ sed -e 's/__RPM_VERSION_INTERNAL__/%{ve
> version.patch
%{__patch} -p1 -b --suffix .version --fuzz=0 < version.patch
cd mozilla
- %patch1 -p1 -b .camelia
+ %patch1 -p2 -b .arm-fix
%patch2 -p3 -b .secondary-ipc
+ %patch097 -p1 -b .python
+ %patch099 -p1 -b .build
%patch099 -p1 -b .build
%patch100 -p2 -b .chromium-types
-
+%patch101 -p1 -b .abort
+%patch104 -p1 -b .gcc-4.4
+%patch105 -p1 -b .gtk-close
+%patch201 -p2 -b .python
+%patch202 -p2 -b .py24
+%patch203 -p2 -b .gcc41
+%patch204 -p2 -b .pysqlite
+%patch205 -p2 -b .hidden
+%patch206 -p2 -b .pagesize-ia64
%patch103 -p2 -b .gc-sections
cd ..
- %patch10 -p1 -b .alarm
+# thunderbird specific patches
+%patch301 -p1 -b .tb-python
+
%{__rm} -f .mozconfig
%{__cp} %{SOURCE10} .mozconfig
@@@ -261,11 -243,12 +284,17 @@@ find $RPM_BUILD_ROOT -name \*.so | xarg
#===============================================================================
%changelog
+ * Wed Dec 11 2013 Orion Poplawski <orion at cora.nwra.com> - 2.6.4-1
+ - Update to 2.6.4
+ - Exclude cs locale for now - doesn't build
+ - Split Google data provider into a sub-package (bug #554113)
+ - Only build WebRTC on x86 to fix FTBFS on other arches
+
+* Tue Mar 19 2013 Orion Poplawski <orion at cora.nwra.com> - 1.9.1-1
+- Update to 1.9.1
+- Add patch to fix alarm handling after suspend (bug #910976)
+- ExcludeArch ppc for now
+
* Tue Nov 20 2012 Jan Horak <jhorak at redhat.com> - 1.9-1
- Update to 1.9
- Bump required TB version
diff --cc thunderbird-mozconfig
index 8946ada,3ee46b9..c924f18
--- a/thunderbird-mozconfig
+++ b/thunderbird-mozconfig
@@@ -29,8 -30,10 +30,9 @@@ ac_add_options --enable-canva
ac_add_options --disable-crashreporter
ac_add_options --disable-necko-wifi
ac_add_options --disable-updater
-ac_add_options --disable-gstreamer
+ac_add_options --disable-webm
ac_add_options --with-l10n-base=../../l10n
+ ac_add_options --disable-gstreamer
export BUILD_OFFICIAL=1
export MOZILLA_OFFICIAL=1
More information about the scm-commits
mailing list