Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 33 additions & 42 deletions tools/maint/rebaseline_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def get_installed_emsdk_sha():
return parts[1]


def get_emsdk_revision_log(old_sha, new_sha, limit=30):
def format_emsdk_version_update(old_sha, new_sha, limit=30):
assert old_sha != 'none'
assert old_sha != new_sha
log_url = f'https://chromium.googlesource.com/emscripten-releases/+log/{old_sha}..{new_sha}'
Expand All @@ -66,26 +66,22 @@ def get_emsdk_revision_log(old_sha, new_sha, limit=30):
data = data[4:]
j = json.loads(data)
entries = j.get('log', [])
lines = [f'emsdk_version: {old_sha} => {new_sha} ({log_url})']
if entries:
lines.append('')
for entry in entries[:limit]:
short_sha = entry['commit'][:8]
subject = entry['message'].splitlines()[0]
lines.append(f' {short_sha} {subject}')
if len(entries) > limit:
lines.append(' ... (and more, see full log)')
lines = [f'emsdk version updated: {old_sha} => {new_sha}']
lines.append('')
return '\n'.join(lines)

lines.append('This includes the following revisions:')
lines.append('')
lines.append('```')
for entry in entries[:limit]:
short_sha = entry['commit'][:8]
subject = entry['message'].splitlines()[0]
lines.append(f'- {short_sha} {subject}')
if len(entries) > limit:
lines.append(' ... (and more, see full log)')
lines.append('```')
lines.append("")
lines.append(f"Full log: {log_url}")

def format_emsdk_version_update():
filename = 'test/emsdk_version.txt'
content = utils.read_file(filename)
old_content = run(['git', 'show', f'HEAD:{filename}'])
old_sha = old_content.strip() if old_content else 'none'
new_sha = content.strip()
return get_emsdk_revision_log(old_sha, new_sha)
return '\n'.join(lines)


def process_changed_file(filename):
Expand Down Expand Up @@ -123,6 +119,8 @@ def main():
if args.clear_cache:
run(['./emcc', '--clear-cache'])

current_sha = None
installed_sha = None
if not args.skip_tests:
if not args.check_only and run(['git', 'status', '-uno', '--porcelain']).strip():
print('tree is not clean')
Expand All @@ -137,6 +135,7 @@ def main():
if installed_sha == current_sha:
print(f'emsdk version is up-to-date ({current_sha})')
return 0
print(f'update emsdk: {current_sha} => {installed_sha}')
utils.write_file(emsdk_version_file, installed_sha + '\n')
elif installed_sha and installed_sha != current_sha:
utils.exit_with_error(f'installed emsdk version ({installed_sha}) does not match test/emsdk_version.txt ({current_sha}). Pass --bump-emsdk to update it.')
Expand All @@ -145,52 +144,44 @@ def main():

output = run(['git', 'status', '-uno', '--porcelain'])
filenames = []
emsdk_version_updated = False
for line in output.splitlines():
filename = line.strip().rsplit(' ', 1)[1]
if filename == 'test/emsdk_version.txt':
emsdk_version_updated = True
elif filename.startswith('test') and os.path.isfile(filename):
if filename.startswith('test') and os.path.isfile(filename) and filename != 'test/emsdk_version.txt':
filenames.append(filename)

if not filenames and not emsdk_version_updated:
if not filenames and not args.bump_emsdk:
print('test expectations are up-to-date')
return 0

if args.check_only:
message = f'''Test expectations are out-of-date

The following ({len(filenames)}) test expectation files were updated by
running the tests with `--rebaseline`:

```
'''
elif emsdk_version_updated:
message = '''Update emsdk version used in tests
message = 'Test expectations are out-of-date\n'
elif args.bump_emsdk:
message = '''Update emsdk version used in testing

This is an automatic change generated by tools/maint/rebaseline_tests.py --bump-emsdk.

```
'''
message += format_emsdk_version_update()
message += format_emsdk_version_update(current_sha, installed_sha) + '\n'
else:
message = f'''Automatic rebaseline of codesize expectations. NFC
message = '''Automatic rebaseline of codesize expectations. NFC

This is an automatic change generated by tools/maint/rebaseline_tests.py.
'''

if filenames:
message += f'''
The following ({len(filenames)}) test expectation files were updated by
running the tests with `--rebaseline`:

```
'''
for file in sorted(filenames):
message += process_changed_file(file)

for file in sorted(filenames):
message += process_changed_file(file)

if all_deltas:
message += f'\nAverage change: {statistics.mean(all_deltas):+.2f}% ({min(all_deltas):+.2f}% - {max(all_deltas):+.2f}%)\n'
if all_deltas:
message += f'\nAverage change: {statistics.mean(all_deltas):+.2f}% ({min(all_deltas):+.2f}% - {max(all_deltas):+.2f}%)\n'

message += '```\n'
message += '```\n'

print(message)
if args.check_only:
Expand Down