| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Chromium presubmit script for the WebDatabase. |
| |
| See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
| for more details on the presubmit API built into depot_tools.""" |
| |
| PRESUBMIT_VERSION = '2.0.0' |
| |
| def CheckCurrentDBVersionUpdatedCorrectly(input_api, output_api): |
| """Checks that whenever the WebDatabase::kCurrentVersionNumber is updated, |
| - WebDatabaseMigrationTest::kCurrentTestedVersionNumber is updated |
| accordingly. |
| - A version_x.sql file for the previous version is added.""" |
| |
| def FindAffectedFile(path): |
| return next(iter(input_api.change.AffectedTestableFiles( |
| file_filter = lambda f: f.LocalPath() == path)), None) |
| |
| # Helper functions to extract integer constants from an affected file `f` via |
| # a regex `pattern`, those first capture group corresponds to the integer. |
| # `new_content` indicates whether the old/new content of `f` is searched. |
| def FindInt(f, pattern, new_content = True): |
| content = "".join(f.NewContents() if new_content else f.OldContents()) |
| match = pattern.search(content) |
| return int(match.group(1)) if match else None |
| def FindCppInt(f, name, new_content = True): |
| return FindInt(f, input_api.re.compile("%s = ([0-9]+)" % name), new_content) |
| |
| # Determine if the version changed. |
| webdb_file = FindAffectedFile("components/webdata/common/web_database.cc") |
| if not webdb_file: |
| return [] |
| version_var_name = "WebDatabase::kCurrentVersionNumber" |
| version = FindCppInt(webdb_file, version_var_name, new_content=True) |
| if version == FindCppInt(webdb_file, version_var_name, new_content=False): |
| return [] |
| |
| # Find the current tested version and check that it matches `version`. |
| migration_test_path = \ |
| "components/webdata/common/web_database_migration_unittest.cc" |
| migration_test_file = FindAffectedFile(migration_test_path) |
| if (not migration_test_file or version != FindCppInt(migration_test_file, |
| "WebDatabaseMigrationTest::kCurrentTestedVersionNumber")): |
| return [output_api.PresubmitError(""" |
| Whenever WebDatabase::kCurrentVersionNumber is updated, |
| WebDatabaseMigrationTest::kCurrentTestedVersionNumber in %s |
| needs to be updated.""" % migration_test_path)] |
| |
| # Check that a golden file for the previous version was added, and that its |
| # version is set correctly. |
| golden_file_dir = "components/test/data/web_database" |
| golden_file = FindAffectedFile( |
| "%s/version_%d.sql" % (golden_file_dir, version-1)) |
| sql_version_pattern = input_api.re.compile( |
| "INSERT INTO meta VALUES\('version','([0-9]+)'\)") |
| if not golden_file or version-1 != FindInt(golden_file, sql_version_pattern): |
| return [output_api.PresubmitError(""" |
| A golden file for version {0} needs to be added in {1}. |
| There are generally two ways of doing so: |
| - Copy version_{2}.sql. Update the version to {0} and make any changes that were |
| made in version {0} (new tables, columns, etc). You can find out what |
| changed by either looking at the WebDatabaseMigrationTest, or by finding |
| the relevant CL (blame on version_{2}.sql) and looking at the migration logic. |
| - Generate the file from scratch: |
| - Launch Chrome with WebDatabase version {0}. That is, without any of the new |
| changes that version {3} introduces. |
| ./out/Default/chrome --user-data-dir=/tmp/sql |
| No need to complete the first run - closing Chrome immediately is fine. |
| - Run sqlite3 '/tmp/sql/Default/Web Data' |
| .output version_{0}.sql |
| .dump |
| .exit |
| - Remove any INSERT statements to tables other than "meta" from |
| version_{0}.sql.""".format(version-1, golden_file_dir, version-2, version))] |
| |
| return [] |