Enhance repository filtering with regex pattern matching for ignore_repositories

This commit is contained in:
mrT23
2025-05-16 17:20:54 +03:00
parent d606672801
commit 42557feb97
5 changed files with 20 additions and 14 deletions

View File

@ -164,6 +164,7 @@ Qodo Merge allows you to automatically ignore certain PRs based on various crite
- PRs with specific titles (using regex matching) - PRs with specific titles (using regex matching)
- PRs between specific branches (using regex matching) - PRs between specific branches (using regex matching)
- PRs from specific repositories (using regex matching)
- PRs not from specific folders - PRs not from specific folders
- PRs containing specific labels - PRs containing specific labels
- PRs opened by specific users - PRs opened by specific users
@ -172,7 +173,7 @@ Qodo Merge allows you to automatically ignore certain PRs based on various crite
To ignore PRs with a specific title such as "[Bump]: ...", you can add the following to your `configuration.toml` file: To ignore PRs with a specific title such as "[Bump]: ...", you can add the following to your `configuration.toml` file:
``` ```toml
[config] [config]
ignore_pr_title = ["\\[Bump\\]"] ignore_pr_title = ["\\[Bump\\]"]
``` ```
@ -183,7 +184,7 @@ Where the `ignore_pr_title` is a list of regex patterns to match the PR title yo
To ignore PRs from specific source or target branches, you can add the following to your `configuration.toml` file: To ignore PRs from specific source or target branches, you can add the following to your `configuration.toml` file:
``` ```toml
[config] [config]
ignore_pr_source_branches = ['develop', 'main', 'master', 'stage'] ignore_pr_source_branches = ['develop', 'main', 'master', 'stage']
ignore_pr_target_branches = ["qa"] ignore_pr_target_branches = ["qa"]
@ -192,6 +193,18 @@ ignore_pr_target_branches = ["qa"]
Where the `ignore_pr_source_branches` and `ignore_pr_target_branches` are lists of regex patterns to match the source and target branches you want to ignore. Where the `ignore_pr_source_branches` and `ignore_pr_target_branches` are lists of regex patterns to match the source and target branches you want to ignore.
They are not mutually exclusive, you can use them together or separately. They are not mutually exclusive, you can use them together or separately.
### Ignoring PRs from specific repositories
To ignore PRs from specific repositories, you can add the following to your `configuration.toml` file:
```toml
[config]
ignore_repositories = ["my-org/my-repo1", "my-org/my-repo2"]
```
Where the `ignore_repositories` is a list of regex patterns to match the repositories you want to ignore. This is useful when you have multiple repositories and want to exclude certain ones from analysis.
### Ignoring PRs not from specific folders ### Ignoring PRs not from specific folders
To allow only specific folders (often needed in large monorepos), set: To allow only specific folders (often needed in large monorepos), set:

View File

