Есть ли "git cherry" в libgit2

Я работаю над проектом, и одним из требований является необходимость позвонить git cherry Команда, чтобы получить некоторые различия между ветвями и другими - (обратите внимание, это не git cherry-pick).

Я планировал использовать ruby rugged драгоценный камень для этого проекта, но я не могу найти ничего в документации, поддерживает ли он git cherry API или нет.

Прочный рубиновый фантик libgit2 но я не смог найти ничего в его документации.

1 ответ

Решение

libgit2 (и, как следствие, вещи, построенные на нем, например, Rugged), находятся на довольно низком уровне. Там, вероятно, никогда не будет git cherry-подобная функциональность, но вы можете написать ее самостоятельно.

К сожалению, на данный момент libgit2 не предоставляет реализацию идентификатора патча, которая используется Git для определения идентичных патчей. Если это так, или если вы хотите написать свой собственный, вы можете выполнить ревизию самостоятельно по двум диапазонам, используя Rugged::Walkerсравнивая, какие идентификаторы патчей из второго диапазона также присутствовали в первом диапазоне. Это по сути то, что делает Git под капотом.

Ниже приведен пример того, что вы можете сделать, заменив функцию patch_id реальной:

require 'rugged'
require 'digest'

def patch_id(patch)
  # This is not a real implementation; replace it with a real one.
  Digest::SHA1.hexdigest(patch.each_line.reject { |l| l =~ /^(diff|index|---|\+\+\+|@@)/ }.join)
end

def walk_revisions(repo, from, to)
  revisions = {}
  walker = Rugged::Walker.new(repo)
  walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
  walker.push(to)
  walker.hide(from)
  walker.each do |c|
    diff = c.parents[0].diff(c)
    revisions[patch_id(diff.patch)] = c.oid
  end
  revisions
end

repo = Rugged::Repository.new(ARGV[0])
a, b, c = ARGV[1..3].map { |r| repo.rev_parse(r) }
first = walk_revisions(repo, b, a)
second = walk_revisions(repo, c, b)
second.each do |id, rev|
  char = first.include?(id) ? '-' : '+'
  puts "#{char} #{rev}"
end
Другие вопросы по тегам