Как обнаружить переименование файла с помощью Rugged?

Я начинающий пользователь Rugged и пытаюсь обнаружить переименования файлов в истории коммитов. Я отличаю каждую фиксацию от ее первого родителя следующим образом:

repo = Rugged::Repository.discover("foo")
walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_TOPO)
walker.push("master")

walker.each.take(200).each do |commit|
  puts commit.oid  
  puts commit.message

  diffs = nil

  # Handle Root commit
  if commit.parents.count > 0 then
    diffs = commit.parents[0].diff(commit)
  else
    diffs = commit.diff(nil)
  end

  (files,additions,deletions) = diffs.stat
  puts "Files changed: #{files}, Additions: #{additions}, Deletions: #{deletions}"  

  paths = [];
  diffs.each_delta do |delta|
    old_file_path = delta.old_file[:path]
    new_file_path = delta.new_file[:path]   

    puts delta.status
    puts delta.renamed?
    puts delta.similarity
    paths += [delta]
 end

 puts "Paths:"
 puts paths
 puts "===================================="

end
walker.reset

Однако, когда у меня есть переименование, программа выводит добавление и удаление (статусы A и D). Это соответствует выводу git log --name-status.

С другой стороны, я обнаружил, что использование git log --name-status --format='%H' --follow -- b.txt правильно показывает переименование как R100.

Историю репозитория и результаты работы git можно увидеть в следующем списке: /ifigueroap/60716bbf4aa2f205b9c9

Мой вопрос заключается в том, как использовать объекты Diff или Delta Rugged для обнаружения такого переименования файла...

Спасибо


person Ismael    schedule 07.04.2015    source источник


Ответы (1)


Прежде чем получить доступ к diffs.stat, вы должны вызвать diffs.find_similar! с помощью :renames => true. Это изменит объект diffs, включив в него информацию о переименовании. По умолчанию это не делается, так как базовая операция довольно сложна и в большинстве случаев не нужна.

Ознакомьтесь с документацией по find_similar! здесь: https://github.com/libgit2/rugged/blob/e96d26174b2bf763e9dd5dd2370e79f5e29077c9/ext/rugged/rugged_diff.c#L310-L366, чтобы узнать больше.

person Arthur Schreiber    schedule 08.04.2015