Index: download_firefox_nightly.py |
=================================================================== |
--- download_firefox_nightly.py (revision 293856) |
+++ download_firefox_nightly.py (working copy) |
@@ -5,11 +5,14 @@ |
"""Downloads a Firefox Nightly build for the current platform.""" |
+import datetime |
+import glob |
import os |
import shutil |
import sys |
import subprocess |
import tarfile |
+import time |
import zipfile |
from optparse import OptionParser |
@@ -23,38 +26,61 @@ |
from mozdownload import scraper |
-def main(): |
- usage = 'usage: %prog -t <target_dir>' |
- parser = OptionParser(usage) |
- parser.add_option('-t', '--target-dir', |
- help=('Target directory to put the downloaded and extracted' |
- ' folder with the Firefox Nightly build in.')) |
- parser.add_option('-f', '--force', action='store_true', |
- help=('Force download even if the current nightly is ' |
- 'already downloaded.')) |
- options, _args = parser.parse_args() |
- if not options.target_dir: |
- parser.error('You must specify the target directory.') |
+def _Touch(a_file): |
+ with open(a_file, 'a'): |
+ os.utime(a_file, None) |
- target_dir = options.target_dir |
- if not os.path.isdir(target_dir): |
- os.mkdir(target_dir) |
- downloader = scraper.DailyScraper(directory=target_dir, version=None) |
- firefox_archive = os.path.join(target_dir, |
- downloader.build_filename(downloader.binary)) |
+def _FindFallbackFirefoxBuild(target_dir): |
+ firefox_archives = glob.glob(os.path.join(target_dir, '*tar.bz2')) |
+ if not firefox_archives: |
+ return None |
- if os.path.exists(firefox_archive) and not options.force: |
- print 'Skipping download as %s is already downloaded.' % firefox_archive |
- return 0 |
+ firefox_archives.sort(key=os.path.getmtime, reverse=True) |
+ newest_build = firefox_archives[0] |
+ build_age_seconds = time.time() - os.path.getmtime(newest_build) |
+ build_age_days = datetime.timedelta(seconds=build_age_seconds).days |
- downloader.download() |
- print 'Downloaded %s' % firefox_archive |
+ return newest_build, build_age_days |
- # Extract the archive. |
- # TODO(phoglund): implement on win/mac |
+ |
+def _MaybeDownload(target_dir, force): |
+ try: |
+ downloader = scraper.DailyScraper(directory=target_dir, version=None) |
+ filename = downloader.build_filename(downloader.binary) |
+ firefox_archive = os.path.join(target_dir, filename) |
+ |
+ if os.path.exists(firefox_archive) and not force: |
+ # Touch the file anyway since we were 'successful', so we can accurately |
+ # compute the age of the most recent download attempt and act accordingly |
+ # when a download fails later. |
+ _Touch(firefox_archive) |
+ print 'Skipping download as %s is already downloaded.' % firefox_archive |
+ return None |
+ |
+ downloader.download() |
+ print 'Downloaded %s' % firefox_archive |
+ return firefox_archive |
+ except scraper.NotFoundException as exception: |
+ print 'Failed to download firefox: %s.' % exception |
+ fallback_build, age_days = _FindFallbackFirefoxBuild(target_dir) |
+ |
+ if not fallback_build: |
+ raise Exception('We failed to download Firefox and we have no builds to ' |
+ 'fall back on; failing...') |
+ if age_days > 3: |
+ raise Exception('We have failed to download firefox builds for more ' |
+ 'than 3 days now: failing so someone looks at it. The ' |
+ 'most recent build we have is %d days old.' % age_days) |
+ |
+ print 'Using %s instead; it is %d days old.' % (fallback_build, age_days) |
+ return fallback_build |
+ |
+ |
+def _ExtractArchive(firefox_archive, target_dir): |
+ # TODO(phoglund): implement on win/mac. See http://crbug.com/454303. |
if sys.platform == 'darwin': |
- print "Temporarily disabled on mac..." |
+ print "Disabled on mac..." |
return 0 |
volume = '/Volumes/Nightly' |
firefox_executable = '%s/FirefoxNightly.app' % target_dir |
@@ -69,7 +95,7 @@ |
tar_archive = tarfile.open(firefox_archive, 'r:bz2') |
tar_archive.extractall(path=target_dir) |
elif sys.platform == 'win32': |
- print "Temporarily disabled on win..." |
+ print "Disabled on win..." |
return 0 |
zip_archive = zipfile.ZipFile(firefox_archive) |
zip_archive.extractall(path=target_dir) |
@@ -76,9 +102,31 @@ |
else: |
print >> sys.stderr, 'Unsupported platform: %s' % sys.platform |
return 1 |
- |
+ |
print 'Extracted %s' % firefox_archive |
return 0 |
+ |
+def main(): |
+ usage = 'usage: %prog -t <target_dir>' |
+ parser = OptionParser(usage) |
+ parser.add_option('-t', '--target-dir', |
+ help=('Target directory to put the downloaded and extracted' |
+ ' folder with the Firefox Nightly build in.')) |
+ parser.add_option('-f', '--force', action='store_true', |
+ help=('Force download even if the current nightly is ' |
+ 'already downloaded.')) |
+ options, _args = parser.parse_args() |
+ if not options.target_dir: |
+ parser.error('You must specify the target directory.') |
+ |
+ target_dir = options.target_dir |
+ if not os.path.isdir(target_dir): |
+ os.mkdir(target_dir) |
+ |
+ firefox_archive = _MaybeDownload(target_dir, options.force) |
+ if firefox_archive: |
+ return _ExtractArchive(firefox_archive, target_dir) |
+ |
if __name__ == '__main__': |
sys.exit(main()) |