Merge "Differentiate build number and release name."
diff --git a/build/tools/package.py b/build/tools/package.py
index 213eb3c..3dc5edf 100755
--- a/build/tools/package.py
+++ b/build/tools/package.py
@@ -18,8 +18,8 @@
 from __future__ import print_function
 
 import argparse
-import datetime
 import os
+import re
 import shutil
 import site
 import stat
@@ -241,12 +241,28 @@
     os.chmod(file_path, mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
 
 
-def make_source_properties(out_dir):
+def make_source_properties(out_dir, release, build_number):
+    # Actual releases will have the name "r11" or similar, but
+    # source.properties versions can only be numeric. Strip the leading "r" in
+    # that case.
+    #
+    # The nightly builds will end up using the build number here (which can be
+    # identified both because the release number will be absurdly high, and
+    # because the release number and build number will be the same.
+    #
+    # Local builds will just end up using "dev" as the release name and 0 as
+    # the build number. The SDK manager won't allow these packages since the
+    # version number is bogus, but we don't want to be shipping locally built
+    # things so that's a feature.
+    match = re.match(r'r(\d+)', release)
+    if match is not None:
+        release = match.group(1)
+
     path = os.path.join(out_dir, 'source.properties')
     with open(path, 'w') as source_properties:
         source_properties.write('\n'.join([
             'Pkg.Desc = Android NDK',
-            'Pkg.Revision = 11.0.0',
+            'Pkg.Revision = {}.0.{}'.format(release, build_number),
         ]))
 
 
@@ -255,7 +271,8 @@
     shutil.copy2(changelog_path, out_dir)
 
 
-def make_package(release, package_dir, packages, host, out_dir, temp_dir):
+def make_package(release, build_number, package_dir, packages, host, out_dir,
+                 temp_dir):
     release_name = 'android-ndk-{}'.format(release)
     extract_dir = os.path.join(temp_dir, release_name)
     if os.path.exists(extract_dir):
@@ -263,7 +280,7 @@
     extract_all(package_dir, packages, extract_dir)
 
     make_ndk_build_shortcut(extract_dir, host)
-    make_source_properties(extract_dir)
+    make_source_properties(extract_dir, release, build_number)
     copy_changelog(extract_dir)
 
     host_tag = build_support.host_to_tag(host)
@@ -308,8 +325,8 @@
             default=build_support.get_default_host(),
             help='Package binaries for given OS (e.g. linux).')
         self.add_argument(
-            '--release', default=datetime.date.today().strftime('%Y%m%d'),
-            help='Release name for the package.')
+            '--build-number', help='Build number for use in version files.')
+        self.add_argument('--release', help='Release name for the package.')
 
         self.add_argument(
             '-f', '--force', dest='force', action='store_true',
@@ -335,6 +352,22 @@
     if args.arch is not None:
         arches = [args.arch]
 
+    if args.release is not None is args.build_number is None:
+        sys.exit('--release requires --build-number')
+
+    # The package will end up being named android-ndk-$RELEASE-$HOST_TAG.
+    # In order of preference, $RELEASE will be the --release argument, the
+    # build number, or simply "dev".
+    release = args.release
+    if release is None:
+        release = 'dev' if args.build_number is None else args.build_number
+
+    # We need to put a build number in the source.properties file even if we
+    # aren't built on the build server. Default to 0. We do this here rather
+    # than in the arg parser definition because we want to use "dev" as the
+    # release name if --build-number was not passed.
+    build_number = 0 if args.build_number is None else args.build_number
+
     if os.path.exists(args.out_dir) and args.unpack:
         if args.force:
             shutil.rmtree(args.out_dir)
@@ -348,7 +381,7 @@
         extract_all(args.dist_dir, packages, args.out_dir)
         make_ndk_build_shortcut(args.out_dir, args.host)
     else:
-        make_package(args.release, args.dist_dir, packages, args.host,
+        make_package(release, build_number, args.dist_dir, packages, args.host,
                      args.out_dir, build_support.get_out_dir())
 
 
diff --git a/checkbuild.py b/checkbuild.py
index 35b64b1..9e2f911 100644
--- a/checkbuild.py
+++ b/checkbuild.py
@@ -23,7 +23,6 @@
 
 import argparse
 import collections
-import datetime
 import inspect
 import os
 import shutil
@@ -92,8 +91,12 @@
             help='Do not run host tests when finished.')
 
         self.add_argument(
-            '--release',
-            help='Release name. Package will be named android-ndk-RELEASE.')
+            '--build-number', help='Build number for use in version files.')
+        self.add_argument(
+            '--release', help=textwrap.dedent("""\
+            Release name. Package will be named android-ndk-RELEASE. If not
+            present, will fall back to the build number, and finally to "dev".
+            """))
 
         self.add_argument(
             '--system', choices=('darwin', 'linux', 'windows', 'windows64'),
@@ -133,6 +136,9 @@
     if args.release is not None:
         package_args.append('--release={}'.format(args.release))
 
+    if args.build_number is not None:
+        package_args.append('--build-number={}'.format(args.build_number))
+
     if args.arch is not None:
         package_args.append('--arch={}'.format(args.arch))
 
@@ -140,9 +146,11 @@
 
 
 def test_ndk(out_dir, args):
+    # Builds will be named with the release name, the build number, or "dev",
+    # in decreasing order of preference.
     release = args.release
     if args.release is None:
-        release = datetime.date.today().strftime('%Y%m%d')
+        release = 'dev' if args.build_number is None else args.build_number
 
     # The packaging step extracts all the modules to a known directory for
     # packaging. This directory is not cleaned up after packaging, so we can