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

#api #rest #bitbucket-api

#API #rest #bitbucket-api

Вопрос:

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

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

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

Ответ №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 <personemail@email.com>
Commit Message: my commit message

List of Files Changed:
['file1.yaml','file2.yaml']