Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/perfetto/tools/bisect_ui_releases
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

117 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright (C) 2024 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Runs a bisection on the autopush ui.perfetto.dev builds
Similar to git bisect, but bisects UI releases rather than commits.
This works only for autopush builds from main, ignores canary and stable
channels, as they make the history non-linear.
How it works:
- It first obtains an unordered list of versions from gs://ui.perfetto.dev
- Then obtains the list of ordered commits from git
- Intersects the two lists, keeping only git commits that have a corresponding
ui autopush release.
- Proceeds with a guided bisect in the range.
"""
import argparse
import sys
from subprocess import check_output
COMMIT_ABBR_LEN = 9 # UI truncates commitish to 9 chars, e.g. v45.0-38b7c2b12.
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
'--good',
default=None,
help='Last good release (e.g. v44.0-257a02990).' +
'Defaults to the first verion available')
parser.add_argument(
'--bad',
default=None,
help='First bad release. Defaults to the latest version available')
args = parser.parse_args()
print('Fetching list of UI releases from GCS...')
rev_list = check_output(['gsutil.py', 'ls', 'gs://ui.perfetto.dev/']).decode()
ui_map = {} # maps '38b7c2b12' -> 'v45.0-38b7c2b12'
for line in rev_list.split():
version = line.split('/')[3]
if '-' not in version:
continue
ver_hash = version.split('-')[1]
ui_map[ver_hash] = version
print('Found %d UI versions' % len(ui_map))
# Get the linear history of all commits.
print('Fetching revision history from git...')
ui_versions = []
git_out = check_output(['git', 'rev-list', '--left-only',
'origin/main']).decode()
for line in git_out.split():
line = line.strip()
rev = line[0:COMMIT_ABBR_LEN]
if rev not in ui_map:
continue # Not all perfetto commits have a UI autopush build.
ui_versions.append(ui_map[rev])
# git rev-list emits entries in recent -> older versions. Reverse it.
ui_versions.reverse()
# Note that not all the entries in ui_map will be present in ui_versions.
# This is because ui_map contains also builds coming from canary and stable
# branches, that we ignore here.
start = ui_versions.index(args.good) if args.good else 0
end = ui_versions.index(args.bad) if args.bad else len(ui_versions) - 1
while end - start > 1:
print('\033c', end='') # clear terminal.
print(
'Bisecting from %s (last good) to %s (first bad), %d revisions to go' %
(ui_versions[start], ui_versions[end], end - start + 1))
mid = (end + start) // 2
# Print a visual indication of where we are in the bisect.
for i in reversed(range(start, end + 1)):
sfx = ''
if i == start:
sfx = ' GOOD --------------'
elif i == end:
sfx = ' BAD ---------------'
elif i == mid:
sfx = ' <- version to test'
print(ui_versions[i] + sfx)
user_feedback = input(
'https://ui.perfetto.dev/%s/. Type g for good and b for bad: ' %
ui_versions[mid])
if user_feedback == 'b':
end = mid
elif user_feedback == 'g':
start = mid
else:
print('Unrecognised key "%d", try again' % user_feedback)
print('First bad UI release %s' % ui_versions[end])
print('You should now inspect the individual commits via git log good..bad')
if __name__ == '__main__':
sys.exit(main())