зеркало из https://github.com/mozilla/gecko-dev.git
Bug 496196 - script and make target to generate a snippet for a locale - r=ccooper,l10n,gozer,kairo
This commit is contained in:
Родитель
6dc6d90788
Коммит
bb547e940d
|
@ -284,7 +284,12 @@ 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-%:
|
||||
|
|
|
@ -145,6 +145,7 @@ ifdef MOZ_MAKE_COMPLETE_MAR
|
|||
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))
|
||||
|
@ -195,3 +196,12 @@ ifeq ($(OS_ARCH), WINNT)
|
|||
(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
|
||||
|
|
|
@ -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()
|
Загрузка…
Ссылка в новой задаче