Grit: как определить, что между двумя коммитами новее?
Я хотел бы иметь возможность сказать между двумя Grit::Commit
объекты, которые новее. Что я имею в виду под более новым является то, что если commit_A
является родителем (или родителем родителя и т. д.) commit_B
, затем commit_B
новее. Это предполагает, что commit_A
а также commit_B
находятся на одной ветке.
Я думал об использовании Grit::Commit#date()
, но я думаю, что это будет неточно.
Есть идеи?
2 ответа
Решение
Вот что я в итоге реализовал. Смотрите комментарии для объяснения.
Производительность очень низкая, но она была хуже при использовании repo.git.rev_list(через method_missing).
require 'grit'
module Grit
class Commit
# Returns true if any commits in +commits+ are decendants of calling commit. True
# means that one or more commits in +commits+ are newer.
def has_decendant_in? *commits
total_commits = commits.flatten
raise ArgumentError "at least one commit required." if total_commits.empty?
total_commits.each do |commit|
return true if repo.commits_between(commit.id, id).empty?
end
return false
end
# Returns an Array of commits which tie for being the newest commits. Ties can
# occur when commits are in different branches.
def self.newest *commits
oldest_commits = []
total_commits = commits.flatten
raise ArgumentError "at least one commit required." if total_commits.empty?
(total_commits).each do |commit|
if commit.has_decendant_in?(total_commits - [commit])
oldest_commits << commit
end
end
return total_commits - oldest_commits
end
end
end
Следующее поможет вам... git log --graph или вы можете использовать gitk