diff options
author | Eric Engestrom <eric@engestrom.ch> | 2020-06-03 00:22:33 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-07-10 20:01:32 +0000 |
commit | 7f61f4180b645527d4c82404b18712946e77e551 (patch) | |
tree | 43333f4c96d7db2f08b043bf2ff58d3ef31bc23c /bin/commit_in_branch_test.py | |
parent | 40a6de176d0f4ffa9fcad8f2c8ab30a7e8cfe807 (diff) | |
download | mesa-7f61f4180b645527d4c82404b18712946e77e551.tar.gz |
introduce `commit_in_branch.py` script to help devs figure this out
It's been pointed out to me that determining whether a commit is present
in a stable branch is non-trivial (cherry-picks are a pain to search for)
and the commands are hard to remember, making it too much to ask.
This script aims to solve that problem; at its simplest form, it only
takes a commit and a branch and tells the user whether that commit
predates the branch, was cherry-picked to it, or is not present in any
form in the branch.
$ bin/commit_in_branch.py e58a10af640ba58b6001f5c5ad750b782547da76 fdo/20.1
Commit e58a10af640ba58b6001f5c5ad750b782547da76 is in branch 20.1
$ echo $?
0
$ bin/commit_in_branch.py dd2bd68fa69124c86cd008b256d06f44fab8e6cd fdo/20.1
Commit dd2bd68fa69124c86cd008b256d06f44fab8e6cd was backported to branch 20.1 as commit d043d24654c851f0be57dbbf48274b5373dea42b
$ echo $?
0
$ bin/commit_in_branch.py master fdo/20.1
Commit 2fbcfe170bf50fcbcd2fc70a564a4d69096d968c is NOT in branch 20.1
$ echo $?
1
Signed-off-by: Eric Engestrom <eric@engestrom.ch>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5306>
Diffstat (limited to 'bin/commit_in_branch_test.py')
-rw-r--r-- | bin/commit_in_branch_test.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/bin/commit_in_branch_test.py b/bin/commit_in_branch_test.py new file mode 100644 index 00000000000..95724f2e56c --- /dev/null +++ b/bin/commit_in_branch_test.py @@ -0,0 +1,116 @@ +import argparse +import pytest # type: ignore +import subprocess + +from .commit_in_branch import ( + is_commit_valid, + branch_has_commit, + branch_has_backport_of_commit, + canonicalize_commit, + validate_branch, +) + + +def get_upstream() -> str: + # Let's assume master is bound to the upstream remote and not a fork + out = subprocess.check_output(['git', 'for-each-ref', + '--format=%(upstream)', + 'refs/heads/master'], + stderr=subprocess.DEVNULL) + return out.decode().strip().split('/')[2] + + +@pytest.mark.parametrize( + 'commit, expected', + [ + ('20.1-branchpoint', True), + ('master', True), + ('e58a10af640ba58b6001f5c5ad750b782547da76', True), + ('d043d24654c851f0be57dbbf48274b5373dea42b', True), + ('dd2bd68fa69124c86cd008b256d06f44fab8e6cd', True), + ('0000000000000000000000000000000000000000', False), + ('not-even-a-valid-commit-format', False), + ]) +def test_canonicalize_commit(commit: str, expected: bool) -> None: + if expected: + assert canonicalize_commit(commit) + else: + try: + assert canonicalize_commit(commit) + except argparse.ArgumentTypeError: + return + assert False + + +@pytest.mark.parametrize( + 'commit, expected', + [ + (get_upstream() + '/20.1', True), + (get_upstream() + '/master', True), + ('20.1', False), + ('master', False), + ('e58a10af640ba58b6001f5c5ad750b782547da76', False), + ('d043d24654c851f0be57dbbf48274b5373dea42b', False), + ('dd2bd68fa69124c86cd008b256d06f44fab8e6cd', False), + ('0000000000000000000000000000000000000000', False), + ('not-even-a-valid-commit-format', False), + ]) +def test_validate_branch(commit: str, expected: bool) -> None: + if expected: + assert validate_branch(commit) + else: + try: + assert validate_branch(commit) + except argparse.ArgumentTypeError: + return + assert False + + +@pytest.mark.parametrize( + 'commit, expected', + [ + ('master', True), + ('20.1-branchpoint', True), + ('20.1', False), + (get_upstream() + '/20.1', True), + ('e58a10af640ba58b6001f5c5ad750b782547da76', True), + ('d043d24654c851f0be57dbbf48274b5373dea42b', True), + ('dd2bd68fa69124c86cd008b256d06f44fab8e6cd', True), + ('0000000000000000000000000000000000000000', False), + ('not-even-a-valid-commit-format', False), + ]) +def test_is_commit_valid(commit: str, expected: bool) -> None: + assert is_commit_valid(commit) == expected + + +@pytest.mark.parametrize( + 'branch, commit, expected', + [ + ('20.1', '20.1-branchpoint', True), + ('20.1', '20.0', False), + ('20.1', 'master', False), + ('20.1', 'e58a10af640ba58b6001f5c5ad750b782547da76', True), + ('20.1', 'd043d24654c851f0be57dbbf48274b5373dea42b', True), + ('20.1', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', False), + ('master', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', True), + ('20.0', 'd043d24654c851f0be57dbbf48274b5373dea42b', False), + ]) +def test_branch_has_commit(branch: str, commit: str, expected: bool) -> None: + upstream = get_upstream() + assert branch_has_commit(upstream, branch, commit) == expected + + +@pytest.mark.parametrize( + 'branch, commit, expected', + [ + ('20.1', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', 'd043d24654c851f0be57dbbf48274b5373dea42b'), + ('20.1', '20.1-branchpoint', ''), + ('20.1', '20.0', ''), + ('20.1', '20.2', ''), + ('20.1', 'master', ''), + ('20.1', 'd043d24654c851f0be57dbbf48274b5373dea42b', ''), + ('20.0', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', ''), + ]) +def test_branch_has_backport_of_commit(branch: str, commit: str, expected: bool) -> None: + upstream = get_upstream() + assert branch_has_backport_of_commit(upstream, branch, commit) == expected |