Bug 496196 - script and make target to generate a snippet for a locale - r=ccooper,l10n,gozer,kairo
authorarmenzg@mozilla.com
Thu, 25 Jun 2009 12:31:06 -0400
changeset 29569 d63de5f6b22ac3a00c5aba621c88a6914f9517e8
parent 29568 c0f111a7af00258118b851337b44cb954661c764
child 29570 224dde6888d7c684c1dd5bd396a59d6a232e94a3
push id7713
push usercoop@mozilla.com
push dateThu, 25 Jun 2009 16:32:05 +0000
treeherdermozilla-central@d63de5f6b22a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersccooper, l10n, gozer, kairo
bugs496196
milestone1.9.2a1pre
Bug 496196 - script and make target to generate a snippet for a locale - r=ccooper,l10n,gozer,kairo
browser/locales/Makefile.in
toolkit/locales/l10n.mk
tools/update-packaging/generatesnippet.py
--- a/browser/locales/Makefile.in
+++ b/browser/locales/Makefile.in
@@ -279,17 +279,22 @@ endif
 
 ifdef MOZ_CRASHREPORTER
 libs:: crashreporter-override.ini
 	$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
 endif
 
 
 ident:
-	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(STAGEDIST)/application.ini App SourceStamp
+	@printf "fx_revision "
+	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py \
+	    $(STAGEDIST)/application.ini App SourceStamp
+	@printf "buildid "
+	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py \
+	    $(STAGEDIST)/application.ini App BuildID
 
 #These make targets call prepare-repackages by setting different UPLOAD_DIR
 prepare-upload-latest-%:
 	@$(MAKE) prepare-repackages-$* UPLOAD_DIR=$(DIST)/upload/latest
 
 prepare-upload-dated-%:
 	@$(MAKE) prepare-repackages-$* UPLOAD_DIR=$(DIST)/upload/`date "+%Y-%m-%d-%H"`-$(MOZ_PKG_APPNAME)$(MOZ_APP_VERSION)-l10n
 
--- a/toolkit/locales/l10n.mk
+++ b/toolkit/locales/l10n.mk
@@ -140,16 +140,17 @@ endif
 	$(NSINSTALL) -D $(DIST)/l10n-stage/$(PKG_PATH)
 	cd $(DIST)/l10n-stage; \
 	  $(MAKE_PACKAGE)
 ifdef MOZ_MAKE_COMPLETE_MAR
 	$(MAKE) -C $(DEPTH)/tools/update-packaging full-update AB_CD=$(AB_CD) \
 	  MOZ_PKG_PRETTYNAMES=$(MOZ_PKG_PRETTYNAMES) \
 	  PACKAGE_BASE_DIR="$(_ABS_DIST)/l10n-stage" \
 	  DIST="$(_ABS_DIST)"
+	$(MAKE) generate-snippet-$(AB_CD)  
 endif
 # packaging done, undo l10n stuff
 ifneq (en,$(AB))
 ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
 	mv $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_APPNAME)/$(_APPNAME)/Contents/Resources/$(AB).lproj $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_APPNAME)/$(_APPNAME)/Contents/Resources/en.lproj
 endif
 endif
 	$(MAKE) clobber-zip AB_CD=$(AB_CD)
@@ -190,8 +191,17 @@ ifndef WGET
 endif
 	(cd $(_ABS_DIST) && $(WGET) -nv -N  $(EN_US_BINARY_URL)/$(PACKAGE))
 	@echo "Downloaded $(EN_US_BINARY_URL)/$(PACKAGE) to $(_ABS_DIST)/$(PACKAGE)"
 ifeq ($(OS_ARCH), WINNT)
 	$(NSINSTALL) -D $(_ABS_DIST)/$(PKG_INST_PATH)
 	(cd $(_ABS_DIST)/$(PKG_INST_PATH) && $(WGET) -nv -N "$(EN_US_BINARY_URL)/$(PKG_PATH)$(PKG_INST_BASENAME).exe")
 	@echo "Downloaded $(EN_US_BINARY_URL)/$(PKG_PATH)$(PKG_INST_BASENAME).exe to $(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe"
 endif
