aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/qualified_token.rb
blob: ccfe08b451df362af959e8f90baa39605d394aa0 (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
module Hbc
  module QualifiedToken
    REPO_PREFIX = "homebrew-".freeze

    # per https://github.com/Homebrew/homebrew/blob/4c7bc9ec3bca729c898ee347b6135ba692ee0274/Library/Homebrew/cmd/tap.rb#L121
    USER_REGEX = %r{[a-z_\-]+}

    # per https://github.com/Homebrew/homebrew/blob/4c7bc9ec3bca729c898ee347b6135ba692ee0274/Library/Homebrew/cmd/tap.rb#L121
    REPO_REGEX = %r{(?:#{REPO_PREFIX})?\w+}

    # per https://github.com/caskroom/homebrew-cask/blob/master/CONTRIBUTING.md#generating-a-token-for-the-cask
    TOKEN_REGEX = %r{[a-z0-9\-]+}

    TAP_REGEX = %r{#{USER_REGEX}[/\-]#{REPO_REGEX}}

    QUALIFIED_TOKEN_REGEX ||= %r{#{TAP_REGEX}/#{TOKEN_REGEX}}

    def self.parse(arg)
      return nil unless arg.is_a?(String) && arg.downcase =~ %r{^#{QUALIFIED_TOKEN_REGEX}$}
      path_elements = arg.downcase.split("/")
      if path_elements.count == 2
        # eg phinze-cask/google-chrome.
        # Not certain this form is needed, but it was supported in the past.
        token = path_elements[1]
        dash_elements = path_elements[0].split("-")
        repo = dash_elements.pop
        dash_elements.pop if dash_elements.count > 1 && dash_elements[-1] + "-" == REPO_PREFIX
        user = dash_elements.join("-")
      else
        # eg caskroom/cask/google-chrome
        # per https://github.com/Homebrew/homebrew/wiki/brew-tap
        user, repo, token = path_elements
      end
      repo.sub!(%r{^#{REPO_PREFIX}}, "")
      odebug "[user, repo, token] might be [#{user}, #{repo}, #{token}]"
      [user, repo, token]
    end
  end
end