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

Другие вопросы по тегам