Class: Ace::Git::ServerRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/git/server_registry.rb

Overview

Resolves forge server identity from configuration, deterministically.

Configuration lives under the git.servers key (see .ace-defaults/git/config.yml). Each entry is a uniquely named server:

servers:
  - name: forge-lab
    provider: acme
    url: https://forge.example.com/owner/repo
    default: true
  - name: forge-mirror
    provider: other
    url: https://other.example.com/owner/repo

At most one server may be marked default: true. Resolution never falls back silently: every failure raises a classified error from the failure taxonomy.

Defined Under Namespace

Classes: Entry

Class Method Summary collapse

Class Method Details

.resolve(name) ⇒ ResolvedServer

Resolve a server by its explicit, configured name.

Parameters:

  • name (String, Symbol) —

    configured server name

Returns:

Raises:



48
49
50
51
52
53
# File 'lib/ace/git/server_registry.rb', line 48

def resolve(name)
  wanted = name.to_s
  entries.map(&:server).find { |server| server.name == wanted } ||
    raise(UnknownServerNameError, "No server named '#{wanted}' is configured " \
      "(configured: #{servers.map(&:name).join(", ")}); add it to git.servers")
end

.resolve_default ⇒ ResolvedServer

Resolve the explicitly configured default server.

Returns:

Raises:



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/ace/git/server_registry.rb', line 60

def resolve_default
  defaults = entries.select(&:default)
  if defaults.empty?
    raise NoDefaultServerConfiguredError,
      "No default server configured; mark exactly one entry in git.servers with default: true"
  end
  if defaults.size > 1
    raise MultipleDefaultServersError,
      "Multiple servers marked as default: #{defaults.map { |e| e.server.name }.join(", ")}; " \
      "keep exactly one"
  end

  defaults.first.server
end

.resolve_remote(remote_name = nil) ⇒ ResolvedServer

Resolve server identity from a git remote URL, matching configured servers deterministically (no hostname assumptions).

Parameters:

  • remote_name (String, nil) (defaults to: nil) —

    git remote name (default: configured remote, then "origin")

Returns:

Raises:



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/ace/git/server_registry.rb', line 83

def resolve_remote(remote_name = nil)
  remote_name ||= Ace::Git.config["remote"] || "origin"
  remote_url = read_remote_url(remote_name)
  matches = entries.map(&:server).select { |server| Atoms::ServerUrl.match?(server.url, remote_url) }

  if matches.empty?
    raise AmbiguousRemoteError,
      "Remote '#{remote_name}' (#{remote_url || "missing"}) matches no configured server " \
      "(configured: #{servers.map(&:name).join(", ")})"
  end
  if matches.size > 1
    raise AmbiguousRemoteError,
      "Remote '#{remote_name}' (#{remote_url}) matches multiple configured servers: " \
      "#{matches.map(&:name).join(", ")}; make server URLs distinct"
  end

  matches.first
end

.servers ⇒ Array<ResolvedServer>

All configured servers, in configuration order.

Returns:

Raises:



39
40
41
# File 'lib/ace/git/server_registry.rb', line 39

def servers
  entries.map(&:server)
end