Я пишу обработчик git post-receive, используя Python и Git-Python, который собирает информацию о коммитах, содержащихся в push-уведомлении, а затем обновляет наш трекер ошибок и IM сводкой. У меня возникают проблемы в случае, когда push создает ветку (т. е. параметр fromrev
для пост-приема равен нулю), а также охватывает несколько коммитов в этой ветке. Я просматриваю список родителей в обратном направлении от коммита torev
, но не могу понять, как определить, какой коммит является первым в ветке, т.е. когда перестать искать.
В командной строке я могу сделать
git rev-list this-branch ^not-that-branch ^master
который даст мне именно список коммитов в this-branch
и никаких других. Я попытался воспроизвести это с помощью метода Commit.iter_parents
, который задокументирован, чтобы принимать те же параметры, что и git-rev-list, но, насколько я вижу, ему не нравятся позиционные параметры, и я не могу найти набор ключевых слов параметры, которые работают.
Я читал документацию для Dulwich, но не было ясно, будет ли он делать что-то сильно отличающееся от Git-Python.
Мой (упрощенный) код выглядит так. Когда push запускает новую ветку, в настоящее время он смотрит только на первую фиксацию, а затем останавливается:
import git
repo = git.Repo('.')
for line in input:
(fromrev, torev, refname) = line.rstrip().split(' ')
commit = repo.commit(torev)
maxdepth = 25 # just so we don't go too far back in the tree
if fromrev == ('0' * 40):
maxdepth = 1
depth = 0
while depth < maxdepth:
if commit.hexsha == fromrev:
# Reached the start of the push
break
print '{sha} by {name}: {msg}'.format(
sha = commit.hexsha[:7], user = commit.author.name, commit.summary)
commit = commit.parents[0]
depth += 1