Merge pull request #4271 from GauthamGoli/create-args
create: Use Parser to parse args
This commit is contained in:
commit
06c01006c9
@ -20,15 +20,28 @@
|
|||||||
#: the specified tap.
|
#: the specified tap.
|
||||||
|
|
||||||
require "formula"
|
require "formula"
|
||||||
|
require "formula_creator"
|
||||||
require "missing_formula"
|
require "missing_formula"
|
||||||
require "digest"
|
require "cli_parser"
|
||||||
require "erb"
|
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
# Create a formula from a tarball URL
|
# Create a formula from a tarball URL
|
||||||
def create
|
def create
|
||||||
|
Homebrew::CLI::Parser.parse do
|
||||||
|
switch "--autotools"
|
||||||
|
switch "--cmake"
|
||||||
|
switch "--meson"
|
||||||
|
switch "--no-fetch"
|
||||||
|
switch "--HEAD"
|
||||||
|
switch :force
|
||||||
|
switch :verbose
|
||||||
|
switch :debug
|
||||||
|
flag "--set-name="
|
||||||
|
flag "--set-version="
|
||||||
|
flag "--tap="
|
||||||
|
end
|
||||||
raise UsageError if ARGV.named.empty?
|
raise UsageError if ARGV.named.empty?
|
||||||
|
|
||||||
# Ensure that the cache exists so we can fetch the tarball
|
# Ensure that the cache exists so we can fetch the tarball
|
||||||
@ -36,9 +49,9 @@ module Homebrew
|
|||||||
|
|
||||||
url = ARGV.named.first # Pull the first (and only) url from ARGV
|
url = ARGV.named.first # Pull the first (and only) url from ARGV
|
||||||
|
|
||||||
version = ARGV.next if ARGV.include? "--set-version"
|
version = args.set_version
|
||||||
name = ARGV.next if ARGV.include? "--set-name"
|
name = args.set_name
|
||||||
tap = ARGV.next if ARGV.include? "--tap"
|
tap = args.tap
|
||||||
|
|
||||||
fc = FormulaCreator.new
|
fc = FormulaCreator.new
|
||||||
fc.name = name
|
fc.name = name
|
||||||
@ -47,11 +60,11 @@ module Homebrew
|
|||||||
raise TapUnavailableError, tap unless fc.tap.installed?
|
raise TapUnavailableError, tap unless fc.tap.installed?
|
||||||
fc.url = url
|
fc.url = url
|
||||||
|
|
||||||
fc.mode = if ARGV.include? "--cmake"
|
fc.mode = if args.cmake?
|
||||||
:cmake
|
:cmake
|
||||||
elsif ARGV.include? "--autotools"
|
elsif args.autotools?
|
||||||
:autotools
|
:autotools
|
||||||
elsif ARGV.include? "--meson"
|
elsif args.meson?
|
||||||
:meson
|
:meson
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -64,7 +77,7 @@ module Homebrew
|
|||||||
|
|
||||||
# Don't allow blacklisted formula, or names that shadow aliases,
|
# Don't allow blacklisted formula, or names that shadow aliases,
|
||||||
# unless --force is specified.
|
# unless --force is specified.
|
||||||
unless ARGV.force?
|
unless args.force?
|
||||||
if reason = MissingFormula.blacklisted_reason(fc.name)
|
if reason = MissingFormula.blacklisted_reason(fc.name)
|
||||||
raise "#{fc.name} is blacklisted for creation.\n#{reason}\nIf you really want to create this formula use --force."
|
raise "#{fc.name} is blacklisted for creation.\n#{reason}\nIf you really want to create this formula use --force."
|
||||||
end
|
end
|
||||||
@ -90,152 +103,3 @@ module Homebrew
|
|||||||
gots.empty? ? nil : gots
|
gots.empty? ? nil : gots
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class FormulaCreator
|
|
||||||
attr_reader :url, :sha256, :desc, :homepage
|
|
||||||
attr_accessor :name, :version, :tap, :path, :mode
|
|
||||||
|
|
||||||
def url=(url)
|
|
||||||
@url = url
|
|
||||||
path = Pathname.new(url)
|
|
||||||
if @name.nil?
|
|
||||||
case url
|
|
||||||
when %r{github\.com/(\S+)/(\S+)\.git}
|
|
||||||
@user = Regexp.last_match(1)
|
|
||||||
@name = Regexp.last_match(2)
|
|
||||||
@head = true
|
|
||||||
@github = true
|
|
||||||
when %r{github\.com/(\S+)/(\S+)/(archive|releases)/}
|
|
||||||
@user = Regexp.last_match(1)
|
|
||||||
@name = Regexp.last_match(2)
|
|
||||||
@github = true
|
|
||||||
else
|
|
||||||
@name = path.basename.to_s[/(.*?)[-_.]?#{Regexp.escape(path.version.to_s)}/, 1]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
update_path
|
|
||||||
if @version
|
|
||||||
@version = Version.create(@version)
|
|
||||||
else
|
|
||||||
@version = Version.detect(url, {})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_path
|
|
||||||
return if @name.nil? || @tap.nil?
|
|
||||||
@path = Formulary.path "#{@tap}/#{@name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch?
|
|
||||||
!ARGV.include?("--no-fetch")
|
|
||||||
end
|
|
||||||
|
|
||||||
def head?
|
|
||||||
@head || ARGV.build_head?
|
|
||||||
end
|
|
||||||
|
|
||||||
def generate!
|
|
||||||
raise "#{path} already exists" if path.exist?
|
|
||||||
|
|
||||||
if version.nil? || version.null?
|
|
||||||
opoo "Version cannot be determined from URL."
|
|
||||||
puts "You'll need to add an explicit 'version' to the formula."
|
|
||||||
elsif fetch?
|
|
||||||
unless head?
|
|
||||||
r = Resource.new
|
|
||||||
r.url(url)
|
|
||||||
r.version(version)
|
|
||||||
r.owner = self
|
|
||||||
@sha256 = r.fetch.sha256 if r.download_strategy == CurlDownloadStrategy
|
|
||||||
end
|
|
||||||
|
|
||||||
if @user && @name
|
|
||||||
begin
|
|
||||||
metadata = GitHub.repository(@user, @name)
|
|
||||||
@desc = metadata["description"]
|
|
||||||
@homepage = metadata["homepage"]
|
|
||||||
rescue GitHub::HTTPNotFoundError
|
|
||||||
# If there was no repository found assume the network connection is at
|
|
||||||
# fault rather than the input URL.
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
path.write ERB.new(template, nil, ">").result(binding)
|
|
||||||
end
|
|
||||||
|
|
||||||
def template
|
|
||||||
<<~EOS
|
|
||||||
# Documentation: https://docs.brew.sh/Formula-Cookbook
|
|
||||||
# http://www.rubydoc.info/github/Homebrew/brew/master/Formula
|
|
||||||
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
|
|
||||||
class #{Formulary.class_s(name)} < Formula
|
|
||||||
desc "#{desc}"
|
|
||||||
homepage "#{homepage}"
|
|
||||||
<% if head? %>
|
|
||||||
head "#{url}"
|
|
||||||
<% else %>
|
|
||||||
url "#{url}"
|
|
||||||
<% unless version.nil? or version.detected_from_url? %>
|
|
||||||
version "#{version}"
|
|
||||||
<% end %>
|
|
||||||
sha256 "#{sha256}"
|
|
||||||
<% end %>
|
|
||||||
<% if mode == :cmake %>
|
|
||||||
depends_on "cmake" => :build
|
|
||||||
<% elsif mode == :meson %>
|
|
||||||
depends_on "meson-internal" => :build
|
|
||||||
depends_on "ninja" => :build
|
|
||||||
depends_on "python" => :build
|
|
||||||
<% elsif mode.nil? %>
|
|
||||||
# depends_on "cmake" => :build
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
def install
|
|
||||||
# ENV.deparallelize # if your formula fails when building in parallel
|
|
||||||
<% if mode == :cmake %>
|
|
||||||
system "cmake", ".", *std_cmake_args
|
|
||||||
<% elsif mode == :autotools %>
|
|
||||||
# Remove unrecognized options if warned by configure
|
|
||||||
system "./configure", "--disable-debug",
|
|
||||||
"--disable-dependency-tracking",
|
|
||||||
"--disable-silent-rules",
|
|
||||||
"--prefix=\#{prefix}"
|
|
||||||
<% elsif mode == :meson %>
|
|
||||||
ENV.refurbish_args
|
|
||||||
|
|
||||||
mkdir "build" do
|
|
||||||
system "meson", "--prefix=\#{prefix}", ".."
|
|
||||||
system "ninja"
|
|
||||||
system "ninja", "install"
|
|
||||||
end
|
|
||||||
<% else %>
|
|
||||||
# Remove unrecognized options if warned by configure
|
|
||||||
system "./configure", "--disable-debug",
|
|
||||||
"--disable-dependency-tracking",
|
|
||||||
"--disable-silent-rules",
|
|
||||||
"--prefix=\#{prefix}"
|
|
||||||
# system "cmake", ".", *std_cmake_args
|
|
||||||
<% end %>
|
|
||||||
<% if mode != :meson %>
|
|
||||||
system "make", "install" # if this fails, try separate make/make install steps
|
|
||||||
<% end %>
|
|
||||||
end
|
|
||||||
|
|
||||||
test do
|
|
||||||
# `test do` will create, run in and delete a temporary directory.
|
|
||||||
#
|
|
||||||
# This test will fail and we won't accept that! For Homebrew/homebrew-core
|
|
||||||
# this will need to be a test that verifies the functionality of the
|
|
||||||
# software. Run the test with `brew test #{name}`. Options passed
|
|
||||||
# to `brew install` such as `--HEAD` also need to be provided to `brew test`.
|
|
||||||
#
|
|
||||||
# The installed folder is not in the path, so use the entire path to any
|
|
||||||
# executables being tested: `system "\#{bin}/program", "do", "something"`.
|
|
||||||
system "false"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|||||||
153
Library/Homebrew/formula_creator.rb
Normal file
153
Library/Homebrew/formula_creator.rb
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
require "digest"
|
||||||
|
require "erb"
|
||||||
|
|
||||||
|
module Homebrew
|
||||||
|
class FormulaCreator
|
||||||
|
attr_reader :url, :sha256, :desc, :homepage
|
||||||
|
attr_accessor :name, :version, :tap, :path, :mode
|
||||||
|
|
||||||
|
def url=(url)
|
||||||
|
@url = url
|
||||||
|
path = Pathname.new(url)
|
||||||
|
if @name.nil?
|
||||||
|
case url
|
||||||
|
when %r{github\.com/(\S+)/(\S+)\.git}
|
||||||
|
@user = Regexp.last_match(1)
|
||||||
|
@name = Regexp.last_match(2)
|
||||||
|
@head = true
|
||||||
|
@github = true
|
||||||
|
when %r{github\.com/(\S+)/(\S+)/(archive|releases)/}
|
||||||
|
@user = Regexp.last_match(1)
|
||||||
|
@name = Regexp.last_match(2)
|
||||||
|
@github = true
|
||||||
|
else
|
||||||
|
@name = path.basename.to_s[/(.*?)[-_.]?#{Regexp.escape(path.version.to_s)}/, 1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
update_path
|
||||||
|
if @version
|
||||||
|
@version = Version.create(@version)
|
||||||
|
else
|
||||||
|
@version = Version.detect(url, {})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_path
|
||||||
|
return if @name.nil? || @tap.nil?
|
||||||
|
@path = Formulary.path "#{@tap}/#{@name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch?
|
||||||
|
!Homebrew.args.no_fetch?
|
||||||
|
end
|
||||||
|
|
||||||
|
def head?
|
||||||
|
@head || Homebrew.args.HEAD?
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate!
|
||||||
|
raise "#{path} already exists" if path.exist?
|
||||||
|
|
||||||
|
if version.nil? || version.null?
|
||||||
|
opoo "Version cannot be determined from URL."
|
||||||
|
puts "You'll need to add an explicit 'version' to the formula."
|
||||||
|
elsif fetch?
|
||||||
|
unless head?
|
||||||
|
r = Resource.new
|
||||||
|
r.url(url)
|
||||||
|
r.version(version)
|
||||||
|
r.owner = self
|
||||||
|
@sha256 = r.fetch.sha256 if r.download_strategy == CurlDownloadStrategy
|
||||||
|
end
|
||||||
|
|
||||||
|
if @user && @name
|
||||||
|
begin
|
||||||
|
metadata = GitHub.repository(@user, @name)
|
||||||
|
@desc = metadata["description"]
|
||||||
|
@homepage = metadata["homepage"]
|
||||||
|
rescue GitHub::HTTPNotFoundError
|
||||||
|
# If there was no repository found assume the network connection is at
|
||||||
|
# fault rather than the input URL.
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
path.write ERB.new(template, nil, ">").result(binding)
|
||||||
|
end
|
||||||
|
|
||||||
|
def template
|
||||||
|
<<~EOS
|
||||||
|
# Documentation: https://docs.brew.sh/Formula-Cookbook
|
||||||
|
# http://www.rubydoc.info/github/Homebrew/brew/master/Formula
|
||||||
|
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
|
||||||
|
class #{Formulary.class_s(name)} < Formula
|
||||||
|
desc "#{desc}"
|
||||||
|
homepage "#{homepage}"
|
||||||
|
<% if head? %>
|
||||||
|
head "#{url}"
|
||||||
|
<% else %>
|
||||||
|
url "#{url}"
|
||||||
|
<% unless version.nil? or version.detected_from_url? %>
|
||||||
|
version "#{version}"
|
||||||
|
<% end %>
|
||||||
|
sha256 "#{sha256}"
|
||||||
|
<% end %>
|
||||||
|
<% if mode == :cmake %>
|
||||||
|
depends_on "cmake" => :build
|
||||||
|
<% elsif mode == :meson %>
|
||||||
|
depends_on "meson-internal" => :build
|
||||||
|
depends_on "ninja" => :build
|
||||||
|
depends_on "python" => :build
|
||||||
|
<% elsif mode.nil? %>
|
||||||
|
# depends_on "cmake" => :build
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
def install
|
||||||
|
# ENV.deparallelize # if your formula fails when building in parallel
|
||||||
|
<% if mode == :cmake %>
|
||||||
|
system "cmake", ".", *std_cmake_args
|
||||||
|
<% elsif mode == :autotools %>
|
||||||
|
# Remove unrecognized options if warned by configure
|
||||||
|
system "./configure", "--disable-debug",
|
||||||
|
"--disable-dependency-tracking",
|
||||||
|
"--disable-silent-rules",
|
||||||
|
"--prefix=\#{prefix}"
|
||||||
|
<% elsif mode == :meson %>
|
||||||
|
ENV.refurbish_args
|
||||||
|
|
||||||
|
mkdir "build" do
|
||||||
|
system "meson", "--prefix=\#{prefix}", ".."
|
||||||
|
system "ninja"
|
||||||
|
system "ninja", "install"
|
||||||
|
end
|
||||||
|
<% else %>
|
||||||
|
# Remove unrecognized options if warned by configure
|
||||||
|
system "./configure", "--disable-debug",
|
||||||
|
"--disable-dependency-tracking",
|
||||||
|
"--disable-silent-rules",
|
||||||
|
"--prefix=\#{prefix}"
|
||||||
|
# system "cmake", ".", *std_cmake_args
|
||||||
|
<% end %>
|
||||||
|
<% if mode != :meson %>
|
||||||
|
system "make", "install" # if this fails, try separate make/make install steps
|
||||||
|
<% end %>
|
||||||
|
end
|
||||||
|
|
||||||
|
test do
|
||||||
|
# `test do` will create, run in and delete a temporary directory.
|
||||||
|
#
|
||||||
|
# This test will fail and we won't accept that! For Homebrew/homebrew-core
|
||||||
|
# this will need to be a test that verifies the functionality of the
|
||||||
|
# software. Run the test with `brew test #{name}`. Options passed
|
||||||
|
# to `brew install` such as `--HEAD` also need to be provided to `brew test`.
|
||||||
|
#
|
||||||
|
# The installed folder is not in the path, so use the entire path to any
|
||||||
|
# executables being tested: `system "\#{bin}/program", "do", "something"`.
|
||||||
|
system "false"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user