mirror of
https://github.com/qodo-ai/pr-agent.git
synced 2025-07-04 04:40:38 +08:00
Enhance logging and refactor code in gitlab_webhook.py, update logger level in bitbucket_app.py and github_polling.py, remove redundant section in github.md
This commit is contained in:
@ -67,18 +67,6 @@ When you open your next PR, you should see a comment from `github-actions` bot w
|
|||||||
PR_CODE_SUGGESTIONS.NUM_CODE_SUGGESTIONS: 6 # Increase number of code suggestions
|
PR_CODE_SUGGESTIONS.NUM_CODE_SUGGESTIONS: 6 # Increase number of code suggestions
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
## Run as a polling server
|
|
||||||
Request reviews by tagging your GitHub user on a PR
|
|
||||||
|
|
||||||
Follow [steps 1-3](#run-as-a-github-action) of the GitHub Action setup.
|
|
||||||
|
|
||||||
Run the following command to start the server:
|
|
||||||
|
|
||||||
```
|
|
||||||
python pr_agent/servers/github_polling.py
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Run as a GitHub App
|
## Run as a GitHub App
|
||||||
|
@ -28,7 +28,7 @@ from pr_agent.tools.pr_code_suggestions import PRCodeSuggestions
|
|||||||
from pr_agent.tools.pr_description import PRDescription
|
from pr_agent.tools.pr_description import PRDescription
|
||||||
from pr_agent.tools.pr_reviewer import PRReviewer
|
from pr_agent.tools.pr_reviewer import PRReviewer
|
||||||
|
|
||||||
setup_logger(fmt=LoggingFormat.JSON)
|
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
secret_provider = get_secret_provider() if get_settings().get("CONFIG.SECRET_PROVIDER") else None
|
secret_provider = get_secret_provider() if get_settings().get("CONFIG.SECRET_PROVIDER") else None
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ from pr_agent.config_loader import get_settings
|
|||||||
from pr_agent.git_providers import get_git_provider
|
from pr_agent.git_providers import get_git_provider
|
||||||
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
||||||
|
|
||||||
setup_logger(fmt=LoggingFormat.JSON)
|
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
||||||
NOTIFICATION_URL = "https://api.github.com/notifications"
|
NOTIFICATION_URL = "https://api.github.com/notifications"
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ from pr_agent.git_providers.utils import apply_repo_settings
|
|||||||
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
||||||
from pr_agent.secret_providers import get_secret_provider
|
from pr_agent.secret_providers import get_secret_provider
|
||||||
|
|
||||||
setup_logger(fmt=LoggingFormat.JSON)
|
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
secret_provider = get_secret_provider() if get_settings().get("CONFIG.SECRET_PROVIDER") else None
|
secret_provider = get_secret_provider() if get_settings().get("CONFIG.SECRET_PROVIDER") else None
|
||||||
@ -51,6 +51,9 @@ async def _perform_commands_gitlab(commands_conf: str, agent: PRAgent, api_url:
|
|||||||
@router.post("/webhook")
|
@router.post("/webhook")
|
||||||
async def gitlab_webhook(background_tasks: BackgroundTasks, request: Request):
|
async def gitlab_webhook(background_tasks: BackgroundTasks, request: Request):
|
||||||
log_context = {"server_type": "gitlab_app"}
|
log_context = {"server_type": "gitlab_app"}
|
||||||
|
get_logger().debug("Received a GitLab webhook")
|
||||||
|
|
||||||
|
# Check if the request is authorized
|
||||||
if request.headers.get("X-Gitlab-Token") and secret_provider:
|
if request.headers.get("X-Gitlab-Token") and secret_provider:
|
||||||
request_token = request.headers.get("X-Gitlab-Token")
|
request_token = request.headers.get("X-Gitlab-Token")
|
||||||
secret = secret_provider.get_secret(request_token)
|
secret = secret_provider.get_secret(request_token)
|
||||||
@ -66,44 +69,56 @@ async def gitlab_webhook(background_tasks: BackgroundTasks, request: Request):
|
|||||||
elif get_settings().get("GITLAB.SHARED_SECRET"):
|
elif get_settings().get("GITLAB.SHARED_SECRET"):
|
||||||
secret = get_settings().get("GITLAB.SHARED_SECRET")
|
secret = get_settings().get("GITLAB.SHARED_SECRET")
|
||||||
if not request.headers.get("X-Gitlab-Token") == secret:
|
if not request.headers.get("X-Gitlab-Token") == secret:
|
||||||
|
get_logger().error(f"Failed to validate secret")
|
||||||
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=jsonable_encoder({"message": "unauthorized"}))
|
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=jsonable_encoder({"message": "unauthorized"}))
|
||||||
else:
|
else:
|
||||||
|
get_logger().error(f"Failed to validate secret")
|
||||||
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=jsonable_encoder({"message": "unauthorized"}))
|
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=jsonable_encoder({"message": "unauthorized"}))
|
||||||
gitlab_token = get_settings().get("GITLAB.PERSONAL_ACCESS_TOKEN", None)
|
gitlab_token = get_settings().get("GITLAB.PERSONAL_ACCESS_TOKEN", None)
|
||||||
if not gitlab_token:
|
if not gitlab_token:
|
||||||
|
get_logger().error(f"No gitlab token found")
|
||||||
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=jsonable_encoder({"message": "unauthorized"}))
|
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=jsonable_encoder({"message": "unauthorized"}))
|
||||||
|
|
||||||
data = await request.json()
|
data = await request.json()
|
||||||
get_logger().info(json.dumps(data))
|
get_logger().info("GitLab data", json.dumps(data))
|
||||||
|
|
||||||
if data.get('object_kind') == 'merge_request' and data['object_attributes'].get('action') in ['open', 'reopen']:
|
if data.get('object_kind') == 'merge_request' and data['object_attributes'].get('action') in ['open', 'reopen']:
|
||||||
get_logger().info(f"A merge request has been opened: {data['object_attributes'].get('title')}")
|
get_logger().info(f"A merge request has been opened: {data['object_attributes'].get('title')}")
|
||||||
url = data['object_attributes'].get('url')
|
url = data['object_attributes'].get('url')
|
||||||
|
get_logger().info(f"New merge request: {url}")
|
||||||
await _perform_commands_gitlab("pr_commands", PRAgent(), url, log_context)
|
await _perform_commands_gitlab("pr_commands", PRAgent(), url, log_context)
|
||||||
# handle_request(background_tasks, url, "/review", log_context)
|
elif data.get('object_kind') == 'note' and data['event_type'] == 'note': # comment on MR
|
||||||
elif data.get('object_kind') == 'note' and data['event_type'] == 'note':
|
|
||||||
if 'merge_request' in data:
|
if 'merge_request' in data:
|
||||||
mr = data['merge_request']
|
mr = data['merge_request']
|
||||||
url = mr.get('url')
|
url = mr.get('url')
|
||||||
|
get_logger().info(f"A comment has been added to a merge request: {url}")
|
||||||
body = data.get('object_attributes', {}).get('note')
|
body = data.get('object_attributes', {}).get('note')
|
||||||
if data.get('object_attributes', {}).get('type') == 'DiffNote' and '/ask' in body:
|
if data.get('object_attributes', {}).get('type') == 'DiffNote' and '/ask' in body: # /ask_line
|
||||||
line_range_ = data['object_attributes']['position']['line_range']
|
body = handle_ask_line(body, data)
|
||||||
|
|
||||||
|
handle_request(background_tasks, url, body, log_context)
|
||||||
|
|
||||||
|
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder({"message": "success"}))
|
||||||
|
|
||||||
|
|
||||||
|
def handle_ask_line(body, data):
|
||||||
|
try:
|
||||||
|
line_range_ = data['object_attributes']['position']['line_range']
|
||||||
# if line_range_['start']['type'] == 'new':
|
# if line_range_['start']['type'] == 'new':
|
||||||
start_line = line_range_['start']['new_line']
|
start_line = line_range_['start']['new_line']
|
||||||
end_line = line_range_['end']['new_line']
|
end_line = line_range_['end']['new_line']
|
||||||
# else:
|
# else:
|
||||||
# start_line = line_range_['start']['old_line']
|
# start_line = line_range_['start']['old_line']
|
||||||
# end_line = line_range_['end']['old_line']
|
# end_line = line_range_['end']['old_line']
|
||||||
|
|
||||||
question = body.replace('/ask', '').strip()
|
question = body.replace('/ask', '').strip()
|
||||||
path = data['object_attributes']['position']['new_path']
|
path = data['object_attributes']['position']['new_path']
|
||||||
side = 'RIGHT' # if line_range_['start']['type'] == 'new' else 'LEFT'
|
side = 'RIGHT' # if line_range_['start']['type'] == 'new' else 'LEFT'
|
||||||
comment_id = data['object_attributes']["discussion_id"]
|
comment_id = data['object_attributes']["discussion_id"]
|
||||||
get_logger().info(f"Handling line comment")
|
get_logger().info(f"Handling line comment")
|
||||||
body = f"/ask_line --line_start={start_line} --line_end={end_line} --side={side} --file_name={path} --comment_id={comment_id} {question}"
|
body = f"/ask_line --line_start={start_line} --line_end={end_line} --side={side} --file_name={path} --comment_id={comment_id} {question}"
|
||||||
|
except Exception as e:
|
||||||
handle_request(background_tasks, url, body, log_context)
|
get_logger().error(f"Failed to handle ask line comment: {e}")
|
||||||
|
return body
|
||||||
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder({"message": "success"}))
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/")
|
@router.get("/")
|
||||||
|
Reference in New Issue
Block a user