Index: dart/editor/build/build.py |
diff --git a/dart/editor/build/build.py b/dart/editor/build/build.py |
index 5b1b481666e885bd6f0560d68bfdfed63a5d1611..1dd9bfe57a50b0f92567167a4b20cd3b4c715174 100755 |
--- a/dart/editor/build/build.py |
+++ b/dart/editor/build/build.py |
@@ -28,18 +28,105 @@ GSU_PATH_LATEST = None |
GSU_API_DOCS_PATH = None |
GSU_API_DOCS_BUCKET = 'gs://dartlang-api-docs' |
+CHANNEL = None |
+PLUGINS_BUILD = None |
REVISION = None |
+SYSTEM = None |
TRUNK_BUILD = None |
-PLUGINS_BUILD = None |
NO_UPLOAD = None |
-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() |
+DART_DIR = os.path.abspath(os.path.join(__file__, '..', '..', '..')) |
+utils = imp.load_source('utils', os.path.join(DART_DIR, 'tools', 'utils.py')) |
+bot_utils = imp.load_source('bot_utils', |
+ os.path.join(DART_DIR, 'tools', 'bots', 'bot_utils.py')) |
+ |
+def DartArchiveFile(local_path, remote_path, create_md5sum=False): |
+ # Copy it to the new unified gs://dart-archive bucket |
+ # TODO(kustermann/ricow): Remove all the old archiving code, once everything |
+ # points to the new location |
+ gsutil = bot_utils.GSUtil() |
+ gsutil.upload(local_path, remote_path, public=True) |
+ if create_md5sum: |
+ # 'local_path' may have a different filename than 'remote_path'. So we need |
+ # to make sure the *.md5sum file contains the correct name. |
+ assert '/' in remote_path and not remote_path.endswith('/') |
+ mangled_filename = remote_path[remote_path.rfind('/') + 1:] |
+ local_md5sum = bot_utils.CreateChecksumFile(local_path, mangled_filename) |
+ gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True) |
+ |
+def DartArchiveUploadEditorZipFile(zipfile): |
+ # TODO(kustermann): We don't archive trunk builds to gs://dart-archive/ |
+ # Remove this once the channel transition is done. |
+ if CHANNEL == 'trunk': return |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ gsutil = bot_utils.GSUtil() |
+ |
+ basename = os.path.basename(zipfile) |
+ system = None |
+ arch = None |
+ if basename.startswith('darteditor-linux'): |
+ system = 'linux' |
+ elif basename.startswith('darteditor-mac'): |
+ system = 'macos' |
+ elif basename.startswith('darteditor-win'): |
+ system = 'windows' |
+ |
+ if basename.endswith('-32.zip'): |
+ arch = 'ia32' |
+ elif basename.endswith('-64.zip'): |
+ arch = 'x64' |
+ |
+ assert system and arch |
+ |
+ for revision in [REVISION, 'latest']: |
+ DartArchiveFile(zipfile, namer.editor_zipfilepath(revision, system, arch), |
+ create_md5sum=True) |
+ |
+def DartArchiveUploadUpdateSite(local_path): |
+ # TODO(kustermann): We don't archive trunk builds to gs://dart-archive/ |
+ # Remove this once the channel transition is done. |
+ if CHANNEL == 'trunk': return |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ gsutil = bot_utils.GSUtil() |
+ for revision in [REVISION, 'latest']: |
+ update_site_dir = namer.editor_eclipse_update_directory(revision) |
+ try: |
+ gsutil.remove(update_site_dir, recursive=True) |
+ except: |
+ # Ignore this, in the general case there is nothing. |
+ pass |
+ gsutil.upload(local_path, update_site_dir, recursive=True, public=True) |
+ |
+def DartArchiveUploadSDKs(system, sdk32_zip, sdk64_zip): |
+ # TODO(kustermann): We don't archive trunk builds to gs://dart-archive/ |
+ # Remove this once the channel transition is done. |
+ if CHANNEL == 'trunk': return |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ for revision in [REVISION, 'latest']: |
+ path32 = namer.sdk_zipfilepath(revision, system, 'ia32', 'release') |
+ path64 = namer.sdk_zipfilepath(revision, system, 'x64', 'release') |
+ DartArchiveFile(sdk32_zip, path32, create_md5sum=True) |
+ DartArchiveFile(sdk64_zip, path64, create_md5sum=True) |
+ |
+def DartArchiveUploadAPIDocs(api_zip): |
+ # TODO(kustermann): We don't archive trunk builds to gs://dart-archive/ |
+ # Remove this once the channel transition is done. |
+ if CHANNEL == 'trunk': return |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ for revision in [REVISION, 'latest']: |
+ destination = (namer.apidocs_directory(revision) + '/' + |
+ namer.apidocs_zipfilename()) |
+ DartArchiveFile(api_zip, destination, create_md5sum=False) |
+ |
+def DartArchiveUploadVersionFile(version_file): |
+ # TODO(kustermann): We don't archive trunk builds to gs://dart-archive/. |
+ # Remove this once the channel transition is done. |
+ if CHANNEL == 'trunk': return |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ for revision in [REVISION, 'latest']: |
+ DartArchiveFile(version_file, namer.version_filepath(revision), |
+ create_md5sum=False) |
class AntWrapper(object): |
"""A wrapper for ant build invocations""" |
@@ -179,15 +266,17 @@ def BuildOptions(): |
def main(): |
"""Main entry point for the build program.""" |
global BUILD_OS |
+ global CHANNEL |
global DART_PATH |
- global TOOLS_PATH |
- global GSU_PATH_REV |
global GSU_API_DOCS_PATH |
global GSU_PATH_LATEST |
+ global GSU_PATH_REV |
+ global NO_UPLOAD |
+ global PLUGINS_BUILD |
global REVISION |
+ global SYSTEM |
+ global TOOLS_PATH |
global TRUNK_BUILD |
- global PLUGINS_BUILD |
- global NO_UPLOAD |
if not sys.argv: |
print 'Script pathname not known, giving up.' |
@@ -298,12 +387,22 @@ def main(): |
print 'Could not find username' |
return 6 |
- # dart-editor[-trunk], dart-editor-(win/mac/linux)[-trunk] |
+ # dart-editor[-trunk], dart-editor-(win/mac/linux)[-trunk/be/dev/stable] |
builder_name = str(options.name) |
- TRUNK_BUILD = builder_name.endswith("-trunk") |
- PLUGINS_BUILD = (builder_name == 'dart-editor' or |
- builder_name == 'dart-editor-trunk') |
+ EDITOR_REGEXP = (r'^dart-editor(-(?P<system>(win|mac|linux)))?' + |
+ '(-(?P<channel>(trunk|be|dev|stable)))?$') |
+ match = re.match(EDITOR_REGEXP, builder_name) |
+ if not match: |
+ raise Exception("Buildername '%s' does not match pattern '%s'." |
+ % (builder_name, EDITOR_REGEXP)) |
+ |
+ CHANNEL = match.groupdict()['channel'] or 'be' |
+ SYSTEM = match.groupdict()['system'] |
+ |
+ TRUNK_BUILD = CHANNEL == 'trunk' |
+ PLUGINS_BUILD = SYSTEM is None |
+ REVISION = revision |
build_skip_tests = os.environ.get('DART_SKIP_RUNNING_TESTS') |
sdk_environment = os.environ |
@@ -318,7 +417,6 @@ def main(): |
running_on_buildbot = False |
sdk_environment['DART_LOCAL_BUILD'] = 'dart-editor-archive-testing' |
- REVISION = revision |
GSU_PATH_REV = '%s/%s' % (to_bucket, REVISION) |
GSU_PATH_LATEST = '%s/%s' % (to_bucket, 'latest') |
GSU_API_DOCS_PATH = '%s/%s' % (GSU_API_DOCS_BUCKET, REVISION) |
@@ -407,10 +505,12 @@ def main(): |
version_file = _FindVersionFile(buildout) |
if version_file: |
UploadFile(version_file, False) |
+ DartArchiveUploadVersionFile(version_file) |
found_zips = _FindRcpZipFiles(buildout) |
for zipfile in found_zips: |
UploadFile(zipfile) |
+ DartArchiveUploadEditorZipFile(zipfile) |
return 0 |
finally: |
@@ -613,7 +713,7 @@ def InstallDartium(buildroot, buildout, buildos, gsu): |
if not os.path.exists(tmp_zip_file): |
gsu.Copy(dartiumFile, tmp_zip_file, False) |
- |
+ |
# Upload dartium zip to make sure we have consistent dartium downloads |
UploadFile(tmp_zip_file) |
@@ -706,32 +806,6 @@ def PostProcessEditorBuilds(out_dir): |
os.remove(infofile) |
-def CalculateChecksum(filename): |
- """Calculate the MD5 checksum for filename.""" |
- |
- md5 = hashlib.md5() |
- |
- with open(filename, 'rb') as f: |
- data = f.read(65536) |
- while len(data) > 0: |
- md5.update(data) |
- data = f.read(65536) |
- |
- return md5.hexdigest() |
- |
- |
-def CreateChecksumFile(filename): |
- """Create and upload an MD5 checksum file for filename.""" |
- |
- checksum = CalculateChecksum(filename) |
- checksum_filename = '%s.md5sum' % filename |
- |
- with open(checksum_filename, 'w') as f: |
- f.write('%s *%s' % (checksum, os.path.basename(filename))) |
- |
- return checksum_filename |
- |
- |
def RunEditorTests(buildout, buildos): |
StartBuildStep('run_tests') |
@@ -839,9 +913,10 @@ def UploadSite(buildout, gsPath) : |
Gsutil(['cp', '-a', 'public-read', |
r'file://' + join(buildout, 'buildRepo', 'index.html'), |
join(gsPath,'index.html')]) |
+ |
# recursively copy update site contents |
UploadDirectory(glob.glob(join(buildout, 'buildRepo', '*')), gsPath) |
- |
+ DartArchiveUploadUpdateSite(join(buildout, 'buildRepo')) |
def CreateApiDocs(buildLocation): |
"""Zip up api_docs, upload it, and upload the raw tree of docs""" |
@@ -863,6 +938,8 @@ def CreateApiDocs(buildLocation): |
# upload to continuous/svn_rev and to continuous/latest |
UploadFile(api_zip, False) |
+ DartArchiveUploadAPIDocs(api_zip) |
+ |
def CreateSDK(sdkpath): |
"""Create the dart-sdk's for the current OS""" |
@@ -874,7 +951,6 @@ def CreateSDK(sdkpath): |
if BUILD_OS == 'win32': |
return CreateWin32SDK(sdkpath) |
- |
def CreateLinuxSDK(sdkpath): |
sdkdir32 = join(DART_PATH, utils.GetBuildRoot('linux', 'release', 'ia32'), |
'dart-sdk') |
@@ -899,6 +975,8 @@ def CreateLinuxSDK(sdkpath): |
UploadFile(sdk64_zip) |
UploadFile(sdk64_tgz) |
+ DartArchiveUploadSDKs('linux', sdk32_zip, sdk64_zip) |
+ |
return sdk32_zip |
@@ -925,6 +1003,8 @@ def CreateMacosSDK(sdkpath): |
UploadFile(sdk32_tgz) |
UploadFile(sdk64_tgz) |
+ DartArchiveUploadSDKs('macos', sdk32_zip, sdk64_zip) |
+ |
return sdk32_zip |
@@ -945,6 +1025,8 @@ def CreateWin32SDK(sdkpath): |
UploadFile(sdk32_zip) |
UploadFile(sdk64_zip) |
+ DartArchiveUploadSDKs('win32', sdk32_zip, sdk64_zip) |
+ |
return sdk32_zip |
@@ -992,12 +1074,12 @@ def UploadFile(targetFile, createChecksum=True): |
if (NO_UPLOAD): |
return |
- |
+ |
filePathRev = "%s/%s" % (GSU_PATH_REV, os.path.basename(targetFile)) |
filePathLatest = "%s/%s" % (GSU_PATH_LATEST, os.path.basename(targetFile)) |
- if (createChecksum): |
- checksum = CreateChecksumFile(targetFile) |
+ if createChecksum: |
+ checksum = bot_utils.CreateChecksumFile(targetFile) |
checksumRev = "%s/%s" % (GSU_PATH_REV, os.path.basename(checksum)) |
checksumLatest = "%s/%s" % (GSU_PATH_LATEST, os.path.basename(checksum)) |