feature: tag from ci fetches commits from remote api
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
import re
|
||||
|
||||
import requests
|
||||
from git_flow import GitFlowError
|
||||
from git_flow.git import Commit
|
||||
from git_flow.remote.base import RemoteAPI
|
||||
|
||||
|
||||
@@ -44,5 +47,35 @@ class BitbucketRemoteAPI(RemoteAPI):
|
||||
else:
|
||||
raise GitFlowError("Ocurrió un error al crear el tag: " + response.text)
|
||||
|
||||
def get_merge_commits(self, merge_commit: str) -> list[Commit]:
|
||||
prs = self.get_json(self.get_endpoint(f"commit/{merge_commit}/pullrequests")).json()
|
||||
pr = next((p for p in prs["values"] if p["state"] == "MERGED"), None)
|
||||
|
||||
if not pr:
|
||||
raise GitFlowError(f"No se encontró un PR para el commit {merge_commit}")
|
||||
|
||||
commits: list[Commit] = []
|
||||
url: str | None = self.get_endpoint(f"pullrequests/{pr['id']}/commits")
|
||||
|
||||
# Bitbucket pagina siguiendo el link "next", y devuelve del más nuevo al más viejo
|
||||
while url:
|
||||
page = self.get_json(url).json()
|
||||
|
||||
for c in page["values"]:
|
||||
raw = c["author"].get("raw", "")
|
||||
match = re.search(r"<(.+?)>", raw)
|
||||
commits.append(
|
||||
Commit(
|
||||
c["hash"][:7],
|
||||
c["message"].splitlines()[0],
|
||||
match.group(1) if match else raw,
|
||||
len(c["parents"]) > 1,
|
||||
)
|
||||
)
|
||||
|
||||
url = page.get("next")
|
||||
|
||||
return commits
|
||||
|
||||
def get_endpoint(self, resource: str) -> str:
|
||||
return f"{BitbucketRemoteAPI.API_ENDPOINT}/{self.repository}/{resource}"
|
||||
|
||||
Reference in New Issue
Block a user