Index: tools/push-to-trunk/generate_version.py |
diff --git a/tools/push-to-trunk/generate_version.py b/tools/push-to-trunk/generate_version.py |
index b4a0221eae5c10224a18d79bf8067ca3df958177..12885066c675c9bbbe2413ef4a55b0af35999597 100755 |
--- a/tools/push-to-trunk/generate_version.py |
+++ b/tools/push-to-trunk/generate_version.py |
@@ -5,9 +5,23 @@ |
""" |
Script to set v8's version file to the version given by the latest tag. |
+ |
+The script can be run in two modes: |
+1) As a gclient hook with the option --hook. |
+ The script will write a temporary version file into the checkout. |
+2) During compilation as an action. |
+ The script will write version.cc in the output folder based on the |
+ tag info. In case of a failure it will fall back to the temporary file |
+ from the hook call. |
+ |
+In most cases, 2) will succeed and the temporary information from 1) won't |
+be used. In case the checkout is copied somewhere and the git context is |
+lost (e.g. on the android_aosp builder), the temporary file from 1) is |
+required. |
""" |
+import optparse |
import os |
import re |
import subprocess |
@@ -17,8 +31,10 @@ import sys |
CWD = os.path.abspath( |
os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) |
VERSION_CC = os.path.join(CWD, "src", "version.cc") |
+TMP_VERSION_CC = os.path.join(CWD, ".version.cc") |
-def main(): |
+ |
+def generate_version_file(): |
tag = subprocess.check_output( |
"git describe --tags", |
shell=True, |
@@ -50,28 +66,68 @@ def main(): |
patch = "0" |
# Modify version.cc with the new values. |
- with open(VERSION_CC, "r") as f: |
- text = f.read() |
output = [] |
- for line in text.split("\n"): |
- for definition, substitute in ( |
- ("MAJOR_VERSION", major), |
- ("MINOR_VERSION", minor), |
- ("BUILD_NUMBER", build), |
- ("PATCH_LEVEL", patch), |
- ("IS_CANDIDATE_VERSION", candidate)): |
- if line.startswith("#define %s" % definition): |
- line = re.sub("\d+$", substitute, line) |
- output.append(line) |
- with open(VERSION_CC, "w") as f: |
- f.write("\n".join(output)) |
- |
- # Log what was done. |
+ with open(VERSION_CC, "r") as f: |
+ for line in f: |
+ for definition, substitute in ( |
+ ("MAJOR_VERSION", major), |
+ ("MINOR_VERSION", minor), |
+ ("BUILD_NUMBER", build), |
+ ("PATCH_LEVEL", patch), |
+ ("IS_CANDIDATE_VERSION", candidate)): |
+ if line.startswith("#define %s" % definition): |
+ line = re.sub("\d+$", substitute, line) |
+ output.append(line) |
+ # Log what was calculated. |
candidate_txt = " (candidate)" if candidate == "1" else "" |
patch_txt = ".%s" % patch if patch != "0" else "" |
version_txt = ("%s.%s.%s%s%s" % |
(major, minor, build, patch_txt, candidate_txt)) |
- print "Modified version.cc. Set V8 version to %s" % version_txt |
+ print "Modifying version.cc. Set V8 version to %s" % version_txt |
+ return "".join(output) |
+ |
+ |
+def delete_tmp_version_file(): |
+ # Make sure a subsequent call to this script doesn't use an outdated |
+ # version file. |
+ if os.path.exists(TMP_VERSION_CC): |
+ os.remove(TMP_VERSION_CC) |
+ |
+ |
+def main(): |
+ parser = optparse.OptionParser() |
+ parser.add_option("--hook", |
+ help="Run as a gclient hook", |
+ default=False, action="store_true") |
+ (options, args) = parser.parse_args() |
+ |
+ if options.hook: |
+ version_out = TMP_VERSION_CC |
+ else: |
+ if len(args) != 1: |
+ print "Error: Specify the output file path for version.cc" |
+ return 1 |
+ version_out = args[0] |
+ |
+ assert os.path.exists(os.path.dirname(version_out)) |
+ |
+ try: |
+ version_file_content = generate_version_file() |
+ except Exception as e: |
+ # Allow exceptions when run during compilation. E.g. there might be no git |
+ # context availabe. When run as a gclient hook, generation must succeed. |
+ if options.hook: |
+ delete_tmp_version_file() |
+ raise e |
+ # Assume the script already ran as a hook. |
+ print "No git context available. Using V8 version from hook." |
+ assert os.path.exists(TMP_VERSION_CC) |
+ with open(TMP_VERSION_CC, "r") as f: |
+ version_file_content = f.read() |
+ |
+ delete_tmp_version_file() |
+ with open(version_out, "w") as f: |
+ f.write(version_file_content) |
return 0 |
if __name__ == "__main__": |