76 lines
2.3 KiB
Ruby
76 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Jekyll
|
|
module GitHubMetadata
|
|
class RepositoryFinder
|
|
NoRepositoryError = Class.new(Jekyll::Errors::FatalException)
|
|
|
|
attr_reader :site
|
|
def initialize(site)
|
|
@site = site
|
|
end
|
|
|
|
# Public: fetches the repository name with owner to fetch metadata for.
|
|
# In order of precedence, this method uses:
|
|
# 1. the environment variable $PAGES_REPO_NWO
|
|
# 2. 'repository' variable in the site config
|
|
# 3. the 'origin' git remote's URL
|
|
#
|
|
# site - the Jekyll::Site being processed
|
|
#
|
|
# Return the name with owner (e.g. 'parkr/my-repo') or raises an
|
|
# error if one cannot be found.
|
|
def nwo
|
|
@nwo ||= begin
|
|
nwo_from_env || \
|
|
nwo_from_config || \
|
|
nwo_from_git_origin_remote || \
|
|
proc do
|
|
raise NoRepositoryError, "No repo name found. " \
|
|
"Specify using PAGES_REPO_NWO environment variables, " \
|
|
"'repository' in your configuration, or set up an 'origin' " \
|
|
"git remote pointing to your github.com repository."
|
|
end.call
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def nwo_from_env
|
|
ENV["PAGES_REPO_NWO"]
|
|
end
|
|
|
|
def nwo_from_config
|
|
repo = site.config["repository"]
|
|
repo if repo&.is_a?(String) && repo&.include?("/")
|
|
end
|
|
|
|
def git_remotes
|
|
_process, output = Jekyll::Utils::Exec.run("git", "remote", "--verbose")
|
|
output.to_s.strip.split("\n")
|
|
rescue Errno::ENOENT => e
|
|
Jekyll.logger.warn "Not Installed:", e.message
|
|
[]
|
|
end
|
|
|
|
def git_remote_url
|
|
git_remotes.grep(%r!\Aorigin\t!).map do |remote|
|
|
remote.sub(%r!\Aorigin\t(.*) \([a-z]+\)!, "\\1")
|
|
end.uniq.first || ""
|
|
end
|
|
|
|
def nwo_from_git_origin_remote
|
|
return unless Jekyll.env == "development" || Jekyll.env == "test"
|
|
|
|
matches = git_remote_url.chomp(".git").match github_remote_regex
|
|
matches[2..3].join("/") if matches
|
|
end
|
|
|
|
def github_remote_regex
|
|
github_host_regex = Regexp.escape(Jekyll::GitHubMetadata::Pages.github_hostname)
|
|
%r!#{github_host_regex}(:|/)([\w-]+)/([\w\.-]+)!
|
|
end
|
|
end
|
|
end
|
|
end
|