Chromium Code Reviews| Index: build/write_build_date_header.py |
| diff --git a/build/write_build_date_header.py b/build/write_build_date_header.py |
| index 0ba47049b570377c4e090a4c9d1fc7884afb9261..99ed7811b05ca7390ff12ebe625ef75810201842 100755 |
| --- a/build/write_build_date_header.py |
| +++ b/build/write_build_date_header.py |
| @@ -4,40 +4,50 @@ |
| # found in the LICENSE file. |
| """Writes a file that contains a define that approximates the build date. |
| -For unofficial builds, the build date is set to the most recent first Sunday |
| -of a month, in UTC time. |
| - |
| -For official builds, the build date is set to the current date (in UTC). |
| +build_type impacts the timestamp generated: |
| +- default: the build date is set to the most recent first Sunday of a month at |
| + 5:00am. The reason is that it is a time where invalidating the build cache |
| + shouldn't have major reprecussions (due to lower load). |
| +- official: the build date is set to the current date at 5:00am, or the day |
| + before if the current time is before 5:00am. |
| +Either way, it is guaranteed to be in the past and always in UTC. |
| It is also possible to explicitly set a build date to be used. |
| - |
| -The reason for using the first Sunday of a month for unofficial builds is that |
| -it is a time where invalidating the build cache shouldn't have major |
| -reprecussions (due to lower load). |
| """ |
| import argparse |
| import calendar |
| import datetime |
| +import doctest |
| import os |
| import sys |
| def GetFirstSundayOfMonth(year, month): |
| - """Returns the first sunday of the given month of the given year.""" |
| + """Returns the first sunday of the given month of the given year. |
| + |
| + >>> GetFirstSundayOfMonth(2016, 2) |
|
lgarron
2016/04/04 17:43:24
Any reason these shouldn't stay asserts?
M-A Ruel
2016/04/04 18:05:01
because asserts will not print both values when it
|
| + 7 |
| + >>> GetFirstSundayOfMonth(2016, 3) |
| + 6 |
| + >>> GetFirstSundayOfMonth(2000, 1) |
| + 2 |
| + """ |
| weeks = calendar.Calendar().monthdays2calendar(year, month) |
| # Return the first day in the first week that is a Sunday. |
| return [date_day[0] for date_day in weeks[0] if date_day[1] == 6][0] |
| -# Validate that GetFirstSundayOfMonth works. |
| -assert GetFirstSundayOfMonth(2016, 2) == 7 |
| -assert GetFirstSundayOfMonth(2016, 3) == 6 |
| -assert GetFirstSundayOfMonth(2000, 1) == 2 |
| - |
| - |
| def GetBuildDate(build_type, utc_now): |
| - """Gets the approximate build date given the specific build type.""" |
| + """Gets the approximate build date given the specific build type. |
| + |
| + >>> GetBuildDate('default', datetime.datetime(2016, 2, 6, 1, 2, 3)) |
| + 'Jan 03 2016 01:02:03' |
| + >>> GetBuildDate('default', datetime.datetime(2016, 2, 7, 5)) |
| + 'Feb 07 2016 05:00:00' |
| + >>> GetBuildDate('default', datetime.datetime(2016, 2, 8, 5)) |
| + 'Feb 07 2016 05:00:00' |
| + """ |
| day = utc_now.day |
| month = utc_now.month |
| year = utc_now.year |
| @@ -54,28 +64,38 @@ def GetBuildDate(build_type, utc_now): |
| month = 12 |
| year -= 1 |
| day = GetFirstSundayOfMonth(year, month) |
| - return '{:%b %d %Y}'.format(datetime.date(year, month, day)) |
| - |
| - |
| -# Validate that GetBuildDate works. |
| -assert GetBuildDate('default', datetime.date(2016, 2, 6)) == 'Jan 03 2016' |
| -assert GetBuildDate('default', datetime.date(2016, 2, 7)) == 'Feb 07 2016' |
| -assert GetBuildDate('default', datetime.date(2016, 2, 8)) == 'Feb 07 2016' |
| + now = datetime.datetime( |
| + year, month, day, utc_now.hour, utc_now.minute, utc_now.second) |
| + return '{:%b %d %Y %H:%M:%S}'.format(now) |
| def main(): |
| - argument_parser = argparse.ArgumentParser() |
| + if doctest.testmod()[0]: |
|
Nico
2016/04/04 15:31:44
^ mithro: see here for the doctest question
|
| + return 1 |
| + argument_parser = argparse.ArgumentParser( |
| + description=sys.modules[__name__].__doc__, |
| + formatter_class=argparse.RawDescriptionHelpFormatter) |
| argument_parser.add_argument('output_file', help='The file to write to') |
| - argument_parser.add_argument('build_type', help='The type of build', |
| - choices=('official', 'default')) |
| - argument_parser.add_argument('build_date_override', nargs='?', |
| - help='Optional override for the build date') |
| + argument_parser.add_argument( |
| + 'build_type', help='The type of build', choices=('official', 'default')) |
| + argument_parser.add_argument( |
| + 'build_date_override', nargs='?', |
| + help='Optional override for the build date. Format must be ' |
| + '\'Mmm DD YYYY HH:MM:SS\'') |
| args = argument_parser.parse_args() |
| if args.build_date_override: |
| + # Format is expected to be "Mmm DD YYYY HH:MM:SS". |
| build_date = args.build_date_override |
| else: |
| - build_date = GetBuildDate(args.build_type, datetime.datetime.utcnow()) |
| + now = datetime.datetime.utcnow() |
| + if now.hour < 5: |
| + # The time is locked at 5:00 am in UTC to cause the build cache |
| + # invalidation to not happen exactly at midnight. Take the day before. |
|
lgarron
2016/04/04 17:43:24
Could you rephrase this to something like "Use the
M-A Ruel
2016/04/04 18:05:01
Done.
|
| + # See //base/build_time.cc. |
| + now = now - datetime.timedelta(day=1) |
| + now = datetime.datetime(now.year, now.month, now.day, 5, 0, 0) |
| + build_date = GetBuildDate(args.build_type, now) |
| output = ('// Generated by //build/write_build_date_header.py\n' |
| '#ifndef BUILD_DATE\n' |