Chromium Code Reviews| Index: tools/create_tarball.py |
| diff --git a/tools/create_tarball.py b/tools/create_tarball.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..97e1bcb72b1cbafd11bfe506a6d923d844fc4cb2 |
| --- /dev/null |
| +++ b/tools/create_tarball.py |
| @@ -0,0 +1,221 @@ |
| +#!/usr/bin/env python |
| +# |
| +# Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| +# for details. All rights reserved. Use of this source code is governed by a |
| +# BSD-style license that can be found in the LICENSE file. |
| +# |
| + |
| +# Script to build a tarball of the Dart source. |
| +# |
| +# The tarball includes all the source needed to build Dart. This |
| +# includes source in third_party. As part of creating the tarball the |
| +# files used to build Debian packages are copied to a top-level debian |
| +# directory. This makes it easy to build Debian packages from the |
| +# tarball. |
| +# |
| +# For building a Debian package renaming the tarball to follow the |
| +# Debian is needed. |
|
kustermann
2014/02/06 15:28:04
"to follow the Debian" sounds strange.
Søren Gjesse
2014/02/07 09:52:43
Done.
|
| +# |
| +# $ mv dart-XXX.tar.gz dart_XXX.orig.tar.gz |
| +# $ tar xf dart_XXX.orig.tar.gz |
| +# $ cd dart_XXX |
| +# $ debuild -us -uc |
| + |
| +import datetime |
| +import optparse |
| +import sys |
| +import tarfile |
| +import tempfile |
|
kustermann
2014/02/06 15:28:04
tempfile not used.
Søren Gjesse
2014/02/07 09:52:43
Removed.
|
| +import utils |
| + |
| +from os import listdir, makedirs, remove, rmdir |
|
kustermann
2014/02/06 15:28:04
remove, rmdir not used.
Søren Gjesse
2014/02/07 09:52:43
Removed.
|
| +from os.path import basename, dirname, join, realpath, exists, isdir, split |
|
kustermann
2014/02/06 15:28:04
basename, dirname, realpath, isdir unused.
Søren Gjesse
2014/02/07 09:52:43
Removed.
|
| + |
| +HOST_OS = utils.GuessOS() |
| + |
| +# TODO (16582): Remove this when the LICENSE file becomes part of |
| +# all checkouts. |
| +license = [ |
|
kustermann
2014/02/06 15:28:04
Python supports multiline strings, why don't you d
Søren Gjesse
2014/02/07 09:52:43
This will go away when https://codereview.chromium
|
| + 'This license applies to all parts of Dart that are not externally', |
| + 'maintained libraries. The external maintained libraries used by', |
| + 'Dart are:', |
| + '', |
| + '7-Zip - in third_party/7zip', |
| + 'JSCRE - in runtime/third_party/jscre', |
| + 'Ant - in third_party/apache_ant', |
| + 'args4j - in third_party/args4j', |
| + 'bzip2 - in third_party/bzip2', |
| + 'Commons IO - in third_party/commons-io', |
| + 'Commons Lang in third_party/commons-lang', |
| + 'dromaeo - in samples/third_party/dromaeo', |
| + 'Eclipse - in third_party/eclipse', |
| + 'gsutil - in third_party/gsutil', |
| + 'Guava - in third_party/guava', |
| + 'hamcrest - in third_party/hamcrest', |
| + 'Httplib2 - in samples/third_party/httplib2', |
| + 'JSON - in third_party/json', |
| + 'JUnit - in third_party/junit', |
| + 'Oauth - in samples/third_party/oauth2client', |
| + 'weberknecht - in third_party/weberknecht', |
| + 'fest - in third_party/fest', |
| + 'mockito - in third_party/mockito', |
| + '', |
| + 'The libraries may have their own licenses; we recommend you read them,', |
| + 'as their terms may differ from the terms below.', |
| + '', |
| + 'Copyright 2012, the Dart project authors. All rights reserved.', |
| + 'Redistribution and use in source and binary forms, with or without', |
| + 'modification, are permitted provided that the following conditions are', |
| + 'met:', |
| + ' * Redistributions of source code must retain the above copyright', |
| + ' notice, this list of conditions and the following disclaimer.', |
| + ' * Redistributions in binary form must reproduce the above', |
| + ' copyright notice, this list of conditions and the following', |
| + ' disclaimer in the documentation and/or other materials provided', |
| + ' with the distribution.', |
| + ' * Neither the name of Google Inc. nor the names of its', |
| + ' contributors may be used to endorse or promote products derived', |
| + ' from this software without specific prior written permission.', |
| + 'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS', |
| + '"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT', |
| + 'LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR', |
| + 'A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT', |
| + 'OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,', |
| + 'SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT', |
| + 'LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,', |
| + 'DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY', |
| + 'THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT', |
| + '(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE', |
| + 'OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.' |
| +] |
| + |
| +# Flags. |
| +verbose = False |
| + |
| +# Name of the dart directory when unpacking the tarball. |
| +versiondir = '' |
| + |
| +# Ignore Git/SVN files, checked-in binaries, backup files, etc.. |
| +ignoredPaths = ['out', 'tools/testing/bin' |
| + 'third_party/7zip', 'third_party/android_tools', |
| + 'third_party/clang', 'third_party/d8', |
| + 'third_party/firefox_jsshell'] |
| +ignoredDirs = ['.svn', '.git'] |
| +ignoredEndings = ['.mk', '.pyc', 'Makefile', '~'] |
| + |
| +def BuildOptions(): |
| + result = optparse.OptionParser() |
| + result.add_option("-v", "--verbose", |
| + help='Verbose output.', |
| + default=False, action="store_true") |
| + return result |
| + |
| +def Filter(tar_info): |
| + _, tail = split(tar_info.name) |
| + if tail in ignoredDirs: |
| + return None |
| + for path in ignoredPaths: |
| + if tar_info.name.startswith(path): |
| + return None |
| + for ending in ignoredEndings: |
| + if tar_info.name.endswith(ending): |
| + return None |
| + # Add the dart directory name with version. |
| + original_name = tar_info.name |
| + # Place the debian directory one level over the rest which are |
| + # placed in the directory 'dart'. This enables building the Debian |
| + # packages out-of-the-box. |
| + tar_info.name = join(versiondir, 'dart', tar_info.name) |
| + if verbose: |
| + print 'Adding %s as %s' % (original_name, tar_info.name) |
| + return tar_info |
| + |
| +def GenerateCopyright(filename): |
| + license_lines = license |
| + try: |
| + # Currently the LICENSE file is part of a svn-root checkout. |
| + lf = open('../LICENSE', 'r') |
|
kustermann
2014/02/06 15:28:04
'r' is the default + using context manager?
Søren Gjesse
2014/02/07 09:52:43
Done.
|
| + license_lines = lf.read().splitlines() |
| + print license_lines |
|
kustermann
2014/02/06 15:28:04
Why print?
Søren Gjesse
2014/02/07 09:52:43
Debug code. Removed.
|
| + lf.close() |
| + except: |
| + pass |
| + |
| + f = open(filename, 'w') |
| + f.write('Name: dart\n') |
| + f.write('Maintainer: Dart Team <misc@dartlang.org>\n') |
| + f.write('Source: https://code.google.com/p/dart/\n') |
| + f.write('License:\n') |
| + for line in license_lines: |
| + f.write(' %s\n' % line) |
| + f.close() |
| + |
| +def GenerateChangeLog(filename, version): |
| + f = open(filename, 'w') |
| + f.write('dart (%s-1) UNRELEASED; urgency=low\n' % version) |
| + f.write('\n') |
| + f.write(' * Generated file.\n') |
| + f.write('\n') |
| + f.write(' -- Dart Team <misc@dartlang.org> %s\n' % |
| + datetime.datetime.utcnow().strftime('%a, %d %b %Y %X +0000')) |
|
kustermann
2014/02/06 15:28:04
Maybe use a multiline string? [see comment at lice
Søren Gjesse
2014/02/07 09:52:43
It does not indent as well as this I think.
|
| + f.close() |
| + |
| +def GenerateSvnRevision(filename, svn_revision): |
| + f = open(filename, 'w') |
|
kustermann
2014/02/06 15:28:04
It's usually nicer (and safer if an exception occu
Søren Gjesse
2014/02/07 09:52:43
Done.
|
| + f.write(svn_revision) |
| + f.close() |
| + |
| + |
| +def CreateTarball(): |
| + # Generate the name of the tarfile |
| + version = utils.GetVersion() |
| + global versiondir |
| + versiondir = 'dart-%s' % version |
| + tarname = '%s.tar.gz' % versiondir |
| + debian_dir = 'tools/linux_dist_support/debian' |
| + # Create the tar file in the out directory. |
| + tardir = utils.GetBuildDir(HOST_OS, HOST_OS) |
| + if not exists(tardir): |
| + makedirs(tardir) |
| + tarfilename = join(tardir, tarname) |
|
kustermann
2014/02/06 15:28:04
It's slightly spooky, that you tar up the dart dir
Søren Gjesse
2014/02/07 09:52:43
I started out by generating it in the parent direc
|
| + print 'Creating tarball: %s' % (tarfilename) |
|
kustermann
2014/02/06 15:28:04
No parenthesis needed!
Søren Gjesse
2014/02/07 09:52:43
Done.
|
| + with tarfile.open(tarfilename, mode='w:gz') as tar: |
| + for f in listdir('.'): |
|
kustermann
2014/02/06 15:28:04
You assume this is run from the root of the dart d
Søren Gjesse
2014/02/07 09:52:43
Done. The script can now be run from anywhere.
|
| + tar.add(f, filter=Filter) |
| + for f in listdir(debian_dir): |
| + tar.add(join(debian_dir, f), |
| + arcname='%s/debian/%s' % (versiondir, f)) |
| + |
| + with utils.TempDir() as temp_dir: |
| + # Generate and add debian/copyright |
| + copyright = join(temp_dir, 'copyright') |
| + GenerateCopyright(copyright) |
| + tar.add(copyright, arcname='%s/debian/copyright' % versiondir) |
| + |
| + # Generate and add debian/changelog |
| + change_log = join(temp_dir, 'changelog') |
| + GenerateChangeLog(change_log, version) |
| + tar.add(change_log, arcname='%s/debian/changelog' % versiondir) |
| + |
| + # For bleeding_edge add the SVN_REVISION file. |
| + if utils.GetChannel() == 'be': |
| + svn_revision = join(temp_dir, 'SVN_REVISION') |
| + GenerateSvnRevision(svn_revision, utils.GetSVNRevision()) |
| + tar.add(svn_revision, arcname='%s/dart/tools/SVN_REVISION' % versiondir) |
| + |
| +def Main(): |
| + if HOST_OS != 'linux': |
| + print 'Tarball can only be created on linux' |
| + return -1 |
| + |
| + # Parse the options. |
| + parser = BuildOptions() |
| + (options, args) = parser.parse_args() |
| + if options.verbose: |
| + global verbose |
| + verbose = True |
| + |
| + CreateTarball() |
| + |
| +if __name__ == '__main__': |
| + sys.exit(Main()) |