summaryrefslogtreecommitdiff
path: root/bin/commit_in_branch_test.py
diff options
context:
space:
mode:
authorEric Engestrom <eric@engestrom.ch>2020-06-03 00:22:33 +0200
committerMarge Bot <eric+marge@anholt.net>2020-07-10 20:01:32 +0000
commit7f61f4180b645527d4c82404b18712946e77e551 (patch)
tree43333f4c96d7db2f08b043bf2ff58d3ef31bc23c /bin/commit_in_branch_test.py
parent40a6de176d0f4ffa9fcad8f2c8ab30a7e8cfe807 (diff)
downloadmesa-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.py116
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