Python: бесконечная рекурсия при попытке найти вилки из репозиториев Github - PullRequest
0 голосов
/ 18 марта 2020

Как новичок, изучающий Python 3 и как использовать API, я пытаюсь разработать простой скрипт, который принимает Github-репозиторий, а рекурсивно идентифицирует все вилки всех форков указанного репозитория. Идея состоит в том, чтобы получить переменную типа list, содержащую вилки (и информацию о родителе этих вилок) (разве что другой тип переменной лучше?), Который я могу экспортировать в файл JSON в качестве дополнительного упражнения.

Сейчас я использую библиотеку Python 3 requests и комбинацию циклов for и while (да, я знаю, что циклы while = True опасны, дайте мне знать, если есть лучший способ).

Вот код с примером репозитория (OpenROV/openrov-software) для поиска вилок, для которых скрыт маркер аутентификации Github:

import requests

#
# getting forks
#

# the starting repository to find forks for
username = "OpenROV"
repo = "openrov-software"
# fake Github auth token:
auth = ("ScroogeMcDuck", "fqo4p6xx6p2cgnwi3fakjotx7c46n5xcfzxpz3hz")

# initialise an empty list of forks
forks = list()

# Recursive function to find all forks of forks of a Github repository
def get_Github_forks(owner, repo, forks, auth=None, recurse=False):
    page_counter = 1
    request_output = list()
    print("Finding forks for repository: {}/{}".format(owner, repo))
    while True:
        print("Retrieving forks page {}".format(page_counter))
        request_string = "https://api.github.com/repos/{}/{}/forks?page={}".format(owner, repo, page_counter)
        print("Request string:", request_string)
        request_output = requests.get(request_string, auth = auth).json()
        for item in request_output:
            forks.append({"fork_owner": item["owner"]["login"], "fork_repo": item["name"], "created_at": item["created_at"], "forked_from_owner": owner, "forked_from_repo": repo})
        # Stop going to the next page of results if the current result is 0,
        # meaning we're already past the last page.
        if len(request_output) == 0:
            break
        # Otherwise, move on to the next page of results
        else:
            page_counter = page_counter + 1
    for fork in forks:
        get_Github_forks(owner=fork["fork_owner"], repo=fork["fork_repo"], forks=forks, auth=auth, recurse=True)

# find forks
get_Github_forks(owner=username, repo=repo, forks=forks, auth=auth, recurse=True)

При запуске этого код, я вижу, что он успешно идентифицирует все вилки родительского / исходного репозитория (у него 179 вилок), но он застревает, повторяя получение первой страницы результатов для первого форка, а именно labimage/openrov-software. Обратите внимание, что этот первый форк (labimage/openrov-software) на самом деле не имеет вилок. Если я использую команду curl -i "https://api.github.com/repos/labimage/openrov-software/forks?page=1" в терминале, она не даст результатов.

Вот верх бесконечного вывода при запуске этого скрипта, вы можете увидеть, где он застрял:

Finding forks for repository: OpenROV/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=1
Retrieving forks page 2
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=2
Retrieving forks page 3
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=3
Retrieving forks page 4
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=4
Retrieving forks page 5
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=5
Retrieving forks page 6
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=6
Retrieving forks page 7
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=7
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
...
[goes on forever]
...

Что я сделал не так? Это мой первый Python вопрос, поэтому заранее благодарю за руководство. Дайте мне знать, если есть больше деталей, которые я могу предоставить.

...