create: Use Parser to parse args

This commit is contained in:
Gautham Goli 2018-06-03 01:15:28 +05:30
parent cd6c990919
commit f60751d91c

View File

@ -21,6 +21,7 @@
require "formula" require "formula"
require "missing_formula" require "missing_formula"
require "cli_parser"
require "digest" require "digest"
require "erb" require "erb"
@ -29,6 +30,19 @@ module Homebrew
# 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 "--tag="
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 +50,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 +61,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 +78,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
@ -89,153 +103,153 @@ module Homebrew
gots = $stdin.gets.chomp gots = $stdin.gets.chomp
gots.empty? ? nil : gots gots.empty? ? nil : gots
end end
end
class FormulaCreator class FormulaCreator
attr_reader :url, :sha256, :desc, :homepage attr_reader :url, :sha256, :desc, :homepage
attr_accessor :name, :version, :tap, :path, :mode attr_accessor :name, :version, :tap, :path, :mode
def url=(url) def url=(url)
@url = url @url = url
path = Pathname.new(url) path = Pathname.new(url)
if @name.nil? if @name.nil?
case url case url
when %r{github\.com/(\S+)/(\S+)\.git} when %r{github\.com/(\S+)/(\S+)\.git}
@user = Regexp.last_match(1) @user = Regexp.last_match(1)
@name = Regexp.last_match(2) @name = Regexp.last_match(2)
@head = true @head = true
@github = true @github = true
when %r{github\.com/(\S+)/(\S+)/(archive|releases)/} when %r{github\.com/(\S+)/(\S+)/(archive|releases)/}
@user = Regexp.last_match(1) @user = Regexp.last_match(1)
@name = Regexp.last_match(2) @name = Regexp.last_match(2)
@github = true @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 else
@name = path.basename.to_s[/(.*?)[-_.]?#{Regexp.escape(path.version.to_s)}/, 1] @version = Version.detect(url, {})
end end
end end
update_path
if @version def update_path
@version = Version.create(@version) return if @name.nil? || @tap.nil?
else @path = Formulary.path "#{@tap}/#{@name}"
@version = Version.detect(url, {})
end end
end
def update_path def fetch?
return if @name.nil? || @tap.nil? !Homebrew.args.no_fetch?
@path = Formulary.path "#{@tap}/#{@name}" end
end
def fetch? def head?
!ARGV.include?("--no-fetch") @head || Homebrew.args.head?
end end
def head? def generate!
@head || ARGV.build_head? raise "#{path} already exists" if path.exist?
end
def generate! if version.nil? || version.null?
raise "#{path} already exists" if path.exist? opoo "Version cannot be determined from URL."
puts "You'll need to add an explicit 'version' to the formula."
if version.nil? || version.null? elsif fetch?
opoo "Version cannot be determined from URL." unless head?
puts "You'll need to add an explicit 'version' to the formula." r = Resource.new
elsif fetch? r.url(url)
unless head? r.version(version)
r = Resource.new r.owner = self
r.url(url) @sha256 = r.fetch.sha256 if r.download_strategy == CurlDownloadStrategy
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
end
path.write ERB.new(template, nil, ">").result(binding) if @user && @name
end begin
metadata = GitHub.repository(@user, @name)
def template @desc = metadata["description"]
<<~EOS @homepage = metadata["homepage"]
# Documentation: https://docs.brew.sh/Formula-Cookbook rescue GitHub::HTTPNotFoundError
# http://www.rubydoc.info/github/Homebrew/brew/master/Formula # If there was no repository found assume the network connection is at
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST! # fault rather than the input URL.
class #{Formulary.class_s(name)} < Formula nil
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 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
end end
EOS
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
end end