Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Unified Diff: bin/ctest.py

Issue 3659002: Add ability to download using newest image from zip url. (Closed) Base URL: http://git.chromium.org/git/crosutils.git
Patch Set: Make regex better Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | bin/ctest_unittest.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: bin/ctest.py
diff --git a/bin/ctest.py b/bin/ctest.py
index 2e12293cbc5ef29eea66a57efd69828eca8074a4..70dbec8ffe2b43dcc411a4b27221d47fff0e58a6 100755
--- a/bin/ctest.py
+++ b/bin/ctest.py
@@ -9,15 +9,46 @@
import fileinput
import optparse
import os
+import re
import sys
import traceback
import urllib
+import HTMLParser
sys.path.append(os.path.join(os.path.dirname(__file__), '../lib'))
-from cros_build_lib import Info, RunCommand, ReinterpretPathForChroot
+from cros_build_lib import Info
+from cros_build_lib import ReinterpretPathForChroot
+from cros_build_lib import RunCommand
+from cros_build_lib import Warning
_IMAGE_TO_EXTRACT = 'chromiumos_test_image.bin'
+class HTMLDirectoryParser(HTMLParser.HTMLParser):
+ """HTMLParser for parsing the default apache file index."""
+
+ def __init__(self, regex):
+ HTMLParser.HTMLParser.__init__(self)
+ self.regex_object = re.compile(regex)
+ self.link_list = []
+
+ def handle_starttag(self, tag, attrs):
+ """Overrides from HTMLParser and is called at the start of every tag.
+
+ This implementation grabs attributes from links (i.e. <a ... > </a>
+ and adds the target from href=<target> if the <target> matches the
+ regex given at the start.
+ """
+ if not tag.lower() == 'a':
+ return
+
+ for attr in attrs:
+ if not attr[0].lower() == 'href':
+ continue
+
+ match = self.regex_object.match(attr[1])
+ if match:
+ self.link_list.append(match.group(0).rstrip('/'))
+
def ModifyBootDesc(download_folder, redirect_file=None):
"""Modifies the boot description of a downloaded image to work with path.
@@ -62,6 +93,40 @@ def ModifyBootDesc(download_folder, redirect_file=None):
fileinput.close()
+def GetLatestLinkFromPage(url, regex):
+ """Returns the latest link from the given url that matches regex.
+
+ Args:
+ url: Url to download and parse.
+ regex: Regular expression to match links against.
+ """
+ url_file = urllib.urlopen(url)
+ url_html = url_file.read()
+ url_file.close()
+
+ # Parses links with versions embedded.
+ url_parser = HTMLDirectoryParser(regex=regex)
+ url_parser.feed(url_html)
+ return max(url_parser.link_list)
+
+
+def GetNewestLinkFromZipBase(board, channel, zip_server_base):
+ """Returns the url to the newest image from the zip server.
+
+ Args:
+ board: board for the image zip.
+ channel: channel for the image zip.
+ zip_server_base: base url for zipped images.
+ """
+ zip_base = os.path.join(zip_server_base, channel, board)
+ latest_version = GetLatestLinkFromPage(zip_base, '\d+\.\d+\.\d+\.\d+/')
+
+ zip_dir = os.path.join(zip_base, latest_version)
+ zip_name = GetLatestLinkFromPage(zip_dir,
+ 'ChromeOS-\d+\.\d+\.\d+\.\d+-.*\.zip')
+ return os.path.join(zip_dir, zip_name)
+
+
def GetLatestZipUrl(board, channel, latest_url_base, zip_server_base):
"""Returns the url of the latest image zip for the given arguments.
@@ -71,18 +136,24 @@ def GetLatestZipUrl(board, channel, latest_url_base, zip_server_base):
latest_url_base: base url for latest links.
zip_server_base: base url for zipped images.
"""
- # Grab the latest image info.
- latest_file_url = os.path.join(latest_url_base, channel,
- 'LATEST-%s' % board)
- latest_image_file = urllib.urlopen(latest_file_url)
- latest_image = latest_image_file.read()
- latest_image_file.close()
-
- # Convert bin.gz into zip.
- latest_image = latest_image.replace('.bin.gz', '.zip')
- version = latest_image.split('-')[1]
- zip_base = os.path.join(zip_server_base, channel, board)
- return os.path.join(zip_base, version, latest_image)
+ if latest_url_base:
+ try:
+ # Grab the latest image info.
+ latest_file_url = os.path.join(latest_url_base, channel,
+ 'LATEST-%s' % board)
+ latest_image_file = urllib.urlopen(latest_file_url)
+ latest_image = latest_image_file.read()
+ latest_image_file.close()
+ # Convert bin.gz into zip.
+ latest_image = latest_image.replace('.bin.gz', '.zip')
+ version = latest_image.split('-')[1]
+ zip_base = os.path.join(zip_server_base, channel, board)
+ return os.path.join(zip_base, version, latest_image)
+ except IOError:
+ Warning(('Could not use latest link provided, defaulting to parsing'
+ ' latest from zip url base.'))
+
+ return GetNewestLinkFromZipBase(board, channel, zip_server_base)
def GrabZipAndExtractImage(zip_url, download_folder, image_name) :
@@ -201,9 +272,6 @@ def main():
if not options.channel:
parser.error('Need channel for image to compare against.')
- if not options.latestbase:
- parser.error('Need latest url base to get images.')
-
if not options.zipbase:
parser.error('Need zip url base to get images.')
« no previous file with comments | « no previous file | bin/ctest_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698