mirror of https://github.com/watcha-fr/synapse
Add a CI job to check that schema deltas are in the correct folder. (#13063)
parent
97e9fbe1b2
commit
de334ac183
@ -0,0 +1 @@ |
||||
Add a CI job to check that schema deltas are in the correct folder. |
@ -0,0 +1,111 @@ |
||||
#!/usr/bin/env python3 |
||||
|
||||
# Check that no schema deltas have been added to the wrong version. |
||||
|
||||
import re |
||||
from typing import Any, Dict, List |
||||
|
||||
import click |
||||
import git |
||||
|
||||
SCHEMA_FILE_REGEX = re.compile(r"^synapse/storage/schema/(.*)/delta/(.*)/(.*)$") |
||||
|
||||
|
||||
@click.command() |
||||
@click.option( |
||||
"--force-colors", |
||||
is_flag=True, |
||||
flag_value=True, |
||||
default=None, |
||||
help="Always output ANSI colours", |
||||
) |
||||
def main(force_colors: bool) -> None: |
||||
click.secho( |
||||
"+++ Checking schema deltas are in the right folder", |
||||
fg="green", |
||||
bold=True, |
||||
color=force_colors, |
||||
) |
||||
|
||||
click.secho("Updating repo...") |
||||
|
||||
repo = git.Repo() |
||||
repo.remote().fetch() |
||||
|
||||
click.secho("Getting current schema version...") |
||||
|
||||
r = repo.git.show("origin/develop:synapse/storage/schema/__init__.py") |
||||
|
||||
locals: Dict[str, Any] = {} |
||||
exec(r, locals) |
||||
current_schema_version = locals["SCHEMA_VERSION"] |
||||
|
||||
click.secho(f"Current schema version: {current_schema_version}") |
||||
|
||||
diffs: List[git.Diff] = repo.remote().refs.develop.commit.diff(None) |
||||
|
||||
seen_deltas = False |
||||
bad_files = [] |
||||
for diff in diffs: |
||||
if not diff.new_file or diff.b_path is None: |
||||
continue |
||||
|
||||
match = SCHEMA_FILE_REGEX.match(diff.b_path) |
||||
if not match: |
||||
continue |
||||
|
||||
seen_deltas = True |
||||
|
||||
_, delta_version, _ = match.groups() |
||||
|
||||
if delta_version != str(current_schema_version): |
||||
bad_files.append(diff.b_path) |
||||
|
||||
if not seen_deltas: |
||||
click.secho( |
||||
"No deltas found.", |
||||
fg="green", |
||||
bold=True, |
||||
color=force_colors, |
||||
) |
||||
return |
||||
|
||||
if not bad_files: |
||||
click.secho( |
||||
f"All deltas are in the correct folder: {current_schema_version}!", |
||||
fg="green", |
||||
bold=True, |
||||
color=force_colors, |
||||
) |
||||
return |
||||
|
||||
bad_files.sort() |
||||
|
||||
click.secho( |
||||
"Found deltas in the wrong folder!", |
||||
fg="red", |
||||
bold=True, |
||||
color=force_colors, |
||||
) |
||||
|
||||
for f in bad_files: |
||||
click.secho( |
||||
f"\t{f}", |
||||
fg="red", |
||||
bold=True, |
||||
color=force_colors, |
||||
) |
||||
|
||||
click.secho() |
||||
click.secho( |
||||
f"Please move these files to delta/{current_schema_version}/", |
||||
fg="red", |
||||
bold=True, |
||||
color=force_colors, |
||||
) |
||||
|
||||
click.get_current_context().exit(1) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
main() |
Loading…
Reference in new issue