+
+generate-snippet-%:
+	$(PYTHON) $(topsrcdir)/tools/update-packaging/generatesnippet.py \
+          --mar-path=$(_ABS_DIST)/update \
+          --application-ini-file=$(STAGEDIST)/application.ini \
+          --locale=$* \
+          --product=$(MOZ_PKG_APPNAME) \
+          --download-base-URL=$(DOWNLOAD_BASE_URL) \
+          --verbose
new file mode 100644
--- /dev/null
+++ b/tools/update-packaging/generatesnippet.py
@@ -0,0 +1,192 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is the Mozilla build system
+#
+# The Initial Developer of the Original Code is Mozilla.
+# Portions created by the Initial Developer are Copyright (C) 2009
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#    Armen Zambrano Gasparnian <armenzg@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+"""
+This script generates the complete snippet for a given locale or en-US
+Most of the parameters received are to generate the MAR's download URL
+and determine the MAR's filename
+"""
+import sys, os, platform, sha
+from optparse import OptionParser
+from ConfigParser import ConfigParser
+from stat import ST_SIZE
+
+def main():
+    error = False
+    parser = OptionParser(
+        usage="%prog [options]")
+    parser.add_option("--mar-path",
+                      action="store",
+                      dest="marPath",
+                      help="[Required] Specify the absolute path where the MAR file is found.")
+    parser.add_option("--application-ini-file",
+                      action="store",
+                      dest="applicationIniFile",
+                      help="[Required] Specify the absolute path to the application.ini file.")
+    parser.add_option("-l",
+                      "--locale",
+                      action="store",
+                      dest="locale",
+                      help="[Required] Specify which locale we are generating the snippet for.")
+    parser.add_option("-p",
+                      "--product",
+                      action="store",
+                      dest="product",
+                      help="[Required] This option is used to generate the URL to download the MAR file.")
+    parser.add_option("--download-base-URL",
+                      action="store",
+                      dest="downloadBaseURL",
+                      help="This option indicates under which.")
+    parser.add_option("-v",
+                      "--verbose",
+                      action="store_true",
+                      dest="verbose",
+                      default=False,
+                      help="This option increases the output of the script.")
+    (options, args) = parser.parse_args()
+    for req, msg in (('marPath', "the absolute path to the where the MAR file is"),
+                     ('applicationIniFile', "the absolute path to the application.ini file."),
+                     ('locale', "a locale."),
+                     ('product', "specify a product.")):
+        if not hasattr(options, req):
+            parser.error('You must specify %s' % msg)
+
+    if not options.downloadBaseURL or options.downloadBaseURL == '':
+        options.downloadBaseURL = 'http://ftp.mozilla.org/pub/mozilla.org/nightly'
+
+    snippet = generateSnippet(options.marPath,
+                              options.applicationIniFile,
+                              options.locale,
+                              options.downloadBaseURL,
+                              options.product)
+    f = open(os.path.join(options.marPath, 'complete.update.snippet'), 'wb')
+    f.write(snippet)
+    f.close()
+
+    if options.verbose:
+        # Show in our logs what the contents of the snippet are
+        print snippet
+
+def generateSnippet(abstDistDir, applicationIniFile, locale,
+                    downloadBaseURL, product):
+    # Let's extract information from application.ini
+    c = ConfigParser()
+    try:
+        c.readfp(open(applicationIniFile))
+    except IOError, (stderror):
+       sys.exit(stderror) 
+    buildid = c.get("App", "BuildID")
+    appVersion = c.get("App", "Version")
+    branchName = c.get("App", "SourceRepository").split('/')[-1]
+
+    marFileName = '%s-%s.%s.%s.complete.mar' % (
+        product,
+        appVersion,
+        locale,
+        getPlatform())
+    # Let's determine the hash and the size of the MAR file
+    # This function exits the script if the file does not exist
+    (completeMarHash, completeMarSize) = getFileHashAndSize(
+        os.path.join(abstDistDir, marFileName))
+    # Construct the URL to where the MAR file will exist
+    interfix = ''
+    if locale == 'en-US':
+        interfix = ''
+    else:
+        interfix = '-l10n'
+    marDownloadURL = "%s/%s%s/%s" % (downloadBaseURL,
+                                     datedDirPath(buildid, branchName),
+                                     interfix,
+                                     marFileName)
+    
+    snippet = """complete
+%(marDownloadURL)s
+sha1
+%(completeMarHash)s
+%(completeMarSize)s
+%(buildid)s
+%(appVersion)s
+%(appVersion)s
+""" % dict( marDownloadURL=marDownloadURL, 
+            completeMarHash=completeMarHash,
+            completeMarSize=completeMarSize,
+            buildid=buildid,
+            appVersion=appVersion)
+
+    return snippet
+
+def getPlatform():
+    if platform.system() == "Linux":
+        return "linux-i686"
+    elif platform.system() in ("Windows", "Microsoft"):
+        return "win32"
+    elif platform.system() == "Darwin":
+        return "mac"
+
+def getFileHashAndSize(filepath):
+    sha1Hash = 'UNKNOWN'
+    size = 'UNKNOWN'
+
+    try:
+        # open in binary mode to make sure we get consistent results
+        # across all platforms
+        f = open(filepath, "rb")
+        shaObj = sha.new(f.read())
+        sha1Hash = shaObj.hexdigest()
+        size = os.stat(filepath)[ST_SIZE]
+    except IOError, (stderror):
+       sys.exit(stderror) 
+
+    return (sha1Hash, size)
+
+def datedDirPath(buildid, milestone):
+    """
+    Returns a string that will look like:
+    2009/12/2009-12-31-09-mozilla-central
+    """
+    year  = buildid[0:4]
+    month = buildid[4:6]
+    day   = buildid[6:8]
+    hour  = buildid[8:10]
+    datedDir = "%s-%s-%s-%s-%s" % (year,
+                                   month,
+                                   day,
+                                   hour,
+                                   milestone)
+    return "%s/%s/%s" % (year, month, datedDir)
+
+if __name__ == '__main__':
+    main()