74 lines
1.5 KiB
Ruby
74 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Git
|
|
class Changes
|
|
include Enumerable
|
|
|
|
attr_reader :repository_data
|
|
|
|
def initialize
|
|
@refs = Set.new
|
|
@items = []
|
|
@branches_index = []
|
|
@tags_index = []
|
|
@repository_data = []
|
|
end
|
|
|
|
def includes_branches?
|
|
branches_index.any?
|
|
end
|
|
|
|
def includes_tags?
|
|
tags_index.any?
|
|
end
|
|
|
|
def add_branch_change(change)
|
|
@branches_index << add_change(change)
|
|
self
|
|
end
|
|
|
|
def add_tag_change(change)
|
|
@tags_index << add_change(change)
|
|
self
|
|
end
|
|
|
|
def each
|
|
items.each do |item|
|
|
yield item
|
|
end
|
|
end
|
|
|
|
def refs
|
|
@refs.to_a
|
|
end
|
|
|
|
def branch_changes
|
|
items.values_at(*branches_index)
|
|
end
|
|
|
|
def tag_changes
|
|
items.values_at(*tags_index)
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :items, :branches_index, :tags_index
|
|
|
|
def add_change(change)
|
|
# refs and repository_data are being cached when a change is added to
|
|
# the collection to remove the need to iterate through changes multiple
|
|
# times.
|
|
@refs << change[:ref]
|
|
@repository_data << build_change_repository_data(change)
|
|
@items << change
|
|
|
|
@items.size - 1
|
|
end
|
|
|
|
def build_change_repository_data(change)
|
|
DataBuilder::Repository.single_change(change[:oldrev], change[:newrev], change[:ref])
|
|
end
|
|
end
|
|
end
|
|
end
|