def _filter_by_git_diff(tests, test_index, git_source, git_target, git_repo): from azdev.utilities import diff_branches, extract_module_name from azdev.utilities.git_util import _summarize_changed_mods if not any([git_source, git_target, git_repo]): return tests if not all([git_target, git_repo]): raise CLIError('usage error: [--src NAME] --tgt NAME --repo PATH') files_changed = diff_branches(git_repo, git_target, git_source) mods_changed = _summarize_changed_mods(files_changed) repo_path = str(os.path.abspath(git_repo)).lower() to_remove = [] for key in tests: test_path = test_index.get(key, None) if test_path and test_path.lower().startswith(repo_path): mod_name = extract_module_name(test_path) if next((x for x in mods_changed if mod_name in x), None): # has changed, so do not filter out continue # in not in the repo or has not changed, filter out to_remove.append(key) # remove the unchanged modules tests = [t for t in tests if t not in to_remove] logger.info('Filtered out: %s', to_remove) return tests
def add_to_index(key, path): from azdev.utilities import extract_module_name key = key or mod_name if key in test_index: if key not in conflicted_keys: conflicted_keys.append(key) mod1 = extract_module_name(path) mod2 = extract_module_name(test_index[key]) if mod1 != mod2: # resolve conflicted keys by prefixing with the module name and a dot (.) logger.warning("'%s' exists in both '%s' and '%s'. Resolve using `%s.%s` or `%s.%s`", key, mod1, mod2, mod1, key, mod2, key) test_index['{}.{}'.format(mod1, key)] = path test_index['{}.{}'.format(mod2, key)] = test_index[key] else: logger.error("'%s' exists twice in the '%s' module. " "Please rename one or both and re-run --discover.", key, mod1) else: test_index[key] = path
def _summarize_changed_mods(files_changed): from azdev.utilities import extract_module_name mod_set = set() for f in files_changed: try: mod_name = extract_module_name(f) except CLIError: # some files aren't part of a module continue mod_set.add(mod_name) return list(mod_set)