diff --git a/swh/storage/algos/snapshot.py b/swh/storage/algos/snapshot.py --- a/swh/storage/algos/snapshot.py +++ b/swh/storage/algos/snapshot.py @@ -169,9 +169,11 @@ def snapshot_resolve_alias( storage: StorageInterface, snapshot_id: Sha1Git, alias_name: bytes -) -> Optional[Tuple[List[SnapshotBranch], Optional[SnapshotBranch]]]: +) -> Optional[SnapshotBranch]: """ - Resolve snapshot branch alias to its real target. + Transitively resolve snapshot branch alias to its real target, and return it; + ie. follows every branch that is an alias, until a branch that isn't an alias + is found. Args: storage: Storage instance @@ -179,13 +181,9 @@ alias_name: name of the branch alias to resolve Returns: - A tuple whose first member is the list of followed branches until the alias - got resolved to a branch whose target type is not an alias, and second member - the real targeted branch. - If a dangling branch is encountered during the resolve process, second member of - the tuple will be None. - If the target type of the tuple second member is an alias, it means that - a cycle has been detected during the resolve process. + The first branch that isn't an alias, in the alias chain; or None if + there is no such branch (ie. either because of a cycle alias, or a dangling + branch). """ snapshot = storage.snapshot_get_branches( snapshot_id, branches_from=alias_name, branches_count=1 @@ -194,19 +192,15 @@ return None if alias_name not in snapshot["branches"]: - return ([], None) + return None last_branch = snapshot["branches"][alias_name] - branches = [] - seen_aliases = {alias_name} - while ( - last_branch is not None - and last_branch.target_type == TargetType.ALIAS - and last_branch.target not in seen_aliases - ): - branches.append(last_branch) + while last_branch is not None and last_branch.target_type == TargetType.ALIAS: + if last_branch.target in seen_aliases: + return None + alias_target = last_branch.target snapshot = storage.snapshot_get_branches( snapshot_id, branches_from=alias_target, branches_count=1 @@ -215,4 +209,4 @@ last_branch = snapshot["branches"].get(alias_target) seen_aliases.add(alias_target) - return (branches, last_branch) + return last_branch diff --git a/swh/storage/tests/algos/test_snapshot.py b/swh/storage/tests/algos/test_snapshot.py --- a/swh/storage/tests/algos/test_snapshot.py +++ b/swh/storage/tests/algos/test_snapshot.py @@ -279,7 +279,7 @@ snapshot = Snapshot(branches={}) swh_storage.snapshot_add([snapshot]) - assert snapshot_resolve_alias(swh_storage, snapshot.id, b"HEAD") == ([], None) + assert snapshot_resolve_alias(swh_storage, snapshot.id, b"HEAD") is None def test_snapshot_resolve_alias(swh_storage, sample_data): @@ -321,27 +321,16 @@ ) swh_storage.snapshot_add([snapshot]) - for alias_name, expected_branches in ( - (rev_alias1_name, ([rev_alias1_branch_info], rev_branch_info)), - ( - rev_alias2_name, - ([rev_alias2_branch_info, rev_alias1_branch_info], rev_branch_info), - ), - ( - rev_alias3_name, - ( - [ - rev_alias3_branch_info, - rev_alias2_branch_info, - rev_alias1_branch_info, - ], - rev_branch_info, - ), - ), - (rel_alias_name, ([rel_alias_branch_info], rel_branch_info)), + for alias_name, expected_branch in ( + (rev_alias1_name, rev_branch_info), + (rev_alias2_name, rev_branch_info,), + (rev_alias3_name, rev_branch_info,), + (rel_alias_name, rel_branch_info), ): - branches = snapshot_resolve_alias(swh_storage, snapshot.id, alias_name) - assert branches == expected_branches + assert ( + snapshot_resolve_alias(swh_storage, snapshot.id, alias_name) + == expected_branch + ) def test_snapshot_resolve_alias_dangling_branch(swh_storage): @@ -357,8 +346,7 @@ ) swh_storage.snapshot_add([snapshot]) - branches = snapshot_resolve_alias(swh_storage, snapshot.id, alias_name) - assert branches == ([alias_branch], None) + assert snapshot_resolve_alias(swh_storage, snapshot.id, alias_name) is None def test_snapshot_resolve_alias_missing_branch(swh_storage): @@ -372,8 +360,7 @@ snapshot = Snapshot(id=b"42" * 10, branches={alias_name: alias_branch,}) swh_storage.snapshot_add([snapshot]) - branches = snapshot_resolve_alias(swh_storage, snapshot.id, alias_name) - assert branches == ([alias_branch], None) + assert snapshot_resolve_alias(swh_storage, snapshot.id, alias_name) is None def test_snapshot_resolve_alias_cycle_found(swh_storage): @@ -405,8 +392,4 @@ ) swh_storage.snapshot_add([snapshot]) - branches = snapshot_resolve_alias(swh_storage, snapshot.id, alias1_name) - assert branches == ( - [alias1_branch_info, alias2_branch_info, alias3_branch_info], - alias4_branch_info, - ) + assert snapshot_resolve_alias(swh_storage, snapshot.id, alias1_name) is None