Как получить последнюю фиксацию для указанного файла с помощью python (dulwich)?

Мне нужно имя автора и время последней фиксации для указанного файла с помощью python. В настоящее время я пытаюсь использовать dulwich.

Существует множество API для извлечения объектов для определенного SHA, например:

repo = Repo("myrepo")
head = repo.head()
object = repo.get_object(head)
author = object.author
time = object.commit_time

Но как узнать недавнюю фиксацию для конкретного файла? Есть ли способ получить его, например:

repo = Repo("myrepo")
commit = repo.get_commit('a.txt')
author = commit.author
time = commit.commit_time

or

repo = Repo("myrepo")
sha = repo.get_sha_for('a.txt')
object = repo.get_object(sha)
author = object.author
time = object.commit_time

Спасибо.


person ccoroom    schedule 20.05.2013    source источник


Ответы (2)


Кажется, что-то вроде этого работает:

from dulwich import repo, diff_tree

fn = 'a.txt'
r = repo.Repo('.')
prev = None
walker = r.get_graph_walker()
cset = walker.next()
while cset is not None:

    commit = r.get_object(cset)
    if prev is None:
        prev = commit.tree
        cset = walker.next()
        continue


    res = None
    delta = diff_tree.tree_changes(r, prev, commit.tree)
    for x in diff_tree.tree_changes(r, prev, commit.tree):
        if x.new.path == fn:
            res = cset
            break

    if res:
        break

    prev = commit.tree
    cset = walker.next()

print fn, res
person djc    schedule 20.05.2013
comment
Спасибо @djc. Если это не работает напрямую. Вы дали ключ к решению моей проблемы. Я добавлю свое решение позже. Еще раз спасибо. - person ccoroom; 21.05.2013
comment
Обратите внимание, что вы можете указать аргумент paths для get_graph_walker(), и в этом случае будут получены только те записи, которые касаются этих путей. Это должно немного упростить код. - person jelmer; 10.06.2013
comment
извините, как dulwich добавляет новый файл и фиксирует его? - person CS QGB; 30.01.2020

Более короткий пример с использованием Repo.get_walker:

r = Repo(".")
p = "the/file/to/look/for"

w = r.get_walker(paths=[p], max_entries=1)
try:
    c = iter(w).next().commit
except StopIteration:
     print "No file %s anywhere in history." % p
else:
    print "%s was last changed at %s by %s (commit %s)" % (
        p, time.ctime(c.author_time), c.author, c.id)
person jelmer    schedule 07.12.2013
comment
как dulwich добавляет новый файл и фиксирует его? - person CS QGB; 30.01.2020