hannesg/multi_git

View on GitHub
lib/multi_git/git_backend/config.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'forwardable'
require 'set'
require 'multi_git/config'
module MultiGit
  module GitBackend
    class Config

      include MultiGit::Config

      def initialize(cmd)
        @cmd = cmd
      end

      def get( section, subsection, key )
        s = schema_for(section, subsection, key)
        begin
          # git < 1.8.0 barfs when using --get on a multiply defined 
          #  value, but uses the last value internally.
          # git >= 1.8.0 simply returns the last value
          value = @cmd['config', '--get-all', qualified_key(section, subsection, key)].lines.map(&:chomp)
          value = value.last unless s.list?
          return s.convert(value)
        rescue Cmd::Error::ExitCode1
          return s.default
        rescue Cmd::Error::ExitCode2
          raise Error::DuplicateConfigKey, qualified_key(section, subsection, key)
        end
      end

      def each_explicit_key
        return to_enum(:each_explicit_key) unless block_given?
        seen = Set.new
        @cmd.('config','--list') do |io|
          io.each_line do |line|
            name, _ = line.split('=',2)
            next if seen.include? name
            seen << name
            yield *split_key(name)
          end
        end
        return self
      end


    end
  end
end