@ -129,12 +129,10 @@ def should_process_pr_logic(data) -> bool:
sender = _get_username(data) sender = _get_username(data)
repo_full_name = pr_data.get("destination", {}).get("repository", {}).get("full_name", "") repo_full_name = pr_data.get("destination", {}).get("repository", {}).get("full_name", "")
print(f"DEBUG: repo_full_name={repo_full_name}, ignore_repos={get_settings().get('CONFIG.IGNORE_REPOSITORIES', [])}")
# logic to ignore PRs from specific repositories # logic to ignore PRs from specific repositories
ignore_repos = get_settings().get("CONFIG.IGNORE_REPOSITORIES", []) ignore_repos = get_settings().get("CONFIG.IGNORE_REPOSITORIES", [])
if ignore_repos and repo_full_name: if repo_full_name and ignore_repos:
if repo_full_name in ignore_repos: if any(re.search(regex, repo_full_name) for regex in ignore_repos):
print(f"DEBUG: Ignoring due to repo match: {repo_full_name}")
get_logger().info(f"Ignoring PR from repository '{repo_full_name}' due to 'config.ignore_repositories' setting") get_logger().info(f"Ignoring PR from repository '{repo_full_name}' due to 'config.ignore_repositories' setting")
return False return False
@ -142,7 +140,6 @@ def should_process_pr_logic(data) -> bool:
ignore_pr_users = get_settings().get("CONFIG.IGNORE_PR_AUTHORS", []) ignore_pr_users = get_settings().get("CONFIG.IGNORE_PR_AUTHORS", [])
if ignore_pr_users and sender: if ignore_pr_users and sender:
if sender in ignore_pr_users: if sender in ignore_pr_users:
print(f"DEBUG: Ignoring due to user match: {sender}")
get_logger().info(f"Ignoring PR from user '{sender}' due to 'config.ignore_pr_authors' setting") get_logger().info(f"Ignoring PR from user '{sender}' due to 'config.ignore_pr_authors' setting")
return False return False
@ -152,7 +149,6 @@ def should_process_pr_logic(data) -> bool:
if not isinstance(ignore_pr_title_re, list): if not isinstance(ignore_pr_title_re, list):
ignore_pr_title_re = [ignore_pr_title_re] ignore_pr_title_re = [ignore_pr_title_re]
if ignore_pr_title_re and any(re.search(regex, title) for regex in ignore_pr_title_re): if ignore_pr_title_re and any(re.search(regex, title) for regex in ignore_pr_title_re):
print(f"DEBUG: Ignoring due to title match: {title}")
get_logger().info(f"Ignoring PR with title '{title}' due to config.ignore_pr_title setting") get_logger().info(f"Ignoring PR with title '{title}' due to config.ignore_pr_title setting")
return False return False
@ -160,17 +156,14 @@ def should_process_pr_logic(data) -> bool:
ignore_pr_target_branches = get_settings().get("CONFIG.IGNORE_PR_TARGET_BRANCHES", []) ignore_pr_target_branches = get_settings().get("CONFIG.IGNORE_PR_TARGET_BRANCHES", [])
if (ignore_pr_source_branches or ignore_pr_target_branches): if (ignore_pr_source_branches or ignore_pr_target_branches):
if any(re.search(regex, source_branch) for regex in ignore_pr_source_branches): if any(re.search(regex, source_branch) for regex in ignore_pr_source_branches):
print(f"DEBUG: Ignoring due to source branch match: {source_branch}")
get_logger().info( get_logger().info(
f"Ignoring PR with source branch '{source_branch}' due to config.ignore_pr_source_branches settings") f"Ignoring PR with source branch '{source_branch}' due to config.ignore_pr_source_branches settings")
return False return False
if any(re.search(regex, target_branch) for regex in ignore_pr_target_branches): if any(re.search(regex, target_branch) for regex in ignore_pr_target_branches):
print(f"DEBUG: Ignoring due to target branch match: {target_branch}")
get_logger().info( get_logger().info(
f"Ignoring PR with target branch '{target_branch}' due to config.ignore_pr_target_branches settings") f"Ignoring PR with target branch '{target_branch}' due to config.ignore_pr_target_branches settings")
return False return False
except Exception as e: except Exception as e:
print(f"DEBUG: Exception in should_process_pr_logic: {e}")
get_logger().error(f"Failed 'should_process_pr_logic': {e}") get_logger().error(f"Failed 'should_process_pr_logic': {e}")
print("DEBUG: Returning True from should_process_pr_logic") print("DEBUG: Returning True from should_process_pr_logic")
return True return True

View File

@ -263,7 +263,7 @@ def should_process_pr_logic(body) -> bool:
# logic to ignore PRs from specific repositories # logic to ignore PRs from specific repositories
ignore_repos = get_settings().get("CONFIG.IGNORE_REPOSITORIES", []) ignore_repos = get_settings().get("CONFIG.IGNORE_REPOSITORIES", [])
if ignore_repos and repo_full_name: if ignore_repos and repo_full_name:
if repo_full_name in ignore_repos: if any(re.search(regex, repo_full_name) for regex in ignore_repos):
get_logger().info(f"Ignoring PR from repository '{repo_full_name}' due to 'config.ignore_repositories' setting") get_logger().info(f"Ignoring PR from repository '{repo_full_name}' due to 'config.ignore_repositories' setting")
return False return False

View File

@ -108,7 +108,7 @@ def should_process_pr_logic(data) -> bool:
# logic to ignore PRs from specific repositories # logic to ignore PRs from specific repositories
ignore_repos = get_settings().get("CONFIG.IGNORE_REPOSITORIES", []) ignore_repos = get_settings().get("CONFIG.IGNORE_REPOSITORIES", [])
if ignore_repos and repo_full_name: if ignore_repos and repo_full_name:
if repo_full_name in ignore_repos: if any(re.search(regex, repo_full_name) for regex in ignore_repos):
get_logger().info(f"Ignoring MR from repository '{repo_full_name}' due to 'config.ignore_repositories' setting") get_logger().info(f"Ignoring MR from repository '{repo_full_name}' due to 'config.ignore_repositories' setting")
return False return False

View File

@ -55,7 +55,7 @@ ignore_pr_target_branches = [] # a list of regular expressions of target branche
ignore_pr_source_branches = [] # a list of regular expressions of source branches to ignore from PR agent when an PR is created ignore_pr_source_branches = [] # a list of regular expressions of source branches to ignore from PR agent when an PR is created
ignore_pr_labels = [] # labels to ignore from PR agent when an PR is created ignore_pr_labels = [] # labels to ignore from PR agent when an PR is created
ignore_pr_authors = [] # authors to ignore from PR agent when an PR is created ignore_pr_authors = [] # authors to ignore from PR agent when an PR is created
ignore_repositories = [] # list of repository full names (e.g. "org/repo") to ignore from PR agent processing ignore_repositories = [] # a list of regular expressions of repository full names (e.g. "org/repo") to ignore from PR agent processing
# #
is_auto_command = false # will be auto-set to true if the command is triggered by an automation is_auto_command = false # will be auto-set to true if the command is triggered by an automation
enable_ai_metadata = false # will enable adding ai metadata enable_ai_metadata = false # will enable adding ai metadata