#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']