summaryrefslogtreecommitdiff
path: root/lib/bundler/mirror.rb
blob: dda6022e785a36ca42efd6c0dcc31ba12259c406 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
module Bundler
  class Settings
    class Mirrors
      def initialize
        @all = Mirror.new
        @mirrors = Hash.new { |h, k| h[k] = Mirror.new }
      end

      def [](key)
        @mirrors[URI(key.to_s)]
      end

      def fetch(key, &block)
        @mirrors.fetch(key, &block)
      end

      def each
        @mirrors.each do |k, v|
          yield k, v.uri.to_s
        end
      end

      def parse(key, value)
        config = MirrorConfig.new(key, value)
        if config.all?
          mirror = @all
        else
          mirror = self[config.uri]
        end
        config.update_mirror(mirror)
      end
    end

    class Mirror
      DEFAULT_FALLBACK_TIMEOUT = 0.1

      attr_reader :uri, :fallback_timeout

      def initialize(uri = nil, fallback_timeout = 0)
        self.uri = uri
        self.fallback_timeout = fallback_timeout
      end

      def uri=(uri)
        @uri = URI(uri.to_s)
      end

      def fallback_timeout=(timeout)
        case timeout
        when true
          @fallback_timeout = DEFAULT_FALLBACK_TIMEOUT
        when false
          @fallback_timeout = 0
        else
          @fallback_timeout = timeout.to_i
        end
      end

      def ==(o)
        self.class == o.class && self.uri == o.uri && self.fallback_timeout == o.fallback_timeout
      end

      def valid?
        ! @uri.nil?
      end
    end

    private

    class MirrorConfig
      attr_reader :uri, :value
      def initialize(config_line, value)
        all, uri, fallback =
          config_line.match(/^mirror(\.all)?\.(.+?)(\.fallback_timeout)?\/?$/).captures
        @all = !all.nil?
        @fallback = !fallback.nil?
        @uri = AbsoluteURI.normalize(uri)
        @value = value
      end

      def all?
        @all
      end

      def update_mirror(mirror)
        if @fallback
          mirror.fallback_timeout = @value
        else
          mirror.uri = AbsoluteURI.normalize(@value)
        end
      end
    end
  end
end