You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
depot_tools/mcp/git_cl.py

144 lines
3.5 KiB
Python

# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tools for interacting with git cl"""
import subprocess
from mcp.server import fastmcp
import telemetry
tracer = telemetry.get_tracer(__name__)
async def try_builder_results(
ctx: fastmcp.Context,
checkout: str,
change_list_issue: int | None = None,
):
"""Gets the try builder results for the provided change list issue
The url of a gerrit change can be parsed from a gerrit cl e.g.
https://chromium-review.googlesource.com/c/chromium/src/+/<change_list_issue>
Args:
checkout: Location of the current checkout.
change_list_issue: The change list (CL) issue id. If none is provided,
the current branch and its associated CL is used.
Returns:
A json list of builds that either ran or are still running on the provided
CL or current branch.
"""
with tracer.start_as_current_span('chromium.mcp.try_builder_results'):
command = [
"git",
"cl",
"try-results",
"--json=-",
]
if change_list_issue:
command.extend(['-i', str(change_list_issue)])
result = subprocess.run(
command,
capture_output=True,
check=True,
text=True,
cwd=checkout,
)
await ctx.info(f'stdout {result.stdout}')
await ctx.info(f'stderr {result.stderr}')
return result.stdout
async def get_current_changes(
ctx: fastmcp.Context,
checkout: str,
) -> str:
"""Shows differences between local tree and last upload.
Args:
checkout: Location of the current checkout.
Returns:
A diff of the current checkout and the last upload.
"""
with tracer.start_as_current_span('chromium.mcp.get_current_changes'):
command = [
"git",
"cl",
"diff",
]
result = subprocess.run(
command,
capture_output=True,
check=True,
text=True,
cwd=checkout,
)
await ctx.info(f'stdout {result.stdout}')
await ctx.info(f'stderr {result.stderr}')
return result.stdout
async def format_checkout(
ctx: fastmcp.Context,
checkout: str,
) -> None:
"""Format the current checkout.
This step should be called before attempting to upload any
code.
Args:
checkout: Location of the current checkout.
Returns:
None
"""
with tracer.start_as_current_span('chromium.mcp.format'):
command = [
"git",
"cl",
"format",
]
result = subprocess.run(
command,
capture_output=True,
check=True,
text=True,
cwd=checkout,
)
await ctx.info(f'stdout {result.stdout}')
await ctx.info(f'stderr {result.stderr}')
return result.stdout
async def upload_change_list(
ctx: fastmcp.Context,
checkout: str,
) -> None:
"""Uploads the current committed changes to codereview
Args:
checkout: Location of the current checkout.
Returns:
None
"""
command = [
"git",
"cl",
"upload",
"-f",
]
result = subprocess.run(
command,
capture_output=True,
check=True,
text=True,
cwd=checkout,
)
await ctx.info(f'stdout {result.stdout}')
await ctx.info(f'stderr {result.stderr}')
return result.stdout