Могу ли я получить самую последнюю фиксацию репозитория с помощью Bitbucket API?

Я использую Bitbucket API для получения различной информации. Однако я хочу сделать запрос, который извлекает последнюю фиксацию для репозитория. Я изначально думал, что это будет сделано так:

https://bitbucket.org/!api/2.0/repositories/xxxx/xxxx/commits?limit=1

Это просто показало все коммиты как обычно, но я хочу показать самый последний. Просматривая документацию API, я не могу найти ничего, что говорило бы об ограничении количества отображаемых коммитов. Так было интересно, может ли кто-нибудь указать мне в правильном направлении?


person lukef2020    schedule 24.11.2020    source источник


Ответы (1)


Хорошо, это тоже было непросто, и я потратил пару часов на поиски того, как это сделать самому. Все закончилось легко, если не сказать печально. Проще говоря, доступный API не будет возвращать только целевую фиксацию (например, последнюю). Вы должны разобрать его самостоятельно. Следующий API:

"https://api.bitbucket.org/2.0/repositories/<project>/<repo>/commits/<branch>?limit=1"

Все равно вернет ВСЕ коммиты для этой конкретной ветки, НО по порядку. Таким образом, вы можете просто получить первый результат на первой возвращенной странице, и это будет самая последняя фиксация для этой ветки. Вот базовый пример Python:

import os
import requests
import json

headers = {"Content-Type": "application/json"}
USER = ""
PASS = ""

def get_bitbucket_credentials():
    global USER, PASS
    USER = "<user>"
    PASS = "<pass>"


def get_commits(project, repo, branch):
    return json.loads(call_url("https://api.bitbucket.org/2.0/repositories/%s/%s/commits/%s?limit=1" % (project, repo, branch)))

def get_modified_files(url):
    data = json.loads(call_url(url))
    file_paths = []
    for value in data["values"]:
        file_paths.append(value["new"]["path"])
    return file_paths


def call_url(url):
    global USER, PASS
    response = requests.get(url, auth=(USER, PASS), headers=headers)
    if response.status_code == requests.codes.ok:
        return response.text
    return ""


if __name__ == "__main__":
    get_bitbucket_credentials()
    data = get_commits("<project>","<repo>","<branch>")
    for item in data["values"]:
        print("Author Of Commit: "+item["author"]["raw"])
        print("Commit Message: "+item["rendered"]["message"]["raw"])
        print("List of Files Changed:")
        print(get_modified_files(item["links"]["diff"]["href"].replace("/diff/","/diffstat/")))
        break

Вы можете запустить приведенный выше пример:

python3 mysavedfile.py

и это будет выглядеть так:

Author Of Commit: Persons Name <[email protected]>
Commit Message: my commit message

List of Files Changed:
['file1.yaml','file2.yaml']
person wesleywh    schedule 16.12.2020