| Index: client/tools/buildbot_annotated_steps.py | 
| diff --git a/client/tools/buildbot_annotated_steps.py b/client/tools/buildbot_annotated_steps.py | 
| index 347b483dfb0689935bd630b872615652e564c4d3..4a2d187eca418afdcece78a7f522266e125c558d 100755 | 
| --- a/client/tools/buildbot_annotated_steps.py | 
| +++ b/client/tools/buildbot_annotated_steps.py | 
| @@ -13,13 +13,12 @@ Compiles dart client apps with dartc, and run the client tests both in headless | 
| chromium and headless dartium. | 
| """ | 
|  | 
| +import imp | 
| import os | 
| import re | 
| import socket | 
| import subprocess | 
| import sys | 
| -import shutil | 
| -import glob | 
|  | 
| BUILDER_NAME = 'BUILDBOT_BUILDERNAME' | 
| BUILDER_CLOBBER = 'BUILDBOT_CLOBBER' | 
| @@ -30,6 +29,13 @@ DARTIUM_VERSION_FILE = 'client/tests/drt/LAST_VERSION' | 
| DARTIUM_V_MATCHER = ( | 
| 'gs://dartium-archive/[^/]*/dartium-\w*-inc-([0-9]*).([0-9]*).zip') | 
|  | 
| +def GetUtils(): | 
| +  '''Dynamically load the tools/utils.py python module.''' | 
| +  dart_dir = os.path.abspath(os.path.join(__file__, '..', '..', '..')) | 
| +  return imp.load_source('utils', os.path.join(dart_dir, 'tools', 'utils.py')) | 
| + | 
| +utils = GetUtils() | 
| + | 
| def GetBuildInfo(): | 
| """Returns a tuple (name, version, mode) where: | 
| - name: A name for the build - the buildbot host if a buildbot. | 
| @@ -58,21 +64,7 @@ def GetBuildInfo(): | 
| version = 'unknown' | 
| return (name, version) | 
|  | 
| - | 
| -def GetUtils(): | 
| -  ''' | 
| -  dynamically get the utils module | 
| -  We use a dynamic import for tools/util.py because we derive its location | 
| -  dynamically using sys.argv[0]. This allows us to run this script from | 
| -  different directories. | 
| - | 
| -  args: | 
| -  ''' | 
| -  sys.path.append(os.path.abspath(os.path.join('.', 'tools'))) | 
| -  utils = __import__('utils') | 
| -  return utils | 
| - | 
| -def GetOutDir(utils, mode): | 
| +def GetOutDir(mode): | 
| ''' | 
| get the location to place the output | 
|  | 
| @@ -99,8 +91,7 @@ def ProcessTools(mode, name, version): | 
| # get the latest changed revision from the current repository sub-tree | 
| version = GetLatestChangedRevision() | 
|  | 
| -  utils = GetUtils() | 
| -  outdir = GetOutDir(utils, mode) | 
| +  outdir = GetOutDir(mode) | 
| cmds = [sys.executable, toolsBuildScript, | 
| '--mode=' + mode, '--revision=' + version, | 
| '--name=' + name, '--out=' + outdir] | 
| @@ -162,32 +153,11 @@ def ClobberBuilder(): | 
| def GetShouldClobber(): | 
| return os.environ.get(BUILDER_CLOBBER) == "1" | 
|  | 
| -def RunDart(scriptPath): | 
| -  if sys.platform == 'darwin': | 
| -    pipe = subprocess.Popen( | 
| -          ['./tools/testing/bin/macos/dart', scriptPath], | 
| -          stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 
| -  elif os.name == 'posix': | 
| -    pipe = subprocess.Popen( | 
| -          ['./tools/testing/bin/linux/dart', scriptPath], | 
| -          stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 
| -  else: | 
| -    pipe = subprocess.Popen( | 
| -          ['tools\\testing\\bin\\windows\\dart.exe', scriptPath], | 
| -          stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) | 
| - | 
| -  output = pipe.communicate() | 
| -  return output[0] | 
| - | 
| def GetLatestChangedRevision(): | 
| -  # 0.1.2.0_r13661 | 
| -  # 0.1.2.0_r13661_username | 
| -  fullVersion = RunDart("tools/version.dart") | 
| - | 
| -  m = re.search('._r(\d+)', fullVersion) | 
| -  svnRev = m.group(1) | 
| - | 
| -  return svnRev | 
| +  revision = utils.GetSVNRevision() | 
| +  if not revision: | 
| +    raise Exception("Couldn't determine last changed revision.") | 
| +  return revision | 
|  | 
| def main(): | 
| if len(sys.argv) == 0: | 
|  |