Class: Dependabot::Source
- Inherits:
-
Object
- Object
- Dependabot::Source
- Extended by:
- T::Sig
- Defined in:
- lib/dependabot/source.rb
Constant Summary collapse
- GITHUB_SOURCE =
%r{ (?<provider>github) (?:\.com)[/:] (?<repo>[\w.-]+/(?:[\w.-])+) (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])? }x
- GITHUB_ENTERPRISE_SOURCE =
%r{ (?<protocol>(http://|https://|git://|ssh://))* (?<username>[^@]+@)* (?<host>[^/]+) [/:] (?<repo>[\w.-]+/(?:[\w.-])+) (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])? }x
- GITLAB_SOURCE =
%r{ (?<provider>gitlab) (?:\.com)[/:] (?<repo>[^/]+/(?:[^/])+((?!/tree|/blob/|/-)/[^/]+)?) (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/].*)? }x
- BITBUCKET_SOURCE =
%r{ (?<provider>bitbucket) (?:\.org)[/:] (?<repo>[\w.-]+/(?:[\w.-])+) (?:(?:/src)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])? }x
- AZURE_SOURCE =
%r{ (?<provider>azure) (?:\.com)[/:] (?<repo>[\w.-]+/([\w.-]+/)?(?:_git/)(?:[\w.-])+) }x
- CODECOMMIT_SOURCE =
%r{ (?<protocol>(http://|https://|git://|ssh://)) git[-] (?<provider>codecommit) (?:.*) (?:\.com/v1/repos/) (?<repo>([^/]*)) (?:/)?(?<directory>[^?]*)? [?]? (?<ref>.*)? }x
- SOURCE_REGEX =
/ (?:#{GITHUB_SOURCE})| (?:#{GITLAB_SOURCE})| (?:#{BITBUCKET_SOURCE})| (?:#{AZURE_SOURCE})| (?:#{CODECOMMIT_SOURCE}) /x
- IGNORED_PROVIDER_HOSTS =
T.let(%w(gitbox.apache.org svn.apache.org fuchsia.googlesource.com).freeze, T::Array[String])
Instance Attribute Summary collapse
-
#api_endpoint ⇒ Object
Returns the value of attribute api_endpoint.
-
#branch ⇒ Object
Returns the value of attribute branch.
-
#commit ⇒ Object
Returns the value of attribute commit.
-
#directories ⇒ Object
Returns the value of attribute directories.
-
#directory ⇒ Object
Returns the value of attribute directory.
-
#hostname ⇒ Object
Returns the value of attribute hostname.
-
#provider ⇒ Object
Returns the value of attribute provider.
-
#repo ⇒ Object
Returns the value of attribute repo.
Class Method Summary collapse
- .from_url(url_string) ⇒ Object
- .github_enterprise?(base_url) ⇒ Boolean
- .github_enterprise_from_url(url_string) ⇒ Object
Instance Method Summary collapse
-
#initialize(provider:, repo:, directory: nil, directories: nil, branch: nil, commit: nil, hostname: nil, api_endpoint: nil) ⇒ Source
constructor
A new instance of Source.
- #organization ⇒ Object
- #project ⇒ Object
- #unscoped_repo ⇒ Object
- #url ⇒ Object
- #url_with_directory ⇒ Object
Constructor Details
#initialize(provider:, repo:, directory: nil, directories: nil, branch: nil, commit: nil, hostname: nil, api_endpoint: nil) ⇒ Source
Returns a new instance of Source.
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/dependabot/source.rb', line 150 def initialize(provider:, repo:, directory: nil, directories: nil, branch: nil, commit: nil, hostname: nil, api_endpoint: nil) if (hostname.nil? ^ api_endpoint.nil?) && (provider != "codecommit") msg = "Both hostname and api_endpoint must be specified if either " \ "are. Alternatively, both may be left blank to use the " \ "provider's defaults." raise msg end @provider = provider @repo = repo @directory = directory @directories = directories @branch = branch @commit = commit @hostname = T.let(hostname || default_hostname(provider), String) @api_endpoint = T.let(api_endpoint || default_api_endpoint(provider), T.nilable(String)) end |
Instance Attribute Details
#api_endpoint ⇒ Object
Returns the value of attribute api_endpoint.
91 92 93 |
# File 'lib/dependabot/source.rb', line 91 def api_endpoint @api_endpoint end |
#branch ⇒ Object
Returns the value of attribute branch.
82 83 84 |
# File 'lib/dependabot/source.rb', line 82 def branch @branch end |
#commit ⇒ Object
Returns the value of attribute commit.
85 86 87 |
# File 'lib/dependabot/source.rb', line 85 def commit @commit end |
#directories ⇒ Object
Returns the value of attribute directories.
79 80 81 |
# File 'lib/dependabot/source.rb', line 79 def directories @directories end |
#directory ⇒ Object
Returns the value of attribute directory.
76 77 78 |
# File 'lib/dependabot/source.rb', line 76 def directory @directory end |
#hostname ⇒ Object
Returns the value of attribute hostname.
88 89 90 |
# File 'lib/dependabot/source.rb', line 88 def hostname @hostname end |
#provider ⇒ Object
Returns the value of attribute provider.
70 71 72 |
# File 'lib/dependabot/source.rb', line 70 def provider @provider end |
#repo ⇒ Object
Returns the value of attribute repo.
73 74 75 |
# File 'lib/dependabot/source.rb', line 73 def repo @repo end |
Class Method Details
.from_url(url_string) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/dependabot/source.rb', line 94 def self.from_url(url_string) return github_enterprise_from_url(url_string) unless url_string&.match?(SOURCE_REGEX) captures = T.must(url_string.match(SOURCE_REGEX)).named_captures new( provider: T.must(captures.fetch("provider")), repo: T.must(captures.fetch("repo")).delete_suffix(".git").delete_suffix("."), directory: captures.fetch("directory"), branch: captures.fetch("branch") ) end |
.github_enterprise?(base_url) ⇒ Boolean
128 129 130 131 132 133 134 135 136 |
# File 'lib/dependabot/source.rb', line 128 def self.github_enterprise?(base_url) resp = Excon.get(File.join(base_url, "status")) resp.status == 200 && # Alternatively: resp.headers["Server"] == "GitHub.com", but this # currently doesn't work with development environments ((resp.headers["X-GitHub-Request-Id"] && !resp.headers["X-GitHub-Request-Id"]&.empty?) || false) rescue StandardError false end |
.github_enterprise_from_url(url_string) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/dependabot/source.rb', line 108 def self.github_enterprise_from_url(url_string) captures = url_string&.match(GITHUB_ENTERPRISE_SOURCE)&.named_captures return unless captures return if IGNORED_PROVIDER_HOSTS.include?(captures.fetch("host")) base_url = "https://#{captures.fetch('host')}" return unless github_enterprise?(base_url) new( provider: "github", repo: T.must(captures.fetch("repo")).delete_suffix(".git").delete_suffix("."), directory: captures.fetch("directory"), branch: captures.fetch("branch"), hostname: captures.fetch("host"), api_endpoint: File.join(base_url, "api", "v3") ) end |
Instance Method Details
#organization ⇒ Object
196 197 198 |
# File 'lib/dependabot/source.rb', line 196 def organization T.must(repo.split("/").first) end |
#project ⇒ Object
201 202 203 204 205 206 207 208 |
# File 'lib/dependabot/source.rb', line 201 def project raise "Project is an Azure DevOps concept only" unless provider == "azure" parts = repo.split("/_git/") return T.must(T.must(parts.first).split("/").last) if parts.first&.split("/")&.count == 2 T.must(parts.last) end |
#unscoped_repo ⇒ Object
211 212 213 |
# File 'lib/dependabot/source.rb', line 211 def unscoped_repo T.must(repo.split("/").last) end |
#url ⇒ Object
170 171 172 |
# File 'lib/dependabot/source.rb', line 170 def url "https://" + hostname + "/" + repo end |
#url_with_directory ⇒ Object
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/dependabot/source.rb', line 175 def url_with_directory return url if [nil, ".", "/"].include?(directory) case provider when "github", "gitlab" path = Pathname.new(File.join("tree/#{branch || 'HEAD'}", directory)) .cleanpath.to_path url + "/" + path when "bitbucket" path = Pathname.new(File.join("src/#{branch || 'default'}", directory)) .cleanpath.to_path url + "/" + path when "azure" url + "?path=#{directory}" when "codecommit" raise "The codecommit provider does not utilize URLs" else raise "Unexpected repo provider '#{provider}'" end end |