class Hiiro::Git::Branches

def self.all(sort_by: nil, ignore_case: false)

def self.all(sort_by: nil, ignore_case: false)
  fetch(sort_by: sort_by, ignore_case: ignore_case, remote: :all)
end

def self.fetch(sort_by: nil, ignore_case: false, remote: false)

def self.fetch(sort_by: nil, ignore_case: false, remote: false)
  args = ['git', 'branch', '--format=%(refname:short)']
  args << '-i' if ignore_case
  args << '-r' if remote
  args << "-a" if remote == :all
  args << "--sort=#{sort_by}" if sort_by
  output = `#{args.shelljoin} 2>/dev/null`
  from_names(output.split("\n").map(&:strip))
end

def self.from_names(names)

def self.from_names(names)
  branches = names.map { |name| Branch.new(name: name) }
  new(branches)
end

def self.local(sort_by: nil, ignore_case: false)

def self.local(sort_by: nil, ignore_case: false)
  fetch(sort_by: sort_by, ignore_case: ignore_case, remote: false)
end

def self.remote(sort_by: nil, ignore_case: false)

def self.remote(sort_by: nil, ignore_case: false)
  fetch(sort_by: sort_by, ignore_case: ignore_case, remote: true)
end

def containing(substring)

def containing(substring)
  self.class.new(branches.select { |b| b.name.include?(substring) })
end

def current

def current
  branches.find(&:current?)
end

def each(&block)

def each(&block)
  branches.each(&block)
end

def empty?

def empty?
  branches.empty?
end

def find_by_name(name)

def find_by_name(name)
  branches.find { |b| b.name == name }
end

def initialize(branches)

def initialize(branches)
  @branches = branches
end

def matching(prefix)

def matching(prefix)
  self.class.new(branches.select { |b| b.name.start_with?(prefix) })
end

def names

def names
  branches.map(&:name)
end

def size

def size
  branches.size
end

def to_a

def to_a
  branches.dup
end