最初は、次のようなコードから始めました。
name = 'repo_'
i = 0
repo_list = {}
items = get_items() # defined elsewhere
for item in os.listdir(dirpath):
i = i + 1 # this was just to add a custom name to the repos located
repo_name = name + str(i)
path_to_repo = os.path.join(dirpath, item)
repo = pygit2.discover_repository(path_to_repo)
repo_list[item] = repo
stringしかし、これはオブジェクトのリストではなく、オブジェクトのリストを返していましたRepository。この関数は、Repository オブジェクトではなく、リポジトリへのパスdiscover_repository()を返すことが判明しました。私は言わなければなりません、私はpygit2 documentationのどこにも関数を見つけられませんでした.そして、私がこの SO questionを見つけるまで、誰もそれを使用したり話したりするのを見たことがありませんでした. しかし今、私は知っています(そして、将来の読者にも役立つと思います):discover_repository()
pygit2 のdiscover_repository(path)関数は、見つかったリポジトリへのパスの文字列表現を返します。これは Repository オブジェクトではないため、インスタンス化する必要があります。
そのため、どこでも答えを探した後、次のスニペットを見つけました。これには、見逃していた行が含まれていました。
path_to_repo = os.path.join(dirpath, item)
repo = pygit2.discover_repository(path_to_repo)
repo_name = Repository(repo) # this line was missing
repo_list[item] = repo_name
近くにいますが、ここで何かがずれています。確かに、これは私が望んでいたことですが、それは少し冗長ではありませんか? 後で、コードの別のセクションに取り組んだ後、forループ全体としてこれだけになりました。
for item in os.listdir(dirpath):
i = i + 1
repo_name = name+str(i)
path_to_repo = os.path.join(dirpath, item)
repo_name = Repository(path_to_repo)
repo_list[item] = repo_name
これにより、目的の結果が得られます。次のような辞書が返されました。
{'repo_1': [listOfRepositoryObjects], 'repo_2': [anotherListOfRepositoryObjects]}
pygit2.discover_repository()で同じことを行うものを含めたので、実際には関数はまったく必要ありませんでしたpath_to_repo = os.path.join(dirpath, item)。彼らは同じものを返すことになったので、私のプロジェクトの要件により適しているように見えるので、私が書いた関数を使用します。