diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b20d235..0000000 --- a/.gitignore +++ /dev/null @@ -1,54 +0,0 @@ -/thunderbird-3.1.9.source.tar.bz2 -/thunderbird-3.1.11.source.tar.bz2 -/thunderbird-3.1.18.source.tar.bz2 -/l10n-comm192-3.1.18.tar.xz -/thunderbird-5.0.source.tar.bz2 -/lightning-1.0b5-source.tar.bz2 -/l10n-miramar.tar.bz2 -/thunderbird-6.0.source.tar.bz2 -/lightning-1.0b7.source.tar.bz2 -/l10n.tar.bz2 -/lightning-1.0rc2.source.tar.bz2 -/lightning-1.0.source.tar.bz2 -/lightning-1.1.source.tar.bz2 -/l10n.tar.xz -/l10n-1.1.tar.xz -/lightning-1.1.1.source.tar.bz2 -/l10n-1.1.1.tar.xz -/l10n-1.2.tar.xz -/lightning-1.2.source.tar.bz2 -/l10n-1.2.1.tar.xz -/lightning-1.2.1.source.tar.bz2 -/lightning-1.2.3.source.tar.bz2 -/l10n-1.2.3.tar.xz -/lightning-1.3.source.tar.bz2 -/l10n-1.3.tar.xz -/lightning-1.4.source.tar.bz2 -/l10n-1.4.tar.xz -/lightning-1.5.source.tar.bz2 -/l10n-1.5.tar.xz -/lightning-1.6.source.tar.bz2 -/l10n-1.6.tar.xz -/lightning-1.7.source.tar.bz2 -/l10n-1.7.tar.xz -/l10n-1.8.tar.xz -/lightning-1.8.source.tar.bz2 -/lightning-1.9.source.tar.bz2 -/l10n-1.9.tar.xz -/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 -/lightning-2.6.4.source.tar.bz2 -/lightning-2.6.5.source.tar.bz2 -/l10n-2.6.5.tar.xz -/lightning-2.6.6.source.tar.bz2 -/l10n-2.6.6.tar.xz -/lightning-3.3.source.tar.bz2 -/l10n-3.3.tar.xz -/simplejson-2.1.1.tar.gz diff --git a/array_len.patch b/array_len.patch deleted file mode 100644 index 4e90f5e..0000000 --- a/array_len.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up comm-esr31/mailnews/mime/src/nsStreamConverter.cpp.array_len comm-esr31/mailnews/mime/src/nsStreamConverter.cpp ---- comm-esr31/mailnews/mime/src/nsStreamConverter.cpp.array_len 2014-08-19 14:01:08.360999613 +0200 -+++ comm-esr31/mailnews/mime/src/nsStreamConverter.cpp 2014-08-19 14:01:50.327000252 +0200 -@@ -447,7 +447,7 @@ nsStreamConverter::DetermineOutputFormat - // find the requested header in table, ensure that we don't match on a prefix - // by checking that the following character is either null or the next query element - const char * remainder; -- for (uint32_t n = 0; n < MOZ_ARRAY_LENGTH(rgTypes); ++n) -+ for (uint32_t n = 0; n < (sizeof(rgTypes)/sizeof((rgTypes)[0])); ++n) - { - remainder = SkipPrefix(header, rgTypes[n].headerType); - if (remainder && (*remainder == '\0' || *remainder == '&')) diff --git a/comm-build-lightning.diff b/comm-build-lightning.diff deleted file mode 100644 index 580a261..0000000 --- a/comm-build-lightning.diff +++ /dev/null @@ -1,334 +0,0 @@ -# HG changeset patch -# Parent 40f36996a1e25cb54760ab77218e18857a247aa5 - -diff --git a/calendar/lightning/Makefile.in b/calendar/lightning/Makefile.in ---- a/calendar/lightning/Makefile.in -+++ b/calendar/lightning/Makefile.in -@@ -56,7 +56,6 @@ - XPI_EM_ID = {e2fda1a4-762b-4020-b5ad-a41df1933103} - - DIST_FILES = install.rdf application.ini --PREF_JS_EXPORTS = $(srcdir)/content/lightning.js - - # Lighting version number - LIGHTNING_VERSION := $(shell cat $(srcdir)/../sunbird/config/version.txt) -@@ -118,7 +117,7 @@ - ../providers \ - ../import-export \ - ../itip \ -- components \ -+ base \ - locales \ - $(NULL) - -@@ -126,20 +125,6 @@ - DIRS += ../test - endif - --# Select a theme from which to pull our skin goodness --# Linux: gnomestripe --# OS X: pinstripe --# Windows: winstripe -- --ifneq (,$(filter gtk2 qt,$(MOZ_WIDGET_TOOLKIT))) --THEME=gnomestripe --else --ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) --THEME=pinstripe --else --THEME=winstripe --endif --endif - - DEFINES += -DTHUNDERBIRD_VERSION=$(THUNDERBIRD_VERSION) \ - -DAB_CD=$(AB_CD) \ -@@ -147,7 +132,6 @@ - -DLIGHTNING_VERSION=$(LIGHTNING_VERSION) \ - -DTARGET_PLATFORM=$(OS_TARGET)_$(TARGET_XPCOM_ABI) \ - -DXPI_EM_ID=$(XPI_EM_ID) \ -- -DTHEME=$(THEME) \ - $(NULL) - - GRE_BUILDID = $(shell $(PYTHON) $(MOZILLA_SRCDIR)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build BuildID) -@@ -158,7 +142,7 @@ - $(NSINSTALL) -m 0644 $(srcdir)/../timezones/timezones.sqlite $(FINAL_TARGET) - - include $(topsrcdir)/config/rules.mk --include $(srcdir)/lightning-packager.mk -+include $(srcdir)/build/lightning-packager.mk - - ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) - # If the macbundle dist dir was already created, sync lightning here to avoid -diff --git a/calendar/lightning/base/Makefile.in b/calendar/lightning/base/Makefile.in -new file mode 100644 ---- /dev/null -+++ b/calendar/lightning/base/Makefile.in -@@ -0,0 +1,36 @@ -+# This Source Code Form is subject to the terms of the Mozilla Public -+# 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/. -+ -+DEPTH = ../../.. -+topsrcdir = @top_srcdir@ -+srcdir = @srcdir@ -+VPATH = @srcdir@ -+ -+include $(DEPTH)/config/autoconf.mk -+ -+MODULE = lightning -+ -+export XPI_NAME = lightning -+export USE_EXTENSION_MANIFEST = 1 -+ -+DIRS = components -+PREF_JS_EXPORTS = $(srcdir)/preferences/lightning.js -+ -+# Select a theme from which to pull our skin goodness -+# Linux: gnomestripe -+# OS X: pinstripe -+# Windows: winstripe -+ifneq (,$(filter gtk2 qt,$(MOZ_WIDGET_TOOLKIT))) -+THEME = gnomestripe -+else -+ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) -+THEME = pinstripe -+else -+THEME = winstripe -+endif -+endif -+ -+DEFINES += -DTHEME=$(THEME) -+ -+include $(topsrcdir)/config/rules.mk -diff --git a/calendar/lightning/components/Makefile.in b/calendar/lightning/base/components/Makefile.in -rename from calendar/lightning/components/Makefile.in -rename to calendar/lightning/base/components/Makefile.in ---- a/calendar/lightning/components/Makefile.in -+++ b/calendar/lightning/base/components/Makefile.in -@@ -37,7 +37,7 @@ - # - # ***** END LICENSE BLOCK ***** - --DEPTH = ../../.. -+DEPTH = ../../../.. - topsrcdir = @top_srcdir@ - srcdir = @srcdir@ - VPATH = @srcdir@ -diff --git a/calendar/lightning/components/calItipProtocolHandler.js b/calendar/lightning/base/components/calItipProtocolHandler.js -rename from calendar/lightning/components/calItipProtocolHandler.js -rename to calendar/lightning/base/components/calItipProtocolHandler.js -diff --git a/calendar/lightning/components/calItipProtocolHandler.manifest b/calendar/lightning/base/components/calItipProtocolHandler.manifest -rename from calendar/lightning/components/calItipProtocolHandler.manifest -rename to calendar/lightning/base/components/calItipProtocolHandler.manifest -diff --git a/calendar/lightning/components/lightningTextCalendarConverter.js b/calendar/lightning/base/components/lightningTextCalendarConverter.js -rename from calendar/lightning/components/lightningTextCalendarConverter.js -rename to calendar/lightning/base/components/lightningTextCalendarConverter.js -diff --git a/calendar/lightning/components/lightningTextCalendarConverter.manifest b/calendar/lightning/base/components/lightningTextCalendarConverter.manifest -rename from calendar/lightning/components/lightningTextCalendarConverter.manifest -rename to calendar/lightning/base/components/lightningTextCalendarConverter.manifest -diff --git a/calendar/lightning/content/imip-bar-overlay.xul b/calendar/lightning/base/content/imip-bar-overlay.xul -rename from calendar/lightning/content/imip-bar-overlay.xul -rename to calendar/lightning/base/content/imip-bar-overlay.xul -diff --git a/calendar/lightning/content/imip-bar.js b/calendar/lightning/base/content/imip-bar.js -rename from calendar/lightning/content/imip-bar.js -rename to calendar/lightning/base/content/imip-bar.js -diff --git a/calendar/lightning/content/lightning-calendar-creation.js b/calendar/lightning/base/content/lightning-calendar-creation.js -rename from calendar/lightning/content/lightning-calendar-creation.js -rename to calendar/lightning/base/content/lightning-calendar-creation.js -diff --git a/calendar/lightning/content/lightning-calendar-creation.xul b/calendar/lightning/base/content/lightning-calendar-creation.xul -rename from calendar/lightning/content/lightning-calendar-creation.xul -rename to calendar/lightning/base/content/lightning-calendar-creation.xul -diff --git a/calendar/lightning/content/lightning-calendar-properties.js b/calendar/lightning/base/content/lightning-calendar-properties.js -rename from calendar/lightning/content/lightning-calendar-properties.js -rename to calendar/lightning/base/content/lightning-calendar-properties.js -diff --git a/calendar/lightning/content/lightning-calendar-properties.xul b/calendar/lightning/base/content/lightning-calendar-properties.xul -rename from calendar/lightning/content/lightning-calendar-properties.xul -rename to calendar/lightning/base/content/lightning-calendar-properties.xul -diff --git a/calendar/lightning/content/lightning-menus.xul b/calendar/lightning/base/content/lightning-menus.xul -rename from calendar/lightning/content/lightning-menus.xul -rename to calendar/lightning/base/content/lightning-menus.xul -diff --git a/calendar/lightning/content/lightning-migration.xul b/calendar/lightning/base/content/lightning-migration.xul -rename from calendar/lightning/content/lightning-migration.xul -rename to calendar/lightning/base/content/lightning-migration.xul -diff --git a/calendar/lightning/content/lightning-scripts.inc b/calendar/lightning/base/content/lightning-scripts.inc -rename from calendar/lightning/content/lightning-scripts.inc -rename to calendar/lightning/base/content/lightning-scripts.inc -diff --git a/calendar/lightning/content/lightning-standalone.xul b/calendar/lightning/base/content/lightning-standalone.xul -rename from calendar/lightning/content/lightning-standalone.xul -rename to calendar/lightning/base/content/lightning-standalone.xul -diff --git a/calendar/lightning/content/lightning-toolbar.xul b/calendar/lightning/base/content/lightning-toolbar.xul -rename from calendar/lightning/content/lightning-toolbar.xul -rename to calendar/lightning/base/content/lightning-toolbar.xul -diff --git a/calendar/lightning/content/lightning-utils.js b/calendar/lightning/base/content/lightning-utils.js -rename from calendar/lightning/content/lightning-utils.js -rename to calendar/lightning/base/content/lightning-utils.js -diff --git a/calendar/lightning/content/lightning-widgets.css b/calendar/lightning/base/content/lightning-widgets.css -rename from calendar/lightning/content/lightning-widgets.css -rename to calendar/lightning/base/content/lightning-widgets.css -diff --git a/calendar/lightning/content/lightning-widgets.xml b/calendar/lightning/base/content/lightning-widgets.xml -rename from calendar/lightning/content/lightning-widgets.xml -rename to calendar/lightning/base/content/lightning-widgets.xml -diff --git a/calendar/lightning/content/messenger-overlay-accountCentral.xul b/calendar/lightning/base/content/messenger-overlay-accountCentral.xul -rename from calendar/lightning/content/messenger-overlay-accountCentral.xul -rename to calendar/lightning/base/content/messenger-overlay-accountCentral.xul -diff --git a/calendar/lightning/content/messenger-overlay-messageWindow.xul b/calendar/lightning/base/content/messenger-overlay-messageWindow.xul -rename from calendar/lightning/content/messenger-overlay-messageWindow.xul -rename to calendar/lightning/base/content/messenger-overlay-messageWindow.xul -diff --git a/calendar/lightning/content/messenger-overlay-preferences.js b/calendar/lightning/base/content/messenger-overlay-preferences.js -rename from calendar/lightning/content/messenger-overlay-preferences.js -rename to calendar/lightning/base/content/messenger-overlay-preferences.js -diff --git a/calendar/lightning/content/messenger-overlay-preferences.xul b/calendar/lightning/base/content/messenger-overlay-preferences.xul -rename from calendar/lightning/content/messenger-overlay-preferences.xul -rename to calendar/lightning/base/content/messenger-overlay-preferences.xul -diff --git a/calendar/lightning/content/messenger-overlay-sidebar.js b/calendar/lightning/base/content/messenger-overlay-sidebar.js -rename from calendar/lightning/content/messenger-overlay-sidebar.js -rename to calendar/lightning/base/content/messenger-overlay-sidebar.js -diff --git a/calendar/lightning/content/messenger-overlay-sidebar.xul b/calendar/lightning/base/content/messenger-overlay-sidebar.xul -rename from calendar/lightning/content/messenger-overlay-sidebar.xul -rename to calendar/lightning/base/content/messenger-overlay-sidebar.xul ---- a/calendar/lightning/content/messenger-overlay-sidebar.xul -+++ b/calendar/lightning/base/content/messenger-overlay-sidebar.xul -@@ -77,7 +77,7 @@ - --#include ../../base/content/calendar-scripts.inc -+#include ../../../base/content/calendar-scripts.inc - #include lightning-scripts.inc - - -diff --git a/calendar/lightning/content/suite-overlay-preferences.xul b/calendar/lightning/base/content/suite-overlay-preferences.xul -rename from calendar/lightning/content/suite-overlay-preferences.xul -rename to calendar/lightning/base/content/suite-overlay-preferences.xul -diff --git a/calendar/lightning/content/suite-overlay-sidebar.js b/calendar/lightning/base/content/suite-overlay-sidebar.js -rename from calendar/lightning/content/suite-overlay-sidebar.js -rename to calendar/lightning/base/content/suite-overlay-sidebar.js -diff --git a/calendar/lightning/content/suite-overlay-sidebar.xul b/calendar/lightning/base/content/suite-overlay-sidebar.xul -rename from calendar/lightning/content/suite-overlay-sidebar.xul -rename to calendar/lightning/base/content/suite-overlay-sidebar.xul -diff --git a/calendar/lightning/jar.mn b/calendar/lightning/base/jar.mn -rename from calendar/lightning/jar.mn -rename to calendar/lightning/base/jar.mn -diff --git a/calendar/lightning/content/lightning.js b/calendar/lightning/base/preferences/lightning.js -rename from calendar/lightning/content/lightning.js -rename to calendar/lightning/base/preferences/lightning.js -diff --git a/calendar/lightning/themes/common/images/mode-switch-icons.png b/calendar/lightning/base/themes/common/images/mode-switch-icons.png -rename from calendar/lightning/themes/common/images/mode-switch-icons.png -rename to calendar/lightning/base/themes/common/images/mode-switch-icons.png -diff --git a/calendar/lightning/themes/common/suite-accountCentral.css b/calendar/lightning/base/themes/common/suite-accountCentral.css -rename from calendar/lightning/themes/common/suite-accountCentral.css -rename to calendar/lightning/base/themes/common/suite-accountCentral.css -diff --git a/calendar/lightning/themes/gnomestripe/accountCentral.css b/calendar/lightning/base/themes/gnomestripe/accountCentral.css -rename from calendar/lightning/themes/gnomestripe/accountCentral.css -rename to calendar/lightning/base/themes/gnomestripe/accountCentral.css -diff --git a/calendar/lightning/themes/gnomestripe/imip.css b/calendar/lightning/base/themes/gnomestripe/imip.css -rename from calendar/lightning/themes/gnomestripe/imip.css -rename to calendar/lightning/base/themes/gnomestripe/imip.css -diff --git a/calendar/lightning/themes/gnomestripe/lightning-widgets.css b/calendar/lightning/base/themes/gnomestripe/lightning-widgets.css -rename from calendar/lightning/themes/gnomestripe/lightning-widgets.css -rename to calendar/lightning/base/themes/gnomestripe/lightning-widgets.css -diff --git a/calendar/lightning/themes/gnomestripe/lightning.css b/calendar/lightning/base/themes/gnomestripe/lightning.css -rename from calendar/lightning/themes/gnomestripe/lightning.css -rename to calendar/lightning/base/themes/gnomestripe/lightning.css -diff --git a/calendar/lightning/themes/pinstripe/accountCentral.css b/calendar/lightning/base/themes/pinstripe/accountCentral.css -rename from calendar/lightning/themes/pinstripe/accountCentral.css -rename to calendar/lightning/base/themes/pinstripe/accountCentral.css -diff --git a/calendar/lightning/themes/pinstripe/imip.css b/calendar/lightning/base/themes/pinstripe/imip.css -rename from calendar/lightning/themes/pinstripe/imip.css -rename to calendar/lightning/base/themes/pinstripe/imip.css -diff --git a/calendar/lightning/themes/pinstripe/lightning-widgets.css b/calendar/lightning/base/themes/pinstripe/lightning-widgets.css -rename from calendar/lightning/themes/pinstripe/lightning-widgets.css -rename to calendar/lightning/base/themes/pinstripe/lightning-widgets.css -diff --git a/calendar/lightning/themes/pinstripe/lightning.css b/calendar/lightning/base/themes/pinstripe/lightning.css -rename from calendar/lightning/themes/pinstripe/lightning.css -rename to calendar/lightning/base/themes/pinstripe/lightning.css -diff --git a/calendar/lightning/themes/winstripe/accountCentral.css b/calendar/lightning/base/themes/winstripe/accountCentral.css -rename from calendar/lightning/themes/winstripe/accountCentral.css -rename to calendar/lightning/base/themes/winstripe/accountCentral.css -diff --git a/calendar/lightning/themes/winstripe/images/mode-switch-icons-aero.png b/calendar/lightning/base/themes/winstripe/images/mode-switch-icons-aero.png -rename from calendar/lightning/themes/winstripe/images/mode-switch-icons-aero.png -rename to calendar/lightning/base/themes/winstripe/images/mode-switch-icons-aero.png -diff --git a/calendar/lightning/themes/winstripe/imip.css b/calendar/lightning/base/themes/winstripe/imip.css -rename from calendar/lightning/themes/winstripe/imip.css -rename to calendar/lightning/base/themes/winstripe/imip.css -diff --git a/calendar/lightning/themes/winstripe/lightning-widgets.css b/calendar/lightning/base/themes/winstripe/lightning-widgets.css -rename from calendar/lightning/themes/winstripe/lightning-widgets.css -rename to calendar/lightning/base/themes/winstripe/lightning-widgets.css -diff --git a/calendar/lightning/themes/winstripe/lightning.css b/calendar/lightning/base/themes/winstripe/lightning.css -rename from calendar/lightning/themes/winstripe/lightning.css -rename to calendar/lightning/base/themes/winstripe/lightning.css -diff --git a/calendar/lightning/build.mk b/calendar/lightning/build.mk -new file mode 100644 ---- /dev/null -+++ b/calendar/lightning/build.mk -@@ -0,0 +1,18 @@ -+# This Source Code Form is subject to the terms of the Mozilla Public -+# 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/. -+ -+ifndef COMM_BUILD # Mozila Makefile -+ -+ifndef LIBXUL_SDK -+include $(topsrcdir)/toolkit/toolkit-tiers.mk -+endif -+ -+TIERS += app -+ -+else # toplevel Makefile -+ -+TIERS += app -+tier_app_dirs += calendar/lightning -+ -+endif -diff --git a/calendar/lightning/lightning-packager.mk b/calendar/lightning/build/lightning-packager.mk -rename from calendar/lightning/lightning-packager.mk -rename to calendar/lightning/build/lightning-packager.mk -diff --git a/calendar/lightning/chrome.manifest b/calendar/lightning/chrome.manifest -deleted file mode 100644 -diff --git a/calendar/lightning/config/version.txt b/calendar/lightning/config/version.txt -new file mode 100644 ---- /dev/null -+++ b/calendar/lightning/config/version.txt -@@ -0,0 +1,1 @@ -+1.7 -diff --git a/calendar/lightning/confvars.sh b/calendar/lightning/confvars.sh -new file mode 100644 ---- /dev/null -+++ b/calendar/lightning/confvars.sh -@@ -0,0 +1,28 @@ -+# This Source Code Form is subject to the terms of the Mozilla Public -+# 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/. -+ -+MOZ_APP_NAME=lightning -+MOZ_CHROME_FILE_FORMAT=omni -+MOZ_NO_ACTIVEX_SUPPORT=1 -+MOZ_ACTIVEX_SCRIPTING_SUPPORT= -+MOZ_APP_VERSION_TXT=${_topsrcdir}/$MOZ_BUILD_APP/config/version.txt -+MOZ_APP_VERSION=`cat $MOZ_APP_VERSION_TXT` -+LIGHTNING_VERSION=$MOZ_APP_VERSION -+ -+# Disabled to improve build speed -+MOZ_FEEDS= -+MOZ_PLACES= -+MOZ_SMIL= -+MOZ_TOOLKIT_SEARCH= -+MOZ_ZIPWRITER= -+MOZ_MORK= -+MOZ_MORKREADER= -+MOZ_OGG= -+MOZ_SYDNEYAUDIO= -+MOZ_WAVE= -+MOZ_MEDIA= -+MOZ_VORBIS= -+MOZ_WEBM= -+MOZ_WEBGL= -+MOZ_XTF= -diff --git a/calendar/lightning/test/xpcshell.ini b/calendar/lightning/test/xpcshell.ini -new file mode 100644 ---- /dev/null -+++ b/calendar/lightning/test/xpcshell.ini -@@ -0,0 +1,3 @@ -+[include:calendar/test/unit/xpcshell.ini] -+ -+[include:xpcshell-core.ini] diff --git a/dead.package b/dead.package new file mode 100644 index 0000000..4e9cb9e --- /dev/null +++ b/dead.package @@ -0,0 +1,4 @@ +2015-10-29: Retired because of broken deps: +unresolved dependencies for thunderbird-lightning-gdata-0.32-1.el6.i686: +thunderbird-lightning(x86-32) = 0:3.3-1.el6 + diff --git a/disable-webm.patch b/disable-webm.patch deleted file mode 100644 index 570713b..0000000 --- a/disable-webm.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up mozilla-esr31/browser/confvars.sh.webm-fix mozilla-esr31/browser/confvars.sh ---- mozilla-esr31/browser/confvars.sh.webm-fix 2014-07-21 13:56:53.522253529 +0200 -+++ mozilla-esr31/browser/confvars.sh 2014-07-21 13:57:49.983533186 +0200 -@@ -65,6 +65,6 @@ MOZ_PAY=1 - # Enable activities. These are used for FxOS developers currently. - MOZ_ACTIVITIES=1 - MOZ_JSDOWNLOADS=1 --MOZ_WEBM_ENCODER=1 -+#MOZ_WEBM_ENCODER=1 - # Enable exact rooting on desktop. - JSGC_USE_EXACT_ROOTING=1 diff --git a/find-external-requires b/find-external-requires deleted file mode 100755 index d79db1d..0000000 --- a/find-external-requires +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# Finds requirements provided outside of the current file set - -filelist=`sed "s/[]['\"*?{}]/\\\\\&/g"` - -provides=`echo $filelist | /usr/lib/rpm/find-provides` - -{ -for f in $filelist ; do - echo $f | /usr/lib/rpm/find-requires | while read req ; do - found=0 - for p in $provides ; do - if [ "$req" = "$p" ]; then - found=1 - fi - done - if [ "$found" = "0" ]; then - echo $req - fi - done -done -} | sort -u \ No newline at end of file diff --git a/firefox-system-nss-3.16.2.patch b/firefox-system-nss-3.16.2.patch deleted file mode 100644 index 600da22..0000000 --- a/firefox-system-nss-3.16.2.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up thunderbird-lightning-3.3/comm-esr31/mozilla/configure.in.system_nss thunderbird-lightning-3.3/comm-esr31/mozilla/configure.in ---- thunderbird-lightning-3.3/comm-esr31/mozilla/configure.in.system_nss 2014-10-21 11:50:49.409534991 -0600 -+++ thunderbird-lightning-3.3/comm-esr31/mozilla/configure.in 2014-10-21 11:54:23.005514143 -0600 -@@ -3655,7 +3655,7 @@ MOZ_ARG_WITH_BOOL(system-nss, - _USE_SYSTEM_NSS=1 ) - - if test -n "$_USE_SYSTEM_NSS"; then -- AM_PATH_NSS(3.16.2, [MOZ_NATIVE_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) -+ AM_PATH_NSS(3.16.1, [MOZ_NATIVE_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) - fi - - if test -n "$MOZ_NATIVE_NSS"; then diff --git a/mklangsource.sh b/mklangsource.sh deleted file mode 100755 index f536e78..0000000 --- a/mklangsource.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# This checks out and builds the language sources. The lightning source needs -# to already be unpacked -lver=`awk '/^%global *lightning_ver/ { print $3; exit }' thunderbird-lightning.spec` -tbver=`awk '/^%global *thunderbird_ver/ { print $3; exit }' thunderbird-lightning.spec` -#tag=CALENDAR_${lver//./_}_RELEASE -tag=THUNDERBIRD_${tbver//./_}_RELEASE -branch=`awk '/^%global *tarballdir/ { print $3; exit }' thunderbird-lightning.spec` -locales=$PWD/thunderbird-lightning-${lver}/${branch}/calendar/locales/shipped-locales -if [ ! -f $locales ] -then - echo "ERROR: missing $locales, try fedpkg prep first" - exit 1 -fi -[ ! -d l10n ] && mkdir l10n -cd l10n -for lang in $(<$locales) -do - if [ -d $lang ] - then - pushd $lang - hg pull - hg update $tag - popd - else - hg clone -u $tag http://hg.mozilla.org/releases/l10n/mozilla-release/$lang - fi -done - -# Tar up, minus the mercurial files -cd .. -rm -f l10n-${lver}.tar.xz -tar caf l10n-${lver}.tar.xz --exclude='.hg*' l10n diff --git a/mozilla-build-arm.patch b/mozilla-build-arm.patch deleted file mode 100644 index f98cbe3..0000000 --- a/mozilla-build-arm.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up firefox-29.0/mozilla-release/gfx/ycbcr/moz.build.arm firefox-29.0/mozilla-release/gfx/ycbcr/moz.build ---- firefox-29.0/mozilla-release/gfx/ycbcr/moz.build.arm 2014-04-22 07:27:47.000000000 +0200 -+++ firefox-29.0/mozilla-release/gfx/ycbcr/moz.build 2014-04-22 16:40:34.862849368 +0200 -@@ -61,7 +61,7 @@ else: - 'yuv_row_other.cpp', - ] - --if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['HAVE_ARM_NEON']: -+if CONFIG['HAVE_ARM_NEON']: - SOURCES += [ - 'yuv_row_arm.s', - ] diff --git a/mozilla-python.patch b/mozilla-python.patch deleted file mode 100644 index 3e97459..0000000 --- a/mozilla-python.patch +++ /dev/null @@ -1,3501 +0,0 @@ -diff -up mozilla-aurora/build/subconfigure.py.python mozilla-aurora/build/subconfigure.py ---- mozilla-aurora/build/subconfigure.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/build/subconfigure.py 2014-05-28 13:45:22.990356026 +0200 -@@ -87,9 +87,10 @@ def dump(dump_file, shell): - - # Scan the config.status output for information about configuration files - # it generates. -- config_status_output = subprocess.check_output( -- [shell, '-c', './config.status --help'], -- stderr=subprocess.STDOUT).splitlines() -+ config_status_output = subprocess.Popen([shell, '-c', './config.status --help'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].splitlines() -+ #config_status_output = subprocess.check_output( -+ # [shell, '-c', './config.status --help'], -+ # stderr=subprocess.STDOUT).splitlines() - state = None - for line in config_status_output: - if line.startswith('Configuration') and line.endswith(':'): -diff -up mozilla-aurora/dom/bindings/Codegen.py.python mozilla-aurora/dom/bindings/Codegen.py ---- mozilla-aurora/dom/bindings/Codegen.py.python 2014-05-06 13:17:23.000000000 +0200 -+++ mozilla-aurora/dom/bindings/Codegen.py 2014-05-28 13:45:22.993356026 +0200 -@@ -11041,7 +11041,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-aurora/dom/bindings/mozwebidlcodegen/__init__.py.python mozilla-aurora/dom/bindings/mozwebidlcodegen/__init__.py ---- mozilla-aurora/dom/bindings/mozwebidlcodegen/__init__.py.python 2014-05-06 13:17:23.000000000 +0200 -+++ mozilla-aurora/dom/bindings/mozwebidlcodegen/__init__.py 2014-05-28 13:45:22.993356026 +0200 -@@ -126,20 +126,20 @@ class WebIDLCodegenManager(LoggingMixin) - """ - - # Global parser derived declaration files. -- GLOBAL_DECLARE_FILES = { -+ GLOBAL_DECLARE_FILES = [ - 'GeneratedAtomList.h', - 'PrototypeList.h', - 'RegisterBindings.h', - 'UnionConversions.h', - 'UnionTypes.h', -- } -+ ] - - # Global parser derived definition files. -- GLOBAL_DEFINE_FILES = { -+ GLOBAL_DEFINE_FILES = [ - 'RegisterBindings.cpp', - 'UnionTypes.cpp', - 'PrototypeList.cpp', -- } -+ ] - - def __init__(self, config_path, inputs, exported_header_dir, - codegen_dir, state_path, cache_dir=None, make_deps_path=None, -@@ -363,8 +363,12 @@ class WebIDLCodegenManager(LoggingMixin) - # a lot of extra work and most build systems don't do that anyway. - - # Now we move on to the input files. -- old_hashes = {v['filename']: v['sha1'] -- for v in self._state['webidls'].values()} -+ old_hashes = {} -+ for v in self._state['webidls'].values(): -+ old_hashes[v['filename']] = v['sha1'] -+ -+ #old_hashes = {v['filename']: v['sha1'] -+ # for v in self._state['webidls'].values()} - - old_filenames = set(old_hashes.keys()) - new_filenames = self._input_paths -@@ -442,7 +446,9 @@ class WebIDLCodegenManager(LoggingMixin) - - for p in self._input_paths: - stem, binding_stem, is_event, header_dir, files = self._binding_info(p) -- paths |= {f for f in files if f} -+ for f in files: -+ if f: -+ paths.add(f); - - for interface in self._example_interfaces: - for p in self._example_paths(interface): -diff -up mozilla-aurora/media/libvorbis/moz.build.python mozilla-aurora/media/libvorbis/moz.build ---- mozilla-aurora/media/libvorbis/moz.build.python 2014-05-28 16:00:22.237354519 +0200 -+++ mozilla-aurora/media/libvorbis/moz.build 2014-05-28 16:00:34.267356050 +0200 -@@ -4,6 +4,7 @@ - # 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/. - -+#print("VORBIS exports") - EXPORTS.vorbis += [ - 'include/vorbis/codec.h', - 'include/vorbis/vorbisenc.h', -diff -up mozilla-aurora/python/mach/mach/logging.py.python mozilla-aurora/python/mach/mach/logging.py ---- mozilla-aurora/python/mach/mach/logging.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mach/mach/logging.py 2014-05-28 13:45:22.993356026 +0200 -@@ -18,6 +18,10 @@ import logging - import sys - 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.""" -@@ -175,7 +179,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) - -@@ -197,7 +201,7 @@ class LoggingManager(object): - write_interval=write_interval, write_times=write_times) - formatter.set_terminal(self.terminal) - -- handler = logging.StreamHandler(stream=fh) -+ handler = logging.StreamHandler(fh) - handler.setFormatter(formatter) - handler.setLevel(level) - -diff -up mozilla-aurora/python/mozbuild/mozbuild/backend/base.py.python mozilla-aurora/python/mozbuild/mozbuild/backend/base.py ---- mozilla-aurora/python/mozbuild/mozbuild/backend/base.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/backend/base.py 2014-05-28 13:45:22.993356026 +0200 -@@ -83,18 +83,18 @@ class BackendConsumeSummary(object): - - @property - def reader_summary(self): -- return 'Finished reading {:d} moz.build files in {:.2f}s'.format( -+ return 'Finished reading {0:d} moz.build files in {1:.2f}s'.format( - self.mozbuild_count, - self.mozbuild_execution_time) - - @property - def emitter_summary(self): -- return 'Processed into {:d} build config descriptors in {:.2f}s'.format( -+ return 'Processed into {0:d} build config descriptors in {1:.2f}s'.format( - self.object_count, self.emitter_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.""" -@@ -103,8 +103,8 @@ 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%}; Untracked: {:.2f}s'.format( -+ return 'Total wall time: {0:.2f}s; CPU time: {1:.2f}s; Efficiency: ' \ -+ '{2:.0%}; Untracked: {3:.2f}s'.format( - self.wall_time, self.cpu_time, efficiency_value, - self.other_time) - -diff -up mozilla-aurora/python/mozbuild/mozbuild/backend/common.py.python mozilla-aurora/python/mozbuild/mozbuild/backend/common.py ---- mozilla-aurora/python/mozbuild/mozbuild/backend/common.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/backend/common.py 2014-05-28 13:45:22.994356026 +0200 -@@ -253,8 +253,11 @@ class CommonBackend(BuildBackend): - "#undef UNKNOWN_NAME" is turned into "/* #undef UNKNOWN_NAME */" - Whitespaces are preserved. - ''' -- with self._write_file(obj.output_path) as fh, \ -- open(obj.input_path, 'rU') as input: -+ fh = self._write_file(obj.output_path).__enter__() -+ input = open(obj.input_path, 'rU') -+ if 1: -+ #with self._write_file(obj.output_path) as fh, \ -+ # open(obj.input_path, 'rU') as input: - r = re.compile('^\s*#\s*(?P[a-z]+)(?:\s+(?P\S+)(?:\s+(?P\S+))?)?', re.U) - for l in input: - m = r.match(l) -@@ -277,5 +280,7 @@ class CommonBackend(BuildBackend): - + l[m.end('name'):] - elif cmd == 'undef': - l = '/* ' + l[:m.end('name')] + ' */' + l[m.end('name'):] -- -+ #print dir(fh) - fh.write(l) -+ fh.__exit__(None, None, None) -+ input.close() -diff -up mozilla-aurora/python/mozbuild/mozbuild/backend/configenvironment.py.python mozilla-aurora/python/mozbuild/mozbuild/backend/configenvironment.py ---- mozilla-aurora/python/mozbuild/mozbuild/backend/configenvironment.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/backend/configenvironment.py 2014-05-28 13:45:22.994356026 +0200 -@@ -15,10 +15,7 @@ from ..util import ( - ) - - --if sys.version_info.major == 2: -- text_type = unicode --else: -- text_type = str -+text_type = unicode - - - class BuildConfig(object): -diff -up mozilla-aurora/python/mozbuild/mozbuild/backend/recursivemake.py.python mozilla-aurora/python/mozbuild/mozbuild/backend/recursivemake.py ---- mozilla-aurora/python/mozbuild/mozbuild/backend/recursivemake.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/backend/recursivemake.py 2014-05-28 13:45:22.994356026 +0200 -@@ -272,9 +272,9 @@ class RecursiveMakeBackend(CommonBackend - self._ipdl_sources = set() - - def detailed(summary): -- s = '{:d} total backend files; ' \ -- '{:d} created; {:d} updated; {:d} unchanged; ' \ -- '{:d} deleted; {:d} -> {:d} Makefile'.format( -+ s = '{0:d} total backend files; ' \ -+ '{1:d} created; {2:d} updated; {3:d} unchanged; ' \ -+ '{4:d} deleted; {5:d} -> {6:d} Makefile'.format( - summary.created_count + summary.updated_count + - summary.unchanged_count, - summary.created_count, -@@ -297,6 +297,18 @@ class RecursiveMakeBackend(CommonBackend - self.backend_input_files.add(mozpath.join(self.environment.topobjdir, - 'config', 'autoconf.mk')) - -+ self._install_manifests = {} -+ for k in [ -+ 'dist_bin', -+ 'dist_idl', -+ 'dist_include', -+ 'dist_public', -+ 'dist_private', -+ 'dist_sdk', -+ 'tests', -+ 'xpidl']: -+ self._install_manifests[k] = InstallManifest() -+ ''' - self._install_manifests = { - k: InstallManifest() for k in [ - 'dist_bin', -@@ -308,7 +320,7 @@ class RecursiveMakeBackend(CommonBackend - 'tests', - 'xpidl', - ]} -- -+ ''' - self._traversal = RecursiveMakeTraversal() - self._may_skip = { - 'export': set(), -@@ -758,8 +770,17 @@ class RecursiveMakeBackend(CommonBackend - # yet know about. - # TODO Emit GENERATED_SOURCES so these special cases are dealt with - # the proper way. -- self._may_skip['compile'] -= {'ipc/ipdl'} -- self._may_skip['compile'] -= {'dom/bindings', 'dom/bindings/test'} -+ #print self._may_skip['compile'] -+ if 'ipc/ipdl' in self._may_skip['compile']: -+ self._may_skip['compile'].remove('ipc/ipdl') -+ #print self._may_skip['compile'] -+ #self._may_skip['compile'] -= {'ipc/ipdl'} -+ if 'dom/bindings' in self._may_skip['compile']: -+ self._may_skip['compile'].remove('dom/bindings') -+ if 'dom/bindings/test' in self._may_skip['compile']: -+ self._may_skip['compile'].remove('dom/bindings/test') -+ #print self._may_skip['compile'] -+ #self._may_skip['compile'] -= {'dom/bindings', 'dom/bindings/test'} - - self._fill_root_mk() - -diff -up mozilla-aurora/python/mozbuild/mozbuild/frontend/data.py.python mozilla-aurora/python/mozbuild/mozbuild/frontend/data.py ---- mozilla-aurora/python/mozbuild/mozbuild/frontend/data.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/frontend/data.py 2014-05-28 13:45:22.994356026 +0200 -@@ -19,7 +19,8 @@ from __future__ import unicode_literals - - import os - --from collections import OrderedDict -+from ordereddict import OrderedDict -+ - from mozbuild.util import ( - shell_quote, - StrictOrderingOnAppendList, -diff -up mozilla-aurora/python/mozbuild/mozbuild/frontend/emitter.py.python mozilla-aurora/python/mozbuild/mozbuild/frontend/emitter.py ---- mozilla-aurora/python/mozbuild/mozbuild/frontend/emitter.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/frontend/emitter.py 2014-05-28 13:45:22.995356026 +0200 -@@ -299,7 +299,12 @@ class TreeMetadataEmitter(LoggingMixin): - - no_pgo = sandbox.get('NO_PGO') - sources = sandbox.get('SOURCES', []) -- no_pgo_sources = [f for f in sources if sources[f].no_pgo] -+ #print (sources) -+ #print sources.__class__ -+ #print dir(sources) -+ no_pgo_sources = [] -+ -+ #no_pgo_sources = [f for f in sources if sources[f].no_pgo] - if no_pgo: - if no_pgo_sources: - raise SandboxValidationError('NO_PGO and SOURCES[...].no_pgo cannot be set at the same time') -diff -up mozilla-aurora/python/mozbuild/mozbuild/frontend/reader.py.python mozilla-aurora/python/mozbuild/mozbuild/frontend/reader.py ---- mozilla-aurora/python/mozbuild/mozbuild/frontend/reader.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/frontend/reader.py 2014-05-28 13:45:22.995356026 +0200 -@@ -60,7 +60,7 @@ from .sandbox_symbols import ( - VARIABLES, - ) - --if sys.version_info.major == 2: -+if sys.version_info[0] == 2: - text_type = unicode - type_type = types.TypeType - else: -@@ -69,6 +69,7 @@ else: - - - def log(logger, level, action, params, formatter): -+ #print(action, formatter) - logger.log(level, formatter, extra={'action': action, 'params': params}) - - -@@ -176,8 +177,9 @@ class MozbuildSandbox(Sandbox): - mozpath.join(topobjdir, reldir, 'config.status')) - config.topobjdir = topobjdir - self.config = config -- -- with self._globals.allow_all_writes() as d: -+ d = self._globals.allow_all_writes().__enter__() -+ if 1: -+ #with self._globals.allow_all_writes() as d: - d['TOPSRCDIR'] = topsrcdir - d['TOPOBJDIR'] = topobjdir - d['RELATIVEDIR'] = reldir -@@ -643,6 +645,7 @@ class BuildReader(object): - - self._sandbox_post_eval_cb = sandbox_post_eval_cb - self._log = logging.getLogger(__name__) -+ self._log.setLevel(10) - self._read_files = set() - self._execution_stack = [] - -@@ -671,13 +674,13 @@ class BuildReader(object): - # In the future, we may traverse moz.build files by looking - # for DIRS references in the AST, even if a directory is added behind - # a conditional. For now, just walk the filesystem. -- ignore = { -+ ignore = ( - # Ignore fake moz.build files used for testing moz.build. - 'python/mozbuild/mozbuild/test', - - # Ignore object directories. - 'obj*', -- } -+ ) - - finder = FileFinder(self.topsrcdir, find_executables=False, - ignore=ignore) -@@ -717,6 +720,9 @@ class BuildReader(object): - """ - self._execution_stack.append(path) - try: -+ #print (dir(path)) -+ #print (config) -+ #print(path) - for s in self._read_mozbuild(path, config, read_tiers=read_tiers, - filesystem_absolute=filesystem_absolute, - descend=descend, metadata=metadata): -@@ -757,16 +763,24 @@ class BuildReader(object): - return - - self._read_files.add(path) -- -+ #print("post read_files.add") - time_start = time.time() - sandbox = MozbuildSandbox(config, path, metadata=metadata) -+ #print("exec file vvvv") -+ #print(sandbox) -+ #print(dir(sandbox)) -+ - sandbox.exec_file(path, filesystem_absolute=filesystem_absolute) - sandbox.execution_time = time.time() - time_start -+ #print("exec ile ^^^") -+ - - if self._sandbox_post_eval_cb: - self._sandbox_post_eval_cb(sandbox) - - var = metadata.get('var', None) -+ #print("forbidden") -+ - forbidden = { - 'TOOL_DIRS': ['DIRS', 'PARALLEL_DIRS', 'TEST_DIRS'], - 'TEST_TOOL_DIRS': ['DIRS', 'PARALLEL_DIRS', 'TEST_DIRS', 'TOOL_DIRS'], -@@ -789,6 +803,7 @@ class BuildReader(object): - dirs = [(v, sandbox[v]) for v in dir_vars if v in sandbox] - - curdir = mozpath.dirname(path) -+ #print("pre sandbox") - - gyp_sandboxes = [] - for target_dir in sandbox['GYP_DIRS']: -@@ -842,6 +857,8 @@ class BuildReader(object): - # It's very tempting to use a set here. Unfortunately, the recursive - # make backend needs order preserved. Once we autogenerate all backend - # files, we should be able to convert this to a set. -+ #print("traverse") -+ - recurse_info = OrderedDict() - for var, var_dirs in dirs: - for d in var_dirs: -diff -up mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox.py.python mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox.py ---- mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox.py 2014-05-28 13:45:22.995356026 +0200 -@@ -131,10 +131,12 @@ class GlobalNamespace(dict): - try: - return dict.__getitem__(self, name) - except KeyError: -+ #print "Key error with", name - pass - - # The variable isn't present yet. Fall back to VARIABLES. - default = self._allowed_variables.get(name, None) -+ #print "default ", default - if default is None: - self.last_name_error = KeyError('global_ns', 'get_unknown', name) - raise self.last_name_error -@@ -143,11 +145,12 @@ class GlobalNamespace(dict): - # not a class that can be called), then it is actually a rule to - # generate the default that should be used. - default = default[0] -+ #print "default2 ", default - if issubclass(default, SandboxDerivedValue): - value = default(self) - else: - value = default() -- -+ #print "value", value, value.__class__ - dict.__setitem__(self, name, value) - return dict.__getitem__(self, name) - -@@ -371,6 +374,7 @@ class Sandbox(object): - # compile() inherits the __future__ from the module by default. We - # do want Unicode literals. - code = compile(source, path, 'exec') -+ #print self._globals - exec(code, self._globals, self._locals) - except SandboxError as e: - raise e -diff -up mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox_symbols.py.python mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox_symbols.py ---- mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox_symbols.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/frontend/sandbox_symbols.py 2014-05-28 13:45:22.996356026 +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, - HierarchicalStringListWithFlagsFactory, -diff -up mozilla-aurora/python/mozbuild/mozbuild/mozconfig.py.python mozilla-aurora/python/mozbuild/mozbuild/mozconfig.py ---- mozilla-aurora/python/mozbuild/mozbuild/mozconfig.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/mozconfig.py 2014-05-28 13:45:22.996356026 +0200 -@@ -215,8 +215,9 @@ class MozconfigLoader(ProcessExecutionMi - try: - # We need to capture stderr because that's where the shell sends - # errors if execution fails. -- output = subprocess.check_output(args, stderr=subprocess.STDOUT, -- cwd=self.topsrcdir, env=env) -+ output = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.topsrcdir, env=env).communicate()[0] -+ #output = subprocess.check_output(args, stderr=subprocess.STDOUT, -+ # cwd=self.topsrcdir, env=env) - except subprocess.CalledProcessError as e: - lines = e.output.splitlines() - -diff -up mozilla-aurora/python/mozbuild/mozbuild/virtualenv.py.python mozilla-aurora/python/mozbuild/mozbuild/virtualenv.py ---- mozilla-aurora/python/mozbuild/mozbuild/virtualenv.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/virtualenv.py 2014-05-28 13:45:22.996356026 +0200 -@@ -18,7 +18,7 @@ from distutils.version import StrictVers - - - # Minimum version of Python required to build. --MINIMUM_PYTHON_VERSION = StrictVersion('2.7.3') -+MINIMUM_PYTHON_VERSION = StrictVersion('2.6') - MINIMUM_PYTHON_MAJOR = 2 - - -diff -up mozilla-aurora/python/mozbuild/mozpack/chrome/flags.py.python mozilla-aurora/python/mozbuild/mozpack/chrome/flags.py ---- mozilla-aurora/python/mozbuild/mozpack/chrome/flags.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozpack/chrome/flags.py 2014-05-28 13:45:22.996356026 +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-aurora/python/mozbuild/mozpack/copier.py.python mozilla-aurora/python/mozbuild/mozpack/copier.py ---- mozilla-aurora/python/mozbuild/mozpack/copier.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozpack/copier.py 2014-05-28 13:45:22.997356026 +0200 -@@ -13,10 +13,11 @@ from mozpack.files import ( - import mozpack.path - import errno - from collections import ( -- Counter, -- OrderedDict, -+ namedtuple - ) -+from Counter import Counter - -+from ordereddict import OrderedDict - - class FileRegistry(object): - ''' -@@ -468,9 +469,12 @@ class Jarrer(FileRegistry, BaseFile): - old_jar = JarReader(fileobj=dest) - except Exception: - old_jar = [] -- -+ #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]) -- -+ #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-aurora/python/mozbuild/mozpack/files.py.python mozilla-aurora/python/mozbuild/mozpack/files.py ---- mozilla-aurora/python/mozbuild/mozpack/files.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozpack/files.py 2014-05-28 13:45:22.997356026 +0200 -@@ -27,7 +27,7 @@ from mozpack.errors import ( - ) - from mozpack.mozjar import JarReader - import mozpack.path --from collections import OrderedDict -+from ordereddict import OrderedDict - from jsmin import JavascriptMinify - from tempfile import ( - mkstemp, -@@ -215,8 +215,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) -@@ -619,7 +621,10 @@ class MinifiedJavaScript(BaseFile): - input_source = self._file.open().read() - output_source = output.getvalue() - -- with NamedTemporaryFile() as fh1, NamedTemporaryFile() as fh2: -+ fh1 = NamedTemporaryFile().__enter__() -+ fh2 = NamedTemporaryFile().__enter__() -+ if 1: -+ #with NamedTemporaryFile() as fh1, NamedTemporaryFile() as fh2: - fh1.write(input_source) - fh2.write(output_source) - fh1.flush() -@@ -638,6 +643,8 @@ class MinifiedJavaScript(BaseFile): - errors.warn(line) - - return self._file.open() -+ fh1.close() -+ fh2.close() - - return output - -diff -up mozilla-aurora/python/mozbuild/mozpack/manifests.py.python mozilla-aurora/python/mozbuild/mozpack/manifests.py ---- mozilla-aurora/python/mozbuild/mozpack/manifests.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozpack/manifests.py 2014-05-28 13:45:22.997356026 +0200 -@@ -289,7 +289,10 @@ class InstallManifest(object): - self._dests[dest] = entry - - def _get_deps(self, dest): -- return {self._source_file} if self._source_file else set() -+ if self._source_file: -+ return (self._source_file) -+ else: -+ return set() - - def populate_registry(self, registry): - """Populate a mozpack.copier.FileRegistry instance with data from us. -diff -up mozilla-aurora/python/mozbuild/mozpack/mozjar.py.python mozilla-aurora/python/mozbuild/mozpack/mozjar.py ---- mozilla-aurora/python/mozbuild/mozpack/mozjar.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozpack/mozjar.py 2014-05-28 13:45:22.997356026 +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: - 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: -@@ -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. - ''' - 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 -@@ -666,8 +660,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-aurora/python/mozbuild/mozpack/unify.py.python mozilla-aurora/python/mozbuild/mozpack/unify.py ---- mozilla-aurora/python/mozbuild/mozpack/unify.py.python 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozpack/unify.py 2014-05-28 13:45:22.998356026 +0200 -@@ -19,7 +19,7 @@ import mozpack.path - import struct - import os - import subprocess --from collections import OrderedDict -+from ordereddict import OrderedDict - - - def may_unify_binary(file): -diff -up mozilla-aurora/rebase/argparse.py.python mozilla-aurora/rebase/argparse.py ---- mozilla-aurora/rebase/argparse.py.python 2014-05-28 13:45:22.999356026 +0200 -+++ mozilla-aurora/rebase/argparse.py 2014-05-28 13:45:22.999356026 +0200 -@@ -0,0 +1,2362 @@ -+# Author: Steven J. Bethard . -+ -+"""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-aurora/rebase/Counter.py.python mozilla-aurora/rebase/Counter.py ---- mozilla-aurora/rebase/Counter.py.python 2014-05-28 13:45:22.999356027 +0200 -+++ mozilla-aurora/rebase/Counter.py 2014-05-28 13:45:22.999356027 +0200 -@@ -0,0 +1,189 @@ -+from operator import itemgetter -+from heapq import nlargest -+from itertools import repeat, ifilter -+ -+class Counter(dict): -+ '''Dict subclass for counting hashable objects. Sometimes called a bag -+ or multiset. Elements are stored as dictionary keys and their counts -+ are stored as dictionary values. -+ -+ >>> Counter('zyzygy') -+ Counter({'y': 3, 'z': 2, 'g': 1}) -+ -+ ''' -+ -+ def __init__(self, iterable=None, **kwds): -+ '''Create a new, empty Counter object. And if given, count elements -+ from an input iterable. Or, initialize the count from another mapping -+ of elements to their counts. -+ -+ >>> c = Counter() # a new, empty counter -+ >>> c = Counter('gallahad') # a new counter from an iterable -+ >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping -+ >>> c = Counter(a=4, b=2) # a new counter from keyword args -+ -+ ''' -+ self.update(iterable, **kwds) -+ -+ def __missing__(self, key): -+ return 0 -+ -+ def most_common(self, n=None): -+ '''List the n most common elements and their counts from the most -+ common to the least. If n is None, then list all element counts. -+ -+ >>> Counter('abracadabra').most_common(3) -+ [('a', 5), ('r', 2), ('b', 2)] -+ -+ ''' -+ if n is None: -+ return sorted(self.iteritems(), key=itemgetter(1), reverse=True) -+ return nlargest(n, self.iteritems(), key=itemgetter(1)) -+ -+ def elements(self): -+ '''Iterator over elements repeating each as many times as its count. -+ -+ >>> c = Counter('ABCABC') -+ >>> sorted(c.elements()) -+ ['A', 'A', 'B', 'B', 'C', 'C'] -+ -+ If an element's count has been set to zero or is a negative number, -+ elements() will ignore it. -+ -+ ''' -+ for elem, count in self.iteritems(): -+ for _ in repeat(None, count): -+ yield elem -+ -+ # Override dict methods where the meaning changes for Counter objects. -+ -+ @classmethod -+ def fromkeys(cls, iterable, v=None): -+ raise NotImplementedError( -+ 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') -+ -+ def update(self, iterable=None, **kwds): -+ '''Like dict.update() but add counts instead of replacing them. -+ -+ Source can be an iterable, a dictionary, or another Counter instance. -+ -+ >>> c = Counter('which') -+ >>> c.update('witch') # add elements from another iterable -+ >>> d = Counter('watch') -+ >>> c.update(d) # add elements from another counter -+ >>> c['h'] # four 'h' in which, witch, and watch -+ 4 -+ -+ ''' -+ if iterable is not None: -+ if hasattr(iterable, 'iteritems'): -+ if self: -+ self_get = self.get -+ for elem, count in iterable.iteritems(): -+ self[elem] = self_get(elem, 0) + count -+ else: -+ dict.update(self, iterable) # fast path when counter is empty -+ else: -+ self_get = self.get -+ for elem in iterable: -+ self[elem] = self_get(elem, 0) + 1 -+ if kwds: -+ self.update(kwds) -+ -+ def copy(self): -+ 'Like dict.copy() but returns a Counter instance instead of a dict.' -+ return Counter(self) -+ -+ def __delitem__(self, elem): -+ 'Like dict.__delitem__() but does not raise KeyError for missing values.' -+ if elem in self: -+ dict.__delitem__(self, elem) -+ -+ def __repr__(self): -+ if not self: -+ return '%s()' % self.__class__.__name__ -+ items = ', '.join(map('%r: %r'.__mod__, self.most_common())) -+ return '%s({%s})' % (self.__class__.__name__, items) -+ -+ # Multiset-style mathematical operations discussed in: -+ # Knuth TAOCP Volume II section 4.6.3 exercise 19 -+ # and at http://en.wikipedia.org/wiki/Multiset -+ # -+ # Outputs guaranteed to only include positive counts. -+ # -+ # To strip negative and zero counts, add-in an empty counter: -+ # c += Counter() -+ -+ def __add__(self, other): -+ '''Add counts from two counters. -+ -+ >>> Counter('abbb') + Counter('bcc') -+ Counter({'b': 4, 'c': 2, 'a': 1}) -+ -+ -+ ''' -+ if not isinstance(other, Counter): -+ return NotImplemented -+ result = Counter() -+ for elem in set(self) | set(other): -+ newcount = self[elem] + other[elem] -+ if newcount > 0: -+ result[elem] = newcount -+ return result -+ -+ def __sub__(self, other): -+ ''' Subtract count, but keep only results with positive counts. -+ -+ >>> Counter('abbbc') - Counter('bccd') -+ Counter({'b': 2, 'a': 1}) -+ -+ ''' -+ if not isinstance(other, Counter): -+ return NotImplemented -+ result = Counter() -+ for elem in set(self) | set(other): -+ newcount = self[elem] - other[elem] -+ if newcount > 0: -+ result[elem] = newcount -+ return result -+ -+ def __or__(self, other): -+ '''Union is the maximum of value in either of the input counters. -+ -+ >>> Counter('abbb') | Counter('bcc') -+ Counter({'b': 3, 'c': 2, 'a': 1}) -+ -+ ''' -+ if not isinstance(other, Counter): -+ return NotImplemented -+ _max = max -+ result = Counter() -+ for elem in set(self) | set(other): -+ newcount = _max(self[elem], other[elem]) -+ if newcount > 0: -+ result[elem] = newcount -+ return result -+ -+ def __and__(self, other): -+ ''' Intersection is the minimum of corresponding counts. -+ -+ >>> Counter('abbb') & Counter('bcc') -+ Counter({'b': 1}) -+ -+ ''' -+ if not isinstance(other, Counter): -+ return NotImplemented -+ _min = min -+ result = Counter() -+ if len(self) < len(other): -+ self, other = other, self -+ for elem in ifilter(self.__contains__, other): -+ newcount = _min(self[elem], other[elem]) -+ if newcount > 0: -+ result[elem] = newcount -+ return result -+ -+ -+if __name__ == '__main__': -+ import doctest -+ #print doctest.testmod() -diff -up mozilla-aurora/rebase/ordereddict.py.python mozilla-aurora/rebase/ordereddict.py ---- mozilla-aurora/rebase/ordereddict.py.python 2014-05-28 13:45:22.999356027 +0200 -+++ mozilla-aurora/rebase/ordereddict.py 2014-05-28 13:45:22.999356027 +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-aurora/toolkit/components/diskspacewatcher/moz.build.python mozilla-aurora/toolkit/components/diskspacewatcher/moz.build ---- mozilla-aurora/toolkit/components/diskspacewatcher/moz.build.python 2014-05-06 13:17:23.000000000 +0200 -+++ mozilla-aurora/toolkit/components/diskspacewatcher/moz.build 2014-05-28 13:45:22.999356027 +0200 -@@ -14,9 +14,11 @@ EXPORTS += [ - - XPIDL_MODULE = 'diskspacewatcher' - --SOURCES = [ -+SOURCES += [ - 'DiskSpaceWatcher.cpp', - ] -+#print("SOURCES CLASS") -+#print(SOURCES.__class__) - - include('/ipc/chromium/chromium-config.mozbuild') - -diff -up mozilla-aurora/toolkit/components/telemetry/histogram_tools.py.python mozilla-aurora/toolkit/components/telemetry/histogram_tools.py ---- mozilla-aurora/toolkit/components/telemetry/histogram_tools.py.python 2014-05-06 13:17:24.000000000 +0200 -+++ mozilla-aurora/toolkit/components/telemetry/histogram_tools.py 2014-05-28 13:45:22.999356027 +0200 -@@ -6,7 +6,8 @@ import json - import math - import re - --from collections import OrderedDict -+import simplejson as json -+from simplejson import OrderedDict - - def table_dispatch(kind, table, body): - """Call body with table[kind] if it exists. Raise an error otherwise.""" -diff -up mozilla-aurora/toolkit/devtools/acorn/moz.build.python mozilla-aurora/toolkit/devtools/acorn/moz.build ---- mozilla-aurora/toolkit/devtools/acorn/moz.build.python 2014-05-06 13:17:25.000000000 +0200 -+++ mozilla-aurora/toolkit/devtools/acorn/moz.build 2014-05-28 13:45:22.999356027 +0200 -@@ -1,15 +1,14 @@ --# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- --# vim: set filetype=python: --# This Source Code Form is subject to the terms of the Mozilla Public --# 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/. -- --XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini'] -- --JS_MODULES_PATH = 'modules/devtools/acorn' -- --EXTRA_JS_MODULES += [ -- 'acorn.js', -- 'acorn_loose.js', -- 'walk.js', --] -+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- -+# vim: set filetype=python: -+# This Source Code Form is subject to the terms of the Mozilla Public -+# 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/. -+XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini'] -+ -+JS_MODULES_PATH = 'modules/devtools/acorn' -+ -+EXTRA_JS_MODULES += [ -+ 'acorn.js', -+ 'acorn_loose.js', -+ 'walk.js', -+] -diff -up mozilla-aurora/toolkit/mozapps/extensions/internal/moz.build.python mozilla-aurora/toolkit/mozapps/extensions/internal/moz.build ---- mozilla-aurora/toolkit/mozapps/extensions/internal/moz.build.python 2014-05-19 11:43:50.000000000 +0200 -+++ mozilla-aurora/toolkit/mozapps/extensions/internal/moz.build 2014-05-28 13:45:23.000356027 +0200 -@@ -1,31 +1,31 @@ --# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- --# vim: set filetype=python: --# This Source Code Form is subject to the terms of the Mozilla Public --# 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/. -- --JS_MODULES_PATH = 'modules/addons' -- --EXTRA_JS_MODULES += [ -- 'AddonLogging.jsm', -- 'AddonRepository.jsm', -- 'AddonRepository_SQLiteMigrator.jsm', -- 'AddonUpdateChecker.jsm', -- 'Content.js', -- 'LightweightThemeImageOptimizer.jsm', -- 'PluginProvider.jsm', -- 'SpellCheckDictionaryBootstrap.js', --] -- --EXTRA_PP_JS_MODULES += [ -- 'XPIProvider.jsm', -- 'XPIProviderUtils.js', --] -- --# This is used in multiple places, so is defined here to avoid it getting --# out of sync. --DEFINES['MOZ_EXTENSIONS_DB_SCHEMA'] = 16 -- --# Additional debugging info is exposed in debug builds --if CONFIG['MOZ_EM_DEBUG']: -- DEFINES['MOZ_EM_DEBUG'] = 1 -+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- -+# vim: set filetype=python: -+# This Source Code Form is subject to the terms of the Mozilla Public -+# 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/. -+ -+JS_MODULES_PATH = 'modules/addons' -+ -+EXTRA_JS_MODULES += [ -+ 'AddonLogging.jsm', -+ 'AddonRepository.jsm', -+ 'AddonRepository_SQLiteMigrator.jsm', -+ 'AddonUpdateChecker.jsm', -+ 'Content.js', -+ 'LightweightThemeImageOptimizer.jsm', -+ 'PluginProvider.jsm', -+ 'SpellCheckDictionaryBootstrap.js', -+] -+ -+EXTRA_PP_JS_MODULES += [ -+ 'XPIProvider.jsm', -+ 'XPIProviderUtils.js', -+] -+ -+# This is used in multiple places, so is defined here to avoid it getting -+# out of sync. -+DEFINES['MOZ_EXTENSIONS_DB_SCHEMA'] = 16 -+ -+# Additional debugging info is exposed in debug builds -+if CONFIG['MOZ_EM_DEBUG']: -+ DEFINES['MOZ_EM_DEBUG'] = 1 -diff -up mozilla-aurora/toolkit/mozapps/installer/find-dupes.py.python mozilla-aurora/toolkit/mozapps/installer/find-dupes.py ---- mozilla-aurora/toolkit/mozapps/installer/find-dupes.py.python 2014-05-06 13:17:26.000000000 +0200 -+++ mozilla-aurora/toolkit/mozapps/installer/find-dupes.py 2014-05-28 13:45:23.000356027 +0200 -@@ -5,7 +5,7 @@ - import sys - import hashlib - from mozpack.packager.unpack import UnpackFinder --from collections import OrderedDict -+from ordereddict import OrderedDict - - ''' - Find files duplicated in a given packaged directory, independently of its diff --git a/nullptr.patch b/nullptr.patch deleted file mode 100644 index 6b8c515..0000000 --- a/nullptr.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up mozilla-aurora/content/media/fmp4/demuxer/bit_reader.cc.nullptr mozilla-aurora/content/media/fmp4/demuxer/bit_reader.cc ---- mozilla-aurora/content/media/fmp4/demuxer/bit_reader.cc.nullptr 2014-06-04 09:29:19.736999987 +0200 -+++ mozilla-aurora/content/media/fmp4/demuxer/bit_reader.cc 2014-06-04 09:29:32.774000025 +0200 -@@ -5,6 +5,7 @@ - #include "mp4_demuxer/bit_reader.h" - #include - -+#define nullptr NULL - namespace mp4_demuxer { - - BitReader::BitReader(const uint8_t* data, off_t size) diff --git a/remove-ogg.patch b/remove-ogg.patch deleted file mode 100644 index 9bf924b..0000000 --- a/remove-ogg.patch +++ /dev/null @@ -1,449 +0,0 @@ -diff -up mozilla-aurora/config/external/moz.build.remove-ogg mozilla-aurora/config/external/moz.build ---- mozilla-aurora/config/external/moz.build.remove-ogg 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/config/external/moz.build 2014-06-03 13:51:14.450340480 +0200 -@@ -33,14 +33,15 @@ if CONFIG['MOZ_WEBM_ENCODER']: - if CONFIG['MOZ_VPX'] and not CONFIG['MOZ_NATIVE_LIBVPX']: - external_dirs += ['media/libvpx'] - -+if CONFIG['MOZ_OGG']: -+ external_dirs += ['media/libogg', 'media/libtheora'] -+ - if not CONFIG['MOZ_NATIVE_PNG']: - external_dirs += ['media/libpng'] - - external_dirs += [ - 'media/kiss_fft', - 'media/libcubeb', -- 'media/libogg', -- 'media/libtheora', - 'media/libspeex_resampler', - 'media/libsoundtouch', - ] -diff -up mozilla-aurora/configure.in.remove-ogg mozilla-aurora/configure.in ---- mozilla-aurora/configure.in.remove-ogg 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/configure.in 2014-06-03 13:51:14.452340483 +0200 -@@ -3938,6 +3938,7 @@ MOZ_FEEDS=1 - MOZ_WEBAPP_RUNTIME= - MOZ_JSDEBUGGER=1 - MOZ_AUTH_EXTENSION=1 -+MOZ_OGG=1 - MOZ_RAW= - MOZ_VORBIS= - MOZ_TREMOR= -@@ -5191,25 +5192,37 @@ fi - - AC_SUBST(MOZ_RAW) - --dnl Checks for __attribute__(aligned()) directive need by libogg --AC_CACHE_CHECK([__attribute__ ((aligned ())) support], -- [ac_cv_c_attribute_aligned], -- [ac_cv_c_attribute_aligned=0 -- CFLAGS_save="${CFLAGS}" -- CFLAGS="${CFLAGS} -Werror" -- for ac_cv_c_attr_align_try in 64 32 16 8; do -- echo "trying $ac_cv_c_attr_align_try" -- AC_TRY_COMPILE([], -- [static char c __attribute__ ((aligned(${ac_cv_c_attr_align_try}))) = 0; return c;], -- [ac_cv_c_attribute_aligned="${ac_cv_c_attr_align_try}"]) -- if test "$ac_cv_c_attribute_aligned" != 0; then -- break; -- fi -- done -- CFLAGS="${CFLAGS_save}"]) --if test "${ac_cv_c_attribute_aligned}" != "0"; then -- AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], -- [${ac_cv_c_attribute_aligned}],[Maximum supported data alignment]) -+dnl ======================================================== -+dnl = Disable Ogg Codecs -+dnl ======================================================== -+MOZ_ARG_DISABLE_BOOL(ogg, -+[ --disable-ogg Disable support for OGG media (Theora video and Vorbis audio)], -+ MOZ_OGG=, -+ MOZ_OGG=1) -+ -+if test -n "$MOZ_OGG"; then -+ AC_DEFINE(MOZ_OGG) -+ -+ dnl Checks for __attribute__(aligned()) directive -+ AC_CACHE_CHECK([__attribute__ ((aligned ())) support], -+ [ac_cv_c_attribute_aligned], -+ [ac_cv_c_attribute_aligned=0 -+ CFLAGS_save="${CFLAGS}" -+ CFLAGS="${CFLAGS} -Werror" -+ for ac_cv_c_attr_align_try in 64 32 16 8; do -+ echo "trying $ac_cv_c_attr_align_try" -+ AC_TRY_COMPILE([], -+ [static char c __attribute__ ((aligned(${ac_cv_c_attr_align_try}))) = 0; return c;], -+ [ac_cv_c_attribute_aligned="${ac_cv_c_attr_align_try}"]) -+ if test "$ac_cv_c_attribute_aligned" != 0; then -+ break; -+ fi -+ done -+ CFLAGS="${CFLAGS_save}"]) -+ if test "${ac_cv_c_attribute_aligned}" != "0"; then -+ AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], -+ [${ac_cv_c_attribute_aligned}],[Maximum supported data alignment]) -+ fi - fi - - dnl ======================================================== -@@ -5426,7 +5439,7 @@ AC_SUBST(MOZ_NATIVE_LIBVPX) - AC_SUBST(MOZ_LIBVPX_CFLAGS) - AC_SUBST(MOZ_LIBVPX_LIBS) - --if test "$MOZ_WEBM"; then -+if test "$MOZ_WEBM" -o "$MOZ_OGG"; then - if test "$MOZ_SAMPLE_TYPE_FLOAT32"; then - MOZ_VORBIS=1 - else -@@ -5533,6 +5546,15 @@ dnl ==================================== - dnl = Handle dependent MEDIA defines - dnl ======================================================== - -+if test -n "$MOZ_OPUS" -a -z "$MOZ_OGG"; then -+ AC_MSG_ERROR([MOZ_OPUS requires MOZ_OGG which is disabled.]) -+fi -+ -+if test -n "$MOZ_VORBIS" -a -z "$MOZ_OGG"; then -+ AC_MSG_ERROR([MOZ_VORBIS requires MOZ_OGG which is disabled. -+Note that you need vorbis support for WebM playback.]) -+fi -+ - if test -n "$MOZ_VORBIS" -a -n "$MOZ_TREMOR"; then - AC_MSG_ERROR([MOZ_VORBIS and MOZ_TREMOR are mutually exclusive! The build system should not allow them both to be set, but they are. Please file a bug at https://bugzilla.mozilla.org/]) - fi -@@ -8842,6 +8864,7 @@ AC_SUBST(MOZ_APPLEMEDIA) - AC_SUBST(MOZ_OMX_PLUGIN) - AC_SUBST(MOZ_VPX_ERROR_CONCEALMENT) - AC_SUBST(MOZ_VPX) -+AC_SUBST(MOZ_OGG) - AC_SUBST(VPX_AS) - AC_SUBST(VPX_ASFLAGS) - AC_SUBST(VPX_DASH_C_FLAG) -diff -up mozilla-aurora/content/html/content/src/HTMLAudioElement.cpp.remove-ogg mozilla-aurora/content/html/content/src/HTMLAudioElement.cpp ---- mozilla-aurora/content/html/content/src/HTMLAudioElement.cpp.remove-ogg 2014-05-06 13:17:19.000000000 +0200 -+++ mozilla-aurora/content/html/content/src/HTMLAudioElement.cpp 2014-06-03 13:51:14.452340483 +0200 -@@ -81,12 +81,16 @@ nsresult HTMLAudioElement::SetAcceptHead - #ifdef MOZ_WEBM - "audio/webm," - #endif -+#ifdef MOZ_OGG - "audio/ogg," -+#endif - #ifdef MOZ_WAVE - "audio/wav," - #endif - "audio/*;q=0.9," -+#ifdef MOZ_OGG - "application/ogg;q=0.7," -+#endif - "video/*;q=0.6,*/*;q=0.5"); - - return aChannel->SetRequestHeader(NS_LITERAL_CSTRING("Accept"), -diff -up mozilla-aurora/content/html/content/src/HTMLVideoElement.cpp.remove-ogg mozilla-aurora/content/html/content/src/HTMLVideoElement.cpp ---- mozilla-aurora/content/html/content/src/HTMLVideoElement.cpp.remove-ogg 2014-05-06 13:17:19.000000000 +0200 -+++ mozilla-aurora/content/html/content/src/HTMLVideoElement.cpp 2014-06-03 13:51:14.452340483 +0200 -@@ -136,9 +136,13 @@ nsresult HTMLVideoElement::SetAcceptHead - #ifdef MOZ_WEBM - "video/webm," - #endif -+#ifdef MOZ_OGG - "video/ogg," -+#endif - "video/*;q=0.9," -+#ifdef MOZ_OGG - "application/ogg;q=0.7," -+#endif - "audio/*;q=0.6,*/*;q=0.5"); - - return aChannel->SetRequestHeader(NS_LITERAL_CSTRING("Accept"), -diff -up mozilla-aurora/content/media/DecoderTraits.cpp.remove-ogg mozilla-aurora/content/media/DecoderTraits.cpp ---- mozilla-aurora/content/media/DecoderTraits.cpp.remove-ogg 2014-05-06 13:17:20.000000000 +0200 -+++ mozilla-aurora/content/media/DecoderTraits.cpp 2014-06-03 13:51:14.452340483 +0200 -@@ -13,8 +13,10 @@ - #include "MediaPluginHost.h" - #endif - -+#ifdef MOZ_OGG - #include "OggDecoder.h" - #include "OggReader.h" -+#endif - #ifdef MOZ_WAVE - #include "WaveDecoder.h" - #include "WaveReader.h" -@@ -100,6 +102,7 @@ IsRawType(const nsACString& aType) - } - #endif - -+#ifdef MOZ_OGG - // See http://www.rfc-editor.org/rfc/rfc5334.txt for the definitions - // of Ogg media types and codec types - static const char* const gOggTypes[4] = { -@@ -131,6 +134,7 @@ IsOggType(const nsACString& aType) - - return CodecListContains(gOggTypes, aType); - } -+#endif - - #ifdef MOZ_WAVE - // See http://www.rfc-editor.org/rfc/rfc2361.txt for the definitions -@@ -199,8 +203,10 @@ IsGStreamerSupportedType(const nsACStrin - if (IsWebMType(aMimeType) && !Preferences::GetBool("media.prefer-gstreamer", false)) - return false; - #endif -+#ifdef MOZ_OGG - if (IsOggType(aMimeType) && !Preferences::GetBool("media.prefer-gstreamer", false)) - return false; -+#endif - - return GStreamerDecoder::CanHandleMediaType(aMimeType, nullptr); - } -@@ -370,10 +376,12 @@ DecoderTraits::CanHandleMediaType(const - result = CANPLAY_MAYBE; - } - #endif -+#ifdef MOZ_OGG - if (IsOggType(nsDependentCString(aMIMEType))) { - codecList = MediaDecoder::IsOpusEnabled() ? gOggCodecsWithOpus : gOggCodecs; - result = CANPLAY_MAYBE; - } -+#endif - #ifdef MOZ_WAVE - if (IsWaveType(nsDependentCString(aMIMEType))) { - codecList = gWaveCodecs; -@@ -479,10 +487,12 @@ InstantiateDecoder(const nsACString& aTy - return decoder.forget(); - } - #endif -+#ifdef MOZ_OGG - if (IsOggType(aType)) { - decoder = new OggDecoder(); - return decoder.forget(); - } -+#endif - #ifdef MOZ_WAVE - if (IsWaveType(aType)) { - decoder = new WaveDecoder(); -@@ -587,9 +597,11 @@ MediaDecoderReader* DecoderTraits::Creat - decoderReader = new RawReader(aDecoder); - } else - #endif -+#ifdef MOZ_OGG - if (IsOggType(aType)) { - decoderReader = new OggReader(aDecoder); - } else -+#endif - #ifdef MOZ_WAVE - if (IsWaveType(aType)) { - decoderReader = new WaveReader(aDecoder); -@@ -642,7 +654,9 @@ MediaDecoderReader* DecoderTraits::Creat - bool DecoderTraits::IsSupportedInVideoDocument(const nsACString& aType) - { - return -+#ifdef MOZ_OGG - IsOggType(aType) || -+#endif - #ifdef MOZ_OMX_DECODER - // We support amr inside WebApps on firefoxOS but not in general web content. - // Ensure we dont create a VideoDocument when accessing amr URLs directly. -diff -up mozilla-aurora/content/media/encoder/MediaEncoder.cpp.remove-ogg mozilla-aurora/content/media/encoder/MediaEncoder.cpp ---- mozilla-aurora/content/media/encoder/MediaEncoder.cpp.remove-ogg 2014-05-06 13:17:20.000000000 +0200 -+++ mozilla-aurora/content/media/encoder/MediaEncoder.cpp 2014-06-03 13:51:14.453340485 +0200 -@@ -9,7 +9,9 @@ - #include "prlog.h" - #include "mozilla/Preferences.h" - -+#ifdef MOZ_OGG - #include "OggWriter.h" -+#endif - #ifdef MOZ_OPUS - #include "OpusTrackEncoder.h" - -@@ -133,6 +135,7 @@ MediaEncoder::CreateEncoder(const nsAStr - mimeType = NS_LITERAL_STRING(AUDIO_3GPP); - } - #endif // MOZ_OMX_ENCODER -+#ifdef MOZ_OGG - else if (MediaDecoder::IsOggEnabled() && MediaDecoder::IsOpusEnabled() && - (aMIMEType.EqualsLiteral(AUDIO_OGG) || - (aTrackTypes & ContainerWriter::CREATE_AUDIO_TRACK))) { -@@ -142,6 +145,7 @@ MediaEncoder::CreateEncoder(const nsAStr - NS_ENSURE_TRUE(audioEncoder, nullptr); - mimeType = NS_LITERAL_STRING(AUDIO_OGG); - } -+#endif // MOZ_OGG - else { - LOG(PR_LOG_ERROR, ("Can not find any encoder to record this media stream")); - return nullptr; -diff -up mozilla-aurora/content/media/MediaDecoder.cpp.remove-ogg mozilla-aurora/content/media/MediaDecoder.cpp ---- mozilla-aurora/content/media/MediaDecoder.cpp.remove-ogg 2014-05-06 13:17:20.000000000 +0200 -+++ mozilla-aurora/content/media/MediaDecoder.cpp 2014-06-03 13:51:14.453340485 +0200 -@@ -1653,6 +1653,7 @@ MediaDecoder::IsRawEnabled() - } - #endif - -+#ifdef MOZ_OGG - bool - MediaDecoder::IsOpusEnabled() - { -@@ -1668,6 +1669,7 @@ MediaDecoder::IsOggEnabled() - { - return Preferences::GetBool("media.ogg.enabled"); - } -+#endif - - #ifdef MOZ_WAVE - bool -diff -up mozilla-aurora/content/media/MediaDecoder.h.remove-ogg mozilla-aurora/content/media/MediaDecoder.h ---- mozilla-aurora/content/media/MediaDecoder.h.remove-ogg 2014-05-06 13:17:20.000000000 +0200 -+++ mozilla-aurora/content/media/MediaDecoder.h 2014-06-03 13:51:14.453340485 +0200 -@@ -844,8 +844,10 @@ public: - static bool IsRawEnabled(); - #endif - -+#ifdef MOZ_OGG - static bool IsOggEnabled(); - static bool IsOpusEnabled(); -+#endif - - #ifdef MOZ_WAVE - static bool IsWaveEnabled(); -diff -up mozilla-aurora/content/media/moz.build.remove-ogg mozilla-aurora/content/media/moz.build ---- mozilla-aurora/content/media/moz.build.remove-ogg 2014-05-06 13:17:20.000000000 +0200 -+++ mozilla-aurora/content/media/moz.build 2014-06-03 13:51:14.453340485 +0200 -@@ -7,7 +7,6 @@ - PARALLEL_DIRS += [ - 'encoder', - 'mediasource', -- 'ogg', - 'webaudio', - 'webvtt' - ] -@@ -17,6 +16,9 @@ TEST_TOOL_DIRS += ['compiledtest'] - if CONFIG['MOZ_RAW']: - PARALLEL_DIRS += ['raw'] - -+if CONFIG['MOZ_OGG']: -+ PARALLEL_DIRS += ['ogg'] -+ - if CONFIG['MOZ_WAVE']: - PARALLEL_DIRS += ['wave'] - -diff -up mozilla-aurora/layout/media/symbols.def.in.remove-ogg mozilla-aurora/layout/media/symbols.def.in ---- mozilla-aurora/layout/media/symbols.def.in.remove-ogg 2014-05-06 13:17:13.000000000 +0200 -+++ mozilla-aurora/layout/media/symbols.def.in 2014-06-03 13:51:14.454340486 +0200 -@@ -145,6 +145,7 @@ cubeb_stream_init - cubeb_stream_start - cubeb_stream_stop - cubeb_stream_get_latency -+#ifdef MOZ_OGG - th_comment_clear - th_comment_init - th_decode_alloc -@@ -158,6 +159,7 @@ th_info_init - th_packet_isheader - th_packet_iskeyframe - th_setup_free -+#endif - #ifdef MOZ_OPUS - opus_decoder_create - opus_decoder_destroy -diff -up mozilla-aurora/modules/libpref/src/init/all.js.remove-ogg mozilla-aurora/modules/libpref/src/init/all.js ---- mozilla-aurora/modules/libpref/src/init/all.js.remove-ogg 2014-05-19 11:43:49.000000000 +0200 -+++ mozilla-aurora/modules/libpref/src/init/all.js 2014-06-03 13:51:25.028355239 +0200 -@@ -212,7 +212,9 @@ pref("media.fragmented-mp4.use-blank-dec - #ifdef MOZ_RAW - pref("media.raw.enabled", true); - #endif -+#ifdef MOZ_OGG - pref("media.ogg.enabled", true); -+#endif - #ifdef MOZ_OPUS - pref("media.opus.enabled", true); - #endif -diff -up mozilla-aurora/python/mozbuild/mozbuild/mozinfo.py.remove-ogg mozilla-aurora/python/mozbuild/mozbuild/mozinfo.py ---- mozilla-aurora/python/mozbuild/mozbuild/mozinfo.py.remove-ogg 2014-05-06 13:17:17.000000000 +0200 -+++ mozilla-aurora/python/mozbuild/mozbuild/mozinfo.py 2014-06-03 13:51:25.028355239 +0200 -@@ -84,6 +84,7 @@ def build_dict(config, env=os.environ): - d['tests_enabled'] = substs.get('ENABLE_TESTS') == "1" - d['bin_suffix'] = substs.get('BIN_SUFFIX', '') - -+ d['ogg'] = bool(substs.get('MOZ_OGG')) - d['webm'] = bool(substs.get('MOZ_WEBM')) - d['wave'] = bool(substs.get('MOZ_WAVE')) - -diff -up mozilla-aurora/uriloader/exthandler/nsExternalHelperAppService.cpp.remove-ogg mozilla-aurora/uriloader/exthandler/nsExternalHelperAppService.cpp ---- mozilla-aurora/uriloader/exthandler/nsExternalHelperAppService.cpp.remove-ogg 2014-05-06 13:17:27.000000000 +0200 -+++ mozilla-aurora/uriloader/exthandler/nsExternalHelperAppService.cpp 2014-06-03 13:51:25.030355242 +0200 -@@ -462,6 +462,7 @@ static nsDefaultMimeTypeEntry defaultMim - { "application/xhtml+xml", "xhtml" }, - { "application/xhtml+xml", "xht" }, - { TEXT_PLAIN, "txt" }, -+#ifdef MOZ_OGG - { VIDEO_OGG, "ogv" }, - { VIDEO_OGG, "ogg" }, - { APPLICATION_OGG, "ogg" }, -@@ -469,6 +470,7 @@ static nsDefaultMimeTypeEntry defaultMim - #ifdef MOZ_OPUS - { AUDIO_OGG, "opus" }, - #endif -+#endif - #ifdef MOZ_WEBM - { VIDEO_WEBM, "webm" }, - { AUDIO_WEBM, "webm" }, -diff -up mozilla-aurora/xpcom/build/nsXPComInit.cpp.remove-ogg mozilla-aurora/xpcom/build/nsXPComInit.cpp ---- mozilla-aurora/xpcom/build/nsXPComInit.cpp.remove-ogg 2014-06-03 14:04:38.913464144 +0200 -+++ mozilla-aurora/xpcom/build/nsXPComInit.cpp 2014-06-03 14:06:03.282582245 +0200 -@@ -133,7 +133,9 @@ extern nsresult nsStringInputStreamConst - #include "mozilla/VisualEventTracer.h" - #endif - -+#if MOZ_OGG - #include "ogg/ogg.h" -+#endif - #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING) - #include "vpx_mem/vpx_mem.h" - #endif -@@ -378,7 +380,7 @@ private: - NS_IMPL_ISUPPORTS(ICUReporter, nsIMemoryReporter) - - /* static */ template<> Atomic CountingAllocatorBase::sAmount(0); -- -+#if MOZ_OGG - class OggReporter MOZ_FINAL : public nsIMemoryReporter, - public CountingAllocatorBase - { -@@ -420,7 +422,7 @@ NS_IMPL_ISUPPORTS(VPXReporter, nsIMemory - - /* static */ template<> Atomic CountingAllocatorBase::sAmount(0); - #endif /* MOZ_VPX */ -- -+#endif /* MOZ_OGG */ - #ifdef MOZ_WEBM - class NesteggReporter MOZ_FINAL : public nsIMemoryReporter - , public CountingAllocatorBase -@@ -606,12 +608,13 @@ NS_InitXPCOM2(nsIServiceManager* *result - // depend on the XPCOM-based memory reporting goop. So for now, we have - // this oddness. - mozilla::SetICUMemoryFunctions(); -- -+#if MOZ_OGG - // Do the same for libogg. - ogg_set_mem_functions(OggReporter::CountingMalloc, - OggReporter::CountingCalloc, - OggReporter::CountingRealloc, - OggReporter::CountingFree); -+#endif - - #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING) - // And for VPX. -@@ -678,7 +681,9 @@ NS_InitXPCOM2(nsIServiceManager* *result - - // The memory reporter manager is up and running -- register our reporters. - RegisterStrongMemoryReporter(new ICUReporter()); -+#if MOZ_OGG - RegisterStrongMemoryReporter(new OggReporter()); -+#endif - #ifdef MOZ_VPX - RegisterStrongMemoryReporter(new VPXReporter()); - #endif diff --git a/rhbz-966424.patch b/rhbz-966424.patch deleted file mode 100644 index c4c332e..0000000 --- a/rhbz-966424.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/toolkit/modules/CertUtils.jsm -+++ b/toolkit/modules/CertUtils.jsm -@@ -170,17 +170,19 @@ this.checkCert = - issuerCert = issuerCert.QueryInterface(Ci.nsIX509Cert3); - var tokenNames = issuerCert.getAllTokenNames({}); - - if (!tokenNames || !tokenNames.some(isBuiltinToken)) - throw new Ce(certNotBuiltInErr, Cr.NS_ERROR_ABORT); - } - - function isBuiltinToken(tokenName) { -- return tokenName == "Builtin Object Token"; -+ return tokenName == "Builtin Object Token" || -+ tokenName == "Default Trust" || -+ tokenName == "System Trust"; - } - - /** - * This class implements nsIBadCertListener. Its job is to prevent "bad cert" - * security dialogs from being shown to the user. It is better to simply fail - * if the certificate is bad. See bug 304286. - * - * @param aAllowNonBuiltInCerts (optional) diff --git a/sources b/sources deleted file mode 100644 index 0a4f031..0000000 --- a/sources +++ /dev/null @@ -1,3 +0,0 @@ -3d9c8a52ba75fcee5655839ab00cbda4 lightning-3.3.source.tar.bz2 -620cbeb932d910e1e33bebc47fff2f9c l10n-3.3.tar.xz -0bbe3a2e5e4cac040013733aca159d89 simplejson-2.1.1.tar.gz diff --git a/thunderbird-lightning.spec b/thunderbird-lightning.spec deleted file mode 100644 index b93efc4..0000000 --- a/thunderbird-lightning.spec +++ /dev/null @@ -1,400 +0,0 @@ -# Use system nspr/nss? -%global system_nss 1 - -%if 0%{?fedora} < 20 -%global system_sqlite 0 -%global system_ffi 0 -%else -%global system_sqlite 1 -%global system_ffi 1 -%endif - -%if %{?system_nss} -%global nspr_version 4.10.6 -%global nspr_build_version %(pkg-config --silence-errors --modversion nspr 2>/dev/null || echo 65536) -%global nss_version 3.16.1 -%global nss_build_version %(pkg-config --silence-errors --modversion nss 2>/dev/null || echo 65536) -%endif - -%global cairo_version 1.8.8 -%global freetype_version 2.1.9 - -%if %{?system_sqlite} -%global sqlite_version 3.8.4.2 -# The actual sqlite version (see #480989): -%global sqlite_build_version %(pkg-config --silence-errors --modversion sqlite3 2>/dev/null || echo 65536) -%endif - -%global libnotify_version 0.4 -%global libvpx_version 1.3.0 -# Update these two as a pair - see calendar/lightning/install.rdf and mail/config/version.txt -%global thunderbird_version 31.0 -%global thunderbird_next_version 32.0 -%global lightning_version 3.3 -# Bump one with each minor lightning release -%global gdata_version 0.32 -# Compatible versions are listed in: -# comm-release/calendar/lightning/install.rdf.rej -# comm-release/calendar/providers/gdata/install.rdf.rej -%global moz_objdir objdir -%global lightning_extname %{_libdir}/mozilla/extensions/{3550f703-e582-4d05-9a08-453d09bdfdc6}/{e2fda1a4-762b-4020-b5ad-a41df1933103} -%global gdata_extname %{_libdir}/mozilla/extensions/{3550f703-e582-4d05-9a08-453d09bdfdc6}/{a62ef8ec-5fdc-40c2-873c-223b8a6925cc} - -# The tarball is pretty inconsistent with directory structure. -# Sometimes there is a top level directory. That goes here. -# -# IMPORTANT: If there is no top level directory, this should be -# set to the cwd, ie: '.' -#global tarballdir . -%global tarballdir comm-esr31 - -%global version_internal 2 -%global mozappdir %{_libdir}/%{name}-%{version_internal} - -Name: thunderbird-lightning -Summary: The calendar extension to Thunderbird -Version: %{lightning_version} -# Must bump release unless gdata_version is increased too -Release: 1%{?dist} -URL: http://www.mozilla.org/projects/calendar/lightning/ -License: MPLv1.1 or GPLv2+ or LGPLv2+ -Group: Applications/Productivity -Source0: http://ftp.mozilla.org/pub/mozilla.org/calendar/lightning/releases/%{version}/source/lightning-%{version}.source.tar.bz2 -#Source0: http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/%{thunderbird_version}/source/thunderbird-%{thunderbird_version}.source.tar.bz2 -# This script will generate the language source below -Source1: mklangsource.sh -Source2: l10n-%{version}.tar.xz -# Config file for compilation -Source10: thunderbird-mozconfig -# Finds requirements provided outside of the current file set -Source100: find-external-requires -Source200: simplejson-2.1.1.tar.gz - -# Build patches -Patch1: mozilla-build-arm.patch -Patch15: disable-webm.patch -Patch16: nullptr.patch - -# EL6 Specific -# Use old python -Patch097: mozilla-python.patch -Patch104: rhbz-966424.patch -Patch105: xulrunner-24.0-jemalloc-ppc.patch -Patch106: xulrunner-24.0-s390-inlines.patch -Patch107: firefox-system-nss-3.16.2.patch -Patch108: remove-ogg.patch - -# Thunderbird specific -Patch301: thunderbird-objdir.patch -Patch302: array_len.patch - -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -%if %{?system_nss} -BuildRequires: nspr-devel >= %{nspr_version} -BuildRequires: nss-devel >= %{nss_version} -Requires: nspr >= %{nspr_build_version} -Requires: nss >= %{nss_build_version} -%if 0%{?fedora} -BuildRequires: nss-static -%endif -%endif -BuildRequires: cairo-devel >= %{cairo_version} -BuildRequires: libnotify-devel >= %{libnotify_version} -BuildRequires: libpng-devel -BuildRequires: libjpeg-devel -BuildRequires: zip -BuildRequires: bzip2-devel -BuildRequires: zlib-devel -BuildRequires: libIDL-devel -BuildRequires: gtk2-devel -BuildRequires: gnome-vfs2-devel -BuildRequires: libgnome-devel -BuildRequires: libgnomeui-devel -BuildRequires: krb5-devel -BuildRequires: pango-devel -BuildRequires: freetype-devel >= %{freetype_version} -BuildRequires: libXt-devel -BuildRequires: libXrender-devel -BuildRequires: hunspell-devel -%if %{?system_sqlite} -BuildRequires: sqlite-devel >= %{sqlite_version} -%endif -BuildRequires: startup-notification-devel -BuildRequires: alsa-lib-devel -BuildRequires: autoconf213 -BuildRequires: desktop-file-utils -BuildRequires: libcurl-devel -BuildRequires: python-ordereddict -BuildRequires: python-simplejson -BuildRequires: yasm -BuildRequires: mesa-libGL-devel -BuildRequires: pulseaudio-libs-devel -%if %{?system_ffi} -BuildRequires: libffi-devel -%endif -Requires: thunderbird >= %{thunderbird_version} -Requires: thunderbird < %{thunderbird_next_version} -Obsoletes: thunderbird-lightning-wcap <= 0.8 -Provides: thunderbird-lightning-wcap = %{version}-%{release} - -%if 0%{?rhel} <= 6 -AutoProv: 0 -%global _use_internal_dependency_generator 0 -%global __find_requires %{SOURCE100} -%else -%global __provides_exclude_from ^%{_libdir}/mozilla/.*$ -%global __requires_exclude_from ^%{_libdir}/mozilla/.*$ -%endif - - -%description -Lightning brings the Sunbird calendar to the popular email client, -Mozilla Thunderbird. Since it's an extension, Lightning is tightly -integrated with Thunderbird, allowing it to easily perform email-related -calendaring tasks. - - -%package gdata -Summary: Lightning data provider for Google Calendar -Version: %{gdata_version} -Requires: %{name}%{?_isa} = %{lightning_version}-%{release} - -%description gdata -This extension allows Lightning to read and write events to a Google Calendar. - -Please read http://wiki.mozilla.org/Calendar:GDATA_Provider for more details -and before filing a bug. Also, be sure to visit the dicussion forums, maybe -your bug already has a solution! - - -%prep -%setup -q -c -a 2 -cd %{tarballdir} - -# xulrunner patches -cd mozilla -%patch097 -p1 -b .python -%patch104 -p1 -b .rhbz-966424 -%patch105 -p2 -b .jemalloc-ppc -%patch106 -p1 -b .s390 -%patch107 -p3 -b .system_nss -%patch108 -p1 -b .remove-ogg -%patch15 -p1 -b .disable-webm -%patch16 -p1 -b .nullptr -cd - - -# thunderbird specific patches -%patch301 -p2 -b .objdir -%patch302 -p1 -b .array_len - -#sed -e 's/__RPM_VERSION_INTERNAL__/%{version_internal}/' %{P:%%PATCH0} \ -# > version.patch -#%{__patch} -p1 -b --suffix .version --fuzz=0 < version.patch -cd mozilla -%patch1 -p2 -b .arm-fix -cd .. - -%{__rm} -f .mozconfig -%{__cp} %{SOURCE10} .mozconfig - -%if %{?system_nss} -echo "ac_add_options --with-system-nspr" >> .mozconfig -echo "ac_add_options --with-system-nss" >> .mozconfig -%else -echo "ac_add_options --without-system-nspr" >> .mozconfig -echo "ac_add_options --without-system-nss" >> .mozconfig -%endif - -%ifarch %{arm} -echo "ac_add_options --disable-elf-hack" >> .mozconfig -%endif - -%ifnarch %{ix86} x86_64 -echo "ac_add_options --disable-webrtc" >> .mozconfig -%endif - -%if %{?system_sqlite} -echo "ac_add_options --enable-system-sqlite" >> .mozconfig -%else -echo "ac_add_options --disable-system-sqlite" >> .mozconfig -%endif - -%if %{?system_ffi} -echo "ac_add_options --enable-system-ffi" >> .mozconfig -%endif - -%ifnarch %{ix86} x86_64 -echo "ac_add_options --disable-methodjit" >> .mozconfig -echo "ac_add_options --disable-monoic" >> .mozconfig -echo "ac_add_options --disable-polyic" >> .mozconfig -echo "ac_add_options --disable-tracejit" >> .mozconfig -%endif - -echo "ac_add_options --enable-system-hunspell" >> .mozconfig -echo "ac_add_options --enable-libnotify" >> .mozconfig -echo "ac_add_options --enable-startup-notification" >> .mozconfig -echo "ac_add_options --without-system-libvpx" >> .mozconfig -echo "ac_add_options --disable-webm" >> .mozconfig -echo "ac_add_options --disable-webrtc" >> .mozconfig -echo "ac_add_options --disable-ogg" >> .mozconfig -echo "ac_add_options --disable-opus" >> .mozconfig - -echo "ac_add_options --disable-debug" >> .mozconfig -echo "ac_add_options --enable-optimize" >> .mozconfig - -# Fix permissions -find -name \*.js -type f | xargs chmod -x - -#=============================================================================== - -%build -%if %{?system_sqlite} -# Do not proceed with build if the sqlite require would be broken: -# make sure the minimum requirement is non-empty, ... -sqlite_version=$(expr "%{sqlite_version}" : '\([0-9]*\.\)[0-9]*\.') || exit 1 -# ... and that major number of the computed build-time version matches: -case "%{sqlite_build_version}" in - "$sqlite_version"*) ;; - *) exit 1 ;; -esac -%endif - -cd %{tarballdir} - -# Set PYTHON PATH to directory which contains libraries used for backport to Python 2.6 -export PYTHONPATH=`pwd`/mozilla/rebase -# install python modules -tar xz -C `pwd`/mozilla/rebase --strip-components=1 -f %{SOURCE200} simplejson-2.1.1/simplejson - -# Update the various config.guess to upstream release for aarch64 support -find ./ -name config.guess -exec cp /usr/lib/rpm/config.guess {} ';' - -INTERNAL_GECKO=%{version_internal} -MOZ_APP_DIR=%{mozappdir} - -# Mozilla builds with -Wall with exception of a few warnings which show up -# everywhere in the code; so, don't override that. -# -# Disable C++ exceptions since Mozilla code is not exception-safe -# -MOZ_OPT_FLAGS=$(echo "$RPM_OPT_FLAGS -fpermissive" | \ - %{__sed} -e 's/-Wall//') -export CFLAGS=$MOZ_OPT_FLAGS -export CXXFLAGS=$MOZ_OPT_FLAGS - -export PREFIX='%{_prefix}' -export LIBDIR='%{_libdir}' - -%global moz_make_flags -j1 -%ifarch ppc ppc64 s390 s390x -%global moz_make_flags -j1 -%else -# temp override of %global moz_make_flags %{?_smp_mflags} -%global moz_make_flags -j1 -%endif - -export LDFLAGS="-Wl,-rpath,%{mozappdir}" -export MAKE="gmake %{moz_make_flags}" -make -f client.mk build STRIP=/bin/true - -# Package l10n files -cd %{moz_objdir}/calendar/lightning -#make AB_CD=all L10N_XPI_NAME=lightning-all repack-clobber-all -make AB_CD=all L10N_XPI_NAME=lightning-all repack-stage-all -grep -v 'osx' ../../../calendar/locales/shipped-locales | while read lang x -do - # Skip cs for now - [ $lang = cs ] && continue - make AB_CD=all L10N_XPI_NAME=lightning-all libs-$lang -done - -#=============================================================================== - -%install -rm -rf $RPM_BUILD_ROOT -cd %{tarballdir} - -# Avoid "Chrome Registration Failed" message on first startup and extension installation -mkdir -p $RPM_BUILD_ROOT%{lightning_extname} -touch $RPM_BUILD_ROOT%{lightning_extname}/chrome.manifest -mkdir -p $RPM_BUILD_ROOT%{gdata_extname} -touch $RPM_BUILD_ROOT%{gdata_extname}/chrome.manifest - -# Lightning and GData provider for it -unzip -qod $RPM_BUILD_ROOT%{lightning_extname} %{moz_objdir}/mozilla/dist/xpi-stage/lightning-%{lightning_version}.all.linux-*.xpi -unzip -qod $RPM_BUILD_ROOT%{gdata_extname} %{moz_objdir}/mozilla/dist/xpi-stage/gdata-provider-%{gdata_version}.en-US.linux-*.xpi - -# Fix up permissions -find $RPM_BUILD_ROOT -name \*.so | xargs chmod 0755 - -#=============================================================================== - -%clean -%{__rm} -rf $RPM_BUILD_ROOT - -#=============================================================================== - -%files -%doc %{tarballdir}/mozilla/LEGAL %{tarballdir}/mozilla/LICENSE %{tarballdir}/mozilla/README.txt -%{lightning_extname} - -%files gdata -%doc %{tarballdir}/mozilla/LEGAL %{tarballdir}/mozilla/LICENSE %{tarballdir}/mozilla/README.txt -%{gdata_extname} - -#=============================================================================== - -%changelog -* Tue Oct 21 2014 Orion Poplawski - 3.3-1 -- Update to 3.3 (gdata 0.32) -- Sync system library build options with thunderbird - -* Thu May 15 2014 Orion Poplawski - 2.6.5-2 -- Update to 2.6.5 -- Fix build with -Werror=format-security (bug #1037355) -- Sync thunderbird-mozoptions from thunderbird package - -* Wed Dec 11 2013 Orion Poplawski - 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 Nov 20 2012 Jan Horak - 1.9-1 -- Update to 1.9 -- Bump required TB version -- Drop gcc47 patch -- Add patches from EL6 thunderbird srpm - -* Wed Mar 14 2012 Orion Poplawski - 1.2.3-1 -- Update to 1.2.3 -- Add patch from EL6 TB to fix ppc64 pcre build issue - -* Wed Mar 14 2012 Orion Poplawski - 1.2.1-1 -- Update to 1.2.1 -- Disable using system cairo - too old in EL6 - -* Fri Feb 17 2012 Orion Poplawski 1.0-0.44.b3pre -- Build l10n - -* Fri Feb 17 2012 Orion Poplawski 1.0-0.43.b3pre -- Update to thunderbird 3.1.18 source -- EL6 has nss-devel, no nss-static - -* Tue Jun 28 2011 Orion Poplawski 1.0-0.42.b3pre -- Update to thunderbird 3.1.11 source -- Drop notify patch, fixed upstream -- Change BR nss-devel to nss-static (Bug 717246) -- Add BR python - -* Mon Apr 11 2011 Orion Poplawski 1.0-0.41.b3pre -- Fix debuginfo builds -- Remove official branding sections -- Don't unpack the .xpi - -* Wed Apr 6 2011 Orion Poplawski 1.0-0.40.b3pre -- Fixup some file permissions -- Minor review cleanups - -* Mon Apr 4 2011 Orion Poplawski 1.0-0.39.b3pre -- Initial packaging, based on thunderbird 3.1.9 diff --git a/thunderbird-mozconfig b/thunderbird-mozconfig deleted file mode 100644 index 2a45066..0000000 --- a/thunderbird-mozconfig +++ /dev/null @@ -1,47 +0,0 @@ -mk_add_options MOZ_CO_PROJECT=mail -ac_add_options --enable-application=mail -mk_add_options AUTOCONF=autoconf-2.13 - -# xulrunner related: -# --with-system-png is disabled because Mozilla requires APNG support in libpng -#ac_add_options --with-system-png - -ac_add_options --prefix="$PREFIX" -ac_add_options --libdir="$LIBDIR" -ac_add_options --with-system-jpeg -ac_add_options --with-system-zlib -ac_add_options --with-system-bz2 -ac_add_options --disable-system-cairo -ac_add_options --with-pthreads -ac_add_options --disable-strip -ac_add_options --disable-install-strip -ac_add_options --disable-tests -ac_add_options --disable-mochitest -ac_add_options --disable-installer -ac_add_options --enable-default-toolkit=cairo-gtk2 -ac_add_options --enable-pango -ac_add_options --enable-svg -ac_add_options --enable-canvas -ac_add_options --disable-crashreporter -ac_add_options --disable-necko-wifi -ac_add_options --enable-startup-notification -ac_add_options --disable-libjpeg-turbo -ac_add_options --disable-cpp-exceptions -ac_add_options --disable-updater -ac_add_options --disable-gstreamer -ac_add_options --enable-cpp-rtti - -# thunderbird related -ac_add_options --enable-xinerama -ac_add_options --disable-xprint -ac_add_options --enable-safe-browsing - -# lightning related -ac_add_options --enable-calendar -ac_add_options --with-l10n-base=../../l10n - -export BUILD_OFFICIAL=1 -export MOZILLA_OFFICIAL=1 -mk_add_options BUILD_OFFICIAL=1 -mk_add_options MOZILLA_OFFICIAL=1 - diff --git a/thunderbird-objdir.patch b/thunderbird-objdir.patch deleted file mode 100644 index f6dcde7..0000000 --- a/thunderbird-objdir.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up thunderbird-31.0/comm-esr31/client.mk.old thunderbird-31.0/comm-esr31/client.mk ---- thunderbird-31.0/comm-esr31/client.mk.old 2014-07-18 02:04:05.000000000 +0200 -+++ thunderbird-31.0/comm-esr31/client.mk 2014-07-30 10:57:01.177453550 +0200 -@@ -131,7 +131,7 @@ endif - - - ifndef MOZ_OBJDIR -- MOZ_OBJDIR = obj-$(CONFIG_GUESS) -+ MOZ_OBJDIR = objdir - else - # On Windows Pymake builds check MOZ_OBJDIR doesn't start with "/" - ifneq (,$(findstring mingw,$(CONFIG_GUESS))) -diff -up thunderbird-31.0/comm-esr31/mozilla/media/webrtc/trunk/Makefile.old thunderbird-31.0/comm-esr31/mozilla/media/webrtc/trunk/Makefile diff --git a/xulrunner-24.0-jemalloc-ppc.patch b/xulrunner-24.0-jemalloc-ppc.patch deleted file mode 100644 index fe404ca..0000000 --- a/xulrunner-24.0-jemalloc-ppc.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up xulrunner-24.0/mozilla-release/memory/mozjemalloc/jemalloc.c.jemalloc-ppc xulrunner-24.0/mozilla-release/memory/mozjemalloc/jemalloc.c ---- xulrunner-24.0/mozilla-release/memory/mozjemalloc/jemalloc.c.jemalloc-ppc 2013-09-11 01:15:18.000000000 +0200 -+++ xulrunner-24.0/mozilla-release/memory/mozjemalloc/jemalloc.c 2013-09-13 13:36:34.171680919 +0200 -@@ -1104,7 +1104,7 @@ static unsigned ncpus; - * controlling the malloc behavior are defined as compile-time constants - * for best performance and cannot be altered at runtime. - */ --#if !defined(__ia64__) && !defined(__sparc__) && !defined(__mips__) -+#if !defined(__ia64__) && !defined(__sparc__) && !defined(__mips__) && !(defined(__powerpc__)) - #define MALLOC_STATIC_SIZES 1 - #endif - diff --git a/xulrunner-24.0-s390-inlines.patch b/xulrunner-24.0-s390-inlines.patch deleted file mode 100644 index 26ec954..0000000 --- a/xulrunner-24.0-s390-inlines.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up mozilla-aurora/js/src/vm/SPSProfiler.cpp.s390-inlines mozilla-aurora/js/src/vm/SPSProfiler.cpp ---- mozilla-aurora/js/src/vm/SPSProfiler.cpp.s390-inlines 2014-05-06 13:17:27.000000000 +0200 -+++ mozilla-aurora/js/src/vm/SPSProfiler.cpp 2014-05-27 17:13:05.273503172 +0200 -@@ -4,6 +4,8 @@ - * 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/. */ - -+#include "jscntxtinlines.h" -+ - #include "vm/SPSProfiler.h" - - #include "mozilla/DebugOnly.h"