azdev/operations/testtool/incremental_strategy.py (28 lines of code) (raw):
# -----------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# -----------------------------------------------------------------------------
import abc
from knack.util import CLIError
from azdev.utilities import get_path_table, git_util
# @wrapt.decorator
# def cli_release_scenario(wrapped, _, args, kwargs):
# """
# Filter out those files in Azure CLI release stage
# """
# # TODO
# # if instance.resolved:
# # return instance
# return wrapped(*args, **kwargs)
class AzureDevOpsContext(abc.ABC):
def __init__(self, git_repo, git_source, git_target):
"""
:param git_source: could be commit id, branch name or any valid value for git diff
:param git_target: could be commit id, branch name or any valid value for git diff
"""
self.git_repo = git_repo
self.git_source = git_source
self.git_target = git_target
@abc.abstractmethod
def filter(self, test_index):
pass
class CLIAzureDevOpsContext(AzureDevOpsContext):
"""
Assemble strategy of incremental test on Azure DevOps Environment for Azure CLI
"""
def __init__(self, git_repo, git_source, git_target):
super().__init__(git_repo, git_source, git_target)
if not any([self.git_source, self.git_target, self.git_repo]):
raise CLIError('usage error: [--src NAME] --tgt NAME --repo PATH --cli-ci')
if not all([self.git_target, self.git_repo]):
raise CLIError('usage error: [--src NAME] --tgt NAME --repo PATH --cli-ci')
@property
def modified_files(self):
modified_files = git_util.diff_branches(self.git_repo, self.git_source, self.git_target)
return [f for f in modified_files if f.startswith('src/')]
def filter(self, test_index):
"""
Strategy on Azure CLI pull request verification stage.
:return: a list of modified packages
"""
modified_packages = git_util.summarize_changed_mods(self.modified_files)
if any(core_package in modified_packages for core_package in ['core', 'testsdk', 'telemetry']):
path_table = get_path_table()
# tests under all packages
return list(path_table['mod'].keys()) + list(path_table['core'].keys()) + list(path_table['ext'].keys())
return modified_packages