Refactor Azure DevOps provider to use PR iterations for change detection, improving accuracy of diff file identification

This commit is contained in:
mrT23
2024-05-14 21:43:14 +03:00
parent 05876afc02
commit e4565f7106

View File

@ -26,6 +26,7 @@ try:
CommentThread, CommentThread,
GitVersionDescriptor, GitVersionDescriptor,
GitPullRequest, GitPullRequest,
GitPullRequestIterationChanges,
) )
except ImportError: except ImportError:
AZURE_DEVOPS_AVAILABLE = False AZURE_DEVOPS_AVAILABLE = False
@ -230,29 +231,56 @@ class AzureDevopsProvider(GitProvider):
base_sha = self.pr.last_merge_target_commit base_sha = self.pr.last_merge_target_commit
head_sha = self.pr.last_merge_source_commit head_sha = self.pr.last_merge_source_commit
commits = self.azure_devops_client.get_pull_request_commits( # Get PR iterations
project=self.workspace_slug, iterations = self.azure_devops_client.get_pull_request_iterations(
repository_id=self.repo_slug, repository_id=self.repo_slug,
pull_request_id=self.pr_num, pull_request_id=self.pr_num,
project=self.workspace_slug
) )
changes = []
if iterations:
iteration_id = iterations[-1].id # Get the last iteration (most recent changes)
# Get changes for the iteration
changes: GitPullRequestIterationChanges = self.azure_devops_client.get_pull_request_iteration_changes(
repository_id=self.repo_slug,
pull_request_id=self.pr_num,
iteration_id=iteration_id,
project=self.workspace_slug
)
diff_files = [] diff_files = []
diffs = [] diffs = []
diff_types = {} diff_types = {}
if changes:
for change in changes.change_entries:
c = change.additional_properties['item']
diffs.append(c['path'])
diff_types[c['path']] = change.additional_properties['changeType']
for c in commits: # wrong implementation - gets all the files that were changed in any commit in the PR
changes_obj = self.azure_devops_client.get_changes( # commits = self.azure_devops_client.get_pull_request_commits(
project=self.workspace_slug, # project=self.workspace_slug,
repository_id=self.repo_slug, # repository_id=self.repo_slug,
commit_id=c.commit_id, # pull_request_id=self.pr_num,
) # )
for i in changes_obj.changes: #
if i["item"]["gitObjectType"] == "tree": # diff_files = []
continue # diffs = []
diffs.append(i["item"]["path"]) # diff_types = {}
diff_types[i["item"]["path"]] = i["changeType"]
diffs = list(set(diffs)) # for c in commits:
# changes_obj = self.azure_devops_client.get_changes(
# project=self.workspace_slug,
# repository_id=self.repo_slug,
# commit_id=c.commit_id,
# )
# for i in changes_obj.changes:
# if i["item"]["gitObjectType"] == "tree":
# continue
# diffs.append(i["item"]["path"])
# diff_types[i["item"]["path"]] = i["changeType"]
#
# diffs = list(set(diffs))
for file in diffs: for file in diffs:
if not is_valid_file(file): if not is_valid_file(file):
@ -273,12 +301,13 @@ class AzureDevopsProvider(GitProvider):
new_file_content_str = new_file_content_str.content new_file_content_str = new_file_content_str.content
except Exception as error: except Exception as error:
get_logger().error( get_logger().error(f"Failed to retrieve new file content of {file} at version {version}. Error: {str(error)}")
"Failed to retrieve new file content of %s at version %s. Error: %s", # get_logger().error(
file, # "Failed to retrieve new file content of %s at version %s. Error: %s",
version, # file,
str(error), # version,
) # str(error),
# )
new_file_content_str = "" new_file_content_str = ""
edit_type = EDIT_TYPE.MODIFIED edit_type = EDIT_TYPE.MODIFIED
@ -303,12 +332,7 @@ class AzureDevopsProvider(GitProvider):
) )
original_file_content_str = original_file_content_str.content original_file_content_str = original_file_content_str.content
except Exception as error: except Exception as error:
get_logger().error( get_logger().error(f"Failed to retrieve original file content of {file} at version {version}. Error: {str(error)}")
"Failed to retrieve original file content of %s at version %s. Error: %s",
file,
version,
str(error),
)
original_file_content_str = "" original_file_content_str = ""
patch = load_large_diff( patch = load_large_diff(