diff --git a/.github/workflows/doctest.yml b/.github/workflows/doctest.yml new file mode 100644 index 0000000..6657d2b --- /dev/null +++ b/.github/workflows/doctest.yml @@ -0,0 +1,21 @@ +name: Run doctests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.9' + + - name: Install package + run: pip install . + + - name: Run tests + run: python -m doctest riot_release_manager.py diff --git a/riot_release_manager.py b/riot_release_manager.py index 8c9dace..1990550 100755 --- a/riot_release_manager.py +++ b/riot_release_manager.py @@ -123,10 +123,32 @@ def update_branch(repo_dir, remote, branch): stderr=subprocess.DEVNULL ) + +def _merge_commits_to_prs(log: str): + """Extracts PR numbers from merge commits in a git log. + + Args: + log: git log + + Returns: + list of PR numbers + + >>> log = 'Merge #19495\\n' + >>> log += 'drivers/lsm303agr: Rename deprecated unit G to GForce\\n' + >>> log += 'Merge #19499 #19500\\n' + >>> log += 'sam0/usbdev: partial revert of #17086\\n' + >>> prs = _merge_commits_to_prs(log) + >>> assert prs == [19495, 19499, 19500] + """ + merge_lines = [line for line in log.splitlines() if line.strip().startswith('Merge #')] + return [int(line) for line in re.findall(r"#([0-9]+)", '\n'.join(merge_lines))] + + def get_merged_prs_with_git(repo_dir, since): log = subprocess.run(git(repo_dir) + ["log", "--merges", "%s..HEAD" % since], capture_output=True, text=True).stdout - return [int(line) for line in re.findall(r"Merge pull request #([0-9]+) from", log)] + return _merge_commits_to_prs(log) + def get_tags(repo_dir, remote): subprocess.run(git(repo_dir) + ["fetch", "--tags", remote])